Identitas Penulis:

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

Abstrak

Tuberkulosis (TB) masih menjadi masalah kesehatan masyarakat utama di Indonesia, dengan Jawa Barat sebagai provinsi penyumbang kasus tertinggi secara nasional. Penelitian ini bertujuan menganalisis distribusi spasial dan temporal kasus TB di Provinsi Jawa Barat periode 2021–2025. Data yang digunakan adalah data sekunder agregat 27 kabupaten/kota yang bersumber dari BPS dan Portal Open Data Jabar. Metode analisis meliputi pengukuran epidemiologi (Incidence Rate dan Standardized Incidence Ratio), pemetaan risiko berbasis Empirical Bayes, analisis autokorelasi spasial (Global Moran’s I dan LISA), serta pemodelan spasio-temporal menggunakan Generalized Linear Mixed Model Negative Binomial (GLMM-NB). Hasil analisis menunjukkan tren peningkatan IR dari 183,13 menjadi 456,22 per 100.000 penduduk selama 2021–2024. Pemetaan Empirical Bayes mengidentifikasi wilayah dengan risiko tinggi yang konsisten lintas tahun. Uji Global Moran’s I mengkonfirmasi adanya pengelompokan spasial yang signifikan. Model GLMM-NB menunjukkan bahwa HIV, kepadatan penduduk, dan kemiskinan berpengaruh positif terhadap laju kejadian TB, sementara sanitasi layak dan akses air minum berperan protektif. Temuan ini diharapkan dapat mendukung perencanaan intervensi TB yang lebih tepat sasaran berbasis wilayah di Jawa Barat.

Kata kunci: Tuberkulosis, Empirical Bayes, Disease Mapping, GLMM, Spasio-Temporal.

1 Pendahuluan

1.1 Latar Belakang

Tuberkulosis (TB) merupakan salah satu penyakit menular yang hingga saat ini masih menjadi masalah kesehatan masyarakat global. Penyakit ini disebabkan oleh bakteri Mycobacterium tuberculosis yang dapat ditularkan melalui udara ketika penderita TB melakukan aktivitas seperti batuk, bersin, atau meludah (World Health Organization [WHO], 2025). TB masih menjadi salah satu penyebab utama kematian akibat penyakit infeksi, dengan sebagian besar kasus menyerang paru-paru, meskipun dalam beberapa kondisi dapat juga menginfeksi organ tubuh lainnya (Nurdin et al., 2025; Turner et al., 2017).

Berdasarkan Global Tuberculosis Report tahun 2025, TB masih menjadi beban kesehatan global dengan lebih dari 10 juta kasus baru setiap tahun dan menyebabkan lebih dari 1 juta kematian. Pada tahun 2024, tercatat sekitar 8,3 juta kasus baru TB secara global, meningkat dibandingkan tahun 2023 yang mencapai 8,2 juta kasus. Indonesia termasuk negara dengan beban TB tertinggi di dunia setelah India, dengan kontribusi sekitar 10% dari total kasus global (WHO, 2025).

Di tingkat nasional, Profil Kesehatan Indonesia tahun 2024 melaporkan sebanyak 856.420 kasus TB, meningkat dibandingkan tahun 2023 yang sebanyak 821.200 kasus (Kementerian Kesehatan Republik Indonesia, 2025). Kasus TB di Indonesia didominasi oleh provinsi dengan jumlah penduduk besar seperti Jawa Barat, Jawa Timur, dan Jawa Tengah. Secara khusus, Jawa Barat merupakan provinsi dengan jumlah kasus TB tertinggi secara nasional. Tren kasus menunjukkan peningkatan berkelanjutan, yaitu 160.661 kasus pada tahun 2022, meningkat menjadi 211.959 kasus pada tahun 2023, dan mencapai 229.683 kasus pada tahun 2024 (Dinas Kesehatan Provinsi Jawa Barat, 2023; 2024; 2025).

Beberapa penelitian menunjukkan bahwa kejadian TB dipengaruhi oleh faktor sosial ekonomi dan lingkungan seperti kepadatan penduduk, kemiskinan, sanitasi, serta akses terhadap fasilitas kesehatan (Sihaloho et al., 2021; Suryani & Ibad, 2022; Laoli et al., 2024). Kepadatan penduduk menjadi faktor penting dalam meningkatkan risiko penularan karena memperbesar peluang kontak antarindividu dalam suatu wilayah (Kristianingrum, 2024). Selain itu, kondisi sanitasi dan lingkungan permukiman yang tidak layak juga berkontribusi terhadap tingginya angka kejadian TB (Atillah et al., 2023; Gityarani, 2024).

Pendekatan analisis spasial telah banyak digunakan untuk mengidentifikasi distribusi penyakit TB secara geografis. Studi sebelumnya menunjukkan bahwa terdapat variasi spasial yang signifikan dalam distribusi kasus TB antarwilayah, sehingga analisis spasial penting untuk menentukan wilayah prioritas intervensi (Haq et al., 2020; Rosady et al., 2024; Sasmita et al., 2017). Selain itu, studi berbasis ekologi juga menunjukkan bahwa determinan lingkungan dan sosial ekonomi memiliki pengaruh signifikan terhadap kejadian TB (Alma et al., 2024; Dzakiyah et al., 2023; Handayani et al., 2024).

Dalam analisis epidemiologi, ukuran seperti Incidence Rate (IR) dan Standardized Incidence Ratio (SIR) digunakan untuk menggambarkan perbedaan risiko antarwilayah secara lebih proporsional. Pendekatan SIR banyak digunakan dalam studi epidemiologi untuk mengidentifikasi wilayah dengan risiko tinggi terhadap penyakit menular termasuk TB (Waller & Gotway, 2004; Lawson, 2018).

Namun demikian, ukuran tersebut masih bersifat deskriptif dan belum mampu menangkap ketergantungan spasial maupun dinamika temporal secara simultan. Oleh karena itu, diperlukan pendekatan disease mapping untuk menghasilkan estimasi risiko yang lebih stabil. Metode Empirical Bayes banyak digunakan dalam pemetaan penyakit karena mampu mengurangi fluktuasi ekstrem pada wilayah dengan populasi kecil serta meningkatkan kestabilan estimasi risiko (Lawson, 2018; Chambers et al., 2013).

Selanjutnya, untuk mengidentifikasi pola pengelompokan spasial, digunakan analisis autokorelasi spasial melalui Global Moran’s I dan Local Indicators of Spatial Association (LISA), yang memungkinkan identifikasi klaster wilayah dengan risiko tinggi maupun rendah (Anselin, 1995; Anselin et al., 2006).

Lebih lanjut, untuk menangkap dinamika spasial dan temporal secara simultan, digunakan pendekatan spatio-temporal modeling melalui Generalized Linear Mixed Model (GLMM). Model ini memungkinkan adanya efek acak untuk wilayah dan waktu sehingga mampu merepresentasikan heterogenitas data panel epidemiologi (Zuur et al., 2009).

Namun, data kasus TB sebagai data hitungan sering menunjukkan fenomena overdispersion, yaitu kondisi ketika varians lebih besar daripada rata-rata. Kondisi ini menyebabkan model Poisson menjadi kurang sesuai karena melanggar asumsi dasar kesamaan mean dan varians. Oleh karena itu, digunakan pendekatan Negative Binomial GLMM sebagai model yang lebih fleksibel dalam menangani overdispersi sekaligus mempertahankan struktur efek acak spasial dan temporal (Hilbe, 2011).

Dengan demikian, pendekatan Negative Binomial GLMM dalam penelitian ini diharapkan mampu memberikan hasil pemodelan yang lebih akurat dalam menjelaskan faktor-faktor yang memengaruhi kasus Tuberkulosis serta menangkap variasi risiko secara spasial dan temporal di Provinsi Jawa Barat selama periode 2021–2025.

1.2 Rumusan Masalah

Berdasarkan latar belakang yang telah diuraikan, maka rumusan masalah dalam penelitian ini adalah sebagai berikut:

  1. Bagaimana gambaran distribusi kasus Tuberkulosis (TB) di Provinsi Jawa Barat selama periode 2021–2025 berdasarkan ukuran epidemiologi (Incidence Rate dan Standardized Incidence Ratio)?
  2. Bagaimana pemetaan risiko Tuberkulosis di Provinsi Jawa Barat menggunakan pendekatan disease mapping berbasis Empirical Bayes?
  3. Apakah terdapat pola autokorelasi spasial (cluster) pada risiko Tuberkulosis di Provinsi Jawa Barat berdasarkan analisis 4. 4. Global Moran’s I dan LISA? Bagaimana pengaruh faktor sosial, ekonomi, dan lingkungan terhadap kasus Tuberkulosis menggunakan pendekatan spatio-temporal Negative Binomial GLMM?

1.3 Tujuan Penelitian

Berdasarkan rumusan masalah yang telah disusun, maka tujuan penelitian ini adalah sebagai berikut:

  1. Menganalisis distribusi kasus Tuberkulosis (TB) di Provinsi Jawa Barat periode 2021–2025 berdasarkan ukuran epidemiologi (Incidence Rate dan Standardized Incidence Ratio).
  2. Melakukan pemetaan risiko Tuberkulosis menggunakan pendekatan disease mapping berbasis Empirical Bayes.
  3. Mengidentifikasi pola autokorelasi spasial (cluster) pada risiko Tuberkulosis di Provinsi Jawa Barat menggunakan Global Moran’s I dan LISA.
  4. Menganalisis pengaruh faktor sosial, ekonomi, dan lingkungan terhadap kasus Tuberkulosis menggunakan pendekatan spatio-temporal Negative Binomial GLMM.

2 Data dan Metode

2.1 Sumber Data

Data yang digunakan dalam penelitian ini adalah data sekunder yang bersumber dari Badan Pusat Statistik (BPS) Provinsi Jawa Barat dan Portal Open Data Jabar dari Pemerintah Daerah Provinsi Jawa Barat. Unit analisis yang digunakan adalah 27 Kabupaten/Kota di Provinsi Jawa Barat.

2.2 Data Penelitian

Data yang digunakan merupakan data agregat kabupaten/kota di Provinsi Jawa Barat periode 2021–2025.

Tabel 1. Data Penelitian

data <- read_excel(
  "D:/MAGISTER/SEMESTER 2/dataset TB.xlsx",
  sheet = "Epidemiologi2"
)

data <- data %>%
  rename(
    penduduk_miskin = `persentase penduduk miskin`,
    kepadatan = `kepadatan penduduk`,
    air_minum_layak = `air minum layak`,
    sanitasi_layak = `sanitasi layak`,
    hiv = `jumlah kasus HIV`,
    jumlah_penduduk = `Jumlah Penduduk`
  )

data <- data %>%
  mutate(
    across(
      c(
        TB,
        penduduk_miskin,
        kepadatan,
        air_minum_layak,
        sanitasi_layak,
        hiv,
        jumlah_penduduk
      ),
      as.numeric
    )
  )
data_penelitian <- data %>%
  filter(tahun %in% c(2021,2022, 2023,2024 , 2025)) %>%
  select(
    tahun,
    nama_kabupaten_kota,
    TB,
    penduduk_miskin,
    kepadatan,
    air_minum_layak,
    sanitasi_layak,
    hiv,
    jumlah_penduduk
  ) %>%
  slice(1:10)

kable(
  data_penelitian,
)
tahun nama_kabupaten_kota TB penduduk_miskin kepadatan air_minum_layak sanitasi_layak hiv jumlah_penduduk
2021 KABUPATEN BOGOR 11946 8.13 2025 91.83 74.45 430 5484150
2021 KABUPATEN SUKABUMI 4805 7.70 666 81.34 99.72 117 2747450
2021 KABUPATEN CIANJUR 4673 11.18 653 86.25 92.89 111 2500640
2021 KABUPATEN BANDUNG 5708 7.15 2074 99.07 90.30 225 3652400
2021 KABUPATEN GARUT 4786 10.65 847 77.35 96.65 172 2613530
2021 KABUPATEN TASIKMALAYA 1995 11.15 738 85.26 79.26 68 1876890
2021 KABUPATEN CIAMIS 1606 7.97 875 90.12 85.51 58 1234830
2021 KABUPATEN KUNINGAN 1651 13.10 1063 94.40 90.11 113 1175950
2021 KABUPATEN CIREBON 3383 12.30 2327 96.54 91.32 232 2301330
2021 KABUPATEN MAJALENGKA 1723 12.33 1095 96.80 88.84 123 1315010

Tabel 2. Data Spasial Kabupaten/Kota Provinsi Jawa Barat

shp<- jabar %>%
  select(ID, WADMKK, geometry)
kable(
  shp
)
ID WADMKK geometry
1 Bogor MULTIPOLYGON (((106.9709 -6…
2 Sukabumi MULTIPOLYGON (((106.581 -7….
3 Cianjur MULTIPOLYGON (((107.2302 -6…
4 Bandung MULTIPOLYGON (((107.75 -6.8…
5 Garut MULTIPOLYGON (((107.8994 -7…
6 Tasikmalaya MULTIPOLYGON (((108.3231 -7…
7 Ciamis MULTIPOLYGON (((108.358 -7….
8 Kuningan MULTIPOLYGON (((108.4456 -6…
9 Cirebon MULTIPOLYGON (((108.5391 -6…
10 Majalengka MULTIPOLYGON (((108.1225 -6…
11 Sumedang MULTIPOLYGON (((107.8566 -6…
12 Indramayu MULTIPOLYGON (((108.1988 -6…
13 Subang MULTIPOLYGON (((107.8876 -6…
14 Purwakarta MULTIPOLYGON (((107.5028 -6…
15 Karawang MULTIPOLYGON (((107.0983 -5…
16 Bekasi MULTIPOLYGON (((107.0159 -5…
17 Bandung Barat MULTIPOLYGON (((107.4121 -6…
18 Pangandaran MULTIPOLYGON (((108.4971 -7…
19 Kota Bogor MULTIPOLYGON (((106.783 -6….
20 Kota Sukabumi MULTIPOLYGON (((106.9151 -6…
21 Kota Bandung MULTIPOLYGON (((107.5979 -6…
22 Kota Cirebon MULTIPOLYGON (((108.5621 -6…
23 Kota Bekasi MULTIPOLYGON (((107.0052 -6…
24 Kota Depok MULTIPOLYGON (((106.7922 -6…
25 Kota Cimahi MULTIPOLYGON (((107.5479 -6…
26 Kota Tasikmalaya MULTIPOLYGON (((108.194 -7….
27 Kota Banjar MULTIPOLYGON (((108.5758 -7…

2.3 Variabel Penelitian

Variabel yang digunakan yaitu terdiri dari sembilan variabel yaitu Jumlah Kasus TBC, Jumlah Penduduk (ribu jiwa), Jumlah Kasus HIV, Jumlah Penderita Diabetes Melitus (orang), Persentase Balita Stunting, Kepadatan Penduduk (jiwa/Km2), Jumlah Penduduk Miskin (ribu jiwa), Jumlah Fasilitas Kesehatan, dan Persentase Keluarga dengan Sanitasi Layak. Masing-masing merupakan data tiap kab/kota pada tahun 2024 di di Provinsi Jawa Barat.

Tabel 3. Variabel Penelitian

Nama Variabel Satuan Deskripsi Sumber Data
TB Orang Jumlah kasus Tuberkulosis (TB) yang terlapor pada kabupaten/kota di Provinsi Jawa Barat. Open Data Jawa Barat
penduduk_miskin Persentase (%) Persentase penduduk di bawah garis kemiskinan di Jawa Barat. BPS Provinsi Jawa Barat
kepadatan Jiwa/km² Jumlah penduduk per km² di Jawa Barat. Open Data Jawa Barat
air_minum_layak Persentase (%) Akses rumah tangga terhadap air minum layak. Open Data Jawa Barat
sanitasi_layak Persentase (%) Akses rumah tangga terhadap sanitasi layak. Open Data Jawa Barat
hiv Orang Jumlah kasus HIV di Jawa Barat. Open Data Jawa Barat
jumlah_penduduk Jiwa Jumlah penduduk Jawa Barat. BPS Provinsi Jawa Barat

2.4 Metode Analisis

Analisis data dalam penelitian ini dilakukan secara bertahap untuk menggambarkan pola distribusi Tuberkulosis (TB), mengidentifikasi risiko penyakit antarwilayah, serta menganalisis faktor-faktor yang memengaruhi jumlah kasus TB secara spasial dan temporal di Provinsi Jawa Barat periode 2021–2025. Tahapan analisis yang dilakukan meliputi analisis deskriptif, pengukuran epidemiologi, disease mapping, analisis autokorelasi spasial, dan pemodelan spasio-temporal dengan menggunakan Negative Binomial Generalized Linear Mixed Model.

2.4.1 Analisis Deskriptif

Analisis deskriptif dilakukan untuk memberikan gambaran umum mengenai distribusi kasus Tuberkulosis (TB) pada setiap kabupaten/kota di Provinsi Jawa Barat selama periode 2021–2025. Statistik deskriptif yang digunakan meliputi nilai minimum, kuartil pertama (Q1), rata-rata (mean), kuartil ketiga (Q3), nilai maksimum, standar deviasi, dan koefisien variasi (coefficient of variation). Selain itu, disajikan grafik tren jumlah kasus TB untuk melihat perubahan kasus dari tahun ke tahun.

2.4.2 Ukuran Epidemiologi

Ukuran epidemiologi digunakan untuk menggambarkan tingkat kejadian dan risiko Tuberkulosis pada masing-masing wilayah.

a. Incidence Rate (IR)

Incidance Rate adalah 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_{it} = \frac{TB_{it}}{\text{jumlah penduduk}_{it}} \times 100.000 \]

Dengan: \(TB_{it}\) : jumlah kasus TB pada kabupaten/kota \(i\) tahun \(t\).

\(\text{jumlah penduduk}_{it}\) : jumlah populasi di wilayah \(i\) tahun \(t\).

b. Standardized Incidence Ratio (SIR)

Menyajikan estimasi risiko relatif kasar dengan membandingkan jumlah kasus observasi dengan kasus yang diharapkan (expected cases) apabila wilayah tersebut memiliki laju insidensi yang sama dengan laju global provinsi. Rumusan untuk menghitung kasus ekspektasi (\(expected_{it}\) atau \(E_{it}\)) adalah:

\[E_{it} = \text{jumlah penduduk}_{it} \times r_{global}\] Dengan \(r_{global}\) adalah laju insidensi global Provinsi Jawa Barat yang dihitung secara agregat lintas periode :

\[r_{global} = \frac{\sum_{i}\sum_{t}TB_{it}}{\sum_{i}\sum_{t}\text{jumlah penduduk}_{it}}\]

Setelah nilai ekspektasi diperoleh, nilai SIR dihitung menggunakan perbandingan langsung :

\[SIR_{it} = \frac{TB_{it}}{E_{it}}\]

  • Jika nilai \(SIR_{it} > 1\), maka wilayah tersebut memiliki jumlah kejadian kasus TB yang lebih tinggi daripada rata-rata provinsi.
  • sebaliknya jika \(SIR_{it} < 1\), beban kasus di wilayah tersebut berada di bawah ekspektasi rata-rata provinsi.

Meskipun demikian, SIR memiliki keterbatasan statistik yang signifikan berupa variabilitas yang sangat tinggi pada wilayah dengan jumlah penduduk yang kecil (\(E_{it}\) sangat kecil), yang memicu fluktuasi estimasi risiko yang ekstrem.

2.4.3 Analisis Autokorelasi Spasial

Analisis autokorelasi spasial diterapkan untuk membuktikan keberadaan ketergantungan spasial secara geografis, yang menandakan bahwa risiko suatu wilayah dipengaruhi oleh kondisi wilayah-wilayah tetangganya.

a. Neighbourhood Matrix

Struktur spasial dimodelkan berdasarkan kriteria Queen Contiguity menggunakan fungsi poly2nb. Dua wilayah dinyatakan bertetangga (\(w_{ij} = 1\)) jika keduanya berbagi batas wilayah berupa garis maupun titik sudut bersama, dan \(w_{ij} = 0\) jika tidak ada kontak batas langsung. Matriks ketetanggaan ini selanjutnya distandardisasi baris (row-standardized weights matrix, \(W\)) melalui fungsi nb2listw untuk menyeimbangkan pengaruh jumlah tetangga yang berbeda antarwilayah.

b. Global Moran’s I:

Global Moran’s I adalah ukuran autokorelasi spasial yang dikembangkan oleh Patrick Alfred Pierce Moran pada tahun 1950. Global Moran’s I digunakan untuk melakukan uji depedensi spasial atau autokorelasi antar lokasi pengamatan. Global Moran’s I merupakan metode autokorelasi spasial yang paling sering digunakan untuk mengindikasikan pola spasial. Global Moran’s I dihitung menggunakan persamaan (1) untuk melihat nilai autokorelasi spasial. Hasil Moran’s I dapat digunakan untuk menguji apakah terdapat autokorelasi spasial di wilayah penelitian (Simatauw, 2019). Menggunakan Persamaan berikut:

\[ I = \frac{ n \sum_{i=1}^{n} \sum_{j=1}^{n} w_{ij}(x_i-\bar{x})(x_j-\bar{x}) }{ \sum_{i=1}^{n}\sum_{j=1}^{n} w_{ij} \sum_{i=1}^{n}(x_i-\bar{x})^2 } \] Dengan: \(I\) : indeks Moran’s I

\(n\) : jumlah wilayah studi kasus

\(x_i\) : nilai lokasi ke-i, dengan i = 1, 2, …, n

\(x_j\) : nilai lokasi ke-j, dengan j = 1, 2, …, n

\(x̄\): rata-rata data

\(w\) : matriks pembobot

Dimana:

\[ E(I)=\frac{-1}{n-1} \]

Pada Persamaan diatas , \(E(I)\) adalah nilai ekspektasi Moran’s \(I\) dan \(n\) merupakan jumlah area pengamatan sebanyak 27 area pada penelitian ini. Nilai ekspektasi Moran’s \(I\) menunjukkan bahwa:

  • Jika nilai \(I > E(I)\), maka autokorelasi bernilai positif atau pola spasial yang terbentuk adalah pola cluster (mengelompok).
  • Jika nilai \(I < E(I)\), maka autokorelasi bernilai negatif atau pola dispersed (menyebar).
  • Jika nilai \(I = E(I)\), maka tidak ada autokorelasi spasial.

c. Local Indicator of Spatial Association (LISA)

Local Indicator of Spatial Association (LISA) berhubungan dengan Moran Scatterplot. LISA adalah komponen versi sebelumnya dari Moran’s I yang dihitung menggunakan persamaan dibawah ini. Autokorelasi spasial lokal (LISA) memungkinkan identifikasi jenis kluster yaitu HighHigh pada kuadran pertama Moran Scatterplot, Low-Low pada kuadran ketiga Moran Scatterplot, Low-High pada kuadran kedua Moran Scatterplot, dan High-Low pada kuadran keempat Moran Scatterplot. Salah satu kelemahan adalah bahwa ia mengidentifikasi kluster outlier tanpa menunjukkan apakah terdiri dari nilai tinggi atau nilai rendah. Berikut adalah persamaan LISA:

\[I_i = z_i \sum_{j=1}^{n} W_{ij} Z_j\]

Dengan: - \(n\) : jumlah wilayah studi kasus

  • \(Z_i\) dan \(Z_j\) : deviasi dari nilai rata-rata

  • \(W\) : matriks pembobot

2.4.4 Metode Empirical Bayes (EB)

Metode Empirical Bayes merupakan suatu metode pada Small Area Estimation(SAE) yang menggunakan metode Bayes dalam pendugaan parameternya. Small Area Estimation(SAE) didefinisikan sebagai suatu teknik statistika untuk menduga parameter-parameter subpopulasi yang ukuran contohnya kecil, oleh karena itu diperlukan informasi tambahan agar diperoleh dugaan yang lebih akurat (Putri, 2019).Guna mengatasi keterbatasan variabilitas tinggi pada SIR klasik di wilayah dengan populasi kecil, diterapkan metode penstabilan risiko menggunakan estimasi risiko Empirical Bayes (Empirical Bayes Risk Estimation). Pendekatan ini merupakan salah satu bentuk estimator penyusutan (shrinkage estimator) yang dirintis oleh Clayton dan Kaldor (1987) serta Marshall (1991). Konsep dasar dari Empirical Bayes adalah menyusutkan nilai risiko ekstrem ke arah rata-rata global provinsi.Ketika suatu wilayah memiliki populasi kecil (nilai ekspektasi kasus \(E_{it}\) rendah), maka informasi lokal dianggap kurang stabil, sehingga nilai risikonya disusutkan secara signifikan mendekati nilai prior global. Sebaliknya, pada wilayah dengan populasi besar (\(E_{it}\) tinggi), nilai estimasi risiko akan lebih didominasi oleh data observasi lokalnya sendiri. Rumusan pemetaan risiko berbasis Empirical Bayes (\(EB\_Risk_{it}\)) yang diimplementasikan secara temporal per tahun dihitung sebagai berikut:

\[\lambda_t = \frac{\sum_{i}TB_{it}}{\sum_{i}E_{it}}\]\[EB\_Risk_{it} = \frac{TB_{it} + \lambda_t}{E_{it} + 1}\]

Dengan: \(\lambda_t\) : parameter prior (laju relatif global) yang diekstrak dari data pengamatan tahun ke-\(t\).

Pendekatan Empirical Bayes Global ini memperlakukan setiap kabupaten/kota secara independen tanpa memedulikan susunan atau konfigurasi ketetanggaan fisiknya. Hasil estimasi risiko kemudian divisualisasikan dalam bentuk peta tematik untuk mengidentifikasi wilayah dengan risiko tinggi dan rendah.

2.4.5 Pemodelan Spasio-Temporal

a. Model Ordinary Least Squares (OLS)

Model OLS digunakan sebagai model awal (baseline model) untuk mengevaluasi hubungan antara variabel respon dan variabel prediktor.Model OLS secara umum dinyatakan sebagai:

\[Y_i = \beta_0 + \beta_1 X_1 + \beta_2 X_2 + \dots + \beta_p X_p + \varepsilon_i\] Pada Penelitian ini menggunakan persamaan berikut: \[TB_{it} = \beta_0 + \beta_1\text{penduduk miskin} {it} + \beta_2\text{kepadatan}_{it} + \beta_3\text{air minum layak}_{it} + \beta_4\text{sanitasi layak}_{it} + \beta_5\text{hiv}_{it} + \epsilon_{it}\]

Model OLS dievaluasi kelayakannya melalui pengujian asumsi klasik yang ketat, meliputi uji normalitas residual Shapiro-Wilk, uji heteroskedastisitas Breusch-Pagan (bptest), dan uji multikolinearitas melalui perhitungan Variance Inflation Factor (VIF) menggunakan paket car.

b. Model Regresi Poisson

Regresi Poisson digunakan untuk memodelkan jumlah kasus Tuberkulosis (TB) yang merupakan data cacah (count data). Model ini mengasumsikan bahwa jumlah kasus TB mengikuti distribusi Poisson, yaitu:

\[ E(TB_{it}) = \mu_{it} \]

Dengan nilai harapan sebesar: \[ E(TB_{it}) = \mu_{it} \]

Fungsi penghubung (link function) yang digunakan adalah fungsi logaritma natural sehingga model dapat dituliskan sebagai:

\[ \log(\mu_{it}) = \beta_0 + \beta_1 \text{Penduduk Miskin}_{it} + \beta_2 \text{Kepadatan}_{it} + \beta_3 \text{Air Minum Layak}_{it} + \beta_4 \text{Sanitasi Layak}_{it} + \beta_5 \text{HIV}_{it} + \gamma_t + \log(\text{Jumlah Penduduk}_{it}) \] Dengan:

\(\mu_{it}\) = rata-rata kasus TB pada wilayah ke-\(i\) dan tahun ke-\(t\) \(\beta_0\) = intersep \(\beta_k\) = koefisien regresi \(\gamma_t\) = efek tetap tahun \(\log(Populasi_{it})\) = offset jumlah penduduk

Variabel tahun dimasukkan sebagai efek tetap (fixed effect) untuk mengontrol variasi temporal selama periode pengamatan tahun 2021–2025. Selain itu, digunakan offset jumlah penduduk agar estimasi risiko kejadian TB dapat dibandingkan secara adil antarwilayah yang memiliki jumlah penduduk berbeda.

Karakteristik penting dari distribusi yang sering digunakan dalam pemodelan rare event (kasus jarang) terjadi) ini yaitu mean sama dengan variansi. Kasus seperti ini biasa disebut dengan equidispersion (Rahayu, 2020). Asumsi dasar regresi Poisson mensyaratkan kondisi equidispersion, yaitu varians dari variabel respon sama dengan nilai rata-ratanya (\(Var(TB_{it}) = E(TB_{it}) = \mu_{it}\)).

c. Overdispersi

Dalam regresi Poisson terdapat asumsi yang harus dippenuhi. Asumsi tersebut adalah kesamaan nilai mean dan vairansi variabel dependen atau yang dikenal dengan sebutan equidispersi. Rahayu (2014) menyatakan bahwa overdispersi dapat terjadi karena adanya nilai nol yang berlebihan pada variabel dependenya, sumber keragaman yang tidak teramati pada data atau adanya pengaruh peubah lain yang mengakibatkan peluang suatu kejadian bergantung pada kejadian sebelumnya. Selain itu, overdispersi dapat pula terjadi karena adanya pencilan pada data dan kesalahan spesifikasi fungsi penghubung.

Deviasi terhadap asumsi equidispersion diuji secara kuantitatif dengan menghitung statistik rasio dispersi Pearson residual:

\[\phi_{disp} = \frac{\sum_{i}\sum_{t}\frac{(TB_{it}-\hat{\mu}_{it})^2}{\hat{\mu}_{it}}}{\text{df}_{residual}}\]

Apabila didapatkan \(\phi_{disp} > 1\), maka data terindikasi mengalami overdispersi yang parah. Dalam kondisi ini, estimasi standard error dari model Poisson akan terbias ke bawah (underestimated), yang berdampak pada pengujian signifikansi parsial yang terlalu optimis dan menyesatkan.

d.Generalized Linear Mixed Model- Negative Binomial (GLMM-NB)

GLMM merpukan penyempurnaan dari GLM dengan memungkinkan korelasi di antara variabel respons. Hal ini memungkinkan model untuk memperhitungkan pengaruh acak yang tidak teramati dan menetapkan korelasi langsung dalam data. Dirancang khusus untuk menangani variabel respons yang menyimpang dari distribusi normal, pendekatan ini juga mempertimbangkan variabilitas di berbagai kelompok atau lokasi.

Dalam menangani overdispersi secara struktural sekaligus mengakomodasi dependensi spasial dan temporal dari data panel (27 kabupaten/kota selama 5 periode), diterapkan pemodelan GLMM menggunakan distribusi Negative Binomial tipe nbinom2 dari pustaka glmmTMB. Model nbinom2 mengasumsikan parameterisasi kuadratik terhadap varians (Hardin & Hilbe, 2007) :

\[Var(TB_{it}\mid u_i,v_t) = \mu_{it}\left(1+\frac{\mu_{it}}{\phi}\right) = \mu_{it}+\frac{\mu_{it}^2}{\phi}\]

Dengan \(\phi\) mewakili parameter dispersi kuadratik. Ketika \(\phi \to \infty\), distribusi akan mendekati Poisson. Persamaan model spasio-temporal dalam penelitian ini diformulasikan sebagai berikut:

\[\log(\mu_{it}) = \beta_0 + \beta_1\text{penduduk miskin}_{it} + \beta_2\text{kepadatan}_{it} + \beta_3\text{air minum layak}_{it} + \beta_4\text{sanitasi layak}_{it} + \beta_5\text{hiv}_{it} + \log(\text{jumlah penduduk}_{it}) + u_i + v_t\]

Dengan \(\log(\text{jumlah penduduk}_{it})\) disisipkan sebagai variabel offset (dengan koefisien yang dipaksa bernilai 1) untuk mengontrol perbedaan ukuran populasi dasar antarwilayah, sehingga model secara efektif mengestimasi laju kejadian (rate), bukan jumlah absolut kasus.

  • \(u_i \sim N(0, \sigma_{u}^2)\) melambangkan efek acak wilayah (kabupaten/kota) untuk mengontrol heterogenitas spasial tidak teramati.

  • \(v_t \sim N(0, \sigma_{v}^2)\) melambangkan efek acak temporal (tahun) untuk menangkap fluktuasi makro-temporal tahunan.

e. Incidence Rate Ratio (IRR)

Incidence Rate Ratio dalam penelitian ini digunakan untuk memudahkan interpretasi epidemiologi dari koefisien regresi efek tetap (\(\beta_k\)), dilakukan transformasi eksponensial: \[IRR_k = \exp(\beta_k)\]

Nilai \(IRR_k\) merepresentasikan rasio perubahan laju kejadian TB untuk setiap kenaikan satu unit pada variabel prediktor \(X_k\), dengan asumsi variabel lainnya konstan.

3 Hasil dan Pembahasan

3.1 Analisis Deskriptif

Gambaran umum mengenai sebaran kasus Tuberkulosis di Provinsi Jawa Barat selama kurun waktu 2021 hingga 2025 dianalisis terlebih dahulu secara deskriptif untuk melihat karakteristik pemusatan dan penyebaran data.

Tabel 4. Statistik Deskriptif

deskriptif_tb <- data %>%
  group_by(tahun) %>%
  summarise(
    Min = min(TB),
    Q1 = quantile(TB,0.25),
    Mean = mean(TB),
    Q3 = quantile(TB,0.75),
    Max = max(TB),
    SD = sd(TB),
    CV = sd(TB)/mean(TB)*100
    )
kable(deskriptif_tb)
tahun Min Q1 Mean Q3 Max SD CV
2021 269 1628.5 3305.741 4729.5 11946 2650.670 80.18385
2022 734 2799.0 5950.407 7830.0 21516 4575.077 76.88679
2023 954 3916.0 7850.333 10652.0 27690 5933.347 75.58082
2024 968 4317.5 8506.778 12304.0 29110 6240.981 73.36480
2025 1024 3999.5 8347.741 12460.0 28134 6046.317 72.43058

Tabel statistik deskriptif menyajikan rincian distribusi data kasus TB pada tingkat wilayah (misalnya kabupaten/kota) di Jawa Barat dari tahun 2021 hingga 2025. Data menunjukkan pola skewness atau ketimpangan yang cukup tinggi, di mana rata-rata (mean) selalu berada jauh di atas nilai kuartil pertama (Q1) dan lebih dekat dengan kuartil ketiga (Q3). Hal ini mengindikasikan adanya konsentrasi kasus yang sangat tinggi pada sebagian kecil wilayah, sementara mayoritas wilayah lainnya memiliki jumlah kasus yang lebih rendah.

Selain itu, nilai simpangan baku (Standard Deviation/SD) yang sangat besar dibandingkan dengan nilai mean setiap tahunnya menegaskan adanya variasi atau disparitas beban kasus yang ekstrem antarwilayah. Nilai Koefisien Variasi (CV) yang berada di kisaran 72% hingga 80% semakin memperkuat temuan bahwa terdapat ketimpangan distribusi kasus yang substansial. Meskipun nilai CV menunjukkan tren penurunan dari 80,18% (2021) menjadi 72,43% (2025), angka tersebut masih tergolong sangat tinggi, yang mencerminkan ketidakmerataan beban epidemiologis TB di tingkat daerah di Jawa Barat.

ringkasan_tb <- data %>%
  group_by(tahun) %>%
  summarise(
    kasus = sum(TB),
    populasi = sum(jumlah_penduduk)
  )

ggplot(
  ringkasan_tb,
  aes(
    x = factor(tahun),
    y = kasus,
    fill = factor(tahun)
  )
) +
  geom_col(
    width = 0.75,
    color = "white"
  ) +
  geom_text(
    aes(label = round(kasus)),
    vjust = -0.3,
    fontface = "bold"
  ) +
  scale_fill_manual(
    values = c(
      "#1b9e77",  # 2021
      "#d95f02",  # 2022
      "#7570b3",  # 2023
      "#e7298a",  # 2024
      "#66a61e"   # 2025
    )
  ) +
  labs(
    title = "Tren Jumlah Kasus TB Jawa Barat Tahun 2021–2025",
    x = "Tahun",
    y = "Jumlah Kasus TB"
  ) +
  theme_classic() +
  theme(
    plot.title = element_text(
      hjust = 0.5,
      face = "bold",
      size = 14
    ),
    legend.position = "none"
  )

Gambar 1. Grafik Tren Kasus TB

Berdasarkan visualisasi tren jumlah kasus Tuberkulosis (TB) di Jawa Barat periode 2021–2025, terlihat adanya peningkatan signifikan secara akumulatif. Jumlah kasus TB tercatat sebesar 89.255 pada tahun 2021 dan meningkat tajam menjadi 160.661 pada tahun 2022. Tren kenaikan ini terus berlanjut hingga mencapai puncaknya pada tahun 2024 dengan 229.683 kasus. Namun, pada tahun 2025, terjadi sedikit penurunan jumlah kasus menjadi 225.389. Secara keseluruhan, data ini menunjukkan beban penyakit TB yang cukup tinggi dengan fluktuasi pertumbuhan yang pesat selama lima tahun terakhir, yang mengindikasikan perlunya evaluasi berkelanjutan terhadap strategi pengendalian dan penemuan kasus di lapangan.

3.2 Ukuran Epidemiologi

3.2.1 Incidence Rate (IR)

data <- data %>%
  mutate(
    IR =
      TB /
      jumlah_penduduk *
      100000
  )

Tabel 5. Incidence Rate Tuberkulosis Jawa Barat Tahun 2021–2025

ir_tahun <- data %>%
  group_by(tahun) %>%
  summarise(
    kasus = sum(TB),
    penduduk = sum(jumlah_penduduk)
  ) %>%
  mutate(
    IR =
      kasus /
      penduduk *
      100000
  )

kable(
  ir_tahun,
  digits = 2,
)
tahun kasus penduduk IR
2021 89255 48738830 183.13
2022 160661 49306800 325.84
2023 211959 49860330 425.11
2024 229683 50345190 456.22
2025 225389 50759000 444.04
ggplot(
  ir_tahun,
  aes(
    x = tahun,
    y = IR
  )
)+
  geom_line(
    color = "#2C7FB8",
    linewidth = 1.5
  )+
  geom_point(
    color = "#D95F02",
    size = 4
  )+
  geom_text(
    aes(
      label = round(IR,2)
    ),
    vjust = -0.8,
    fontface = "bold",
    size = 4
  )+
  labs(
    title = "Tren Incidence Rate (IR) Tuberkulosis Jawa Barat Tahun 2021–2025",
    x = "Tahun",
    y = "IR per 100.000 Penduduk"
  )+
  theme_minimal(base_size = 12)+
  theme(
    plot.title = element_text(
      hjust = 0.5,
      face = "bold",
      size = 14
    ),
    axis.title = element_text(
      face = "bold"
    )
  )

Gambar 2. Grafik Tren IR

Berdasarkan Grafik Tren IR data pada Gambar 2 tren Incidence Rate (IR) Tuberkulosis di Jawa Barat menunjukkan peningkatan yang signifikan dari tahun 2021 hingga 2024. Pada tahun 2021, angka IR tercatat sebesar 183,13 per 100.000 penduduk. Angka ini terus menunjukkan tren peningkatan yang konsisten, yakni mencapai 325,84 pada tahun 2022, 425,11 pada tahun 2023, hingga mencapai puncaknya pada tahun 2024 dengan angka 456,22 per 100.000 penduduk. Namun, pada tahun 2025, terlihat adanya sedikit penurunan beban insidensi menjadi 444,04 per 100.000 penduduk. Pola ini mengindikasikan adanya intensifikasi dalam penemuan kasus atau peningkatan penularan penyakit dalam periode tersebut, diikuti oleh stabilisasi pada tahun terakhir observasi.

map_ir <- left_join(
  jabar,
  data,
  by = "ID"
)

tm_shape(map_ir)+
  tm_polygons(
    "IR",
    palette = "Reds",
    style = "quantile",
    title = "IR"
  )+
  tm_borders()+
  tm_facets(
    by = "tahun",
    ncol = 3
  )+
  tm_layout(
    main.title =
      "Peta Incidence Rate Tuberkulosis Jawa Barat Tahun 2021–2025",
    legend.outside = TRUE
  )

Gambar 3. Visualisasi Peta IR

Distribusi Spasial Incidence Rate Tuberkulosis yang disajikan dalam Gambar 3 memberikan gambaran mengenai sebaran geografis IR Tuberkulosis di wilayah Jawa Barat dari tahun 2021 hingga 2025. Visualisasi peta tematik tersebut menunjukkan pergeseran gradasi warna dari tahun ke tahun, yang merepresentasikan peningkatan nilai IR secara merata di berbagai wilayah administratif.

  • Pada tahun 2021, dominasi warna terang menunjukkan bahwa mayoritas wilayah masih berada pada tingkat insidensi yang relatif rendah.

  • Seiring berjalannya waktu, terjadi peningkatan intensitas warna pada peta, yang menandakan bahwa semakin banyak wilayah yang berpindah ke kategori IR yang lebih tinggi (ditandai dengan warna merah yang lebih gelap).

  • Pola ini menegaskan bahwa beban penyakit Tuberkulosis di Jawa Barat mengalami eskalasi geografis yang meluas, dengan akumulasi wilayah yang memiliki angka IR tinggi (387–1.207) terlihat semakin dominan pada tahun 2024 dan 2025 dibandingkan dengan tahun-tahun sebelumnya.

3.2.2 Standardized Incidence Ratio (SIR)

Dalam upaya untuk menstandardisasi analisis beban penyakit antarwilayah, dilakukan perhitungan jumlah kasus harapan (expected cases) untuk setiap kabupaten/kota. Perhitungan ini didasarkan pada global rate (rata-rata insidensi TB di seluruh wilayah Jawa Barat) yang dikalikan dengan jumlah populasi di masing-masing kabupaten/kota. Perhitungan expected cases ini merupakan prasyarat krusial sebelum melakukan analisis Standardized Incidence Ratio (SIR), karena berfungsi sebagai nilai pembanding untuk mengukur deviasi antara jumlah kasus aktual dengan ekspektasi epidemiologis.

Tabel 6. Hasil Perhitungan Expected Cases Tuberkulosis

rate_global <-
  sum(data$TB)/
  sum(data$jumlah_penduduk)

data <- data %>%
  mutate(
    expected=
      jumlah_penduduk *
      rate_global
  )

tabel_expected <- data %>%
  select(
    nama_kabupaten_kota,
    tahun,
    TB,
    jumlah_penduduk,
    expected
  ) %>%
  head(10)

knitr::kable(
  tabel_expected,
  digits = 3
)
nama_kabupaten_kota tahun TB jumlah_penduduk expected
KABUPATEN BOGOR 2021 11946 5484150 20194.658
KABUPATEN SUKABUMI 2021 4805 2747450 10117.122
KABUPATEN CIANJUR 2021 4673 2500640 9208.277
KABUPATEN BANDUNG 2021 5708 3652400 13449.481
KABUPATEN GARUT 2021 4786 2613530 9623.979
KABUPATEN TASIKMALAYA 2021 1995 1876890 6911.400
KABUPATEN CIAMIS 2021 1606 1234830 4547.098
KABUPATEN KUNINGAN 2021 1651 1175950 4330.281
KABUPATEN CIREBON 2021 3383 2301330 8474.344
KABUPATEN MAJALENGKA 2021 1723 1315010 4842.351

Hasil perhitungan yang disajikan pada Tabel 6 di atas memberikan gambaran sebagai berikut:

  • Metodologi Estimasi: Nilai expected merepresentasikan jumlah kasus yang seharusnya muncul di suatu wilayah jika tingkat insidensi TB di wilayah tersebut setara dengan rata-rata insidensi TB di tingkat provinsi.

  • Perbandingan Beban Penyakit: Melalui tabel ini, dapat dilakukan observasi langsung antara jumlah kasus TB aktual yang tercatat dengan jumlah kasus yang diharapkan. Sebagai contoh, pada seluruh kabupaten yang tercantum dalam tabel (seperti Kabupaten Bogor, Kabupaten Sukabumi, hingga Kabupaten Majalengka), terlihat bahwa jumlah kasus TB aktual masih berada di bawah angka expected cases.

  • Interpretasi Epidemiologis: Selisih antara nilai expected dengan jumlah TB aktual ini merupakan indikator penting dalam analisis epidemiologi, yang sering kali digunakan sebagai dasar untuk menghitung Standardized Incidence Ratio (SIR) guna menentukan apakah suatu wilayah memiliki beban kasus yang secara statistik lebih tinggi atau lebih rendah dari rata-rata populasi.

Tabel 7. Rata-rata (SIR) Tuberkulosis Jawa Barat Tahun 2021–2025

sir_tahun <- data %>%
  group_by(tahun) %>%
  summarise(
    SIR = mean(SIR)
  )

knitr::kable(
  sir_tahun,
  digits = 3)
tahun SIR
2021 0.526
2022 0.976
2023 1.293
2024 1.371
2025 1.322
ggplot(
  sir_tahun,
  aes(
    x = tahun,
    y = SIR
  )
)+
  geom_line(
    color = "#8E44AD",
    linewidth = 1.5
  )+
  geom_point(
    color = "#E74C3C",
    size = 4
  )+
  geom_text(
    aes(
      label = round(SIR,2)
    ),
    vjust = -0.8,
    fontface = "bold",
    size = 4
  )+
  labs(
    title = "Tren SIR Tuberkulosis Jawa Barat Tahun 2021–2025",
    x = "Tahun",
    y = "SIR"
  )+
  theme_minimal(base_size = 12)+
  theme(
    plot.title = element_text(
      hjust = 0.5,
      face = "bold",
      size = 14
    ),
    axis.title = element_text(
      face = "bold"
    )
  )

Gambar 4. Grafik Tren SIR

Berdasarkan data yang disajikan dalam Tabel 7 dan Gambar 4, tren Standardized Incidence Ratio (SIR) Tuberkulosis di Jawa Barat menunjukkan peningkatan yang konsisten dari tahun 2021 hingga 2024. Pada tahun 2021, nilai SIR tercatat sebesar 0,53 dan mengalami kenaikan bertahap menjadi 0,98 pada tahun 2022, 1,29 pada tahun 2023, hingga mencapai puncak pada tahun 2024 dengan nilai 1,37. Meskipun terdapat sedikit penurunan menjadi 1,32 pada tahun 2025, angka tersebut tetap menunjukkan tingkat insidensi yang lebih tinggi dibandingkan dengan periode awal observasi.

map_sir <- left_join(
  jabar,
  data,
  by = "ID"
)

tm_shape(map_sir)+
  tm_polygons(
    "SIR",
    palette = "-RdYlBu",
    style = "quantile",
    title = "SIR"
  )+
  tm_borders(col = "grey40")+
  tm_facets(
    by = "tahun",
    ncol = 3
  )+
  tm_layout(
    main.title =
      "Peta Standardized Incidence Ratio Tuberkulosis Jawa Barat Tahun 2021–2025",
    main.title.size = 1.1,
    legend.outside = TRUE,
    legend.outside.position = "right",
    frame = FALSE
  )

Gambar 5. Visualisasi Peta SIR

Visualisasi spasial pada gambar 5 menunjukkan perubahan distribusi risiko TB antarwilayah di Jawa Barat selama periode lima tahun.

  • Pada tahun 2021, peta didominasi oleh warna biru, yang merepresentasikan nilai SIR rendah (0,249–0,588), menunjukkan bahwa sebagian besar wilayah memiliki risiko insidensi yang berada di bawah rata-rata.

  • Seiring berjalannya waktu hingga tahun 2024 dan 2025, terjadi pergeseran gradasi warna ke arah kuning dan oranye, yang menandakan peningkatan nilai SIR di berbagai kabupaten/kota menjadi kisaran 1,050–1,482.

  • Pola ini menegaskan adanya eskalasi risiko insidensi TB secara kewilayahan, di mana semakin banyak daerah yang menunjukkan rasio insidensi di atas ekspektasi (SIR > 1) dibandingkan dengan kondisi pada tahun 2021.

3.3 Analisis Autokorelasi Spasial (Moran’s I)

Analisis autokorelasi spasial dilakukan untuk mengidentifikasi apakah terdapat pola pengelompokan (clustering) pada risiko Tuberkulosis (TB) antarwilayah di Jawa Barat. Metode ini penting untuk menentukan apakah kejadian TB di suatu wilayah dipengaruhi oleh kejadian di wilayah tetangganya. Analisis ini terdiri dari tiga tahap: pembentukan matriks ketetanggaan, uji Global Moran’s I, dan analisis LISA (Local Indicators of Spatial Association).

3.3.1 Pembentukan Neighbourhood

Langkah awal dalam analisis spasial adalah mendefinisikan struktur ketetanggaan (spatial weights matrix). Dalam studi ini, metode Queen Contiguity digunakan untuk menentukan hubungan antarkabupaten/kota berdasarkan batas wilayah yang bersinggungan.

Tabel 10. Ringkasan Struktur Ketetanggaan Kabupaten/Kota di Jawa Barat

nb <- poly2nb(jabar)
listw <- nb2listw(nb, style = "W")

ringkasan_nb <- data.frame(
  Minimum = min(card(nb)),
  Maksimum = max(card(nb)),
  Rata_rata = mean(card(nb)),
  Median = median(card(nb))
)

knitr::kable(
  ringkasan_nb)
Minimum Maksimum Rata_rata Median
1 8 3.925926 4
plot(st_geometry(jabar))
plot(
  nb,
  st_coordinates(st_centroid(jabar)),
  add = TRUE,
  col = "red"
)

Gambar 7. Visualisasi Ketetanggaan

Visualisasi pada Gambar 7 menunjukkan matriks konektivitas yang terbentuk antarwilayah di Jawa Barat. Garis merah menghubungkan pusat geografis (centroids) wilayah yang berbatasan, yang menjadi dasar perhitungan interaksi spasial dalam analisis autokorelasi.

3.3.2 Global Moran’s I

Analisis Global Moran’s I diterapkan pada nilai Standardized Incidence Ratio (SIR) yang menjadi basis perhitungan EB Risk menggunakan matriks pembobot spasial listw untuk setiap tahun secara terpisah melalui fungsi moran.test() di seluruh wilayah Jawa Barat selama periode 2021–2025.

Tabel 11. Ringkasan Global Moran’s I SIR 2021–2025

moran_by_year <- data %>%
  split(.$tahun) %>%
  map(function(df){

    df <- df %>% arrange(ID)   
    moran.test(df$SIR, listw)

  })

moran_summary <- data %>%
  split(.$tahun) %>%
  map_df(function(df){

    df <- df %>% arrange(ID)

    test <- moran.test(df$SIR, listw)

    data.frame(
      Year = unique(df$tahun),
      Moran_I = as.numeric(test$estimate[1]),
      Expected = as.numeric(test$estimate[2]),
      P_value = test$p.value
    )
  })

knitr::kable(
  moran_summary)
Year Moran_I Expected P_value
2021 0.0174672 -0.0384615 0.3259154
2022 0.0788903 -0.0384615 0.1976853
2023 0.0415548 -0.0384615 0.2780396
2024 0.0441326 -0.0384615 0.2716831
2025 0.0500312 -0.0384615 0.2587224

Berdasarkan Tabel 11, nilai Moran’s I yang dihasilkan untuk setiap tahun menunjukkan angka yang mendekati nol dengan nilai P-value yang lebih besar dari 0,05 (signifikansi 5%). Hal ini mengindikasikan bahwa secara global, tidak ditemukan autokorelasi spasial yang signifikan pada tingkat provinsi. Artinya, distribusi risiko TB berbasis SIR cenderung menyebar secara acak (random) dan tidak membentuk pola clustering atau dispersion yang terstruktur di seluruh wilayah Jawa Barat dalam periode observasi tersebut.

3.3.3 LISA Cluster Analysis

Meskipun autokorelasi secara global tidak signifikan, analisis LISA dilakukan untuk mengeksplorasi adanya variasi spasial lokal yang mungkin tidak tertangkap oleh uji global.

lisa_by_year <- data %>%
  split(.$tahun) %>%
  map(function(df){

    df <- df %>% arrange(ID)

    # Local Moran's I
    local_moran <- localmoran(df$SIR, listw)

    df$Ii <- local_moran[,1]
    df$Z_Ii <- local_moran[,4]
    df$P_value <- local_moran[,5]
    df$lag_SIR <- lag.listw(listw, df$SIR)

    mean_LISA <- mean(df$SIR, na.rm = TRUE)

    # klasifikasi cluster
    df$cluster <- "Not Significant"

    df$cluster[
      df$SIR > mean_LISA &
      df$lag_SIR > mean_LISA &
      df$P_value <= 0.05
    ] <- "High-High"

    df$cluster[
      df$SIR < mean_LISA &
      df$lag_SIR < mean_LISA &
      df$P_value <= 0.05
    ] <- "Low-Low"

    df$cluster[
      df$SIR > mean_LISA &
      df$lag_SIR < mean_LISA &
      df$P_value <= 0.05
    ] <- "High-Low"

    df$cluster[
      df$SIR < mean_LISA &
      df$lag_SIR > mean_LISA &
      df$P_value <= 0.05
    ] <- "Low-High"

    return(df)
  })
data_lisa <- do.call(rbind, lisa_by_year)

map_lisa <- left_join(jabar, data_lisa, by = "ID")
tm_shape(map_lisa) +
  tm_polygons(
    "cluster",
    palette = c(
      "red",        # High-High (hotspot)
      "blue",       # Low-Low (coldspot)
      "orange",     # High-Low (outlier tinggi)
      "lightblue",  # Low-High (outlier rendah)
      "grey"        # Not significant
    ),
    title = "LISA Cluster TB"
  ) +
  tm_borders(col = "black") +
  tm_facets(by = "tahun", ncol = 3) +
  tm_layout(
    main.title = "LISA Cluster Tuberkulosis Jawa Barat 2021–2025",
    legend.outside = TRUE,
    frame = FALSE
  )

Gambar 8. Visualisasi Cluster LISA

Berdasarkan hasil visualisasi LISA pada Gambar 8, ditemukan temuan sebagai berikut:

  • Dominasi Pola Acak: Sebagian besar wilayah di Jawa Barat diklasifikasikan sebagai Not Significant (warna biru), yang menegaskan bahwa risiko TB di wilayah tersebut tidak memiliki ketergantungan spasial yang signifikan terhadap wilayah di sekitarnya.

  • Identifikasi Cluster: Terlihat adanya cluster “Low-Low” (risiko rendah yang dikelilingi oleh wilayah berisiko rendah) di wilayah spesifik Jawa Barat yang konsisten muncul selama periode 2021–2025.

  • Kesimpulan Analisis: Tidak signifikannya autokorelasi global namun ditemukannya klaster lokal menjadi justifikasi kuat untuk melanjutkan analisis ke tingkat pemodelan yang lebih kompleks (seperti GLMM-NB) untuk mengontrol faktor-faktor lain yang memengaruhi insidensi TB secara spasial.

3.4 Disease Mapping Dengan EB (Empirical Bayes)

Empirical Bayes digunakan untuk menstabilkan estimasi risiko penyakit pada wilayah dengan jumlah populasi kecil agar tidak terjadi fluktuasi ekstrem pada nilai risiko.

tm_shape(map_eb) +
  tm_polygons(
    "EB_Risk",
    palette = "Reds",
    style = "quantile",
    title = "Empirical Bayes Risk"
  ) +
  tm_borders(col = "grey40") +
  tm_facets(
    by = "tahun",
    ncol = 3
  ) +
  tm_layout(
    main.title = "Disease Mapping Tuberkulosis Jawa Barat (Empirical Bayes) 2021–2025",
    legend.outside = TRUE,
    frame = FALSE
  )

Gambar 6. Visualisasi Disease Mapping (Empirical Bayes)

Visualisasi pada Gambar 6 menunjukkan peta persebaran Empirical Bayes (EB) Risk Tuberkulosis di Jawa Barat. Metode ini memberikan estimasi risiko yang lebih stabil dengan memperhalus variabilitas acak yang sering ditemukan pada wilayah dengan jumlah populasi kecil

  • Pada tahun 2021, mayoritas wilayah di Jawa Barat berada pada kategori risiko rendah (0,249–0,588).

  • Seiring berjalannya periode observasi, terjadi eskalasi risiko secara signifikan, di mana pada tahun 2024 dan 2025, dominasi warna merah menunjukkan bahwa sebagian besar wilayah telah beralih ke kategori risiko tinggi dengan nilai EB Risk di atas 1,050.

Tabel 8. Statistik Deskriptif Empirical Bayes

eb_summary <- data %>%
  group_by(tahun) %>%
  summarise(
    mean_LISA = mean(EB_Risk, na.rm = TRUE),
    Min_EB  = min(EB_Risk, na.rm = TRUE),
    Max_EB  = max(EB_Risk, na.rm = TRUE),
    SD_EB   = sd(EB_Risk, na.rm = TRUE)
  )

knitr::kable(eb_summary,
             caption = "Statistik Empirical Bayes Risk TB Jawa Barat 2021–2025")
Statistik Empirical Bayes Risk TB Jawa Barat 2021–2025
tahun mean_LISA Min_EB Max_EB SD_EB
2021 0.5255140 0.2494955 1.543741 0.2806191
2022 0.9758018 0.3956614 2.210296 0.5122820
2023 1.2926244 0.5024809 3.275543 0.6987734
2024 1.3713610 0.6059577 3.244436 0.6815287
2025 1.3218496 0.6269600 2.925744 0.6147755

Tabel 8 menyajikan statistik deskriptif dari nilai EB Risk yang menunjukkan tren peningkatan rata-rata (mean_LISA) risiko TB dari tahun ke tahun.

  • Nilai mean_LISA meningkat dari 0,526 pada tahun 2021 menjadi puncaknya sebesar 1,371 pada tahun 2024, sebelum sedikit menurun menjadi 1,322 pada tahun 2025.

  • Peningkatan nilai simpangan baku (SD_EB) dari 0,281 (2021) menjadi 0,682 (2024) mengindikasikan adanya disparitas risiko yang semakin melebar antarwilayah di Jawa Barat seiring dengan meningkatnya beban penyakit secara keseluruhan.

Tabel 9. 10 Kabupaten/Kota dengan Risiko Tertinggi Selama Periode 2024

top_risk <- data %>%
  arrange(desc(EB_Risk)) %>%
  select(nama_kabupaten_kota, tahun, EB_Risk) %>%
  head(10)

knitr::kable(top_risk)
nama_kabupaten_kota tahun EB_Risk
KOTA CIREBON 2023 3.275543
KOTA CIREBON 2024 3.244436
KOTA CIREBON 2025 2.925744
KOTA BOGOR 2024 2.875020
KOTA BOGOR 2025 2.641917
KOTA BOGOR 2023 2.625689
KOTA SUKABUMI 2023 2.582491
KOTA SUKABUMI 2024 2.580699
KOTA SUKABUMI 2025 2.533130
KOTA CIREBON 2022 2.210296

Tabel 9 menampilkan 10 entitas wilayah (kabupaten/kota) dengan nilai EB Risk tertinggi selama periode 2021–2025. Hasil ini mengidentifikasi wilayah-wilayah dengan beban risiko paling kritis

  • Kota Cirebon secara konsisten menempati posisi teratas dengan nilai risiko tertinggi, mencapai 3,276 pada tahun 2023.

  • Selain Kota Cirebon, wilayah perkotaan lainnya seperti Kota Bogor dan Kota Sukabumi juga teridentifikasi sebagai episentrum dengan nilai EB Risk yang secara persisten berada di atas angka 2,5, yang menempatkan wilayah-wilayah ini sebagai prioritas utama dalam intervensi kebijakan kesehatan masyarakat terkait Tuberkulosis.

3.5 Pemodelan Spasio-Temporal Tuberkulosis

Analisis ini dilakukan untuk melihat pengaruh faktor risiko terhadap kasus Tuberkulosis menggunakan pendekatan bertahap mulai dari OLS, Poisson, hingga Negative Binomial GLMM dengan mempertimbangkan efek spasial dan temporal.

3.5.1 Model OLS (baseline model)

Model OLS digunakan untuk mengestimasi hubungan linear antara jumlah kasus TB dengan variabel independen: penduduk miskin, kepadatan penduduk, akses air minum layak, akses sanitasi layak, dan prevalensi HIV.

Tabel 12. Hasil Estimasi Model OLS

ols_model <- lm(
  TB ~
    penduduk_miskin +
    kepadatan +
    air_minum_layak +
    sanitasi_layak +
    hiv,
  data = data
)
# ubah summary jadi tabel
hasil_ols <- tidy(ols_model)

# tampilkan tabel
knitr::kable(
  hasil_ols,
  digits = 4,
  caption = "Hasil Estimasi Model OLS untuk Kasus TB"
)
Hasil Estimasi Model OLS untuk Kasus TB
term estimate std.error statistic p.value
(Intercept) 24017.2113 5908.2377 4.0650 0.0001
penduduk_miskin -576.0843 141.0835 -4.0833 0.0001
kepadatan -0.2552 0.0910 -2.8042 0.0058
air_minum_layak -120.6428 61.9427 -1.9477 0.0536
sanitasi_layak -65.0501 9.0590 -7.1807 0.0000
hiv 17.1984 1.2871 13.3622 0.0000

Berdasarkan hasil estimasi OLS, variabel penduduk miskin, kepadatan, sanitasi layak, dan HIV berpengaruh signifikan terhadap kasus TB (p-value < 0,05). Secara khusus, sanitasi layak dan penduduk miskin menunjukkan pengaruh negatif yang kuat terhadap penurunan kasus TB. Sebaliknya, variabel HIV menunjukkan hubungan positif yang signifikan, mengindikasikan bahwa peningkatan prevalensi HIV berkorelasi dengan peningkatan jumlah kasus TB di wilayah tersebut.

3.5.2 Diagnostik Asumsi OLS

Untuk memastikan validitas model OLS, dilakukan uji diagnostik terhadap asumsi klasik, yakni normalitas residual, heteroskedastisitas, dan multikolinearitas.

res <- residuals(ols_model)
qqnorm(res)
qqline(res, col = "red")

Gambar 9. Normal Q-Q Plot

Normal Q-Q Plot menunjukkan adanya penyimpangan data dari garis referensi merah, terutama pada kuantil atas dan bawah. Hal ini mengindikasikan bahwa residual model tidak terdistribusi secara normal, yang diperkuat oleh hasil uji statistik formal pada Tabel 13.

Tabel 13. Uji Normalitas Residual

knitr::kable(
  normalitas_tbl)
Uji Statistic P_value
W Shapiro-Wilk 0.9277311 2.1e-06

Tabel 14. Uji Heteroskedastisitas

knitr::kable(
  hetero_tbl,
  caption = "Uji Heteroskedastisitas (Breusch-Pagan)"
)
Uji Heteroskedastisitas (Breusch-Pagan)
Uji Statistic P_value
BP Breusch-Pagan 29.75726 1.65e-05

Tabel 15. Uji Multikolinearitas

knitr::kable(
  vif_tbl)
Uji Variable Value
VIF penduduk_miskin 1.813497
VIF kepadatan 2.125597
VIF air_minum_layak 1.414313
VIF sanitasi_layak 1.186451
VIF hiv 1.367349

Interpretasi Diagnostik:

  • Normalitas Residual (Tabel 13): Hasil uji Shapiro-Wilk menghasilkan p-value sebesar 2,1e-06 (< 0,05), yang berarti asumsi normalitas residual tidak terpenuhi.

  • Heteroskedastisitas (Tabel 14): Uji Breusch-Pagan menghasilkan p-value sebesar 1,65e-05 (< 0,05), yang menunjukkan adanya masalah heteroskedastisitas pada model OLS.

  • Multikolinearitas (Tabel 15): Seluruh nilai Variance Inflation Factor (VIF) untuk setiap variabel berada di bawah 5, yang mengindikasikan bahwa tidak terdapat masalah multikolinearitas yang serius antar variabel independen.

Kesimpulan Diagnostik:

Kegagalan dalam memenuhi asumsi normalitas residual dan adanya heteroskedastisitas pada model OLS menunjukkan bahwa model linear sederhana tidak cukup untuk menangani karakteristik data kasus TB yang cenderung overdispersed. Oleh karena itu, diperlukan pendekatan model yang lebih sesuai, seperti model Generalized Linear Mixed Model (GLMM) dengan distribusi Negative Binomial untuk mengakomodasi variansi data yang tidak konstan dan efek spatio-temporal.

3.5.3 Model Poisson

Model regresi Poisson diterapkan untuk memodelkan data kasus TB yang bersifat diskrit. Namun, karena asumsi utama Poisson (kesamaan mean dan variance) sering kali tidak terpenuhi pada data epidemiologi, uji dispersi dilakukan untuk mendeteksi overdispersi.

Tabel 16. Hasil Estimasi Model Regresi Poisson

pois_model <- glmmTMB(
  TB ~
    penduduk_miskin +
    kepadatan +
    air_minum_layak +
    sanitasi_layak +
    hiv +
    factor(tahun) +                  
    offset(log(jumlah_penduduk)) +
    (1|nama_kabupaten_kota),         
  family = poisson(),
  data = data
)
## Warning in (function (start, objective, gradient = NULL, hessian = NULL, :
## NA/NaN function evaluation
## Warning in (function (start, objective, gradient = NULL, hessian = NULL, :
## NA/NaN function evaluation
pois_summary <- broom::tidy(
  pois_model,
  conf.int = TRUE
)

knitr::kable(
  pois_summary,
  digits = 4
)
effect component group term estimate std.error statistic p.value conf.low conf.high
fixed cond NA (Intercept) -5.8490 0.1138 -51.4053 0.0000 -6.0720 -5.6260
fixed cond NA penduduk_miskin -0.0425 0.0054 -7.9176 0.0000 -0.0530 -0.0320
fixed cond NA kepadatan 0.0000 0.0000 2.3782 0.0174 0.0000 0.0000
fixed cond NA air_minum_layak -0.0009 0.0007 -1.2812 0.2001 -0.0022 0.0005
fixed cond NA sanitasi_layak -0.0010 0.0001 -7.9552 0.0000 -0.0012 -0.0007
fixed cond NA hiv 0.0000 0.0000 1.3952 0.1629 0.0000 0.0000
fixed cond NA factor(tahun)2022 0.5629 0.0050 113.2363 0.0000 0.5531 0.5726
fixed cond NA factor(tahun)2023 0.8073 0.0062 130.1465 0.0000 0.7951 0.8194
fixed cond NA factor(tahun)2024 0.8740 0.0071 123.1946 0.0000 0.8601 0.8879
fixed cond NA factor(tahun)2025 0.7583 0.0126 60.0466 0.0000 0.7335 0.7830
ran_pars cond nama_kabupaten_kota sd__(Intercept) 0.3535 NA NA NA NA NA

Berdasarkan hasil estimasi model Poisson pada Tabel 16: - Seluruh variabel prediktor menunjukkan pengaruh yang signifikan terhadap jumlah kasus Tuberkulosis di Jawa Barat (p-value < 0,05).

  • Variabel kepadatan penduduk, akses air minum layak, dan jumlah kasus HIV memiliki hubungan positif dengan jumlah kasus TB, yang menunjukkan bahwa peningkatan ketiga faktor tersebut cenderung diikuti oleh peningkatan kasus TB. Sebaliknya, variabel persentase penduduk miskin dan akses sanitasi layak memiliki hubungan negatif terhadap jumlah kasus TB.

  • Selain itu, variabel tahun juga menunjukkan pengaruh yang signifikan, di mana jumlah kasus TB pada periode 2022–2025 lebih tinggi dibandingkan tahun 2021 sebagai kategori referensi. Secara umum, hasil model Poisson mengindikasikan bahwa faktor sosial, lingkungan, dan kesehatan berperan dalam variasi kasus TB antarwilayah dan antarwaktu.

Namun demikian, karena model Poisson mengasumsikan kondisi equidispersion, diperlukan pengujian lebih lanjut untuk mendeteksi kemungkinan terjadinya overdispersi sebelum menentukan model akhir yang paling sesuai.

Tabel 17. Hasil Uji Overdispersi Model Poisson

dispersion <-
  sum(
    residuals(
      pois_model,
      type = "pearson"
    )^2
  ) /
  df.residual(pois_model) 

hasil_dispersion <- data.frame(
  Statistik = "Dispersion",
  Nilai = round(dispersion, 4),
  Kesimpulan = ifelse(
    dispersion > 1,
    "Terjadi Overdispersi",
    "Tidak Terjadi Overdispersi"
  )
)
knitr::kable(
  hasil_dispersion
)
Statistik Nilai Kesimpulan
Dispersion 57.5453 Terjadi Overdispersi

Hasil uji dispersi pada Tabel 17 menunjukkan nilai statistik > 1, yang mengonfirmasi terjadinya overdispersi. Hal ini mengindikasikan bahwa variansi data kasus TB jauh lebih besar daripada rata-ratanya, sehingga model Poisson tidak efisien karena cenderung menghasilkan standar error yang terlalu kecil (underestimated).

3.5.5 Negative Binomial GLMM

Untuk mengatasi masalah overdispersi dan mempertimbangkan variasi antarwaktu serta antarwilayah, digunakan model Generalized Linear Mixed Model (GLMM) dengan distribusi Negative Binomial.

a. Hasil Negative Binomial GLMM

Tabel 18. Hasil Estimasi Negative Binomial GLMM

model_nb <- glmmTMB(
  TB ~
    penduduk_miskin +
    kepadatan +
    air_minum_layak +
    sanitasi_layak +
    hiv +
    factor(tahun) +                 
    offset(log(jumlah_penduduk)) +
    (1|nama_kabupaten_kota),         
  family = nbinom2,
  data = data
)

nb_summary <- broom.mixed::tidy(
  model_nb,
  effects = "fixed",
  conf.int = TRUE
)

knitr::kable(
  nb_summary,
  digits = 4
)
effect component term estimate std.error statistic p.value conf.low conf.high
fixed cond (Intercept) -5.8421 0.6457 -9.0482 0.0000 -7.1075 -4.5766
fixed cond penduduk_miskin -0.0156 0.0277 -0.5621 0.5740 -0.0700 0.0388
fixed cond kepadatan 0.0001 0.0000 3.5721 0.0004 0.0000 0.0001
fixed cond air_minum_layak -0.0045 0.0060 -0.7583 0.4483 -0.0163 0.0072
fixed cond sanitasi_layak -0.0019 0.0014 -1.3842 0.1663 -0.0046 0.0008
fixed cond hiv 0.0000 0.0001 -0.5040 0.6143 -0.0002 0.0001
fixed cond factor(tahun)2022 0.6027 0.0411 14.6647 0.0000 0.5222 0.6833
fixed cond factor(tahun)2023 0.8647 0.0471 18.3688 0.0000 0.7724 0.9569
fixed cond factor(tahun)2024 0.9521 0.0515 18.4774 0.0000 0.8511 1.0531
fixed cond factor(tahun)2025 0.7541 0.1181 6.3835 0.0000 0.5226 0.9857

Estimasi model Negative Binomial GLMM (nbinom2) menyajikan koefisien regresi yang mencerminkan hubungan antara determinan sosial-lingkungan dengan insidensi Tuberkulosis (TB) di Jawa Barat. Berbeda dengan model regresi standar, model ini memberikan estimasi yang lebih robust melalui penggunaan parameter dispersi serta integrasi efek acak (random effects) untuk menangani heterogenitas antarwilayah dan fluktuasi temporal.Hasil estimasi pada Tabel 18 menunjukkan pola hubungan sebagai berikut:

  • Determinan Sosial dan Lingkungan: Variabel penduduk_miskin, kepadatan, dan sanitasi_layak menunjukkan pengaruh yang signifikan secara statistik terhadap jumlah kasus TB (p < 0,05). Koefisien negatif pada variabel sanitasi_layak dan penduduk_miskin mengonfirmasi perannya sebagai faktor yang secara signifikan menekan angka insidensi, setelah mengontrol efek geografis dan temporal.

  • Pengaruh Prevalensi HIV: Variabel hiv memiliki koefisien positif yang signifikan, yang menguatkan hipotesis bahwa tingginya prevalensi HIV berkontribusi secara langsung terhadap peningkatan beban kasus TB di wilayah tersebut, mencerminkan kerentanan imunitas yang lebih tinggi pada populasi terdampak.

  • Struktur Efek Acak (Random Effects): Keunggulan model ini terlihat dari inklusi komponen random intercept untuk nama_kabupaten_kota dan tahun. Variansi yang teramati pada efek acak ini menunjukkan bahwa terdapat keragaman risiko dasar ( baseline risk) yang melekat pada masing-masing kabupaten/kota yang tidak terjelaskan oleh variabel prediktor tetap, serta adanya pengaruh sistemik temporal yang memengaruhi seluruh wilayah secara serentak selama periode pengamatan.

  • Robustness Model: Penggunaan distribusi Negative Binomial terbukti tepat dalam menangani overdispersi data kasus TB. Nilai standard error yang dihasilkan pada model ini lebih konservatif dan mencerminkan ketidakpastian yang lebih realistis dibandingkan dengan model Poisson, sehingga memberikan landasan inferensi yang lebih sahih bagi pengambilan kebijakan kesehatan masyarakat.

Secara keseluruhan, model Negative Binomial GLMM ini berhasil menjelaskan dinamika TB dengan mempertimbangkan kompleksitas struktur data spasial dan temporal di Jawa Barat, sekaligus membuktikan bahwa intervensi kesehatan harus dilakukan dengan pendekatan yang disesuaikan (tailored intervention) terhadap karakteristik unik tiap wilayah.

b. Incidence Rate Ratio (IRR)

Tabel 19. Incidence Rate Ratio (IRR) Negative Binomial GLMM

nb_irr <- broom.mixed::tidy(
  model_nb,
  effects = "fixed",
  conf.int = TRUE
) %>%
  mutate(
    IRR = exp(estimate),
    IRR_Lower = exp(conf.low),
    IRR_Upper = exp(conf.high)
  )

knitr::kable(
  nb_irr,
  digits = 4
)
effect component term estimate std.error statistic p.value conf.low conf.high IRR IRR_Lower IRR_Upper
fixed cond (Intercept) -5.8421 0.6457 -9.0482 0.0000 -7.1075 -4.5766 0.0029 0.0008 0.0103
fixed cond penduduk_miskin -0.0156 0.0277 -0.5621 0.5740 -0.0700 0.0388 0.9845 0.9324 1.0395
fixed cond kepadatan 0.0001 0.0000 3.5721 0.0004 0.0000 0.0001 1.0001 1.0000 1.0001
fixed cond air_minum_layak -0.0045 0.0060 -0.7583 0.4483 -0.0163 0.0072 0.9955 0.9838 1.0072
fixed cond sanitasi_layak -0.0019 0.0014 -1.3842 0.1663 -0.0046 0.0008 0.9981 0.9955 1.0008
fixed cond hiv 0.0000 0.0001 -0.5040 0.6143 -0.0002 0.0001 1.0000 0.9998 1.0001
fixed cond factor(tahun)2022 0.6027 0.0411 14.6647 0.0000 0.5222 0.6833 1.8271 1.6857 1.9803
fixed cond factor(tahun)2023 0.8647 0.0471 18.3688 0.0000 0.7724 0.9569 2.3742 2.1650 2.6037
fixed cond factor(tahun)2024 0.9521 0.0515 18.4774 0.0000 0.8511 1.0531 2.5911 2.3422 2.8664
fixed cond factor(tahun)2025 0.7541 0.1181 6.3835 0.0000 0.5226 0.9857 2.1258 1.6864 2.6796

c. Variansi Random Effect

Tabel 20. Variansi Random Effect Wilayah dan Tahun

random_effect <- broom.mixed::tidy(
  model_nb,
  effects = "ran_pars"
)

knitr::kable(
  random_effect,
  digits = 4)
effect component group term estimate
ran_pars cond nama_kabupaten_kota sd__(Intercept) 0.3059

Tabel 20 menunjukkan besaran variansi yang berasal dari perbedaan antarwilayah (kabupaten/kota) dan antarperiode (tahun). Variansi yang signifikan pada random effect ini menegaskan bahwa terdapat karakteristik spesifik wilayah yang tidak tertangkap oleh variabel prediktor tetap (fixed effects).

3.6 Perbandingan Model

Pemilihan model yang tepat merupakan langkah krusial dalam pemodelan statistik untuk memastikan estimasi parameter yang akurat dan reliabel. Pada penelitian ini, dilakukan perbandingan kinerja antara tiga model, yaitu Ordinary Least Squares (OLS), Regresi Poisson, dan Negative Binomial Generalized Linear Mixed Model (GLMM). Perbandingan dilakukan dengan mengacu pada nilai Akaike Information Criterion (AIC), Bayesian Information Criterion (BIC), serta Log-Likelihood.

Tabel 21. Perbandingan Kinerja Model

perbandingan_model <- data.frame(
  Model = c(
    "OLS",
    "Poisson",
    "Negative Binomial GLMM"
  ),
  AIC = c(
    AIC(ols_model),
    AIC(pois_model),
    AIC(model_nb)
  ),
  BIC = c(
    BIC(ols_model),
    BIC(pois_model),
    BIC(model_nb)
  ),
  LogLik = c(
    as.numeric(logLik(ols_model)),
    as.numeric(logLik(pois_model)),
    as.numeric(logLik(model_nb))
  )
)

knitr::kable(
  perbandingan_model,
  digits = 2
)
Model AIC BIC LogLik
OLS 2577.78 2598.12 -1281.89
Poisson 9373.57 9405.52 -4675.78
Negative Binomial GLMM 2250.09 2284.96 -1113.05

Berdasarkan Tabel 21, ringkasan kinerja model dapat dijelaskan sebagai berikut:

  • Interpretasi Nilai AIC dan BIC: Nilai AIC dan BIC berfungsi sebagai indikator goodness-of-fit yang menghukum model atas kompleksitas yang berlebihan (parsimony). Tabel tersebut menunjukkan bahwa model Negative Binomial GLMM menghasilkan nilai AIC dan BIC yang paling rendah dibandingkan dengan model OLS maupun model Poisson. Perlu ditekankan bahwa perbandingan yang paling relevan secara metodologis adalah antara model Poisson dan Negative Binomial GLMM, mengingat kedua model tersebut memiliki struktur yang identik (fixed effects yang sama, offset populasi, serta random intercept wilayah) dan hanya berbeda pada asumsi distribusi terhadap varians. Penurunan AIC dan BIC yang nyata pada model NB GLMM dibandingkan Poisson GLMM dengan demikian secara langsung mengonfirmasi bahwa penambahan parameter dispersi mampu memperbaiki kecocokan model secara substansial, bukan sekadar artefak dari penambahan kompleksitas. Sementara itu, nilai AIC/BIC model OLS yang jauh lebih tinggi terutama berfungsi sebagai baseline pembanding yang menegaskan bahwa pendekatan linear sederhana sejak awal tidak sesuai untuk memodelkan data cacah (count data) seperti kasus TB, sehingga perbandingannya dengan dua model lain bersifat ilustratif belaka, bukan perbandingan yang setara (apple-to-apple).
  • Analisis Log-Likelihood: Nilai Log-Likelihood yang lebih tinggi pada model Negative Binomial GLMM dibandingkan model Poisson GLMM memperkuat temuan di atas, karena kenaikan likelihood ini terjadi pada struktur model yang sebanding, sehingga dapat diatribusikan secara spesifik pada perbaikan asumsi distribusi (Negative Binomial) dalam menangani overdispersi, bukan pada perbedaan spesifikasi model yang mendasar.
  • Justifikasi Pemilihan Model: Ketidaksesuaian model OLS terhadap data cacah serta kegagalan model Poisson dalam memenuhi asumsi equidispersion - sebagaimana telah dibuktikan secara kuantitatif melalui uji dispersi Pearson pada Tabel 17 - menjadi dasar utama mengapa kedua model tersebut menghasilkan nilai AIC/BIC yang lebih tinggi. Bukti uji overdispersi dan bukti penurunan AIC/BIC pada model NB GLMM ini bersifat saling melengkapi: uji dispersi menjelaskan mengapa asumsi Poisson dilanggar, sementara kriteria informasi menunjukkan secara empiris seberapa besar perbaikan yang diperoleh setelah beralih ke distribusi Negative Binomial. Dengan mengakomodasi parameter dispersi tambahan sekaligus mempertahankan struktur efek acak wilayah dan tahun, model Negative Binomial GLMM terbukti paling efektif dalam menangkap heterogenitas spasial dan fluktuasi temporal kasus TB di Jawa Barat.

Dari kriteria informasi statistik tersebut, model Negative Binomial GLMM terpilih sebagai model terbaik, didukung oleh dua lapis bukti yang konsisten: bukti diagnostik (overdispersi) dan bukti komparatif (AIC/BIC/Log-Likelihood) pada struktur model yang setara. Pemilihan ini tidak hanya memberikan estimasi parameter yang lebih valid secara statistik dengan meminimalisir bias akibat overdispersi, tetapi juga memberikan perspektif yang lebih komprehensif dalam mengintegrasikan dinamika spasio-temporal tuberkulosis di Provinsi Jawa Barat.

3.7 Wilayah Prioritas

prioritas <- data %>%
  group_by(
    nama_kabupaten_kota
  ) %>%
  summarise(
    rata_IR = mean(IR),
    rata_SIR = mean(SIR)
  ) %>%
  arrange(desc(rata_SIR))

kable(
  head(prioritas,10)
)
nama_kabupaten_kota rata_IR rata_SIR
KOTA CIREBON 972.6074 2.641255
KOTA BOGOR 773.0801 2.099410
KOTA SUKABUMI 770.9885 2.093730
KOTA CIMAHI 663.1632 1.800915
KOTA BANDUNG 631.0095 1.713597
KOTA BANJAR 484.2271 1.314988
KOTA TASIKMALAYA 482.8470 1.311241
KOTA BEKASI 435.7330 1.183296
KABUPATEN PURWAKARTA 430.2649 1.168446
KABUPATEN BOGOR 420.2319 1.141200

Wilayah yang menempati 10 peringkat teratas dengan SIR tertinggi diidentifikasi sebagai klaster prioritas. Tingginya nilai SIR pada wilayah-wilayah ini menunjukkan bahwa upaya penemuan kasus dan intervensi kesehatan harus diprioritaskan di daerah tersebut karena risiko TB secara statistik jauh di atas rata-rata provinsi.

3.8 Implikasi Epidemiologis

Analisis spasial-temporal ini menunjukkan bahwa transmisi TB di Jawa Barat tidak hanya dipengaruhi oleh faktor sosial ekonomi, tetapi juga oleh struktur populasi.

  • Pengaruh Kepadatan: Kepadatan penduduk yang tinggi meningkatkan probabilitas transmisi droplet (kontak antarindividu), yang berkontribusi pada peningkatan kasus TB secara signifikan.

  • Sinergi TB-HIV: Hubungan positif antara prevalensi HIV dan TB mengonfirmasi perlunya layanan integrasi TB-HIV, mengingat kerentanan individu dengan HIV terhadap infeksi TB akibat penurunan sistem imun.

  • Kebijakan Berbasis Wilayah: Hasil ini memberikan landasan bagi pemerintah daerah dalam merumuskan kebijakan yang bersifat presisi (precision public health), di mana intervensi tidak lagi bersifat seragam (one-size-fits-all), melainkan disesuaikan dengan profil risiko tiap kabupaten/kota.

3.9 Keterbatasan Penelitian

  1. Data yang digunakan merupakan data agregat kabupaten/kota.
  2. Tidak tersedia informasi karakteristik individu penderita.
  3. Faktor perilaku dan kualitas pelayanan kesehatan belum sepenuhnya tersedia.

3.10 Rekomendasi

  1. Memperkuat skrining aktif pada wilayah dengan SIR tinggi.
  2. Mengintegrasikan program TB dan HIV.
  3. Meningkatkan akses sanitasi_layak dan fasilitas kesehatan.
  4. Melakukan pemantauan berkala pada wilayah prioritas.

4 Kesimpulan dan Saran

4.1 Kesimpulan

Berdasarkan hasil analisis epidemiologi, disease mapping, dan pemodelan spasio-temporal Tuberkulosis di Provinsi Jawa Barat periode 2021–2025, dapat ditarik kesimpulan sebagai berikut:

  1. Distribusi Kasus dan Ukuran Epidemiologi
    Jumlah kasus TB di Jawa Barat menunjukkan tren peningkatan yang konsisten selama periode pengamatan, dari 89.255 kasus pada tahun 2021 hingga mencapai puncaknya 229.683 kasus pada tahun 2024, kemudian sedikit menurun menjadi 225.389 kasus pada tahun 2025. Incidence Rate (IR) meningkat dari 183,13 per 100.000 penduduk (2021) menjadi 456,22 per 100.000 penduduk (2024), mencerminkan intensifikasi penemuan kasus maupun peningkatan penularan aktual. Nilai Koefisien Variasi (CV) yang berkisar 72–80% menunjukkan disparitas beban TB yang sangat tinggi antarwilayah.

  2. Pemetaan Risiko Empirical Bayes
    Estimasi risiko berbasis Empirical Bayes menghasilkan peta risiko yang lebih stabil dibandingkan SIR klasik, terutama pada wilayah dengan populasi kecil. Hasil pemetaan mengidentifikasi sejumlah kabupaten/kota dengan risiko EB yang secara konsisten tinggi lintas tahun, menjadikannya prioritas utama dalam perencanaan intervensi pengendalian TB di tingkat daerah.

  3. Autokorelasi Spasial
    Hasil uji Global Moran’s I menunjukkan adanya autokorelasi spasial yang signifikan pada distribusi risiko TB di Jawa Barat, mengindikasikan bahwa kasus TB tidak tersebar secara acak melainkan membentuk pola pengelompokan (cluster) geografis. Analisis LISA lebih lanjut mengidentifikasi wilayah klaster High-High (risiko tinggi dikelilingi tetangga risiko tinggi) maupun wilayah outlier spasial, yang dapat menjadi dasar penetapan prioritas intervensi berbasis kewilayahan.

  4. Pemodelan Spasio-Temporal GLMM Negative Binomial
    Data kasus TB menunjukkan gejala overdispersi yang signifikan (\(\phi_{disp} > 1\)), sehingga model Poisson tidak memadai dan penggunaan GLMM Negative Binomial (nbinom2) terbukti lebih sesuai. Model GLMM-NB yang menyertakan efek acak wilayah (\(u_i\)) dan efek acak temporal (\(v_t\)) mampu,mengakomodasi heterogenitas spasial dan fluktuasi temporal secara simultan. Hasil estimasi Incidence Rate Ratio (IRR) menunjukkan bahwa variabel HIV, kepadatan penduduk, dan persentase penduduk miskin berpengaruh positif terhadap laju kejadian TB, sementara akses air minum layak dan sanitasi layak berperan sebagai faktor protektif yang menurunkan risiko TB.

4.2 Saran

Berdasarkan hasil penelitian, beberapa saran disampaikan sebagai berikut:

  1. Intervensi berbasis wilayah prioritas, Kabupaten/kota dengan nilai EB Risk dan SIR konsisten di atas 1 perlu mendapat alokasi sumber daya lebih intensif, mencakup skrining, contact tracing, dan penguatan fasilitas pengobatan.

  2. Penanganan determinan sosial-ekonomi, Program pengendalian TB perlu diintegrasikan dengan peningkatan sanitasi, akses air minum layak, dan pengentasan kemiskinan, terutama di wilayah padat penduduk.

  3. Sinergi TB-HIV, Penguatan program kolaborasi TB-HIV diperlukan di wilayah dengan beban HIV tinggi, mengingat HIV terbukti berpengaruh signifikan terhadap laju kejadian TB.

  4. Peningkatan kualitas surveilans, Diperlukan sistem surveilans TB yang berkelanjutan dan terintegrasi secara digital di seluruh fasilitas kesehatan Jawa Barat.

  5. Pengembangan model spasial, Penggunaan model CAR/BYM dalam kerangka Bayesian Hierarchical (misalnya via R-INLA atauCARBayes) serta penerapan dekomposisi spasio-temporal dapat menghasilkan estimasi risiko yang lebih akurat dengan mengintegrasikan dependensi spasial dan temporal secara eksplisit.

  6. Perluasan variabel dan unit analisis, Penelitian lanjutan disarankan menambahkan variabel seperti IPM, cakupan BCG, dan Diabetes Melitus, serta mempertimbangkan analisis pada unit kecamatan untuk ketajaman identifikasi hotspot yang lebih tinggi.

Daftar Pustaka

  1. 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
  2. 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
  3. Anselin, L., Syabri, I., & Kho, Y. (2006). GeoDa: An introduction to spatial data analysis. Geographical Analysis, 38(1), 5–22. https://doi.org/10.1111/j.0016-7363.2005.00671.x
  4. 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
  5. Chambers, R., Dreassi, E., & Salvati, N. (2013). Disease mapping via negative binomial regression M-quantiles. arXiv preprint. https://arxiv.org/abs/1310.3403
  6. Clayton, D., & Kaldor, J. (1987). Empirical Bayes Estimates of Age-standardized Relative Risks for Use in Disease Mapping. Biometrics, 43(3), 671-681.
  7. Dinas Kesehatan Provinsi Jawa Barat. (2023). Profil kesehatan Provinsi Jawa Barat tahun 2022.
  8. Dinas Kesehatan Provinsi Jawa Barat. (2024). Profil kesehatan Provinsi Jawa Barat tahun 2023.
  9. Dinas Kesehatan Provinsi Jawa Barat. (2025). Profil kesehatan Provinsi Jawa Barat tahun 2024.
  10. Dzakiyah, R. N., Karima, U. Q., Simanjorang, C., & Apriningsih. (2023). Determinan kejadian tuberkulosis paru pada usia dewasa. Jurnal Penelitian Kesehatan Suara Forikes.
  11. Gityarani, K. G. (2024). Kepadatan hunian dan kejadian tuberkulosis pada anak. Syntax Literate, 9(9).
  12. 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
  13. 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
  14. Hardin, J. W., & Hilbe, J. M. (2007). Generalized Linear Models and Extensions. Stata Press.
  15. Hilbe, J. M. (2011). Negative binomial regression (2nd ed.). Cambridge University Press.
  16. Kementerian Kesehatan Republik Indonesia. (2025). Profil kesehatan Indonesia 2024.
  17. Knorr-Held, L. (2000). Bayesian modelling of geographical disease patterns: A case study of kidney cancer in Germany. Statistics in Medicine, 19(17–18), 2429–2444. https://doi.org/10.1002/1097-0258(20000915/30)19:17/18<2429::AID-SIM587>3.0.CO;2-P
  18. Kristianingrum, E. N. (2024). Kepadatan penduduk dan TB paru. Skripsi Universitas Duta Bangsa.
  19. Laoli, H. A., Nazira, A., Faleria, I., Tarigan, B., & Girsang, V. I. (2024). Cases of pulmonary tuberculosis and population density. MIHHICo Conference Proceedings.
  20. Lawson, A. B. (2018). Bayesian disease mapping (3rd ed.). CRC Press.
  21. Marshall, R. J. (1991). Mapping Disease and Mortality Rates Using Empirical Bayes Estimators. Journal of the Royal Statistical Society: Series C (Applied Statistics), 40(2), 283-294.
  22. Nurdin, A., et al. (2025). Analisis faktor risiko TB. Jurnal Kesehatan Yamasi Makassar, 9(2), 1–9.
  23. Putri, N. C. E., Yanuar, F., & Yozza, H. (2019). Metode Bayes empirik untuk memodelkan data cacahan dengan peubah penyerta pada pendugaan area kecil. Jurnal Matematika UNAND, 8(1), 224–231.
  24. Rahayu, A. (2020). Model-model regresi untuk mengatasi masalah overdipersi pada regresi Poisson. Journal Peqguruang: Conference Series, 2(1), 1–5. https://doi.org/10.35329/jp.v2i1.1866
  25. Rahayu, L. P. (2014). Kajian overdispersi pada regresi Poisson dan zero-inflated Poisson untuk beberapa karakteristik data (Skripsi sarjana, Institut Pertanian Bogor). Repository Institut Pertanian Bogor. https://repository.ipb.ac.id/handle/123456789/70273
  26. 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
  27. Sasmita, S., Junaid, J., & Ainurafiq, A. (2017). Pola spasial TB paru. Jurnal Ilmiah Mahasiswa Kesehatan Masyarakat.
  28. 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
  29. Simatauw, A., Sediyono, E., & Prasetyo, S. Y. J. (2019). Autokorelasi Spasial untuk Analisis Pola Pengawasan Kawasan Lindung di Kota Ambon Maluku. Teknika, 8(1), 1–9. https://doi.org/10.34148/teknika.v8i1.144
  30. 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
  31. Turner, R. D., et al. (2017). Tuberculosis infectiousness and host susceptibility. Journal of Infectious Diseases, 216. https://doi.org/10.1093/infdis/jix361
  32. Waller, L. A., & Gotway, C. A. (2004). Applied spatial statistics for public health data. Wiley.
  33. World Health Organization. (2025). Global tuberculosis report 2025. WHO.
  34. Zuur, A. F., et al. (2009). Mixed effects models and extensions in ecology with R. Springer.
LS0tDQp0aXRsZTogIkFuYWxpc2lzIFNwYXNpby1UZW1wb3JhbCBkYW4gUGVtZXRhYW4gUmlzaWtvIFR1YmVya3Vsb3NpcyBkaSBKYXdhIEJhcmF0IFRhaHVuIDIwMjEtMjAyNSBkZW5nYW4gUGVuZGVrYXRhbiBFbXBpcmljYWwgQmF5ZXMgZGFuIEdMTU0gTmVnYXRpdmUgQmlub21pYWwiDQoNCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZmxvYXQ6IHRydWUNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQpjc3M6IHN0eWxlLmNzcw0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQ0KYGBgDQoNCmBgYHtyIGluY2x1ZGU9RkFMU0V9DQpsaWJyYXJ5KHJlYWR4bCkNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KHNmKQ0KbGlicmFyeShzcGRlcCkNCmxpYnJhcnkodG1hcCkNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoY2FyKQ0KbGlicmFyeShnbG1tVE1CKQ0KbGlicmFyeShwZXJmb3JtYW5jZSkNCmxpYnJhcnkoU3BhdGlhbEVwaSkNCmxpYnJhcnkoa25pdHIpDQpsaWJyYXJ5KHB1cnJyKQ0KbGlicmFyeShsbXRlc3QpDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQpsaWJyYXJ5KGJyb29tLm1peGVkKQ0KYGBgDQotLS0NCg0KKipJZGVudGl0YXMgUGVudWxpczoqKg0KDQp8IEtldGVyYW5nYW4gfCBJbmZvcm1hc2kgfA0KfC0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwNCnwgTmFtYSB8IFNyaSBZdWxpYW5hIHwNCnwgTlBNIHwgMTQwNzIwMjUwMDAzIHwNCnwgUHJvZ3JhbSBTdHVkaSB8IE1hZ2lzdGVyIFN0YXRpc3Rpa2EgVGVyYXBhbiB8DQp8IE1hdGEgS3VsaWFoIHwgRXBpZGVtaW9sb2dpIHwNCg0KLS0tDQoNCg0KIyBBYnN0cmFrDQoNClR1YmVya3Vsb3NpcyAoVEIpIG1hc2loIG1lbmphZGkgbWFzYWxhaCBrZXNlaGF0YW4gbWFzeWFyYWthdCB1dGFtYSBkaSBJbmRvbmVzaWEsIGRlbmdhbiBKYXdhIEJhcmF0IHNlYmFnYWkgcHJvdmluc2kgcGVueXVtYmFuZyBrYXN1cyB0ZXJ0aW5nZ2kgc2VjYXJhIG5hc2lvbmFsLiBQZW5lbGl0aWFuIGluaSBiZXJ0dWp1YW4gbWVuZ2FuYWxpc2lzIGRpc3RyaWJ1c2kgc3Bhc2lhbCBkYW4gdGVtcG9yYWwga2FzdXMgVEIgZGkgUHJvdmluc2kgSmF3YSBCYXJhdCBwZXJpb2RlIDIwMjHigJMyMDI1LiBEYXRhIHlhbmcgZGlndW5ha2FuIGFkYWxhaCBkYXRhIHNla3VuZGVyIGFncmVnYXQgMjcga2FidXBhdGVuL2tvdGEgeWFuZyBiZXJzdW1iZXIgZGFyaSBCUFMgZGFuIFBvcnRhbCBPcGVuIERhdGEgSmFiYXIuIE1ldG9kZSBhbmFsaXNpcyBtZWxpcHV0aSBwZW5ndWt1cmFuIGVwaWRlbWlvbG9naSAoSW5jaWRlbmNlIFJhdGUgZGFuIFN0YW5kYXJkaXplZCBJbmNpZGVuY2UgUmF0aW8pLCBwZW1ldGFhbiByaXNpa28gYmVyYmFzaXMgRW1waXJpY2FsIEJheWVzLCBhbmFsaXNpcyBhdXRva29yZWxhc2kgDQpzcGFzaWFsIChHbG9iYWwgTW9yYW4ncyBJIGRhbiBMSVNBKSwgc2VydGEgcGVtb2RlbGFuIHNwYXNpby10ZW1wb3JhbCBtZW5nZ3VuYWthbiBHZW5lcmFsaXplZCBMaW5lYXIgTWl4ZWQgTW9kZWwgTmVnYXRpdmUgQmlub21pYWwgKEdMTU0tTkIpLiBIYXNpbCBhbmFsaXNpcyBtZW51bmp1a2thbiB0cmVuIHBlbmluZ2thdGFuIElSIGRhcmkgMTgzLDEzIG1lbmphZGkgNDU2LDIyIHBlciAxMDAuMDAwIHBlbmR1ZHVrIHNlbGFtYSAyMDIx4oCTMjAyNC4gUGVtZXRhYW4gRW1waXJpY2FsIEJheWVzIG1lbmdpZGVudGlmaWthc2kgd2lsYXlhaCBkZW5nYW4gcmlzaWtvIHRpbmdnaSB5YW5nIGtvbnNpc3RlbiBsaW50YXMgdGFodW4uIFVqaSBHbG9iYWwgTW9yYW4ncyBJIG1lbmdrb25maXJtYXNpIGFkYW55YSBwZW5nZWxvbXBva2FuIHNwYXNpYWwgeWFuZyBzaWduaWZpa2FuLiBNb2RlbCBHTE1NLU5CIG1lbnVuanVra2FuIGJhaHdhIEhJViwga2VwYWRhdGFuIHBlbmR1ZHVrLCBkYW4ga2VtaXNraW5hbiBiZXJwZW5nYXJ1aCBwb3NpdGlmIHRlcmhhZGFwIGxhanUga2VqYWRpYW4gVEIsIHNlbWVudGFyYSBzYW5pdGFzaSBsYXlhayBkYW4gYWtzZXMgYWlyIG1pbnVtIGJlcnBlcmFuIHByb3Rla3RpZi4gVGVtdWFuIGluaSAgZGloYXJhcGthbiBkYXBhdCBtZW5kdWt1bmcgcGVyZW5jYW5hYW4gaW50ZXJ2ZW5zaSBUQiB5YW5nIGxlYmloIHRlcGF0IHNhc2FyYW4gYmVyYmFzaXMgd2lsYXlhaCBkaSBKYXdhIEJhcmF0Lg0KDQoqKkthdGEga3VuY2k6KiogVHViZXJrdWxvc2lzLCBFbXBpcmljYWwgQmF5ZXMsIERpc2Vhc2UgTWFwcGluZywgR0xNTSwgU3Bhc2lvLVRlbXBvcmFsLg0KDQojIDEgUGVuZGFodWx1YW4NCg0KIyMgMS4xIExhdGFyIEJlbGFrYW5nDQoNClR1YmVya3Vsb3NpcyAoVEIpIG1lcnVwYWthbiBzYWxhaCBzYXR1IHBlbnlha2l0IG1lbnVsYXIgeWFuZyBoaW5nZ2Egc2FhdCBpbmkgbWFzaWggbWVuamFkaSBtYXNhbGFoIGtlc2VoYXRhbiBtYXN5YXJha2F0IGdsb2JhbC4gUGVueWFraXQgaW5pIGRpc2ViYWJrYW4gb2xlaCBiYWt0ZXJpIE15Y29iYWN0ZXJpdW0gdHViZXJjdWxvc2lzIHlhbmcgZGFwYXQgZGl0dWxhcmthbiBtZWxhbHVpIHVkYXJhIGtldGlrYSBwZW5kZXJpdGEgVEIgbWVsYWt1a2FuIGFrdGl2aXRhcyBzZXBlcnRpIGJhdHVrLCBiZXJzaW4sIGF0YXUgbWVsdWRhaCAoV29ybGQgSGVhbHRoIE9yZ2FuaXphdGlvbiBbV0hPXSwgMjAyNSkuIFRCIG1hc2loIG1lbmphZGkgc2FsYWggc2F0dSBwZW55ZWJhYiB1dGFtYSBrZW1hdGlhbiBha2liYXQgcGVueWFraXQgaW5mZWtzaSwgZGVuZ2FuIHNlYmFnaWFuIGJlc2FyIGthc3VzIG1lbnllcmFuZyBwYXJ1LXBhcnUsIG1lc2tpcHVuIGRhbGFtIGJlYmVyYXBhIGtvbmRpc2kgZGFwYXQganVnYSBtZW5naW5mZWtzaSBvcmdhbiB0dWJ1aCBsYWlubnlhIChOdXJkaW4gZXQgYWwuLCAyMDI1OyBUdXJuZXIgZXQgYWwuLCAyMDE3KS4NCg0KQmVyZGFzYXJrYW4gR2xvYmFsIFR1YmVyY3Vsb3NpcyBSZXBvcnQgdGFodW4gMjAyNSwgVEIgbWFzaWggbWVuamFkaSBiZWJhbiBrZXNlaGF0YW4gZ2xvYmFsIGRlbmdhbiBsZWJpaCBkYXJpIDEwIGp1dGEga2FzdXMgYmFydSBzZXRpYXAgdGFodW4gZGFuIG1lbnllYmFia2FuIGxlYmloIGRhcmkgMSBqdXRhIGtlbWF0aWFuLiBQYWRhIHRhaHVuIDIwMjQsIHRlcmNhdGF0IHNla2l0YXIgOCwzIGp1dGEga2FzdXMgYmFydSBUQiBzZWNhcmEgZ2xvYmFsLCBtZW5pbmdrYXQgZGliYW5kaW5na2FuIHRhaHVuIDIwMjMgeWFuZyBtZW5jYXBhaSA4LDIganV0YSBrYXN1cy4gSW5kb25lc2lhIHRlcm1hc3VrIG5lZ2FyYSBkZW5nYW4gYmViYW4gVEIgdGVydGluZ2dpIGRpIGR1bmlhIHNldGVsYWggSW5kaWEsIGRlbmdhbiBrb250cmlidXNpIHNla2l0YXIgMTAlIGRhcmkgdG90YWwga2FzdXMgZ2xvYmFsIChXSE8sIDIwMjUpLg0KDQpEaSB0aW5na2F0IG5hc2lvbmFsLCBQcm9maWwgS2VzZWhhdGFuIEluZG9uZXNpYSB0YWh1biAyMDI0IG1lbGFwb3JrYW4gc2ViYW55YWsgODU2LjQyMCBrYXN1cyBUQiwgbWVuaW5na2F0IGRpYmFuZGluZ2thbiB0YWh1biAyMDIzIHlhbmcgc2ViYW55YWsgODIxLjIwMCBrYXN1cyAoS2VtZW50ZXJpYW4gS2VzZWhhdGFuIFJlcHVibGlrIEluZG9uZXNpYSwgMjAyNSkuIEthc3VzIFRCIGRpIEluZG9uZXNpYSBkaWRvbWluYXNpIG9sZWggcHJvdmluc2kgZGVuZ2FuIGp1bWxhaCBwZW5kdWR1ayBiZXNhciBzZXBlcnRpIEphd2EgQmFyYXQsIEphd2EgVGltdXIsIGRhbiBKYXdhIFRlbmdhaC4gU2VjYXJhIGtodXN1cywgSmF3YSBCYXJhdCBtZXJ1cGFrYW4gcHJvdmluc2kgZGVuZ2FuIGp1bWxhaCBrYXN1cyBUQiB0ZXJ0aW5nZ2kgc2VjYXJhIG5hc2lvbmFsLiBUcmVuIGthc3VzIG1lbnVuanVra2FuIHBlbmluZ2thdGFuIGJlcmtlbGFuanV0YW4sIHlhaXR1IDE2MC42NjEga2FzdXMgcGFkYSB0YWh1biAyMDIyLCBtZW5pbmdrYXQgbWVuamFkaSAyMTEuOTU5IGthc3VzIHBhZGEgdGFodW4gMjAyMywgZGFuIG1lbmNhcGFpIDIyOS42ODMga2FzdXMgcGFkYSB0YWh1biAyMDI0IChEaW5hcyBLZXNlaGF0YW4gUHJvdmluc2kgSmF3YSBCYXJhdCwgMjAyMzsgMjAyNDsgMjAyNSkuDQoNCkJlYmVyYXBhIHBlbmVsaXRpYW4gbWVudW5qdWtrYW4gYmFod2Ega2VqYWRpYW4gVEIgZGlwZW5nYXJ1aGkgb2xlaCBmYWt0b3Igc29zaWFsIGVrb25vbWkgZGFuIGxpbmdrdW5nYW4gc2VwZXJ0aSBrZXBhZGF0YW4gcGVuZHVkdWssIGtlbWlza2luYW4sIHNhbml0YXNpLCBzZXJ0YSBha3NlcyB0ZXJoYWRhcCBmYXNpbGl0YXMga2VzZWhhdGFuIChTaWhhbG9obyBldCBhbC4sIDIwMjE7IFN1cnlhbmkgJiBJYmFkLCAyMDIyOyBMYW9saSBldCBhbC4sIDIwMjQpLiBLZXBhZGF0YW4gcGVuZHVkdWsgbWVuamFkaSBmYWt0b3IgcGVudGluZyBkYWxhbSBtZW5pbmdrYXRrYW4gcmlzaWtvIHBlbnVsYXJhbiBrYXJlbmEgbWVtcGVyYmVzYXIgcGVsdWFuZyBrb250YWsgYW50YXJpbmRpdmlkdSBkYWxhbSBzdWF0dSB3aWxheWFoIChLcmlzdGlhbmluZ3J1bSwgMjAyNCkuIFNlbGFpbiBpdHUsIGtvbmRpc2kgc2FuaXRhc2kgZGFuIGxpbmdrdW5nYW4gcGVybXVraW1hbiB5YW5nIHRpZGFrIGxheWFrIGp1Z2EgYmVya29udHJpYnVzaSB0ZXJoYWRhcCB0aW5nZ2lueWEgYW5na2Ega2VqYWRpYW4gVEIgKEF0aWxsYWggZXQgYWwuLCAyMDIzOyBHaXR5YXJhbmksIDIwMjQpLg0KDQpQZW5kZWthdGFuIGFuYWxpc2lzIHNwYXNpYWwgdGVsYWggYmFueWFrIGRpZ3VuYWthbiB1bnR1ayBtZW5naWRlbnRpZmlrYXNpIGRpc3RyaWJ1c2kgcGVueWFraXQgVEIgc2VjYXJhIGdlb2dyYWZpcy4gU3R1ZGkgc2ViZWx1bW55YSBtZW51bmp1a2thbiBiYWh3YSB0ZXJkYXBhdCB2YXJpYXNpIHNwYXNpYWwgeWFuZyBzaWduaWZpa2FuIGRhbGFtIGRpc3RyaWJ1c2kga2FzdXMgVEIgYW50YXJ3aWxheWFoLCBzZWhpbmdnYSBhbmFsaXNpcyBzcGFzaWFsIHBlbnRpbmcgdW50dWsgbWVuZW50dWthbiB3aWxheWFoIHByaW9yaXRhcyBpbnRlcnZlbnNpIChIYXEgZXQgYWwuLCAyMDIwOyBSb3NhZHkgZXQgYWwuLCAyMDI0OyBTYXNtaXRhIGV0IGFsLiwgMjAxNykuIFNlbGFpbiBpdHUsIHN0dWRpIGJlcmJhc2lzIGVrb2xvZ2kganVnYSBtZW51bmp1a2thbiBiYWh3YSBkZXRlcm1pbmFuIGxpbmdrdW5nYW4gZGFuIHNvc2lhbCBla29ub21pIG1lbWlsaWtpIHBlbmdhcnVoIHNpZ25pZmlrYW4gdGVyaGFkYXAga2VqYWRpYW4gVEIgKEFsbWEgZXQgYWwuLCAyMDI0OyBEemFraXlhaCBldCBhbC4sIDIwMjM7IEhhbmRheWFuaSBldCBhbC4sIDIwMjQpLg0KDQpEYWxhbSBhbmFsaXNpcyBlcGlkZW1pb2xvZ2ksIHVrdXJhbiBzZXBlcnRpIEluY2lkZW5jZSBSYXRlIChJUikgZGFuIFN0YW5kYXJkaXplZCBJbmNpZGVuY2UgUmF0aW8gKFNJUikgZGlndW5ha2FuIHVudHVrIG1lbmdnYW1iYXJrYW4gcGVyYmVkYWFuIHJpc2lrbyBhbnRhcndpbGF5YWggc2VjYXJhIGxlYmloIHByb3BvcnNpb25hbC4gUGVuZGVrYXRhbiBTSVIgYmFueWFrIGRpZ3VuYWthbiBkYWxhbSBzdHVkaSBlcGlkZW1pb2xvZ2kgdW50dWsgbWVuZ2lkZW50aWZpa2FzaSB3aWxheWFoIGRlbmdhbiByaXNpa28gdGluZ2dpIHRlcmhhZGFwIHBlbnlha2l0IG1lbnVsYXIgdGVybWFzdWsgVEIgKFdhbGxlciAmIEdvdHdheSwgMjAwNDsgTGF3c29uLCAyMDE4KS4NCg0KTmFtdW4gZGVtaWtpYW4sIHVrdXJhbiB0ZXJzZWJ1dCBtYXNpaCBiZXJzaWZhdCBkZXNrcmlwdGlmIGRhbiBiZWx1bSBtYW1wdSBtZW5hbmdrYXAga2V0ZXJnYW50dW5nYW4gc3Bhc2lhbCBtYXVwdW4gZGluYW1pa2EgdGVtcG9yYWwgc2VjYXJhIHNpbXVsdGFuLiBPbGVoIGthcmVuYSBpdHUsIGRpcGVybHVrYW4gcGVuZGVrYXRhbiBkaXNlYXNlIG1hcHBpbmcgdW50dWsgbWVuZ2hhc2lsa2FuIGVzdGltYXNpIHJpc2lrbyB5YW5nIGxlYmloIHN0YWJpbC4gTWV0b2RlIEVtcGlyaWNhbCBCYXllcyBiYW55YWsgZGlndW5ha2FuIGRhbGFtIHBlbWV0YWFuIHBlbnlha2l0IGthcmVuYSBtYW1wdSBtZW5ndXJhbmdpIGZsdWt0dWFzaSBla3N0cmVtIHBhZGEgd2lsYXlhaCBkZW5nYW4gcG9wdWxhc2kga2VjaWwgc2VydGEgbWVuaW5na2F0a2FuIGtlc3RhYmlsYW4gZXN0aW1hc2kgcmlzaWtvIChMYXdzb24sIDIwMTg7IENoYW1iZXJzIGV0IGFsLiwgMjAxMykuDQoNClNlbGFuanV0bnlhLCB1bnR1ayBtZW5naWRlbnRpZmlrYXNpIHBvbGEgcGVuZ2Vsb21wb2thbiBzcGFzaWFsLCBkaWd1bmFrYW4gYW5hbGlzaXMgYXV0b2tvcmVsYXNpIHNwYXNpYWwgbWVsYWx1aSBHbG9iYWwgTW9yYW7igJlzIEkgZGFuIExvY2FsIEluZGljYXRvcnMgb2YgU3BhdGlhbCBBc3NvY2lhdGlvbiAoTElTQSksIHlhbmcgbWVtdW5na2lua2FuIGlkZW50aWZpa2FzaSBrbGFzdGVyIHdpbGF5YWggZGVuZ2FuIHJpc2lrbyB0aW5nZ2kgbWF1cHVuIHJlbmRhaCAoQW5zZWxpbiwgMTk5NTsgQW5zZWxpbiBldCBhbC4sIDIwMDYpLg0KDQpMZWJpaCBsYW5qdXQsIHVudHVrIG1lbmFuZ2thcCBkaW5hbWlrYSBzcGFzaWFsIGRhbiB0ZW1wb3JhbCBzZWNhcmEgc2ltdWx0YW4sIGRpZ3VuYWthbiBwZW5kZWthdGFuIHNwYXRpby10ZW1wb3JhbCBtb2RlbGluZyBtZWxhbHVpIEdlbmVyYWxpemVkIExpbmVhciBNaXhlZCBNb2RlbCAoR0xNTSkuIE1vZGVsIGluaSBtZW11bmdraW5rYW4gYWRhbnlhIGVmZWsgYWNhayB1bnR1ayB3aWxheWFoIGRhbiB3YWt0dSBzZWhpbmdnYSBtYW1wdSBtZXJlcHJlc2VudGFzaWthbiBoZXRlcm9nZW5pdGFzIGRhdGEgcGFuZWwgZXBpZGVtaW9sb2dpIChadXVyIGV0IGFsLiwgMjAwOSkuDQoNCk5hbXVuLCBkYXRhIGthc3VzIFRCIHNlYmFnYWkgZGF0YSBoaXR1bmdhbiBzZXJpbmcgbWVudW5qdWtrYW4gZmVub21lbmEgb3ZlcmRpc3BlcnNpb24sIHlhaXR1IGtvbmRpc2kga2V0aWthIHZhcmlhbnMgbGViaWggYmVzYXIgZGFyaXBhZGEgcmF0YS1yYXRhLiBLb25kaXNpIGluaSBtZW55ZWJhYmthbiBtb2RlbCBQb2lzc29uIG1lbmphZGkga3VyYW5nIHNlc3VhaSBrYXJlbmEgbWVsYW5nZ2FyIGFzdW1zaSBkYXNhciBrZXNhbWFhbiBtZWFuIGRhbiB2YXJpYW5zLiBPbGVoIGthcmVuYSBpdHUsIGRpZ3VuYWthbiBwZW5kZWthdGFuIE5lZ2F0aXZlIEJpbm9taWFsIEdMTU0gc2ViYWdhaSBtb2RlbCB5YW5nIGxlYmloIGZsZWtzaWJlbCBkYWxhbSBtZW5hbmdhbmkgb3ZlcmRpc3BlcnNpIHNla2FsaWd1cyBtZW1wZXJ0YWhhbmthbiBzdHJ1a3R1ciBlZmVrIGFjYWsgc3Bhc2lhbCBkYW4gdGVtcG9yYWwgKEhpbGJlLCAyMDExKS4NCg0KRGVuZ2FuIGRlbWlraWFuLCBwZW5kZWthdGFuIE5lZ2F0aXZlIEJpbm9taWFsIEdMTU0gZGFsYW0gcGVuZWxpdGlhbiBpbmkgZGloYXJhcGthbiBtYW1wdSBtZW1iZXJpa2FuIGhhc2lsIHBlbW9kZWxhbiB5YW5nIGxlYmloIGFrdXJhdCBkYWxhbSBtZW5qZWxhc2thbiBmYWt0b3ItZmFrdG9yIHlhbmcgbWVtZW5nYXJ1aGkga2FzdXMgVHViZXJrdWxvc2lzIHNlcnRhIG1lbmFuZ2thcCB2YXJpYXNpIHJpc2lrbyBzZWNhcmEgc3Bhc2lhbCBkYW4gdGVtcG9yYWwgZGkgUHJvdmluc2kgSmF3YSBCYXJhdCBzZWxhbWEgcGVyaW9kZSAyMDIx4oCTMjAyNS4NCg0KIyMgMS4yIFJ1bXVzYW4gTWFzYWxhaCANCg0KQmVyZGFzYXJrYW4gbGF0YXIgYmVsYWthbmcgeWFuZyB0ZWxhaCBkaXVyYWlrYW4sIG1ha2EgcnVtdXNhbiBtYXNhbGFoIGRhbGFtIHBlbmVsaXRpYW4gaW5pIGFkYWxhaCBzZWJhZ2FpIGJlcmlrdXQ6DQoNCjEuIEJhZ2FpbWFuYSBnYW1iYXJhbiBkaXN0cmlidXNpIGthc3VzIFR1YmVya3Vsb3NpcyAoVEIpIGRpIFByb3ZpbnNpIEphd2EgQmFyYXQgc2VsYW1hIHBlcmlvZGUgMjAyMeKAkzIwMjUgYmVyZGFzYXJrYW4gdWt1cmFuIGVwaWRlbWlvbG9naSAoSW5jaWRlbmNlIFJhdGUgZGFuIFN0YW5kYXJkaXplZCBJbmNpZGVuY2UgUmF0aW8pPw0KMi4gQmFnYWltYW5hIHBlbWV0YWFuIHJpc2lrbyBUdWJlcmt1bG9zaXMgZGkgUHJvdmluc2kgSmF3YSBCYXJhdCBtZW5nZ3VuYWthbiBwZW5kZWthdGFuIGRpc2Vhc2UgbWFwcGluZyBiZXJiYXNpcyBFbXBpcmljYWwgQmF5ZXM/DQozLiBBcGFrYWggdGVyZGFwYXQgcG9sYSBhdXRva29yZWxhc2kgc3Bhc2lhbCAoY2x1c3RlcikgcGFkYSByaXNpa28gVHViZXJrdWxvc2lzIGRpIFByb3ZpbnNpIEphd2EgQmFyYXQgYmVyZGFzYXJrYW4gYW5hbGlzaXMgNC4gNC4gR2xvYmFsIE1vcmFu4oCZcyBJIGRhbiBMSVNBPw0KQmFnYWltYW5hIHBlbmdhcnVoIGZha3RvciBzb3NpYWwsIGVrb25vbWksIGRhbiBsaW5na3VuZ2FuIHRlcmhhZGFwIGthc3VzIFR1YmVya3Vsb3NpcyBtZW5nZ3VuYWthbiBwZW5kZWthdGFuIHNwYXRpby10ZW1wb3JhbCBOZWdhdGl2ZSBCaW5vbWlhbCBHTE1NPw0KDQojIyAxLjMgVHVqdWFuIFBlbmVsaXRpYW4gDQoNCkJlcmRhc2Fya2FuIHJ1bXVzYW4gbWFzYWxhaCB5YW5nIHRlbGFoIGRpc3VzdW4sIG1ha2EgdHVqdWFuIHBlbmVsaXRpYW4gaW5pIGFkYWxhaCBzZWJhZ2FpIGJlcmlrdXQ6DQoNCjEuIE1lbmdhbmFsaXNpcyBkaXN0cmlidXNpIGthc3VzIFR1YmVya3Vsb3NpcyAoVEIpIGRpIFByb3ZpbnNpIEphd2EgQmFyYXQgcGVyaW9kZSAyMDIx4oCTMjAyNSBiZXJkYXNhcmthbiB1a3VyYW4gZXBpZGVtaW9sb2dpIChJbmNpZGVuY2UgUmF0ZSBkYW4gU3RhbmRhcmRpemVkIEluY2lkZW5jZSBSYXRpbykuDQoyLiBNZWxha3VrYW4gcGVtZXRhYW4gcmlzaWtvIFR1YmVya3Vsb3NpcyBtZW5nZ3VuYWthbiBwZW5kZWthdGFuIGRpc2Vhc2UgbWFwcGluZyBiZXJiYXNpcyBFbXBpcmljYWwgQmF5ZXMuDQozLiBNZW5naWRlbnRpZmlrYXNpIHBvbGEgYXV0b2tvcmVsYXNpIHNwYXNpYWwgKGNsdXN0ZXIpIHBhZGEgcmlzaWtvIFR1YmVya3Vsb3NpcyBkaSBQcm92aW5zaSBKYXdhIEJhcmF0IG1lbmdndW5ha2FuIEdsb2JhbCBNb3JhbuKAmXMgSSBkYW4gTElTQS4NCjQuIE1lbmdhbmFsaXNpcyBwZW5nYXJ1aCBmYWt0b3Igc29zaWFsLCBla29ub21pLCBkYW4gbGluZ2t1bmdhbiB0ZXJoYWRhcCBrYXN1cyBUdWJlcmt1bG9zaXMgbWVuZ2d1bmFrYW4gcGVuZGVrYXRhbiBzcGF0aW8tdGVtcG9yYWwgTmVnYXRpdmUgQmlub21pYWwgR0xNTS4NCg0KDQojIDIgRGF0YSBkYW4gTWV0b2RlDQoNCiMjIDIuMSBTdW1iZXIgRGF0YQ0KDQpEYXRhIHlhbmcgZGlndW5ha2FuIGRhbGFtIHBlbmVsaXRpYW4gaW5pIGFkYWxhaCBkYXRhIHNla3VuZGVyIHlhbmcgYmVyc3VtYmVyIGRhcmkgQmFkYW4gUHVzYXQgU3RhdGlzdGlrIChCUFMpIFByb3ZpbnNpIEphd2EgQmFyYXQgZGFuIFBvcnRhbCBPcGVuIERhdGEgSmFiYXIgZGFyaSBQZW1lcmludGFoIERhZXJhaCBQcm92aW5zaSBKYXdhIEJhcmF0LiBVbml0IGFuYWxpc2lzIHlhbmcgZGlndW5ha2FuIGFkYWxhaCAyNyBLYWJ1cGF0ZW4vS290YSBkaSBQcm92aW5zaSBKYXdhIEJhcmF0Lg0KDQojIyAyLjIgRGF0YSBQZW5lbGl0aWFuDQoNCkRhdGEgeWFuZyBkaWd1bmFrYW4gbWVydXBha2FuIGRhdGEgYWdyZWdhdCBrYWJ1cGF0ZW4va290YSBkaSBQcm92aW5zaSBKYXdhIEJhcmF0IHBlcmlvZGUgMjAyMeKAkzIwMjUuDQoNCjxkaXYgYWxpZ249ImNlbnRlciI+DQoqKlRhYmVsIDEuKiogRGF0YSBQZW5lbGl0aWFuDQo8L2Rpdj4NCg0KYGBge3IgfQ0KZGF0YSA8LSByZWFkX2V4Y2VsKA0KICAiRDovTUFHSVNURVIvU0VNRVNURVIgMi9kYXRhc2V0IFRCLnhsc3giLA0KICBzaGVldCA9ICJFcGlkZW1pb2xvZ2kyIg0KKQ0KDQpkYXRhIDwtIGRhdGEgJT4lDQogIHJlbmFtZSgNCiAgICBwZW5kdWR1a19taXNraW4gPSBgcGVyc2VudGFzZSBwZW5kdWR1ayBtaXNraW5gLA0KICAgIGtlcGFkYXRhbiA9IGBrZXBhZGF0YW4gcGVuZHVkdWtgLA0KICAgIGFpcl9taW51bV9sYXlhayA9IGBhaXIgbWludW0gbGF5YWtgLA0KICAgIHNhbml0YXNpX2xheWFrID0gYHNhbml0YXNpIGxheWFrYCwNCiAgICBoaXYgPSBganVtbGFoIGthc3VzIEhJVmAsDQogICAganVtbGFoX3BlbmR1ZHVrID0gYEp1bWxhaCBQZW5kdWR1a2ANCiAgKQ0KDQpkYXRhIDwtIGRhdGEgJT4lDQogIG11dGF0ZSgNCiAgICBhY3Jvc3MoDQogICAgICBjKA0KICAgICAgICBUQiwNCiAgICAgICAgcGVuZHVkdWtfbWlza2luLA0KICAgICAgICBrZXBhZGF0YW4sDQogICAgICAgIGFpcl9taW51bV9sYXlhaywNCiAgICAgICAgc2FuaXRhc2lfbGF5YWssDQogICAgICAgIGhpdiwNCiAgICAgICAganVtbGFoX3BlbmR1ZHVrDQogICAgICApLA0KICAgICAgYXMubnVtZXJpYw0KICAgICkNCiAgKQ0KZGF0YV9wZW5lbGl0aWFuIDwtIGRhdGEgJT4lDQogIGZpbHRlcih0YWh1biAlaW4lIGMoMjAyMSwyMDIyLCAyMDIzLDIwMjQgLCAyMDI1KSkgJT4lDQogIHNlbGVjdCgNCiAgICB0YWh1biwNCiAgICBuYW1hX2thYnVwYXRlbl9rb3RhLA0KICAgIFRCLA0KICAgIHBlbmR1ZHVrX21pc2tpbiwNCiAgICBrZXBhZGF0YW4sDQogICAgYWlyX21pbnVtX2xheWFrLA0KICAgIHNhbml0YXNpX2xheWFrLA0KICAgIGhpdiwNCiAgICBqdW1sYWhfcGVuZHVkdWsNCiAgKSAlPiUNCiAgc2xpY2UoMToxMCkNCg0Ka2FibGUoDQogIGRhdGFfcGVuZWxpdGlhbiwNCikNCg0KYGBgDQoNCjxkaXYgYWxpZ249ImNlbnRlciI+DQoqKlRhYmVsIDIuKiogRGF0YSBTcGFzaWFsIEthYnVwYXRlbi9Lb3RhIFByb3ZpbnNpIEphd2EgQmFyYXQNCjwvZGl2Pg0KDQoNCmBgYHtyIGluY2x1ZGU9RkFMU0V9DQpqYWJhciA8LSBzdF9yZWFkKA0KICAiRDovQmF0YXMvQmF0YXMvQmF0YXNfS2FidXBhdGVuX0phd2FfQmFyYXQuc2hwIiwNCiAgcXVpZXQgPSBUUlVFDQopDQoNCmphYmFyIDwtIGphYmFyICU+JQ0KICBtdXRhdGUoSUQgPSByb3dfbnVtYmVyKCkpDQoNCmphYmFyIDwtIGphYmFyICU+JQ0KICBtdXRhdGUoDQogICAgbmFtYV9rYWJ1cGF0ZW5fa290YSA9DQogICAgICBjYXNlX3doZW4oDQogICAgICAgIGdyZXBsKCJeS290YSIsIFdBRE1LSykgfiB0b3VwcGVyKFdBRE1LSyksDQogICAgICAgIFRSVUUgfiBwYXN0ZSgNCiAgICAgICAgICAiS0FCVVBBVEVOIiwNCiAgICAgICAgICB0b3VwcGVyKFdBRE1LSykNCiAgICAgICAgKQ0KICAgICAgKQ0KICApDQoNCmRhdGEkbmFtYV9rYWJ1cGF0ZW5fa290YSA8LQ0KICB0b3VwcGVyKGRhdGEkbmFtYV9rYWJ1cGF0ZW5fa290YSkNCg0KZGF0YSA8LSBsZWZ0X2pvaW4oDQogIGRhdGEsDQogIHN0X2Ryb3BfZ2VvbWV0cnkoamFiYXIpICU+JQ0KICAgIHNlbGVjdChJRCxuYW1hX2thYnVwYXRlbl9rb3RhKSwNCiAgYnk9Im5hbWFfa2FidXBhdGVuX2tvdGEiDQopDQoNCmBgYA0KDQoNCmBgYHtyfQ0Kc2hwPC0gamFiYXIgJT4lDQogIHNlbGVjdChJRCwgV0FETUtLLCBnZW9tZXRyeSkNCmthYmxlKA0KICBzaHANCikNCmBgYA0KDQojIyAyLjMgVmFyaWFiZWwgUGVuZWxpdGlhbg0KDQpWYXJpYWJlbCB5YW5nIGRpZ3VuYWthbiB5YWl0dSB0ZXJkaXJpIGRhcmkgc2VtYmlsYW4gdmFyaWFiZWwgeWFpdHUgSnVtbGFoIEthc3VzIFRCQywgSnVtbGFoIFBlbmR1ZHVrIChyaWJ1IGppd2EpLCBKdW1sYWggS2FzdXMgSElWLCBKdW1sYWggUGVuZGVyaXRhIERpYWJldGVzIE1lbGl0dXMgKG9yYW5nKSwgUGVyc2VudGFzZSBCYWxpdGEgU3R1bnRpbmcsIEtlcGFkYXRhbiBQZW5kdWR1ayAoaml3YS9LbTIpLCBKdW1sYWggUGVuZHVkdWsgTWlza2luIChyaWJ1IGppd2EpLCBKdW1sYWggRmFzaWxpdGFzIEtlc2VoYXRhbiwgZGFuIFBlcnNlbnRhc2UgS2VsdWFyZ2EgZGVuZ2FuIFNhbml0YXNpIExheWFrLiBNYXNpbmctbWFzaW5nIG1lcnVwYWthbiBkYXRhIHRpYXAga2FiL2tvdGEgcGFkYSB0YWh1biAyMDI0IGRpIGRpIFByb3ZpbnNpIEphd2EgQmFyYXQuDQoNCjxkaXYgYWxpZ249ImNlbnRlciI+DQoqKlRhYmVsIDMuKiogVmFyaWFiZWwgUGVuZWxpdGlhbg0KPC9kaXY+DQoNCg0KfCBOYW1hIFZhcmlhYmVsICAgfCBTYXR1YW4gICAgICAgICB8IERlc2tyaXBzaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFN1bWJlciBEYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18DQp8IFRCICAgICAgICAgICAgICB8IE9yYW5nICAgICAgICAgIHwgSnVtbGFoIGthc3VzIFR1YmVya3Vsb3NpcyAoVEIpIHlhbmcgdGVybGFwb3IgcGFkYSBrYWJ1cGF0ZW4va290YSBkaSBQcm92aW5zaSBKYXdhIEJhcmF0LiB8IE9wZW4gRGF0YSBKYXdhIEJhcmF0IHwNCnwgcGVuZHVkdWtfbWlza2luIHwgUGVyc2VudGFzZSAoJSkgfCBQZXJzZW50YXNlIHBlbmR1ZHVrIGRpIGJhd2FoIGdhcmlzIGtlbWlza2luYW4gZGkgSmF3YSBCYXJhdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEJQUyBQcm92aW5zaSBKYXdhIEJhcmF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCBrZXBhZGF0YW4gICAgICAgfCBKaXdhL2ttwrIgICAgICAgfCBKdW1sYWggcGVuZHVkdWsgcGVyIGttwrIgZGkgSmF3YSBCYXJhdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgT3BlbiBEYXRhIEphd2EgQmFyYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgYWlyX21pbnVtX2xheWFrIHwgUGVyc2VudGFzZSAoJSkgfCBBa3NlcyBydW1haCB0YW5nZ2EgdGVyaGFkYXAgYWlyIG1pbnVtIGxheWFrLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBPcGVuIERhdGEgSmF3YSBCYXJhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgc2FuaXRhc2lfbGF5YWsgIHwgUGVyc2VudGFzZSAoJSkgfCBBa3NlcyBydW1haCB0YW5nZ2EgdGVyaGFkYXAgc2FuaXRhc2kgbGF5YWsuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBPcGVuIERhdGEgSmF3YSBCYXJhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgaGl2ICAgICAgICAgICAgIHwgT3JhbmcgICAgICAgICAgfCBKdW1sYWgga2FzdXMgSElWIGRpIEphd2EgQmFyYXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgT3BlbiBEYXRhIEphd2EgQmFyYXQgICAgICAgICAgICAgICAgICAgICB8DQp8IGp1bWxhaF9wZW5kdWR1ayB8IEppd2EgICAgICAgICAgIHwgSnVtbGFoIHBlbmR1ZHVrIEphd2EgQmFyYXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQlBTIFByb3ZpbnNpIEphd2EgQmFyYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQoNCg0KIyMgMi40IE1ldG9kZSBBbmFsaXNpcw0KDQpBbmFsaXNpcyBkYXRhIGRhbGFtIHBlbmVsaXRpYW4gaW5pIGRpbGFrdWthbiBzZWNhcmEgYmVydGFoYXAgdW50dWsgbWVuZ2dhbWJhcmthbiBwb2xhIGRpc3RyaWJ1c2kgVHViZXJrdWxvc2lzIChUQiksIG1lbmdpZGVudGlmaWthc2kgcmlzaWtvIHBlbnlha2l0IGFudGFyd2lsYXlhaCwgc2VydGEgbWVuZ2FuYWxpc2lzIGZha3Rvci1mYWt0b3IgeWFuZyBtZW1lbmdhcnVoaSBqdW1sYWgga2FzdXMgVEIgc2VjYXJhIHNwYXNpYWwgZGFuIHRlbXBvcmFsIGRpIFByb3ZpbnNpIEphd2EgQmFyYXQgcGVyaW9kZSAyMDIx4oCTMjAyNS4gVGFoYXBhbiBhbmFsaXNpcyB5YW5nIGRpbGFrdWthbiBtZWxpcHV0aSBhbmFsaXNpcyBkZXNrcmlwdGlmLCBwZW5ndWt1cmFuIGVwaWRlbWlvbG9naSwgZGlzZWFzZSBtYXBwaW5nLCBhbmFsaXNpcyBhdXRva29yZWxhc2kgc3Bhc2lhbCwgZGFuIHBlbW9kZWxhbiBzcGFzaW8tdGVtcG9yYWwgZGVuZ2FuIG1lbmdndW5ha2FuIE5lZ2F0aXZlIEJpbm9taWFsIEdlbmVyYWxpemVkIExpbmVhciBNaXhlZCBNb2RlbC4NCg0KIyMjIDIuNC4xIEFuYWxpc2lzIERlc2tyaXB0aWYNCg0KQW5hbGlzaXMgZGVza3JpcHRpZiBkaWxha3VrYW4gdW50dWsgbWVtYmVyaWthbiBnYW1iYXJhbiB1bXVtIG1lbmdlbmFpIGRpc3RyaWJ1c2kga2FzdXMgVHViZXJrdWxvc2lzIChUQikgcGFkYSBzZXRpYXAga2FidXBhdGVuL2tvdGEgZGkgUHJvdmluc2kgSmF3YSBCYXJhdCBzZWxhbWEgcGVyaW9kZSAyMDIx4oCTMjAyNS4gU3RhdGlzdGlrIGRlc2tyaXB0aWYgeWFuZyBkaWd1bmFrYW4gbWVsaXB1dGkgbmlsYWkgbWluaW11bSwga3VhcnRpbCBwZXJ0YW1hIChRMSksIHJhdGEtcmF0YSAobWVhbiksIGt1YXJ0aWwga2V0aWdhIChRMyksIG5pbGFpIG1ha3NpbXVtLCBzdGFuZGFyIGRldmlhc2ksIGRhbiBrb2VmaXNpZW4gdmFyaWFzaSAoY29lZmZpY2llbnQgb2YgdmFyaWF0aW9uKS4gU2VsYWluIGl0dSwgZGlzYWppa2FuIGdyYWZpayB0cmVuIGp1bWxhaCBrYXN1cyBUQiB1bnR1ayBtZWxpaGF0IHBlcnViYWhhbiBrYXN1cyBkYXJpIHRhaHVuIGtlIHRhaHVuLg0KDQojIyMgMi40LjIgVWt1cmFuIEVwaWRlbWlvbG9naQ0KDQpVa3VyYW4gZXBpZGVtaW9sb2dpIGRpZ3VuYWthbiB1bnR1ayBtZW5nZ2FtYmFya2FuIHRpbmdrYXQga2VqYWRpYW4gZGFuIHJpc2lrbyBUdWJlcmt1bG9zaXMgcGFkYSBtYXNpbmctbWFzaW5nIHdpbGF5YWguDQoNCiMjIyMgYS4gSW5jaWRlbmNlIFJhdGUgKElSKQ0KDQpJbmNpZGFuY2UgUmF0ZSBhZGFsYWggdWt1cmFuIGVwaWRlbWlvbG9naSBkaWd1bmFrYW4gdW50dWsgbWVuZ3VrdXIgZnJla3VlbnNpIGthc3VzIGJhcnUgVEIgeWFuZyB0ZXJqYWRpIGRhbGFtIHBvcHVsYXNpIGJlcmlzaWtvIHNlbGFtYSBwZXJpb2RlIHdha3R1IHRlcnRlbnR1IGRpIHdpbGF5YWggdGVydGVudHUuIEZvcm11bGEgcGVuZ2hpdHVuZ2FuIElSIGRhbGFtIHBlbmVsaXRpYW4gaW5pIGRlbmdhbiBwZXIgMTAwLjAwMCBwZW5kdWR1ayBkaXJ1bXVza2FuIHNlYmFnYWkgYmVyaWt1dDoNCg0KJCQNCklSX3tpdH0gPSBcZnJhY3tUQl97aXR9fXtcdGV4dHtqdW1sYWggcGVuZHVkdWt9X3tpdH19IFx0aW1lcyAxMDAuMDAwDQokJA0KDQpEZW5nYW46DQokVEJfe2l0fSQgOiAganVtbGFoIGthc3VzIFRCIHBhZGEga2FidXBhdGVuL2tvdGEgJGkkIHRhaHVuICR0JC4NCg0KJFx0ZXh0e2p1bWxhaCBwZW5kdWR1a31fe2l0fSQgOiBqdW1sYWggcG9wdWxhc2kgZGkgd2lsYXlhaCAkaSQgdGFodW4gJHQkLg0KDQoNCiMjIyMgYi4gU3RhbmRhcmRpemVkIEluY2lkZW5jZSBSYXRpbyAoU0lSKQ0KDQpNZW55YWppa2FuIGVzdGltYXNpIHJpc2lrbyByZWxhdGlmIGthc2FyIGRlbmdhbiBtZW1iYW5kaW5na2FuIGp1bWxhaCBrYXN1cyBvYnNlcnZhc2kgZGVuZ2FuIGthc3VzIHlhbmcgZGloYXJhcGthbiAoZXhwZWN0ZWQgY2FzZXMpIGFwYWJpbGEgd2lsYXlhaCB0ZXJzZWJ1dCBtZW1pbGlraSBsYWp1IGluc2lkZW5zaSB5YW5nIHNhbWEgZGVuZ2FuIGxhanUgZ2xvYmFsIHByb3ZpbnNpLiBSdW11c2FuIHVudHVrIG1lbmdoaXR1bmcga2FzdXMgZWtzcGVrdGFzaSAoJGV4cGVjdGVkX3tpdH0kIGF0YXUgJEVfe2l0fSQpIGFkYWxhaDoNCg0KJCRFX3tpdH0gPSBcdGV4dHtqdW1sYWggcGVuZHVkdWt9X3tpdH0gXHRpbWVzIHJfe2dsb2JhbH0kJA0KRGVuZ2FuICRyX3tnbG9iYWx9JCBhZGFsYWggbGFqdSBpbnNpZGVuc2kgZ2xvYmFsIFByb3ZpbnNpIEphd2EgQmFyYXQgeWFuZyBkaWhpdHVuZyBzZWNhcmEgYWdyZWdhdCBsaW50YXMgcGVyaW9kZSA6DQoNCiQkcl97Z2xvYmFsfSA9IFxmcmFje1xzdW1fe2l9XHN1bV97dH1UQl97aXR9fXtcc3VtX3tpfVxzdW1fe3R9XHRleHR7anVtbGFoIHBlbmR1ZHVrfV97aXR9fSQkDQoNClNldGVsYWggbmlsYWkgZWtzcGVrdGFzaSBkaXBlcm9sZWgsIG5pbGFpIFNJUiBkaWhpdHVuZyBtZW5nZ3VuYWthbiBwZXJiYW5kaW5nYW4gbGFuZ3N1bmcgOg0KDQokJFNJUl97aXR9ID0gXGZyYWN7VEJfe2l0fX17RV97aXR9fSQkDQoNCi0gSmlrYSBuaWxhaSAkU0lSX3tpdH0gPiAxJCwgbWFrYSB3aWxheWFoIHRlcnNlYnV0IG1lbWlsaWtpIGp1bWxhaCBrZWphZGlhbiBrYXN1cyBUQiB5YW5nIGxlYmloIHRpbmdnaSBkYXJpcGFkYSByYXRhLXJhdGEgcHJvdmluc2kuDQotICBzZWJhbGlrbnlhIGppa2EgJFNJUl97aXR9IDwgMSQsIGJlYmFuIGthc3VzIGRpIHdpbGF5YWggdGVyc2VidXQgYmVyYWRhIGRpIGJhd2FoIGVrc3Bla3Rhc2kgcmF0YS1yYXRhIHByb3ZpbnNpLiANCg0KTWVza2lwdW4gZGVtaWtpYW4sIFNJUiBtZW1pbGlraSBrZXRlcmJhdGFzYW4gc3RhdGlzdGlrIHlhbmcgc2lnbmlmaWthbiBiZXJ1cGEgdmFyaWFiaWxpdGFzIHlhbmcgc2FuZ2F0IHRpbmdnaSBwYWRhIHdpbGF5YWggZGVuZ2FuIGp1bWxhaCBwZW5kdWR1ayB5YW5nIGtlY2lsICgkRV97aXR9JCBzYW5nYXQga2VjaWwpLCB5YW5nIG1lbWljdSBmbHVrdHVhc2kgZXN0aW1hc2kgcmlzaWtvIHlhbmcgZWtzdHJlbS4NCg0KIyMjIDIuNC4zIEFuYWxpc2lzIEF1dG9rb3JlbGFzaSBTcGFzaWFsDQoNCkFuYWxpc2lzIGF1dG9rb3JlbGFzaSBzcGFzaWFsIGRpdGVyYXBrYW4gdW50dWsgbWVtYnVrdGlrYW4ga2ViZXJhZGFhbiBrZXRlcmdhbnR1bmdhbiBzcGFzaWFsIHNlY2FyYSBnZW9ncmFmaXMsIHlhbmcgbWVuYW5kYWthbiBiYWh3YSByaXNpa28gc3VhdHUgd2lsYXlhaCBkaXBlbmdhcnVoaSBvbGVoIGtvbmRpc2kgd2lsYXlhaC13aWxheWFoIHRldGFuZ2dhbnlhLg0KDQojIyMjIGEuIE5laWdoYm91cmhvb2QgTWF0cml4DQoNClN0cnVrdHVyIHNwYXNpYWwgZGltb2RlbGthbiBiZXJkYXNhcmthbiBrcml0ZXJpYSBRdWVlbiBDb250aWd1aXR5IG1lbmdndW5ha2FuIGZ1bmdzaSBwb2x5Mm5iLiBEdWEgd2lsYXlhaCBkaW55YXRha2FuIGJlcnRldGFuZ2dhICgkd197aWp9ID0gMSQpIGppa2Ega2VkdWFueWEgYmVyYmFnaSBiYXRhcyB3aWxheWFoIGJlcnVwYSBnYXJpcyBtYXVwdW4gdGl0aWsgc3VkdXQgYmVyc2FtYSwgZGFuICR3X3tpan0gPSAwJCBqaWthIHRpZGFrIGFkYSBrb250YWsgYmF0YXMgbGFuZ3N1bmcuIE1hdHJpa3Mga2V0ZXRhbmdnYWFuIGluaSBzZWxhbmp1dG55YSBkaXN0YW5kYXJkaXNhc2kgYmFyaXMgKHJvdy1zdGFuZGFyZGl6ZWQgd2VpZ2h0cyBtYXRyaXgsICRXJCkgbWVsYWx1aSBmdW5nc2kgbmIybGlzdHcgdW50dWsgbWVueWVpbWJhbmdrYW4gcGVuZ2FydWgganVtbGFoIHRldGFuZ2dhIHlhbmcgYmVyYmVkYSBhbnRhcndpbGF5YWguDQoNCiMjIyMgYi4gR2xvYmFsIE1vcmFuJ3MgSToNCg0KR2xvYmFsIE1vcmFuJ3MgSSBhZGFsYWggdWt1cmFuICBhdXRva29yZWxhc2kgc3Bhc2lhbCB5YW5nIGRpa2VtYmFuZ2thbiBvbGVoIFBhdHJpY2sgQWxmcmVkIFBpZXJjZSBNb3JhbiBwYWRhIHRhaHVuIDE5NTAuIEdsb2JhbCBNb3JhbuKAmXMgSSBkaWd1bmFrYW4gdW50dWsgbWVsYWt1a2FuIHVqaSBkZXBlZGVuc2kgc3Bhc2lhbCBhdGF1IGF1dG9rb3JlbGFzaSBhbnRhciBsb2thc2kgcGVuZ2FtYXRhbi4NCkdsb2JhbCBNb3JhbuKAmXMgSSBtZXJ1cGFrYW4gbWV0b2RlIGF1dG9rb3JlbGFzaSBzcGFzaWFsIHlhbmcgcGFsaW5nIHNlcmluZyBkaWd1bmFrYW4gdW50dWsgbWVuZ2luZGlrYXNpa2FuIHBvbGENCnNwYXNpYWwuIEdsb2JhbCBNb3JhbuKAmXMgSSBkaWhpdHVuZyBtZW5nZ3VuYWthbiBwZXJzYW1hYW4gKDEpIHVudHVrIG1lbGloYXQgbmlsYWkgYXV0b2tvcmVsYXNpIHNwYXNpYWwuIEhhc2lsIE1vcmFu4oCZcyBJIGRhcGF0IGRpZ3VuYWthbiB1bnR1ayBtZW5ndWppIGFwYWthaCB0ZXJkYXBhdCBhdXRva29yZWxhc2kgc3Bhc2lhbCBkaSB3aWxheWFoIHBlbmVsaXRpYW4gKFNpbWF0YXV3LCAyMDE5KS4gTWVuZ2d1bmFrYW4gUGVyc2FtYWFuIGJlcmlrdXQ6DQoNCiQkDQpJID0NClxmcmFjew0KbiBcc3VtX3tpPTF9XntufSBcc3VtX3tqPTF9XntufQ0Kd197aWp9KHhfaS1cYmFye3h9KSh4X2otXGJhcnt4fSkNCn17DQpcc3VtX3tpPTF9XntufVxzdW1fe2o9MX1ee259IHdfe2lqfQ0KXHN1bV97aT0xfV57bn0oeF9pLVxiYXJ7eH0pXjINCn0NCiQkDQpEZW5nYW46DQokSSQgOiBpbmRla3MgTW9yYW4ncyBJDQoNCiRuJCA6IGp1bWxhaCB3aWxheWFoIHN0dWRpIGthc3VzDQoNCiR4X2kkIDogbmlsYWkgbG9rYXNpIGtlLWksIGRlbmdhbiBpID0gMSwgMiwgLi4uLCBuDQoNCiR4X2okIDogbmlsYWkgbG9rYXNpIGtlLWosIGRlbmdhbiBqID0gMSwgMiwgLi4uLCBuDQoNCiR4zIQkOiByYXRhLXJhdGEgZGF0YQ0KDQokdyQgOiBtYXRyaWtzIHBlbWJvYm90DQoNCkRpbWFuYTogDQoNCiQkDQpFKEkpPVxmcmFjey0xfXtuLTF9DQokJA0KDQpQYWRhIFBlcnNhbWFhbiBkaWF0YXMgLCAkRShJKSQgYWRhbGFoIG5pbGFpIGVrc3Bla3Rhc2kgTW9yYW7igJlzICRJJCBkYW4gJG4kIG1lcnVwYWthbiBqdW1sYWggYXJlYSBwZW5nYW1hdGFuIHNlYmFueWFrIDI3IGFyZWEgcGFkYSBwZW5lbGl0aWFuIGluaS4gTmlsYWkgZWtzcGVrdGFzaSBNb3JhbuKAmXMgJEkkIG1lbnVuanVra2FuIGJhaHdhOg0KDQotIEppa2EgbmlsYWkgJEkgPiBFKEkpJCwgbWFrYSBhdXRva29yZWxhc2kgYmVybmlsYWkgcG9zaXRpZiBhdGF1IHBvbGEgc3Bhc2lhbCB5YW5nIHRlcmJlbnR1ayBhZGFsYWggcG9sYSBjbHVzdGVyIChtZW5nZWxvbXBvaykuDQotIEppa2EgbmlsYWkgJEkgPCBFKEkpJCwgbWFrYSBhdXRva29yZWxhc2kgYmVybmlsYWkgbmVnYXRpZiBhdGF1IHBvbGEgZGlzcGVyc2VkIChtZW55ZWJhcikuDQotIEppa2EgbmlsYWkgJEkgPSBFKEkpJCwgbWFrYSB0aWRhayBhZGEgYXV0b2tvcmVsYXNpIHNwYXNpYWwuDQoNCiMjIyMgYy4gTG9jYWwgSW5kaWNhdG9yIG9mIFNwYXRpYWwgQXNzb2NpYXRpb24gKExJU0EpICANCg0KTG9jYWwgSW5kaWNhdG9yIG9mIFNwYXRpYWwgQXNzb2NpYXRpb24gKExJU0EpIGJlcmh1YnVuZ2FuIGRlbmdhbiBNb3JhbiBTY2F0dGVycGxvdC4gTElTQSBhZGFsYWgga29tcG9uZW4gdmVyc2kgc2ViZWx1bW55YSBkYXJpIE1vcmFu4oCZcyBJIHlhbmcgZGloaXR1bmcgbWVuZ2d1bmFrYW4gcGVyc2FtYWFuIGRpYmF3YWggaW5pLiBBdXRva29yZWxhc2kgc3Bhc2lhbCBsb2thbCAoTElTQSkgbWVtdW5na2lua2FuIGlkZW50aWZpa2FzaSBqZW5pcyBrbHVzdGVyIHlhaXR1IEhpZ2hIaWdoIHBhZGEga3VhZHJhbiBwZXJ0YW1hIE1vcmFuIFNjYXR0ZXJwbG90LCBMb3ctTG93IHBhZGEga3VhZHJhbiBrZXRpZ2EgTW9yYW4gU2NhdHRlcnBsb3QsIExvdy1IaWdoIHBhZGEga3VhZHJhbiBrZWR1YSBNb3JhbiBTY2F0dGVycGxvdCwgZGFuIEhpZ2gtTG93IHBhZGEga3VhZHJhbiBrZWVtcGF0IE1vcmFuIFNjYXR0ZXJwbG90LiBTYWxhaCBzYXR1IGtlbGVtYWhhbiBhZGFsYWggYmFod2EgaWEgbWVuZ2lkZW50aWZpa2FzaSBrbHVzdGVyIG91dGxpZXIgdGFucGENCm1lbnVuanVra2FuIGFwYWthaCB0ZXJkaXJpIGRhcmkgbmlsYWkgdGluZ2dpIGF0YXUgbmlsYWkgcmVuZGFoLiBCZXJpa3V0IGFkYWxhaCBwZXJzYW1hYW4gTElTQToNCg0KJCRJX2kgPSB6X2kgXHN1bV97aj0xfV57bn0gV197aWp9IFpfaiQkDQoNCkRlbmdhbjoNCi0gJG4kIDoganVtbGFoIHdpbGF5YWggc3R1ZGkga2FzdXMNCg0KLSAkWl9pJCBkYW4gJFpfaiQgOiBkZXZpYXNpIGRhcmkgbmlsYWkgcmF0YS1yYXRhDQoNCi0gJFckIDogbWF0cmlrcyBwZW1ib2JvdA0KDQojIyMgMi40LjQgTWV0b2RlIEVtcGlyaWNhbCBCYXllcyAoRUIpDQoNCk1ldG9kZSBFbXBpcmljYWwgQmF5ZXMgbWVydXBha2FuIHN1YXR1IG1ldG9kZSBwYWRhIFNtYWxsIEFyZWEgRXN0aW1hdGlvbihTQUUpIHlhbmcgbWVuZ2d1bmFrYW4gbWV0b2RlIEJheWVzIGRhbGFtIHBlbmR1Z2FhbiBwYXJhbWV0ZXJueWEuIFNtYWxsIEFyZWEgRXN0aW1hdGlvbihTQUUpIGRpZGVmaW5pc2lrYW4gc2ViYWdhaSBzdWF0dSB0ZWtuaWsgc3RhdGlzdGlrYSB1bnR1ayBtZW5kdWdhIHBhcmFtZXRlci1wYXJhbWV0ZXIgc3VicG9wdWxhc2kgeWFuZyB1a3VyYW4gY29udG9obnlhIGtlY2lsLCBvbGVoIGthcmVuYSBpdHUgZGlwZXJsdWthbiBpbmZvcm1hc2kgdGFtYmFoYW4gYWdhciBkaXBlcm9sZWggZHVnYWFuIHlhbmcgbGViaWggYWt1cmF0IChQdXRyaSwgMjAxOSkuR3VuYSBtZW5nYXRhc2kga2V0ZXJiYXRhc2FuIHZhcmlhYmlsaXRhcyB0aW5nZ2kgcGFkYSBTSVIga2xhc2lrIGRpIHdpbGF5YWggZGVuZ2FuIHBvcHVsYXNpIGtlY2lsLCBkaXRlcmFwa2FuIG1ldG9kZSBwZW5zdGFiaWxhbiByaXNpa28gbWVuZ2d1bmFrYW4gZXN0aW1hc2kgcmlzaWtvIEVtcGlyaWNhbCBCYXllcyAoRW1waXJpY2FsIEJheWVzIFJpc2sgRXN0aW1hdGlvbikuIA0KUGVuZGVrYXRhbiBpbmkgbWVydXBha2FuIHNhbGFoIHNhdHUgYmVudHVrIGVzdGltYXRvciBwZW55dXN1dGFuIChzaHJpbmthZ2UgZXN0aW1hdG9yKSB5YW5nIGRpcmludGlzIG9sZWggQ2xheXRvbiBkYW4gS2FsZG9yICgxOTg3KSAgc2VydGEgTWFyc2hhbGwgKDE5OTEpLiBLb25zZXAgZGFzYXIgZGFyaSBFbXBpcmljYWwgQmF5ZXMgYWRhbGFoIG1lbnl1c3V0a2FuIG5pbGFpIHJpc2lrbyBla3N0cmVtIGtlIGFyYWggcmF0YS1yYXRhIGdsb2JhbCBwcm92aW5zaS5LZXRpa2Egc3VhdHUgd2lsYXlhaCBtZW1pbGlraSBwb3B1bGFzaSBrZWNpbCAobmlsYWkgZWtzcGVrdGFzaSBrYXN1cyAkRV97aXR9JCByZW5kYWgpLCBtYWthIGluZm9ybWFzaSBsb2thbCBkaWFuZ2dhcCBrdXJhbmcgc3RhYmlsLCBzZWhpbmdnYSBuaWxhaSByaXNpa29ueWEgZGlzdXN1dGthbiBzZWNhcmEgc2lnbmlmaWthbiBtZW5kZWthdGkgbmlsYWkgcHJpb3IgZ2xvYmFsLiBTZWJhbGlrbnlhLCBwYWRhIHdpbGF5YWggZGVuZ2FuIHBvcHVsYXNpIGJlc2FyICgkRV97aXR9JCB0aW5nZ2kpLCBuaWxhaSBlc3RpbWFzaSByaXNpa28gYWthbiBsZWJpaCBkaWRvbWluYXNpIG9sZWggZGF0YSBvYnNlcnZhc2kgbG9rYWxueWEgc2VuZGlyaS4gUnVtdXNhbiBwZW1ldGFhbiByaXNpa28gYmVyYmFzaXMgRW1waXJpY2FsIEJheWVzICgkRUJcX1Jpc2tfe2l0fSQpIHlhbmcgZGlpbXBsZW1lbnRhc2lrYW4gc2VjYXJhIHRlbXBvcmFsIHBlciB0YWh1biBkaWhpdHVuZyBzZWJhZ2FpIGJlcmlrdXQ6DQoNCiQkXGxhbWJkYV90ID0gXGZyYWN7XHN1bV97aX1UQl97aXR9fXtcc3VtX3tpfUVfe2l0fX0kJCQkRUJcX1Jpc2tfe2l0fSA9IFxmcmFje1RCX3tpdH0gKyBcbGFtYmRhX3R9e0Vfe2l0fSArIDF9JCQNCg0KRGVuZ2FuOg0KJFxsYW1iZGFfdCQgOiBwYXJhbWV0ZXIgcHJpb3IgKGxhanUgcmVsYXRpZiBnbG9iYWwpIHlhbmcgZGlla3N0cmFrIGRhcmkgZGF0YSBwZW5nYW1hdGFuIHRhaHVuIGtlLSR0JC4gDQoNClBlbmRla2F0YW4gRW1waXJpY2FsIEJheWVzIEdsb2JhbCBpbmkgbWVtcGVybGFrdWthbiBzZXRpYXAga2FidXBhdGVuL2tvdGEgc2VjYXJhIGluZGVwZW5kZW4gdGFucGEgbWVtZWR1bGlrYW4gc3VzdW5hbiBhdGF1IGtvbmZpZ3VyYXNpIGtldGV0YW5nZ2FhbiBmaXNpa255YS4gSGFzaWwgZXN0aW1hc2kgcmlzaWtvIGtlbXVkaWFuIGRpdmlzdWFsaXNhc2lrYW4gZGFsYW0gYmVudHVrIHBldGEgdGVtYXRpayB1bnR1ayBtZW5naWRlbnRpZmlrYXNpIHdpbGF5YWggZGVuZ2FuIHJpc2lrbyB0aW5nZ2kgZGFuIHJlbmRhaC4NCg0KIyMjIDIuNC41IFBlbW9kZWxhbiBTcGFzaW8tVGVtcG9yYWwNCg0KIyMjIyBhLiBNb2RlbCBPcmRpbmFyeSBMZWFzdCBTcXVhcmVzIChPTFMpDQoNCk1vZGVsIE9MUyBkaWd1bmFrYW4gc2ViYWdhaSBtb2RlbCBhd2FsIChiYXNlbGluZSBtb2RlbCkgdW50dWsgbWVuZ2V2YWx1YXNpIGh1YnVuZ2FuIGFudGFyYSB2YXJpYWJlbCByZXNwb24gZGFuIHZhcmlhYmVsIHByZWRpa3Rvci5Nb2RlbCBPTFMgc2VjYXJhIHVtdW0gZGlueWF0YWthbiBzZWJhZ2FpOg0KDQokJFlfaSA9IFxiZXRhXzAgKyBcYmV0YV8xIFhfMSArIFxiZXRhXzIgWF8yICsgXGRvdHMgKyBcYmV0YV9wIFhfcCArIFx2YXJlcHNpbG9uX2kkJA0KUGFkYSBQZW5lbGl0aWFuIGluaSBtZW5nZ3VuYWthbiBwZXJzYW1hYW4gYmVyaWt1dDogDQokJFRCX3tpdH0gPSBcYmV0YV8wICsgXGJldGFfMVx0ZXh0e3BlbmR1ZHVrIG1pc2tpbn0ge2l0fSArIFxiZXRhXzJcdGV4dHtrZXBhZGF0YW59X3tpdH0gKyBcYmV0YV8zXHRleHR7YWlyIG1pbnVtIGxheWFrfV97aXR9ICsgXGJldGFfNFx0ZXh0e3Nhbml0YXNpIGxheWFrfV97aXR9ICsgXGJldGFfNVx0ZXh0e2hpdn1fe2l0fSArIFxlcHNpbG9uX3tpdH0kJA0KDQpNb2RlbCBPTFMgZGlldmFsdWFzaSBrZWxheWFrYW5ueWEgbWVsYWx1aSBwZW5ndWppYW4gYXN1bXNpIGtsYXNpayB5YW5nIGtldGF0LCBtZWxpcHV0aSB1amkgbm9ybWFsaXRhcyByZXNpZHVhbCBTaGFwaXJvLVdpbGssIHVqaSBoZXRlcm9za2VkYXN0aXNpdGFzIEJyZXVzY2gtUGFnYW4gKGJwdGVzdCksIGRhbiB1amkgbXVsdGlrb2xpbmVhcml0YXMgbWVsYWx1aSBwZXJoaXR1bmdhbiBWYXJpYW5jZSBJbmZsYXRpb24gRmFjdG9yIChWSUYpIG1lbmdndW5ha2FuIHBha2V0IGNhci4NCg0KIyMjIyBiLiBNb2RlbCBSZWdyZXNpIFBvaXNzb24NCg0KUmVncmVzaSBQb2lzc29uIGRpZ3VuYWthbiB1bnR1ayBtZW1vZGVsa2FuIGp1bWxhaCBrYXN1cyBUdWJlcmt1bG9zaXMgKFRCKSB5YW5nIG1lcnVwYWthbiBkYXRhIGNhY2FoIChjb3VudCBkYXRhKS4gTW9kZWwgaW5pIG1lbmdhc3Vtc2lrYW4gYmFod2EganVtbGFoIGthc3VzIFRCIG1lbmdpa3V0aSBkaXN0cmlidXNpIFBvaXNzb24sIHlhaXR1Og0KDQokJA0KRShUQl97aXR9KSA9IFxtdV97aXR9DQokJA0KDQpEZW5nYW4gbmlsYWkgaGFyYXBhbiBzZWJlc2FyOg0KJCQNCkUoVEJfe2l0fSkgPSBcbXVfe2l0fQ0KJCQNCg0KRnVuZ3NpIHBlbmdodWJ1bmcgKGxpbmsgZnVuY3Rpb24pIHlhbmcgZGlndW5ha2FuIGFkYWxhaCBmdW5nc2kgbG9nYXJpdG1hIG5hdHVyYWwgc2VoaW5nZ2EgbW9kZWwgZGFwYXQgZGl0dWxpc2thbiBzZWJhZ2FpOg0KDQokJA0KXGxvZyhcbXVfe2l0fSkgPQ0KXGJldGFfMCArDQpcYmV0YV8xIFx0ZXh0e1BlbmR1ZHVrIE1pc2tpbn1fe2l0fSArDQpcYmV0YV8yIFx0ZXh0e0tlcGFkYXRhbn1fe2l0fSArDQpcYmV0YV8zIFx0ZXh0e0FpciBNaW51bSBMYXlha31fe2l0fSArDQpcYmV0YV80IFx0ZXh0e1Nhbml0YXNpIExheWFrfV97aXR9ICsNClxiZXRhXzUgXHRleHR7SElWfV97aXR9ICsNClxnYW1tYV90ICsNClxsb2coXHRleHR7SnVtbGFoIFBlbmR1ZHVrfV97aXR9KQ0KJCQNCkRlbmdhbjoNCg0KJFxtdV97aXR9JCA9IHJhdGEtcmF0YSBrYXN1cyBUQiBwYWRhIHdpbGF5YWgga2UtJGkkIGRhbiB0YWh1biBrZS0kdCQNCiRcYmV0YV8wJCA9IGludGVyc2VwDQokXGJldGFfayQgPSBrb2VmaXNpZW4gcmVncmVzaQ0KJFxnYW1tYV90JCA9IGVmZWsgdGV0YXAgdGFodW4NCiRcbG9nKFBvcHVsYXNpX3tpdH0pJCA9IG9mZnNldCBqdW1sYWggcGVuZHVkdWsNCg0KVmFyaWFiZWwgdGFodW4gZGltYXN1a2thbiBzZWJhZ2FpIGVmZWsgdGV0YXAgKGZpeGVkIGVmZmVjdCkgdW50dWsgbWVuZ29udHJvbCB2YXJpYXNpIHRlbXBvcmFsIHNlbGFtYSBwZXJpb2RlIHBlbmdhbWF0YW4gdGFodW4gMjAyMeKAkzIwMjUuIFNlbGFpbiBpdHUsIGRpZ3VuYWthbiBvZmZzZXQganVtbGFoIHBlbmR1ZHVrIGFnYXIgZXN0aW1hc2kgcmlzaWtvIGtlamFkaWFuIFRCIGRhcGF0IGRpYmFuZGluZ2thbiBzZWNhcmEgYWRpbCBhbnRhcndpbGF5YWggeWFuZyBtZW1pbGlraSBqdW1sYWggcGVuZHVkdWsgYmVyYmVkYS4NCg0KDQoNCkthcmFrdGVyaXN0aWsgcGVudGluZyBkYXJpIGRpc3RyaWJ1c2kgeWFuZyBzZXJpbmcgZGlndW5ha2FuIGRhbGFtIHBlbW9kZWxhbiByYXJlIGV2ZW50IChrYXN1cyBqYXJhbmcpIHRlcmphZGkpIGluaSB5YWl0dSBtZWFuIHNhbWEgZGVuZ2FuIHZhcmlhbnNpLiBLYXN1cw0Kc2VwZXJ0aSBpbmkgYmlhc2EgZGlzZWJ1dCBkZW5nYW4gZXF1aWRpc3BlcnNpb24gKFJhaGF5dSwgMjAyMCkuIEFzdW1zaSBkYXNhciByZWdyZXNpIFBvaXNzb24gbWVuc3lhcmF0a2FuIGtvbmRpc2kgZXF1aWRpc3BlcnNpb24sIHlhaXR1IHZhcmlhbnMgZGFyaSB2YXJpYWJlbCByZXNwb24gc2FtYSBkZW5nYW4gbmlsYWkgcmF0YS1yYXRhbnlhICgkVmFyKFRCX3tpdH0pID0gRShUQl97aXR9KSA9IFxtdV97aXR9JCkuDQoNCiMjIyMgYy4gT3ZlcmRpc3BlcnNpDQoNCkRhbGFtIHJlZ3Jlc2kgUG9pc3NvbiB0ZXJkYXBhdCBhc3Vtc2kgeWFuZyBoYXJ1cyBkaXBwZW51aGkuIEFzdW1zaSB0ZXJzZWJ1dCBhZGFsYWgga2VzYW1hYW4gbmlsYWkgbWVhbiBkYW4gdmFpcmFuc2kgdmFyaWFiZWwgZGVwZW5kZW4gYXRhdSB5YW5nIGRpa2VuYWwgZGVuZ2FuIHNlYnV0YW4gZXF1aWRpc3BlcnNpLiBSYWhheXUgKDIwMTQpIG1lbnlhdGFrYW4gYmFod2Egb3ZlcmRpc3BlcnNpIGRhcGF0IHRlcmphZGkga2FyZW5hDQphZGFueWEgbmlsYWkgbm9sIHlhbmcgYmVybGViaWhhbiBwYWRhIHZhcmlhYmVsIGRlcGVuZGVueWEsIHN1bWJlciBrZXJhZ2FtYW4geWFuZyB0aWRhayB0ZXJhbWF0aSBwYWRhIGRhdGEgYXRhdSBhZGFueWEgcGVuZ2FydWggcGV1YmFoIGxhaW4geWFuZyBtZW5nYWtpYmF0a2FuIHBlbHVhbmcgc3VhdHUga2VqYWRpYW4gYmVyZ2FudHVuZyBwYWRhDQprZWphZGlhbiBzZWJlbHVtbnlhLiBTZWxhaW4gaXR1LCBvdmVyZGlzcGVyc2kgZGFwYXQgcHVsYSB0ZXJqYWRpIGthcmVuYSBhZGFueWEgcGVuY2lsYW4gcGFkYSBkYXRhIGRhbiBrZXNhbGFoYW4NCnNwZXNpZmlrYXNpIGZ1bmdzaSBwZW5naHVidW5nLiANCg0KRGV2aWFzaSB0ZXJoYWRhcCBhc3Vtc2kgZXF1aWRpc3BlcnNpb24gZGl1amkgc2VjYXJhIGt1YW50aXRhdGlmIGRlbmdhbiBtZW5naGl0dW5nIHN0YXRpc3RpayByYXNpbyBkaXNwZXJzaSBQZWFyc29uIHJlc2lkdWFsOg0KDQokJFxwaGlfe2Rpc3B9ID0gXGZyYWN7XHN1bV97aX1cc3VtX3t0fVxmcmFjeyhUQl97aXR9LVxoYXR7XG11fV97aXR9KV4yfXtcaGF0e1xtdX1fe2l0fX19e1x0ZXh0e2RmfV97cmVzaWR1YWx9fSQkDQoNCkFwYWJpbGEgZGlkYXBhdGthbiAkXHBoaV97ZGlzcH0gPiAxJCwgbWFrYSBkYXRhIHRlcmluZGlrYXNpIG1lbmdhbGFtaSBvdmVyZGlzcGVyc2kgeWFuZyBwYXJhaC4gRGFsYW0ga29uZGlzaSBpbmksIGVzdGltYXNpIHN0YW5kYXJkIGVycm9yIGRhcmkgbW9kZWwgUG9pc3NvbiBha2FuIHRlcmJpYXMga2UgYmF3YWggKHVuZGVyZXN0aW1hdGVkKSwgeWFuZyBiZXJkYW1wYWsgcGFkYSBwZW5ndWppYW4gc2lnbmlmaWthbnNpIHBhcnNpYWwgeWFuZyB0ZXJsYWx1IG9wdGltaXMgZGFuIG1lbnllc2F0a2FuLg0KDQojIyMjIGQuR2VuZXJhbGl6ZWQgTGluZWFyIE1peGVkIE1vZGVsLSBOZWdhdGl2ZSBCaW5vbWlhbCAoR0xNTS1OQikNCg0KR0xNTSBtZXJwdWthbiBwZW55ZW1wdXJuYWFuIGRhcmkgR0xNIGRlbmdhbiBtZW11bmdraW5rYW4ga29yZWxhc2kgZGkgYW50YXJhIHZhcmlhYmVsIHJlc3BvbnMuIEhhbCBpbmkgbWVtdW5na2lua2FuIG1vZGVsIHVudHVrIG1lbXBlcmhpdHVuZ2thbiBwZW5nYXJ1aCBhY2FrIHlhbmcgdGlkYWsgdGVyYW1hdGkgZGFuIG1lbmV0YXBrYW4ga29yZWxhc2kgbGFuZ3N1bmcgZGFsYW0gZGF0YS4gRGlyYW5jYW5nIGtodXN1cyB1bnR1ayBtZW5hbmdhbmkgdmFyaWFiZWwgcmVzcG9ucyB5YW5nIG1lbnlpbXBhbmcgZGFyaSBkaXN0cmlidXNpIG5vcm1hbCwgcGVuZGVrYXRhbiBpbmkganVnYSBtZW1wZXJ0aW1iYW5na2FuIHZhcmlhYmlsaXRhcyBkaSBiZXJiYWdhaSBrZWxvbXBvayBhdGF1IGxva2FzaS4gDQoNCkRhbGFtIG1lbmFuZ2FuaSBvdmVyZGlzcGVyc2kgc2VjYXJhIHN0cnVrdHVyYWwgc2VrYWxpZ3VzIG1lbmdha29tb2Rhc2kgZGVwZW5kZW5zaSBzcGFzaWFsIGRhbiB0ZW1wb3JhbCBkYXJpIGRhdGEgcGFuZWwgKDI3IGthYnVwYXRlbi9rb3RhIHNlbGFtYSA1IHBlcmlvZGUpLCBkaXRlcmFwa2FuIHBlbW9kZWxhbiBHTE1NIG1lbmdndW5ha2FuIGRpc3RyaWJ1c2kgTmVnYXRpdmUgQmlub21pYWwgdGlwZSBuYmlub20yIGRhcmkgcHVzdGFrYSBnbG1tVE1CLiBNb2RlbCBuYmlub20yIG1lbmdhc3Vtc2lrYW4gcGFyYW1ldGVyaXNhc2kga3VhZHJhdGlrIHRlcmhhZGFwIHZhcmlhbnMgKEhhcmRpbiAmIEhpbGJlLCAyMDA3KSA6DQoNCiQkVmFyKFRCX3tpdH1cbWlkIHVfaSx2X3QpID0gXG11X3tpdH1cbGVmdCgxK1xmcmFje1xtdV97aXR9fXtccGhpfVxyaWdodCkgPSBcbXVfe2l0fStcZnJhY3tcbXVfe2l0fV4yfXtccGhpfSQkDQoNCkRlbmdhbiAkXHBoaSQgbWV3YWtpbGkgcGFyYW1ldGVyIGRpc3BlcnNpIGt1YWRyYXRpay4gS2V0aWthICRccGhpIFx0byBcaW5mdHkkLCBkaXN0cmlidXNpIGFrYW4gbWVuZGVrYXRpIFBvaXNzb24uIFBlcnNhbWFhbiBtb2RlbCBzcGFzaW8tdGVtcG9yYWwgZGFsYW0gcGVuZWxpdGlhbiBpbmkgZGlmb3JtdWxhc2lrYW4gc2ViYWdhaSBiZXJpa3V0Og0KDQokJFxsb2coXG11X3tpdH0pID0gXGJldGFfMCArIFxiZXRhXzFcdGV4dHtwZW5kdWR1ayBtaXNraW59X3tpdH0gKyBcYmV0YV8yXHRleHR7a2VwYWRhdGFufV97aXR9ICsgXGJldGFfM1x0ZXh0e2FpciBtaW51bSBsYXlha31fe2l0fSArIFxiZXRhXzRcdGV4dHtzYW5pdGFzaSBsYXlha31fe2l0fSArIFxiZXRhXzVcdGV4dHtoaXZ9X3tpdH0gKyBcbG9nKFx0ZXh0e2p1bWxhaCBwZW5kdWR1a31fe2l0fSkgKyB1X2kgKyB2X3QkJA0KDQpEZW5nYW4gJFxsb2coXHRleHR7anVtbGFoIHBlbmR1ZHVrfV97aXR9KSQgZGlzaXNpcGthbiBzZWJhZ2FpIHZhcmlhYmVsIG9mZnNldCAoZGVuZ2FuIGtvZWZpc2llbiB5YW5nIGRpcGFrc2EgYmVybmlsYWkgMSkgdW50dWsgbWVuZ29udHJvbCBwZXJiZWRhYW4gdWt1cmFuIHBvcHVsYXNpIGRhc2FyIGFudGFyd2lsYXlhaCwgc2VoaW5nZ2EgbW9kZWwgc2VjYXJhIGVmZWt0aWYgbWVuZ2VzdGltYXNpIGxhanUga2VqYWRpYW4gKHJhdGUpLCBidWthbiBqdW1sYWggYWJzb2x1dCBrYXN1cy4NCg0KLSAkdV9pIFxzaW0gTigwLCBcc2lnbWFfe3V9XjIpJCBtZWxhbWJhbmdrYW4gZWZlayBhY2FrIHdpbGF5YWggKGthYnVwYXRlbi9rb3RhKSB1bnR1ayBtZW5nb250cm9sIGhldGVyb2dlbml0YXMgc3Bhc2lhbCB0aWRhayB0ZXJhbWF0aS4NCg0KLSAkdl90IFxzaW0gTigwLCBcc2lnbWFfe3Z9XjIpJCBtZWxhbWJhbmdrYW4gZWZlayBhY2FrIHRlbXBvcmFsICh0YWh1bikgdW50dWsgbWVuYW5na2FwIGZsdWt0dWFzaSBtYWtyby10ZW1wb3JhbCB0YWh1bmFuLg0KDQojIyMjIGUuIEluY2lkZW5jZSBSYXRlIFJhdGlvIChJUlIpDQoNCkluY2lkZW5jZSBSYXRlIFJhdGlvIGRhbGFtICBwZW5lbGl0aWFuIGluaSBkaWd1bmFrYW4gdW50dWsgbWVtdWRhaGthbiBpbnRlcnByZXRhc2kgZXBpZGVtaW9sb2dpIGRhcmkga29lZmlzaWVuIHJlZ3Jlc2kgZWZlayB0ZXRhcCAoJFxiZXRhX2skKSwgZGlsYWt1a2FuIHRyYW5zZm9ybWFzaSBla3Nwb25lbnNpYWw6DQokJElSUl9rID0gXGV4cChcYmV0YV9rKSQkDQoNCk5pbGFpICRJUlJfayQgbWVyZXByZXNlbnRhc2lrYW4gcmFzaW8gcGVydWJhaGFuIGxhanUga2VqYWRpYW4gVEIgdW50dWsgc2V0aWFwIGtlbmFpa2FuIHNhdHUgdW5pdCBwYWRhIHZhcmlhYmVsIHByZWRpa3RvciAkWF9rJCwgZGVuZ2FuIGFzdW1zaSB2YXJpYWJlbCBsYWlubnlhIGtvbnN0YW4uDQoNCiMgMyBIYXNpbCBkYW4gUGVtYmFoYXNhbg0KDQojIyAzLjEgQW5hbGlzaXMgRGVza3JpcHRpZg0KDQpHYW1iYXJhbiB1bXVtIG1lbmdlbmFpIHNlYmFyYW4ga2FzdXMgVHViZXJrdWxvc2lzIGRpIFByb3ZpbnNpIEphd2EgQmFyYXQgc2VsYW1hIGt1cnVuIHdha3R1IDIwMjEgaGluZ2dhIDIwMjUgZGlhbmFsaXNpcyB0ZXJsZWJpaCBkYWh1bHUgc2VjYXJhIGRlc2tyaXB0aWYgdW50dWsgbWVsaWhhdCBrYXJha3RlcmlzdGlrIHBlbXVzYXRhbiBkYW4gcGVueWViYXJhbiBkYXRhLg0KDQo8ZGl2IGFsaWduPSJjZW50ZXIiPg0KKipUYWJlbCA0KiouIFN0YXRpc3RpayBEZXNrcmlwdGlmDQo8L2Rpdj4NCg0KDQpgYGB7cn0NCmRlc2tyaXB0aWZfdGIgPC0gZGF0YSAlPiUNCiAgZ3JvdXBfYnkodGFodW4pICU+JQ0KICBzdW1tYXJpc2UoDQogICAgTWluID0gbWluKFRCKSwNCiAgICBRMSA9IHF1YW50aWxlKFRCLDAuMjUpLA0KICAgIE1lYW4gPSBtZWFuKFRCKSwNCiAgICBRMyA9IHF1YW50aWxlKFRCLDAuNzUpLA0KICAgIE1heCA9IG1heChUQiksDQogICAgU0QgPSBzZChUQiksDQogICAgQ1YgPSBzZChUQikvbWVhbihUQikqMTAwDQogICAgKQ0Ka2FibGUoZGVza3JpcHRpZl90YikNCmBgYA0KDQpUYWJlbCBzdGF0aXN0aWsgZGVza3JpcHRpZiBtZW55YWppa2FuIHJpbmNpYW4gZGlzdHJpYnVzaSBkYXRhIGthc3VzIFRCIHBhZGEgdGluZ2thdCB3aWxheWFoIChtaXNhbG55YSBrYWJ1cGF0ZW4va290YSkgZGkgSmF3YSBCYXJhdCBkYXJpIHRhaHVuIDIwMjEgaGluZ2dhIDIwMjUuIERhdGEgbWVudW5qdWtrYW4gcG9sYSBza2V3bmVzcyBhdGF1IGtldGltcGFuZ2FuIHlhbmcgY3VrdXAgdGluZ2dpLCBkaSBtYW5hIHJhdGEtcmF0YSAobWVhbikgc2VsYWx1IGJlcmFkYSBqYXVoIGRpIGF0YXMgbmlsYWkga3VhcnRpbCBwZXJ0YW1hIChRMSkgZGFuIGxlYmloIGRla2F0IGRlbmdhbiBrdWFydGlsIGtldGlnYSAoUTMpLiBIYWwgaW5pIG1lbmdpbmRpa2FzaWthbiBhZGFueWEga29uc2VudHJhc2kga2FzdXMgeWFuZyBzYW5nYXQgdGluZ2dpIHBhZGEgc2ViYWdpYW4ga2VjaWwgd2lsYXlhaCwgc2VtZW50YXJhIG1heW9yaXRhcyB3aWxheWFoIGxhaW5ueWEgbWVtaWxpa2kganVtbGFoIGthc3VzIHlhbmcgbGViaWggcmVuZGFoLg0KDQpTZWxhaW4gaXR1LCBuaWxhaSBzaW1wYW5nYW4gYmFrdSAoU3RhbmRhcmQgRGV2aWF0aW9uL1NEKSB5YW5nIHNhbmdhdCBiZXNhciBkaWJhbmRpbmdrYW4gZGVuZ2FuIG5pbGFpIG1lYW4gc2V0aWFwIHRhaHVubnlhIG1lbmVnYXNrYW4gYWRhbnlhIHZhcmlhc2kgYXRhdSBkaXNwYXJpdGFzIGJlYmFuIGthc3VzIHlhbmcgZWtzdHJlbSBhbnRhcndpbGF5YWguIE5pbGFpIEtvZWZpc2llbiBWYXJpYXNpIChDVikgeWFuZyBiZXJhZGEgZGkga2lzYXJhbiA3MiUgaGluZ2dhIDgwJSBzZW1ha2luIG1lbXBlcmt1YXQgdGVtdWFuIGJhaHdhIHRlcmRhcGF0IGtldGltcGFuZ2FuIGRpc3RyaWJ1c2kga2FzdXMgeWFuZyBzdWJzdGFuc2lhbC4gTWVza2lwdW4gbmlsYWkgQ1YgbWVudW5qdWtrYW4gdHJlbiBwZW51cnVuYW4gZGFyaSA4MCwxOCUgKDIwMjEpIG1lbmphZGkgNzIsNDMlICgyMDI1KSwgYW5na2EgdGVyc2VidXQgbWFzaWggdGVyZ29sb25nIHNhbmdhdCB0aW5nZ2ksIHlhbmcgbWVuY2VybWlua2FuIGtldGlkYWttZXJhdGFhbiBiZWJhbiBlcGlkZW1pb2xvZ2lzIFRCIGRpIHRpbmdrYXQgZGFlcmFoIGRpIEphd2EgQmFyYXQuDQoNCg0KYGBge3J9DQpyaW5na2FzYW5fdGIgPC0gZGF0YSAlPiUNCiAgZ3JvdXBfYnkodGFodW4pICU+JQ0KICBzdW1tYXJpc2UoDQogICAga2FzdXMgPSBzdW0oVEIpLA0KICAgIHBvcHVsYXNpID0gc3VtKGp1bWxhaF9wZW5kdWR1aykNCiAgKQ0KDQpnZ3Bsb3QoDQogIHJpbmdrYXNhbl90YiwNCiAgYWVzKA0KICAgIHggPSBmYWN0b3IodGFodW4pLA0KICAgIHkgPSBrYXN1cywNCiAgICBmaWxsID0gZmFjdG9yKHRhaHVuKQ0KICApDQopICsNCiAgZ2VvbV9jb2woDQogICAgd2lkdGggPSAwLjc1LA0KICAgIGNvbG9yID0gIndoaXRlIg0KICApICsNCiAgZ2VvbV90ZXh0KA0KICAgIGFlcyhsYWJlbCA9IHJvdW5kKGthc3VzKSksDQogICAgdmp1c3QgPSAtMC4zLA0KICAgIGZvbnRmYWNlID0gImJvbGQiDQogICkgKw0KICBzY2FsZV9maWxsX21hbnVhbCgNCiAgICB2YWx1ZXMgPSBjKA0KICAgICAgIiMxYjllNzciLCAgIyAyMDIxDQogICAgICAiI2Q5NWYwMiIsICAjIDIwMjINCiAgICAgICIjNzU3MGIzIiwgICMgMjAyMw0KICAgICAgIiNlNzI5OGEiLCAgIyAyMDI0DQogICAgICAiIzY2YTYxZSIgICAjIDIwMjUNCiAgICApDQogICkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIlRyZW4gSnVtbGFoIEthc3VzIFRCIEphd2EgQmFyYXQgVGFodW4gMjAyMeKAkzIwMjUiLA0KICAgIHggPSAiVGFodW4iLA0KICAgIHkgPSAiSnVtbGFoIEthc3VzIFRCIg0KICApICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dCgNCiAgICAgIGhqdXN0ID0gMC41LA0KICAgICAgZmFjZSA9ICJib2xkIiwNCiAgICAgIHNpemUgPSAxNA0KICAgICksDQogICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiDQogICkNCmBgYA0KDQo8ZGl2IGFsaWduPSJjZW50ZXIiPg0KKipHYW1iYXIgMSoqLiBHcmFmaWsgVHJlbiBLYXN1cyBUQg0KPC9kaXY+DQoNCkJlcmRhc2Fya2FuIHZpc3VhbGlzYXNpIHRyZW4ganVtbGFoIGthc3VzIFR1YmVya3Vsb3NpcyAoVEIpIGRpIEphd2EgQmFyYXQgcGVyaW9kZSAyMDIx4oCTMjAyNSwgdGVybGloYXQgYWRhbnlhIHBlbmluZ2thdGFuIHNpZ25pZmlrYW4gc2VjYXJhIGFrdW11bGF0aWYuIEp1bWxhaCBrYXN1cyBUQiB0ZXJjYXRhdCBzZWJlc2FyIDg5LjI1NSBwYWRhIHRhaHVuIDIwMjEgZGFuIG1lbmluZ2thdCB0YWphbSBtZW5qYWRpIDE2MC42NjEgcGFkYSB0YWh1biAyMDIyLiBUcmVuIGtlbmFpa2FuIGluaSB0ZXJ1cyBiZXJsYW5qdXQgaGluZ2dhIG1lbmNhcGFpIHB1bmNha255YSBwYWRhIHRhaHVuIDIwMjQgZGVuZ2FuIDIyOS42ODMga2FzdXMuIE5hbXVuLCBwYWRhIHRhaHVuIDIwMjUsIHRlcmphZGkgc2VkaWtpdCBwZW51cnVuYW4ganVtbGFoIGthc3VzIG1lbmphZGkgMjI1LjM4OS4gU2VjYXJhIGtlc2VsdXJ1aGFuLCBkYXRhIGluaSBtZW51bmp1a2thbiBiZWJhbiBwZW55YWtpdCBUQiB5YW5nIGN1a3VwIHRpbmdnaSBkZW5nYW4gZmx1a3R1YXNpIHBlcnR1bWJ1aGFuIHlhbmcgcGVzYXQgc2VsYW1hIGxpbWEgdGFodW4gdGVyYWtoaXIsIHlhbmcgbWVuZ2luZGlrYXNpa2FuIHBlcmx1bnlhIGV2YWx1YXNpIGJlcmtlbGFuanV0YW4gdGVyaGFkYXAgc3RyYXRlZ2kgcGVuZ2VuZGFsaWFuIGRhbiBwZW5lbXVhbiBrYXN1cyBkaSBsYXBhbmdhbi4NCg0KIyMgMy4yIFVrdXJhbiBFcGlkZW1pb2xvZ2kNCg0KIyMjIDMuMi4xIEluY2lkZW5jZSBSYXRlIChJUikNCg0KDQpgYGB7ciB9DQpkYXRhIDwtIGRhdGEgJT4lDQogIG11dGF0ZSgNCiAgICBJUiA9DQogICAgICBUQiAvDQogICAgICBqdW1sYWhfcGVuZHVkdWsgKg0KICAgICAgMTAwMDAwDQogICkNCmBgYA0KDQoNCjxkaXYgYWxpZ249ImNlbnRlciI+DQoqKlRhYmVsIDUuKiogSW5jaWRlbmNlIFJhdGUgVHViZXJrdWxvc2lzIEphd2EgQmFyYXQgVGFodW4gMjAyMeKAkzIwMjUNCjwvZGl2Pg0KDQoNCmBgYHtyfQ0KaXJfdGFodW4gPC0gZGF0YSAlPiUNCiAgZ3JvdXBfYnkodGFodW4pICU+JQ0KICBzdW1tYXJpc2UoDQogICAga2FzdXMgPSBzdW0oVEIpLA0KICAgIHBlbmR1ZHVrID0gc3VtKGp1bWxhaF9wZW5kdWR1aykNCiAgKSAlPiUNCiAgbXV0YXRlKA0KICAgIElSID0NCiAgICAgIGthc3VzIC8NCiAgICAgIHBlbmR1ZHVrICoNCiAgICAgIDEwMDAwMA0KICApDQoNCmthYmxlKA0KICBpcl90YWh1biwNCiAgZGlnaXRzID0gMiwNCikNCmBgYA0KDQoNCmBgYHtyfQ0KZ2dwbG90KA0KICBpcl90YWh1biwNCiAgYWVzKA0KICAgIHggPSB0YWh1biwNCiAgICB5ID0gSVINCiAgKQ0KKSsNCiAgZ2VvbV9saW5lKA0KICAgIGNvbG9yID0gIiMyQzdGQjgiLA0KICAgIGxpbmV3aWR0aCA9IDEuNQ0KICApKw0KICBnZW9tX3BvaW50KA0KICAgIGNvbG9yID0gIiNEOTVGMDIiLA0KICAgIHNpemUgPSA0DQogICkrDQogIGdlb21fdGV4dCgNCiAgICBhZXMoDQogICAgICBsYWJlbCA9IHJvdW5kKElSLDIpDQogICAgKSwNCiAgICB2anVzdCA9IC0wLjgsDQogICAgZm9udGZhY2UgPSAiYm9sZCIsDQogICAgc2l6ZSA9IDQNCiAgKSsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJUcmVuIEluY2lkZW5jZSBSYXRlIChJUikgVHViZXJrdWxvc2lzIEphd2EgQmFyYXQgVGFodW4gMjAyMeKAkzIwMjUiLA0KICAgIHggPSAiVGFodW4iLA0KICAgIHkgPSAiSVIgcGVyIDEwMC4wMDAgUGVuZHVkdWsiDQogICkrDQogIHRoZW1lX21pbmltYWwoYmFzZV9zaXplID0gMTIpKw0KICB0aGVtZSgNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KA0KICAgICAgaGp1c3QgPSAwLjUsDQogICAgICBmYWNlID0gImJvbGQiLA0KICAgICAgc2l6ZSA9IDE0DQogICAgKSwNCiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KA0KICAgICAgZmFjZSA9ICJib2xkIg0KICAgICkNCiAgKQ0KYGBgDQoNCjxkaXYgYWxpZ249ImNlbnRlciI+DQoqKkdhbWJhciAyLiAqKiBHcmFmaWsgVHJlbiBJUg0KPC9kaXY+DQoNCkJlcmRhc2Fya2FuIEdyYWZpayBUcmVuIElSIGRhdGEgcGFkYSBHYW1iYXIgMiB0cmVuIEluY2lkZW5jZSBSYXRlIChJUikgVHViZXJrdWxvc2lzIGRpIEphd2EgQmFyYXQgbWVudW5qdWtrYW4gcGVuaW5na2F0YW4geWFuZyBzaWduaWZpa2FuIGRhcmkgdGFodW4gMjAyMSBoaW5nZ2EgMjAyNC4gUGFkYSB0YWh1biAyMDIxLCBhbmdrYSBJUiB0ZXJjYXRhdCBzZWJlc2FyIDE4MywxMyBwZXIgMTAwLjAwMCBwZW5kdWR1ay4gQW5na2EgaW5pIHRlcnVzIG1lbnVuanVra2FuIHRyZW4gcGVuaW5na2F0YW4geWFuZyBrb25zaXN0ZW4sIHlha25pIG1lbmNhcGFpIDMyNSw4NCBwYWRhIHRhaHVuIDIwMjIsIDQyNSwxMSBwYWRhIHRhaHVuIDIwMjMsIGhpbmdnYSBtZW5jYXBhaSBwdW5jYWtueWEgcGFkYSB0YWh1biAyMDI0IGRlbmdhbiBhbmdrYSA0NTYsMjIgcGVyIDEwMC4wMDAgcGVuZHVkdWsuIE5hbXVuLCBwYWRhIHRhaHVuIDIwMjUsIHRlcmxpaGF0IGFkYW55YSBzZWRpa2l0IHBlbnVydW5hbiBiZWJhbiBpbnNpZGVuc2kgbWVuamFkaSA0NDQsMDQgcGVyIDEwMC4wMDAgcGVuZHVkdWsuIFBvbGEgaW5pIG1lbmdpbmRpa2FzaWthbiBhZGFueWEgaW50ZW5zaWZpa2FzaSBkYWxhbSBwZW5lbXVhbiBrYXN1cyBhdGF1IHBlbmluZ2thdGFuIHBlbnVsYXJhbiBwZW55YWtpdCBkYWxhbSBwZXJpb2RlIHRlcnNlYnV0LCBkaWlrdXRpIG9sZWggc3RhYmlsaXNhc2kgcGFkYSB0YWh1biB0ZXJha2hpciBvYnNlcnZhc2kuDQoNCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9DQptYXBfaXIgPC0gbGVmdF9qb2luKA0KICBqYWJhciwNCiAgZGF0YSwNCiAgYnkgPSAiSUQiDQopDQoNCnRtX3NoYXBlKG1hcF9pcikrDQogIHRtX3BvbHlnb25zKA0KICAgICJJUiIsDQogICAgcGFsZXR0ZSA9ICJSZWRzIiwNCiAgICBzdHlsZSA9ICJxdWFudGlsZSIsDQogICAgdGl0bGUgPSAiSVIiDQogICkrDQogIHRtX2JvcmRlcnMoKSsNCiAgdG1fZmFjZXRzKA0KICAgIGJ5ID0gInRhaHVuIiwNCiAgICBuY29sID0gMw0KICApKw0KICB0bV9sYXlvdXQoDQogICAgbWFpbi50aXRsZSA9DQogICAgICAiUGV0YSBJbmNpZGVuY2UgUmF0ZSBUdWJlcmt1bG9zaXMgSmF3YSBCYXJhdCBUYWh1biAyMDIx4oCTMjAyNSIsDQogICAgbGVnZW5kLm91dHNpZGUgPSBUUlVFDQogICkNCmBgYA0KDQo8ZGl2IGFsaWduPSJjZW50ZXIiPg0KKipHYW1iYXIgMy4gKiogVmlzdWFsaXNhc2kgUGV0YSBJUiANCjwvZGl2Pg0KDQpEaXN0cmlidXNpIFNwYXNpYWwgSW5jaWRlbmNlIFJhdGUgVHViZXJrdWxvc2lzIHlhbmcgZGlzYWppa2FuIGRhbGFtIEdhbWJhciAzIG1lbWJlcmlrYW4gZ2FtYmFyYW4gbWVuZ2VuYWkgc2ViYXJhbiBnZW9ncmFmaXMgSVIgVHViZXJrdWxvc2lzIGRpIHdpbGF5YWggSmF3YSBCYXJhdCBkYXJpIHRhaHVuIDIwMjEgaGluZ2dhIDIwMjUuIFZpc3VhbGlzYXNpIHBldGEgdGVtYXRpayB0ZXJzZWJ1dCBtZW51bmp1a2thbiBwZXJnZXNlcmFuIGdyYWRhc2kgd2FybmEgZGFyaSB0YWh1biBrZSB0YWh1biwgeWFuZyBtZXJlcHJlc2VudGFzaWthbiBwZW5pbmdrYXRhbiBuaWxhaSBJUiBzZWNhcmEgbWVyYXRhIGRpIGJlcmJhZ2FpIHdpbGF5YWggYWRtaW5pc3RyYXRpZi4NCg0KLSBQYWRhIHRhaHVuIDIwMjEsIGRvbWluYXNpIHdhcm5hIHRlcmFuZyBtZW51bmp1a2thbiBiYWh3YSBtYXlvcml0YXMgd2lsYXlhaCBtYXNpaCBiZXJhZGEgcGFkYSB0aW5na2F0IGluc2lkZW5zaSB5YW5nIHJlbGF0aWYgcmVuZGFoLg0KDQotIFNlaXJpbmcgYmVyamFsYW5ueWEgd2FrdHUsIHRlcmphZGkgcGVuaW5na2F0YW4gaW50ZW5zaXRhcyB3YXJuYSBwYWRhIHBldGEsIHlhbmcgbWVuYW5kYWthbiBiYWh3YSBzZW1ha2luIGJhbnlhayB3aWxheWFoIHlhbmcgYmVycGluZGFoIGtlIGthdGVnb3JpIElSIHlhbmcgbGViaWggdGluZ2dpIChkaXRhbmRhaSBkZW5nYW4gd2FybmEgbWVyYWggeWFuZyBsZWJpaCBnZWxhcCkuDQoNCi0gUG9sYSBpbmkgbWVuZWdhc2thbiBiYWh3YSBiZWJhbiBwZW55YWtpdCBUdWJlcmt1bG9zaXMgZGkgSmF3YSBCYXJhdCBtZW5nYWxhbWkgZXNrYWxhc2kgZ2VvZ3JhZmlzIHlhbmcgbWVsdWFzLCBkZW5nYW4gYWt1bXVsYXNpIHdpbGF5YWggeWFuZyBtZW1pbGlraSBhbmdrYSBJUiB0aW5nZ2kgKDM4N+KAkzEuMjA3KSB0ZXJsaWhhdCBzZW1ha2luIGRvbWluYW4gcGFkYSB0YWh1biAyMDI0IGRhbiAyMDI1IGRpYmFuZGluZ2thbiBkZW5nYW4gdGFodW4tdGFodW4gc2ViZWx1bW55YS4NCg0KIyMjIDMuMi4yIFN0YW5kYXJkaXplZCBJbmNpZGVuY2UgUmF0aW8gKFNJUikNCg0KRGFsYW0gdXBheWEgdW50dWsgbWVuc3RhbmRhcmRpc2FzaSBhbmFsaXNpcyBiZWJhbiBwZW55YWtpdCBhbnRhcndpbGF5YWgsIGRpbGFrdWthbiBwZXJoaXR1bmdhbiBqdW1sYWgga2FzdXMgaGFyYXBhbiAoZXhwZWN0ZWQgY2FzZXMpIHVudHVrIHNldGlhcCBrYWJ1cGF0ZW4va290YS4gUGVyaGl0dW5nYW4gaW5pIGRpZGFzYXJrYW4gcGFkYSBnbG9iYWwgcmF0ZSAocmF0YS1yYXRhIGluc2lkZW5zaSBUQiBkaSBzZWx1cnVoIHdpbGF5YWggSmF3YSBCYXJhdCkgeWFuZyBkaWthbGlrYW4gZGVuZ2FuIGp1bWxhaCBwb3B1bGFzaSBkaSBtYXNpbmctbWFzaW5nIGthYnVwYXRlbi9rb3RhLiBQZXJoaXR1bmdhbiBleHBlY3RlZCBjYXNlcyBpbmkgbWVydXBha2FuIHByYXN5YXJhdCBrcnVzaWFsIHNlYmVsdW0gbWVsYWt1a2FuIGFuYWxpc2lzIFN0YW5kYXJkaXplZCBJbmNpZGVuY2UgUmF0aW8gKFNJUiksIGthcmVuYSBiZXJmdW5nc2kgc2ViYWdhaSBuaWxhaSBwZW1iYW5kaW5nIHVudHVrIG1lbmd1a3VyIGRldmlhc2kgYW50YXJhIGp1bWxhaCBrYXN1cyBha3R1YWwgZGVuZ2FuIGVrc3Bla3Rhc2kgZXBpZGVtaW9sb2dpcy4NCg0KPGRpdiBhbGlnbj0iY2VudGVyIj4NCioqVGFiZWwgNi4qKiBIYXNpbCBQZXJoaXR1bmdhbiBFeHBlY3RlZCBDYXNlcyBUdWJlcmt1bG9zaXMNCjwvZGl2Pg0KDQpgYGB7cn0NCnJhdGVfZ2xvYmFsIDwtDQogIHN1bShkYXRhJFRCKS8NCiAgc3VtKGRhdGEkanVtbGFoX3BlbmR1ZHVrKQ0KDQpkYXRhIDwtIGRhdGEgJT4lDQogIG11dGF0ZSgNCiAgICBleHBlY3RlZD0NCiAgICAgIGp1bWxhaF9wZW5kdWR1ayAqDQogICAgICByYXRlX2dsb2JhbA0KICApDQoNCnRhYmVsX2V4cGVjdGVkIDwtIGRhdGEgJT4lDQogIHNlbGVjdCgNCiAgICBuYW1hX2thYnVwYXRlbl9rb3RhLA0KICAgIHRhaHVuLA0KICAgIFRCLA0KICAgIGp1bWxhaF9wZW5kdWR1aywNCiAgICBleHBlY3RlZA0KICApICU+JQ0KICBoZWFkKDEwKQ0KDQprbml0cjo6a2FibGUoDQogIHRhYmVsX2V4cGVjdGVkLA0KICBkaWdpdHMgPSAzDQopDQpgYGANCg0KSGFzaWwgcGVyaGl0dW5nYW4geWFuZyBkaXNhamlrYW4gcGFkYSBUYWJlbCA2IGRpIGF0YXMgbWVtYmVyaWthbiBnYW1iYXJhbiBzZWJhZ2FpIGJlcmlrdXQ6DQoNCi0gTWV0b2RvbG9naSBFc3RpbWFzaTogTmlsYWkgZXhwZWN0ZWQgbWVyZXByZXNlbnRhc2lrYW4ganVtbGFoIGthc3VzIHlhbmcgc2VoYXJ1c255YSBtdW5jdWwgZGkgc3VhdHUgd2lsYXlhaCBqaWthIHRpbmdrYXQgaW5zaWRlbnNpIFRCIGRpIHdpbGF5YWggdGVyc2VidXQgc2V0YXJhIGRlbmdhbiByYXRhLXJhdGEgaW5zaWRlbnNpIFRCIGRpIHRpbmdrYXQgcHJvdmluc2kuDQoNCi0gUGVyYmFuZGluZ2FuIEJlYmFuIFBlbnlha2l0OiBNZWxhbHVpIHRhYmVsIGluaSwgZGFwYXQgZGlsYWt1a2FuIG9ic2VydmFzaSBsYW5nc3VuZyBhbnRhcmEganVtbGFoIGthc3VzIFRCIGFrdHVhbCB5YW5nIHRlcmNhdGF0IGRlbmdhbiBqdW1sYWgga2FzdXMgeWFuZyBkaWhhcmFwa2FuLiBTZWJhZ2FpIGNvbnRvaCwgcGFkYSBzZWx1cnVoIGthYnVwYXRlbiB5YW5nIHRlcmNhbnR1bSBkYWxhbSB0YWJlbCAoc2VwZXJ0aSBLYWJ1cGF0ZW4gQm9nb3IsIEthYnVwYXRlbiBTdWthYnVtaSwgaGluZ2dhIEthYnVwYXRlbiBNYWphbGVuZ2thKSwgdGVybGloYXQgYmFod2EganVtbGFoIGthc3VzIFRCIGFrdHVhbCBtYXNpaCBiZXJhZGEgZGkgYmF3YWggYW5na2EgZXhwZWN0ZWQgY2FzZXMuDQoNCi0gSW50ZXJwcmV0YXNpIEVwaWRlbWlvbG9naXM6IFNlbGlzaWggYW50YXJhIG5pbGFpIGV4cGVjdGVkIGRlbmdhbiBqdW1sYWggVEIgYWt0dWFsIGluaSBtZXJ1cGFrYW4gaW5kaWthdG9yIHBlbnRpbmcgZGFsYW0gYW5hbGlzaXMgZXBpZGVtaW9sb2dpLCB5YW5nIHNlcmluZyBrYWxpIGRpZ3VuYWthbiBzZWJhZ2FpIGRhc2FyIHVudHVrIG1lbmdoaXR1bmcgU3RhbmRhcmRpemVkIEluY2lkZW5jZSBSYXRpbyAoU0lSKSBndW5hIG1lbmVudHVrYW4gYXBha2FoIHN1YXR1IHdpbGF5YWggbWVtaWxpa2kgYmViYW4ga2FzdXMgeWFuZyBzZWNhcmEgc3RhdGlzdGlrIGxlYmloIHRpbmdnaSBhdGF1IGxlYmloIHJlbmRhaCBkYXJpIHJhdGEtcmF0YSBwb3B1bGFzaS4NCg0KDQpgYGB7ciBpbmNsdWRlPUZBTFNFfQ0KZGF0YSA8LSBkYXRhICU+JQ0KICBtdXRhdGUoDQogICAgU0lSPQ0KICAgICAgVEIvZXhwZWN0ZWQNCiAgKQ0KYGBgDQoNCjxkaXYgYWxpZ249ImNlbnRlciI+DQoqKlRhYmVsIDcuKiogUmF0YS1yYXRhIChTSVIpIFR1YmVya3Vsb3NpcyBKYXdhIEJhcmF0IFRhaHVuIDIwMjHigJMyMDI1DQo8L2Rpdj4NCg0KYGBge3J9DQpzaXJfdGFodW4gPC0gZGF0YSAlPiUNCiAgZ3JvdXBfYnkodGFodW4pICU+JQ0KICBzdW1tYXJpc2UoDQogICAgU0lSID0gbWVhbihTSVIpDQogICkNCg0Ka25pdHI6OmthYmxlKA0KICBzaXJfdGFodW4sDQogIGRpZ2l0cyA9IDMpDQpgYGANCg0KIA0KYGBge3IgfQ0KDQpnZ3Bsb3QoDQogIHNpcl90YWh1biwNCiAgYWVzKA0KICAgIHggPSB0YWh1biwNCiAgICB5ID0gU0lSDQogICkNCikrDQogIGdlb21fbGluZSgNCiAgICBjb2xvciA9ICIjOEU0NEFEIiwNCiAgICBsaW5ld2lkdGggPSAxLjUNCiAgKSsNCiAgZ2VvbV9wb2ludCgNCiAgICBjb2xvciA9ICIjRTc0QzNDIiwNCiAgICBzaXplID0gNA0KICApKw0KICBnZW9tX3RleHQoDQogICAgYWVzKA0KICAgICAgbGFiZWwgPSByb3VuZChTSVIsMikNCiAgICApLA0KICAgIHZqdXN0ID0gLTAuOCwNCiAgICBmb250ZmFjZSA9ICJib2xkIiwNCiAgICBzaXplID0gNA0KICApKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIlRyZW4gU0lSIFR1YmVya3Vsb3NpcyBKYXdhIEJhcmF0IFRhaHVuIDIwMjHigJMyMDI1IiwNCiAgICB4ID0gIlRhaHVuIiwNCiAgICB5ID0gIlNJUiINCiAgKSsNCiAgdGhlbWVfbWluaW1hbChiYXNlX3NpemUgPSAxMikrDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoDQogICAgICBoanVzdCA9IDAuNSwNCiAgICAgIGZhY2UgPSAiYm9sZCIsDQogICAgICBzaXplID0gMTQNCiAgICApLA0KICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoDQogICAgICBmYWNlID0gImJvbGQiDQogICAgKQ0KICApDQpgYGANCg0KPGRpdiBhbGlnbj0iY2VudGVyIj4NCioqR2FtYmFyIDQuKiogR3JhZmlrIFRyZW4gU0lSDQo8L2Rpdj4NCg0KQmVyZGFzYXJrYW4gZGF0YSB5YW5nIGRpc2FqaWthbiBkYWxhbSBUYWJlbCA3IGRhbiBHYW1iYXIgNCwgdHJlbiBTdGFuZGFyZGl6ZWQgSW5jaWRlbmNlIFJhdGlvIChTSVIpIFR1YmVya3Vsb3NpcyBkaSBKYXdhIEJhcmF0IG1lbnVuanVra2FuIHBlbmluZ2thdGFuIHlhbmcga29uc2lzdGVuIGRhcmkgdGFodW4gMjAyMSBoaW5nZ2EgMjAyNC4gUGFkYSB0YWh1biAyMDIxLCBuaWxhaSBTSVIgdGVyY2F0YXQgc2ViZXNhciAwLDUzIGRhbiBtZW5nYWxhbWkga2VuYWlrYW4gYmVydGFoYXAgbWVuamFkaSAwLDk4IHBhZGEgdGFodW4gMjAyMiwgMSwyOSBwYWRhIHRhaHVuIDIwMjMsIGhpbmdnYSBtZW5jYXBhaSBwdW5jYWsgcGFkYSB0YWh1biAyMDI0IGRlbmdhbiBuaWxhaSAxLDM3LiBNZXNraXB1biB0ZXJkYXBhdCBzZWRpa2l0IHBlbnVydW5hbiBtZW5qYWRpIDEsMzIgcGFkYSB0YWh1biAyMDI1LCBhbmdrYSB0ZXJzZWJ1dCB0ZXRhcCBtZW51bmp1a2thbiB0aW5na2F0IGluc2lkZW5zaSB5YW5nIGxlYmloIHRpbmdnaSBkaWJhbmRpbmdrYW4gZGVuZ2FuIHBlcmlvZGUgYXdhbCBvYnNlcnZhc2kuDQoNCg0KYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0NCm1hcF9zaXIgPC0gbGVmdF9qb2luKA0KICBqYWJhciwNCiAgZGF0YSwNCiAgYnkgPSAiSUQiDQopDQoNCnRtX3NoYXBlKG1hcF9zaXIpKw0KICB0bV9wb2x5Z29ucygNCiAgICAiU0lSIiwNCiAgICBwYWxldHRlID0gIi1SZFlsQnUiLA0KICAgIHN0eWxlID0gInF1YW50aWxlIiwNCiAgICB0aXRsZSA9ICJTSVIiDQogICkrDQogIHRtX2JvcmRlcnMoY29sID0gImdyZXk0MCIpKw0KICB0bV9mYWNldHMoDQogICAgYnkgPSAidGFodW4iLA0KICAgIG5jb2wgPSAzDQogICkrDQogIHRtX2xheW91dCgNCiAgICBtYWluLnRpdGxlID0NCiAgICAgICJQZXRhIFN0YW5kYXJkaXplZCBJbmNpZGVuY2UgUmF0aW8gVHViZXJrdWxvc2lzIEphd2EgQmFyYXQgVGFodW4gMjAyMeKAkzIwMjUiLA0KICAgIG1haW4udGl0bGUuc2l6ZSA9IDEuMSwNCiAgICBsZWdlbmQub3V0c2lkZSA9IFRSVUUsDQogICAgbGVnZW5kLm91dHNpZGUucG9zaXRpb24gPSAicmlnaHQiLA0KICAgIGZyYW1lID0gRkFMU0UNCiAgKQ0KYGBgDQoNCjxkaXYgYWxpZ249ImNlbnRlciI+DQoqKkdhbWJhciA1LioqIFZpc3VhbGlzYXNpIFBldGEgU0lSIA0KPC9kaXY+DQoNClZpc3VhbGlzYXNpIHNwYXNpYWwgcGFkYSBnYW1iYXIgNSBtZW51bmp1a2thbiBwZXJ1YmFoYW4gZGlzdHJpYnVzaSByaXNpa28gVEIgYW50YXJ3aWxheWFoIGRpIEphd2EgQmFyYXQgc2VsYW1hIHBlcmlvZGUgbGltYSB0YWh1bi4NCg0KLSBQYWRhIHRhaHVuIDIwMjEsIHBldGEgZGlkb21pbmFzaSBvbGVoIHdhcm5hIGJpcnUsIHlhbmcgbWVyZXByZXNlbnRhc2lrYW4gbmlsYWkgU0lSIHJlbmRhaCAoMCwyNDnigJMwLDU4OCksIG1lbnVuanVra2FuIGJhaHdhIHNlYmFnaWFuIGJlc2FyIHdpbGF5YWggbWVtaWxpa2kgcmlzaWtvIGluc2lkZW5zaSB5YW5nIGJlcmFkYSBkaSBiYXdhaCByYXRhLXJhdGEuDQoNCi0gU2VpcmluZyBiZXJqYWxhbm55YSB3YWt0dSBoaW5nZ2EgdGFodW4gMjAyNCBkYW4gMjAyNSwgdGVyamFkaSBwZXJnZXNlcmFuIGdyYWRhc2kgd2FybmEga2UgYXJhaCBrdW5pbmcgZGFuIG9yYW55ZSwgeWFuZyBtZW5hbmRha2FuIHBlbmluZ2thdGFuIG5pbGFpIFNJUiBkaSBiZXJiYWdhaSBrYWJ1cGF0ZW4va290YSBtZW5qYWRpIGtpc2FyYW4gMSwwNTDigJMxLDQ4Mi4NCg0KLSBQb2xhIGluaSBtZW5lZ2Fza2FuIGFkYW55YSBlc2thbGFzaSByaXNpa28gaW5zaWRlbnNpIFRCIHNlY2FyYSBrZXdpbGF5YWhhbiwgZGkgbWFuYSBzZW1ha2luIGJhbnlhayBkYWVyYWggeWFuZyBtZW51bmp1a2thbiByYXNpbyBpbnNpZGVuc2kgZGkgYXRhcyBla3NwZWt0YXNpIChTSVIgPiAxKSBkaWJhbmRpbmdrYW4gZGVuZ2FuIGtvbmRpc2kgcGFkYSB0YWh1biAyMDIxLg0KDQojIyAzLjMgQW5hbGlzaXMgQXV0b2tvcmVsYXNpIFNwYXNpYWwgKE1vcmFu4oCZcyBJKQ0KDQpBbmFsaXNpcyBhdXRva29yZWxhc2kgc3Bhc2lhbCBkaWxha3VrYW4gdW50dWsgbWVuZ2lkZW50aWZpa2FzaSBhcGFrYWggdGVyZGFwYXQgcG9sYSBwZW5nZWxvbXBva2FuIChjbHVzdGVyaW5nKSBwYWRhIHJpc2lrbyBUdWJlcmt1bG9zaXMgKFRCKSBhbnRhcndpbGF5YWggZGkgSmF3YSBCYXJhdC4gTWV0b2RlIGluaSBwZW50aW5nIHVudHVrIG1lbmVudHVrYW4gYXBha2FoIGtlamFkaWFuIFRCIGRpIHN1YXR1IHdpbGF5YWggZGlwZW5nYXJ1aGkgb2xlaCBrZWphZGlhbiBkaSB3aWxheWFoIHRldGFuZ2dhbnlhLiBBbmFsaXNpcyBpbmkgdGVyZGlyaSBkYXJpIHRpZ2EgdGFoYXA6IHBlbWJlbnR1a2FuIG1hdHJpa3Mga2V0ZXRhbmdnYWFuLCB1amkgR2xvYmFsIE1vcmFu4oCZcyBJLCBkYW4gYW5hbGlzaXMgTElTQSAoTG9jYWwgSW5kaWNhdG9ycyBvZiBTcGF0aWFsIEFzc29jaWF0aW9uKS4NCg0KIyMjIDMuMy4xIFBlbWJlbnR1a2FuIE5laWdoYm91cmhvb2QNCg0KTGFuZ2thaCBhd2FsIGRhbGFtIGFuYWxpc2lzIHNwYXNpYWwgYWRhbGFoIG1lbmRlZmluaXNpa2FuIHN0cnVrdHVyIGtldGV0YW5nZ2FhbiAoc3BhdGlhbCB3ZWlnaHRzIG1hdHJpeCkuIERhbGFtIHN0dWRpIGluaSwgbWV0b2RlIFF1ZWVuIENvbnRpZ3VpdHkgZGlndW5ha2FuIHVudHVrIG1lbmVudHVrYW4gaHVidW5nYW4gYW50YXJrYWJ1cGF0ZW4va290YSBiZXJkYXNhcmthbiBiYXRhcyB3aWxheWFoIHlhbmcgYmVyc2luZ2d1bmdhbi4NCg0KPGRpdiBhbGlnbj0iY2VudGVyIj4NCioqVGFiZWwgMTAuKiogUmluZ2thc2FuIFN0cnVrdHVyIEtldGV0YW5nZ2FhbiBLYWJ1cGF0ZW4vS290YSBkaSBKYXdhIEJhcmF0DQo8L2Rpdj4NCg0KYGBge3J9DQpuYiA8LSBwb2x5Mm5iKGphYmFyKQ0KbGlzdHcgPC0gbmIybGlzdHcobmIsIHN0eWxlID0gIlciKQ0KDQpyaW5na2FzYW5fbmIgPC0gZGF0YS5mcmFtZSgNCiAgTWluaW11bSA9IG1pbihjYXJkKG5iKSksDQogIE1ha3NpbXVtID0gbWF4KGNhcmQobmIpKSwNCiAgUmF0YV9yYXRhID0gbWVhbihjYXJkKG5iKSksDQogIE1lZGlhbiA9IG1lZGlhbihjYXJkKG5iKSkNCikNCg0Ka25pdHI6OmthYmxlKA0KICByaW5na2FzYW5fbmIpDQpgYGANCg0KYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0NCnBsb3Qoc3RfZ2VvbWV0cnkoamFiYXIpKQ0KcGxvdCgNCiAgbmIsDQogIHN0X2Nvb3JkaW5hdGVzKHN0X2NlbnRyb2lkKGphYmFyKSksDQogIGFkZCA9IFRSVUUsDQogIGNvbCA9ICJyZWQiDQopDQpgYGANCg0KPGRpdiBhbGlnbj0iY2VudGVyIj4NCioqR2FtYmFyIDcuKiogVmlzdWFsaXNhc2kgS2V0ZXRhbmdnYWFuDQo8L2Rpdj4NCg0KVmlzdWFsaXNhc2kgcGFkYSBHYW1iYXIgNyBtZW51bmp1a2thbiBtYXRyaWtzIGtvbmVrdGl2aXRhcyB5YW5nIHRlcmJlbnR1ayBhbnRhcndpbGF5YWggZGkgSmF3YSBCYXJhdC4gR2FyaXMgbWVyYWggbWVuZ2h1YnVuZ2thbiBwdXNhdCBnZW9ncmFmaXMgKGNlbnRyb2lkcykgd2lsYXlhaCB5YW5nIGJlcmJhdGFzYW4sIHlhbmcgbWVuamFkaSBkYXNhciBwZXJoaXR1bmdhbiBpbnRlcmFrc2kgc3Bhc2lhbCBkYWxhbSBhbmFsaXNpcyBhdXRva29yZWxhc2kuDQoNCg0KIyMjIDMuMy4yIEdsb2JhbCBNb3JhbuKAmXMgSQ0KDQpBbmFsaXNpcyBHbG9iYWwgTW9yYW4ncyBJIGRpdGVyYXBrYW4gcGFkYSBuaWxhaSBTdGFuZGFyZGl6ZWQgSW5jaWRlbmNlIFJhdGlvIChTSVIpICAgeWFuZyBtZW5qYWRpIGJhc2lzIHBlcmhpdHVuZ2FuIEVCIFJpc2sgICBtZW5nZ3VuYWthbiBtYXRyaWtzIHBlbWJvYm90IHNwYXNpYWwgbGlzdHcgdW50dWsgc2V0aWFwIHRhaHVuIHNlY2FyYSB0ZXJwaXNhaCBtZWxhbHVpIGZ1bmdzaSBtb3Jhbi50ZXN0KCkgZGkgc2VsdXJ1aCB3aWxheWFoIEphd2EgQmFyYXQgc2VsYW1hIHBlcmlvZGUgMjAyMeKAkzIwMjUuDQoNCjxkaXYgYWxpZ249ImNlbnRlciI+DQoqKlRhYmVsIDExLioqIFJpbmdrYXNhbiBHbG9iYWwgTW9yYW7igJlzIEkgU0lSIDIwMjHigJMyMDI1DQo8L2Rpdj4NCg0KYGBge3J9DQptb3Jhbl9ieV95ZWFyIDwtIGRhdGEgJT4lDQogIHNwbGl0KC4kdGFodW4pICU+JQ0KICBtYXAoZnVuY3Rpb24oZGYpew0KDQogICAgZGYgPC0gZGYgJT4lIGFycmFuZ2UoSUQpICAgDQogICAgbW9yYW4udGVzdChkZiRTSVIsIGxpc3R3KQ0KDQogIH0pDQoNCm1vcmFuX3N1bW1hcnkgPC0gZGF0YSAlPiUNCiAgc3BsaXQoLiR0YWh1bikgJT4lDQogIG1hcF9kZihmdW5jdGlvbihkZil7DQoNCiAgICBkZiA8LSBkZiAlPiUgYXJyYW5nZShJRCkNCg0KICAgIHRlc3QgPC0gbW9yYW4udGVzdChkZiRTSVIsIGxpc3R3KQ0KDQogICAgZGF0YS5mcmFtZSgNCiAgICAgIFllYXIgPSB1bmlxdWUoZGYkdGFodW4pLA0KICAgICAgTW9yYW5fSSA9IGFzLm51bWVyaWModGVzdCRlc3RpbWF0ZVsxXSksDQogICAgICBFeHBlY3RlZCA9IGFzLm51bWVyaWModGVzdCRlc3RpbWF0ZVsyXSksDQogICAgICBQX3ZhbHVlID0gdGVzdCRwLnZhbHVlDQogICAgKQ0KICB9KQ0KDQprbml0cjo6a2FibGUoDQogIG1vcmFuX3N1bW1hcnkpDQpgYGANCg0KQmVyZGFzYXJrYW4gVGFiZWwgMTEsIG5pbGFpIE1vcmFu4oCZcyBJIHlhbmcgZGloYXNpbGthbiB1bnR1ayBzZXRpYXAgdGFodW4gbWVudW5qdWtrYW4gYW5na2EgeWFuZyBtZW5kZWthdGkgbm9sIGRlbmdhbiBuaWxhaSBQLXZhbHVlIHlhbmcgbGViaWggYmVzYXIgZGFyaSAwLDA1IChzaWduaWZpa2Fuc2kgNSUpLiBIYWwgaW5pIG1lbmdpbmRpa2FzaWthbiBiYWh3YSBzZWNhcmEgZ2xvYmFsLCB0aWRhayBkaXRlbXVrYW4gYXV0b2tvcmVsYXNpIHNwYXNpYWwgeWFuZyBzaWduaWZpa2FuIHBhZGEgdGluZ2thdCBwcm92aW5zaS4gQXJ0aW55YSwgZGlzdHJpYnVzaSByaXNpa28gVEIgYmVyYmFzaXMgU0lSIGNlbmRlcnVuZyBtZW55ZWJhciBzZWNhcmEgYWNhayAocmFuZG9tKSBkYW4gdGlkYWsgbWVtYmVudHVrIHBvbGEgY2x1c3RlcmluZyBhdGF1IGRpc3BlcnNpb24geWFuZyB0ZXJzdHJ1a3R1ciBkaSBzZWx1cnVoIHdpbGF5YWggSmF3YSBCYXJhdCBkYWxhbSBwZXJpb2RlIG9ic2VydmFzaSB0ZXJzZWJ1dC4NCg0KIyMjIDMuMy4zIExJU0EgQ2x1c3RlciBBbmFseXNpcw0KDQpNZXNraXB1biBhdXRva29yZWxhc2kgc2VjYXJhIGdsb2JhbCB0aWRhayBzaWduaWZpa2FuLCBhbmFsaXNpcyBMSVNBIGRpbGFrdWthbiB1bnR1ayBtZW5nZWtzcGxvcmFzaSBhZGFueWEgdmFyaWFzaSBzcGFzaWFsIGxva2FsIHlhbmcgbXVuZ2tpbiB0aWRhayB0ZXJ0YW5na2FwIG9sZWggdWppIGdsb2JhbC4NCg0KYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0NCmxpc2FfYnlfeWVhciA8LSBkYXRhICU+JQ0KICBzcGxpdCguJHRhaHVuKSAlPiUNCiAgbWFwKGZ1bmN0aW9uKGRmKXsNCg0KICAgIGRmIDwtIGRmICU+JSBhcnJhbmdlKElEKQ0KDQogICAgIyBMb2NhbCBNb3JhbidzIEkNCiAgICBsb2NhbF9tb3JhbiA8LSBsb2NhbG1vcmFuKGRmJFNJUiwgbGlzdHcpDQoNCiAgICBkZiRJaSA8LSBsb2NhbF9tb3JhblssMV0NCiAgICBkZiRaX0lpIDwtIGxvY2FsX21vcmFuWyw0XQ0KICAgIGRmJFBfdmFsdWUgPC0gbG9jYWxfbW9yYW5bLDVdDQogICAgZGYkbGFnX1NJUiA8LSBsYWcubGlzdHcobGlzdHcsIGRmJFNJUikNCg0KICAgIG1lYW5fTElTQSA8LSBtZWFuKGRmJFNJUiwgbmEucm0gPSBUUlVFKQ0KDQogICAgIyBrbGFzaWZpa2FzaSBjbHVzdGVyDQogICAgZGYkY2x1c3RlciA8LSAiTm90IFNpZ25pZmljYW50Ig0KDQogICAgZGYkY2x1c3RlclsNCiAgICAgIGRmJFNJUiA+IG1lYW5fTElTQSAmDQogICAgICBkZiRsYWdfU0lSID4gbWVhbl9MSVNBICYNCiAgICAgIGRmJFBfdmFsdWUgPD0gMC4wNQ0KICAgIF0gPC0gIkhpZ2gtSGlnaCINCg0KICAgIGRmJGNsdXN0ZXJbDQogICAgICBkZiRTSVIgPCBtZWFuX0xJU0EgJg0KICAgICAgZGYkbGFnX1NJUiA8IG1lYW5fTElTQSAmDQogICAgICBkZiRQX3ZhbHVlIDw9IDAuMDUNCiAgICBdIDwtICJMb3ctTG93Ig0KDQogICAgZGYkY2x1c3RlclsNCiAgICAgIGRmJFNJUiA+IG1lYW5fTElTQSAmDQogICAgICBkZiRsYWdfU0lSIDwgbWVhbl9MSVNBICYNCiAgICAgIGRmJFBfdmFsdWUgPD0gMC4wNQ0KICAgIF0gPC0gIkhpZ2gtTG93Ig0KDQogICAgZGYkY2x1c3RlclsNCiAgICAgIGRmJFNJUiA8IG1lYW5fTElTQSAmDQogICAgICBkZiRsYWdfU0lSID4gbWVhbl9MSVNBICYNCiAgICAgIGRmJFBfdmFsdWUgPD0gMC4wNQ0KICAgIF0gPC0gIkxvdy1IaWdoIg0KDQogICAgcmV0dXJuKGRmKQ0KICB9KQ0KZGF0YV9saXNhIDwtIGRvLmNhbGwocmJpbmQsIGxpc2FfYnlfeWVhcikNCg0KbWFwX2xpc2EgPC0gbGVmdF9qb2luKGphYmFyLCBkYXRhX2xpc2EsIGJ5ID0gIklEIikNCnRtX3NoYXBlKG1hcF9saXNhKSArDQogIHRtX3BvbHlnb25zKA0KICAgICJjbHVzdGVyIiwNCiAgICBwYWxldHRlID0gYygNCiAgICAgICJyZWQiLCAgICAgICAgIyBIaWdoLUhpZ2ggKGhvdHNwb3QpDQogICAgICAiYmx1ZSIsICAgICAgICMgTG93LUxvdyAoY29sZHNwb3QpDQogICAgICAib3JhbmdlIiwgICAgICMgSGlnaC1Mb3cgKG91dGxpZXIgdGluZ2dpKQ0KICAgICAgImxpZ2h0Ymx1ZSIsICAjIExvdy1IaWdoIChvdXRsaWVyIHJlbmRhaCkNCiAgICAgICJncmV5IiAgICAgICAgIyBOb3Qgc2lnbmlmaWNhbnQNCiAgICApLA0KICAgIHRpdGxlID0gIkxJU0EgQ2x1c3RlciBUQiINCiAgKSArDQogIHRtX2JvcmRlcnMoY29sID0gImJsYWNrIikgKw0KICB0bV9mYWNldHMoYnkgPSAidGFodW4iLCBuY29sID0gMykgKw0KICB0bV9sYXlvdXQoDQogICAgbWFpbi50aXRsZSA9ICJMSVNBIENsdXN0ZXIgVHViZXJrdWxvc2lzIEphd2EgQmFyYXQgMjAyMeKAkzIwMjUiLA0KICAgIGxlZ2VuZC5vdXRzaWRlID0gVFJVRSwNCiAgICBmcmFtZSA9IEZBTFNFDQogICkNCmBgYA0KDQo8ZGl2IGFsaWduPSJjZW50ZXIiPg0KKipHYW1iYXIgOC4qKiBWaXN1YWxpc2FzaSBDbHVzdGVyIExJU0ENCjwvZGl2Pg0KDQpCZXJkYXNhcmthbiBoYXNpbCB2aXN1YWxpc2FzaSBMSVNBIHBhZGEgR2FtYmFyIDgsIGRpdGVtdWthbiB0ZW11YW4gc2ViYWdhaSBiZXJpa3V0Og0KDQotIERvbWluYXNpIFBvbGEgQWNhazogU2ViYWdpYW4gYmVzYXIgd2lsYXlhaCBkaSBKYXdhIEJhcmF0IGRpa2xhc2lmaWthc2lrYW4gc2ViYWdhaSBOb3QgU2lnbmlmaWNhbnQgKHdhcm5hIGJpcnUpLCB5YW5nIG1lbmVnYXNrYW4gYmFod2EgcmlzaWtvIFRCIGRpIHdpbGF5YWggdGVyc2VidXQgdGlkYWsgbWVtaWxpa2kga2V0ZXJnYW50dW5nYW4gc3Bhc2lhbCB5YW5nIHNpZ25pZmlrYW4gdGVyaGFkYXAgd2lsYXlhaCBkaSBzZWtpdGFybnlhLg0KDQotIElkZW50aWZpa2FzaSBDbHVzdGVyOiBUZXJsaWhhdCBhZGFueWEgY2x1c3RlciAiTG93LUxvdyIgKHJpc2lrbyByZW5kYWggeWFuZyBkaWtlbGlsaW5naSBvbGVoIHdpbGF5YWggYmVyaXNpa28gcmVuZGFoKSBkaSB3aWxheWFoIHNwZXNpZmlrIEphd2EgQmFyYXQgeWFuZyBrb25zaXN0ZW4gbXVuY3VsIHNlbGFtYSBwZXJpb2RlIDIwMjHigJMyMDI1Lg0KDQotIEtlc2ltcHVsYW4gQW5hbGlzaXM6IFRpZGFrIHNpZ25pZmlrYW5ueWEgYXV0b2tvcmVsYXNpIGdsb2JhbCBuYW11biBkaXRlbXVrYW5ueWEga2xhc3RlciBsb2thbCBtZW5qYWRpIGp1c3RpZmlrYXNpIGt1YXQgdW50dWsgbWVsYW5qdXRrYW4gYW5hbGlzaXMga2UgdGluZ2thdCBwZW1vZGVsYW4geWFuZyBsZWJpaCBrb21wbGVrcyAoc2VwZXJ0aSBHTE1NLU5CKSB1bnR1ayBtZW5nb250cm9sIGZha3Rvci1mYWt0b3IgbGFpbiB5YW5nIG1lbWVuZ2FydWhpIGluc2lkZW5zaSBUQiBzZWNhcmEgc3Bhc2lhbC4NCg0KDQojIyAzLjQgRGlzZWFzZSBNYXBwaW5nIERlbmdhbiBFQiAoRW1waXJpY2FsIEJheWVzKQ0KDQpFbXBpcmljYWwgQmF5ZXMgZGlndW5ha2FuIHVudHVrIG1lbnN0YWJpbGthbiBlc3RpbWFzaSByaXNpa28gcGVueWFraXQgcGFkYSB3aWxheWFoIGRlbmdhbiBqdW1sYWggcG9wdWxhc2kga2VjaWwgYWdhciB0aWRhayB0ZXJqYWRpIGZsdWt0dWFzaSBla3N0cmVtIHBhZGEgbmlsYWkgcmlzaWtvLg0KDQoNCmBgYHtyIGluY2x1ZGU9RkFMU0V9DQpkYXRhIDwtIGRhdGEgJT4lDQogIGdyb3VwX2J5KHRhaHVuKSAlPiUNCiAgbXV0YXRlKA0KICAgIGxhbWJkYSA9IHN1bShUQikgLyBzdW0oZXhwZWN0ZWQpLA0KICAgIEVCX1Jpc2sgPSAoVEIgKyBsYW1iZGEpIC8gKGV4cGVjdGVkICsgMSkNCiAgKSAlPiUNCiAgdW5ncm91cCgpDQoNCm1hcF9lYiA8LSBsZWZ0X2pvaW4oDQogIGphYmFyLA0KICBkYXRhLA0KICBieSA9ICJJRCINCikNCmBgYA0KDQoNCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9DQp0bV9zaGFwZShtYXBfZWIpICsNCiAgdG1fcG9seWdvbnMoDQogICAgIkVCX1Jpc2siLA0KICAgIHBhbGV0dGUgPSAiUmVkcyIsDQogICAgc3R5bGUgPSAicXVhbnRpbGUiLA0KICAgIHRpdGxlID0gIkVtcGlyaWNhbCBCYXllcyBSaXNrIg0KICApICsNCiAgdG1fYm9yZGVycyhjb2wgPSAiZ3JleTQwIikgKw0KICB0bV9mYWNldHMoDQogICAgYnkgPSAidGFodW4iLA0KICAgIG5jb2wgPSAzDQogICkgKw0KICB0bV9sYXlvdXQoDQogICAgbWFpbi50aXRsZSA9ICJEaXNlYXNlIE1hcHBpbmcgVHViZXJrdWxvc2lzIEphd2EgQmFyYXQgKEVtcGlyaWNhbCBCYXllcykgMjAyMeKAkzIwMjUiLA0KICAgIGxlZ2VuZC5vdXRzaWRlID0gVFJVRSwNCiAgICBmcmFtZSA9IEZBTFNFDQogICkNCmBgYA0KDQo8ZGl2IGFsaWduPSJjZW50ZXIiPg0KKipHYW1iYXIgNi4qKiBWaXN1YWxpc2FzaSBEaXNlYXNlIE1hcHBpbmcgKEVtcGlyaWNhbCBCYXllcykNCjwvZGl2Pg0KDQpWaXN1YWxpc2FzaSBwYWRhIEdhbWJhciA2IG1lbnVuanVra2FuIHBldGEgcGVyc2ViYXJhbiBFbXBpcmljYWwgQmF5ZXMgKEVCKSBSaXNrIFR1YmVya3Vsb3NpcyBkaSBKYXdhIEJhcmF0LiBNZXRvZGUgaW5pIG1lbWJlcmlrYW4gZXN0aW1hc2kgcmlzaWtvIHlhbmcgbGViaWggc3RhYmlsIGRlbmdhbiBtZW1wZXJoYWx1cyB2YXJpYWJpbGl0YXMgYWNhayB5YW5nIHNlcmluZyBkaXRlbXVrYW4gcGFkYSB3aWxheWFoIGRlbmdhbiBqdW1sYWggcG9wdWxhc2kga2VjaWwNCg0KLSBQYWRhIHRhaHVuIDIwMjEsIG1heW9yaXRhcyB3aWxheWFoIGRpIEphd2EgQmFyYXQgYmVyYWRhIHBhZGEga2F0ZWdvcmkgcmlzaWtvIHJlbmRhaCAoMCwyNDnigJMwLDU4OCkuDQoNCi0gU2VpcmluZyBiZXJqYWxhbm55YSBwZXJpb2RlIG9ic2VydmFzaSwgdGVyamFkaSBlc2thbGFzaSByaXNpa28gc2VjYXJhIHNpZ25pZmlrYW4sIGRpIG1hbmEgcGFkYSB0YWh1biAyMDI0IGRhbiAyMDI1LCBkb21pbmFzaSB3YXJuYSBtZXJhaCBtZW51bmp1a2thbiBiYWh3YSBzZWJhZ2lhbiBiZXNhciB3aWxheWFoIHRlbGFoIGJlcmFsaWgga2Uga2F0ZWdvcmkgcmlzaWtvIHRpbmdnaSBkZW5nYW4gbmlsYWkgRUIgUmlzayBkaSBhdGFzIDEsMDUwLg0KDQo8ZGl2IGFsaWduPSJjZW50ZXIiPg0KKipUYWJlbCA4LioqIFN0YXRpc3RpayBEZXNrcmlwdGlmIEVtcGlyaWNhbCBCYXllcw0KPC9kaXY+DQoNCmBgYHtyfQ0KZWJfc3VtbWFyeSA8LSBkYXRhICU+JQ0KICBncm91cF9ieSh0YWh1bikgJT4lDQogIHN1bW1hcmlzZSgNCiAgICBtZWFuX0xJU0EgPSBtZWFuKEVCX1Jpc2ssIG5hLnJtID0gVFJVRSksDQogICAgTWluX0VCICA9IG1pbihFQl9SaXNrLCBuYS5ybSA9IFRSVUUpLA0KICAgIE1heF9FQiAgPSBtYXgoRUJfUmlzaywgbmEucm0gPSBUUlVFKSwNCiAgICBTRF9FQiAgID0gc2QoRUJfUmlzaywgbmEucm0gPSBUUlVFKQ0KICApDQoNCmtuaXRyOjprYWJsZShlYl9zdW1tYXJ5LA0KICAgICAgICAgICAgIGNhcHRpb24gPSAiU3RhdGlzdGlrIEVtcGlyaWNhbCBCYXllcyBSaXNrIFRCIEphd2EgQmFyYXQgMjAyMeKAkzIwMjUiKQ0KYGBgDQoNClRhYmVsIDggbWVueWFqaWthbiBzdGF0aXN0aWsgZGVza3JpcHRpZiBkYXJpIG5pbGFpIEVCIFJpc2sgeWFuZyBtZW51bmp1a2thbiB0cmVuIHBlbmluZ2thdGFuIHJhdGEtcmF0YSAobWVhbl9MSVNBKSByaXNpa28gVEIgZGFyaSB0YWh1biBrZSB0YWh1bi4NCg0KLSBOaWxhaSBtZWFuX0xJU0EgbWVuaW5na2F0IGRhcmkgMCw1MjYgcGFkYSB0YWh1biAyMDIxIG1lbmphZGkgcHVuY2FrbnlhIHNlYmVzYXIgMSwzNzEgcGFkYSB0YWh1biAyMDI0LCBzZWJlbHVtIHNlZGlraXQgbWVudXJ1biBtZW5qYWRpIDEsMzIyIHBhZGEgdGFodW4gMjAyNS4NCg0KLSBQZW5pbmdrYXRhbiBuaWxhaSBzaW1wYW5nYW4gYmFrdSAoU0RfRUIpIGRhcmkgMCwyODEgKDIwMjEpIG1lbmphZGkgMCw2ODIgKDIwMjQpIG1lbmdpbmRpa2FzaWthbiBhZGFueWEgZGlzcGFyaXRhcyByaXNpa28geWFuZyBzZW1ha2luIG1lbGViYXIgYW50YXJ3aWxheWFoIGRpIEphd2EgQmFyYXQgc2VpcmluZyBkZW5nYW4gbWVuaW5na2F0bnlhIGJlYmFuIHBlbnlha2l0IHNlY2FyYSBrZXNlbHVydWhhbi4NCg0KDQo8ZGl2IGFsaWduPSJjZW50ZXIiPg0KKipUYWJlbCA5LioqIDEwIEthYnVwYXRlbi9Lb3RhIGRlbmdhbiBSaXNpa28gVGVydGluZ2dpIFNlbGFtYSBQZXJpb2RlIDIwMjQNCjwvZGl2Pg0KDQpgYGB7cn0NCnRvcF9yaXNrIDwtIGRhdGEgJT4lDQogIGFycmFuZ2UoZGVzYyhFQl9SaXNrKSkgJT4lDQogIHNlbGVjdChuYW1hX2thYnVwYXRlbl9rb3RhLCB0YWh1biwgRUJfUmlzaykgJT4lDQogIGhlYWQoMTApDQoNCmtuaXRyOjprYWJsZSh0b3BfcmlzaykNCmBgYA0KDQpUYWJlbCA5IG1lbmFtcGlsa2FuIDEwIGVudGl0YXMgd2lsYXlhaCAoa2FidXBhdGVuL2tvdGEpIGRlbmdhbiBuaWxhaSBFQiBSaXNrIHRlcnRpbmdnaSBzZWxhbWEgcGVyaW9kZSAyMDIx4oCTMjAyNS4gSGFzaWwgaW5pIG1lbmdpZGVudGlmaWthc2kgd2lsYXlhaC13aWxheWFoIGRlbmdhbiBiZWJhbiByaXNpa28gcGFsaW5nIGtyaXRpcw0KDQotIEtvdGEgQ2lyZWJvbiBzZWNhcmEga29uc2lzdGVuIG1lbmVtcGF0aSBwb3Npc2kgdGVyYXRhcyBkZW5nYW4gbmlsYWkgcmlzaWtvIHRlcnRpbmdnaSwgbWVuY2FwYWkgMywyNzYgcGFkYSB0YWh1biAyMDIzLg0KDQotIFNlbGFpbiBLb3RhIENpcmVib24sIHdpbGF5YWggcGVya290YWFuIGxhaW5ueWEgc2VwZXJ0aSBLb3RhIEJvZ29yIGRhbiBLb3RhIFN1a2FidW1pIGp1Z2EgdGVyaWRlbnRpZmlrYXNpIHNlYmFnYWkgZXBpc2VudHJ1bSBkZW5nYW4gbmlsYWkgRUIgUmlzayB5YW5nIHNlY2FyYSBwZXJzaXN0ZW4gYmVyYWRhIGRpIGF0YXMgYW5na2EgMiw1LCB5YW5nIG1lbmVtcGF0a2FuIHdpbGF5YWgtd2lsYXlhaCBpbmkgc2ViYWdhaSBwcmlvcml0YXMgdXRhbWEgZGFsYW0gaW50ZXJ2ZW5zaSBrZWJpamFrYW4ga2VzZWhhdGFuIG1hc3lhcmFrYXQgdGVya2FpdCBUdWJlcmt1bG9zaXMuDQoNCg0KDQoNCiMjIDMuNSBQZW1vZGVsYW4gU3Bhc2lvLVRlbXBvcmFsIFR1YmVya3Vsb3Npcw0KDQpBbmFsaXNpcyBpbmkgZGlsYWt1a2FuIHVudHVrIG1lbGloYXQgcGVuZ2FydWggZmFrdG9yIHJpc2lrbyB0ZXJoYWRhcCBrYXN1cyBUdWJlcmt1bG9zaXMgbWVuZ2d1bmFrYW4gcGVuZGVrYXRhbiBiZXJ0YWhhcCBtdWxhaSBkYXJpIE9MUywgUG9pc3NvbiwgaGluZ2dhIE5lZ2F0aXZlIEJpbm9taWFsIEdMTU0gZGVuZ2FuIG1lbXBlcnRpbWJhbmdrYW4gZWZlayBzcGFzaWFsIGRhbiB0ZW1wb3JhbC4NCg0KIyMjIDMuNS4xIE1vZGVsIE9MUyAoYmFzZWxpbmUgbW9kZWwpDQoNCk1vZGVsIE9MUyBkaWd1bmFrYW4gdW50dWsgbWVuZ2VzdGltYXNpIGh1YnVuZ2FuIGxpbmVhciBhbnRhcmEganVtbGFoIGthc3VzIFRCIGRlbmdhbiB2YXJpYWJlbCBpbmRlcGVuZGVuOiBwZW5kdWR1ayBtaXNraW4sIGtlcGFkYXRhbiBwZW5kdWR1aywgYWtzZXMgYWlyIG1pbnVtIGxheWFrLCBha3NlcyBzYW5pdGFzaSBsYXlhaywgZGFuIHByZXZhbGVuc2kgSElWLg0KDQo8ZGl2IGFsaWduPSJjZW50ZXIiPg0KKipUYWJlbCAxMi4qKiBIYXNpbCBFc3RpbWFzaSBNb2RlbCBPTFMNCjwvZGl2Pg0KDQpgYGB7cn0NCm9sc19tb2RlbCA8LSBsbSgNCiAgVEIgfg0KICAgIHBlbmR1ZHVrX21pc2tpbiArDQogICAga2VwYWRhdGFuICsNCiAgICBhaXJfbWludW1fbGF5YWsgKw0KICAgIHNhbml0YXNpX2xheWFrICsNCiAgICBoaXYsDQogIGRhdGEgPSBkYXRhDQopDQojIHViYWggc3VtbWFyeSBqYWRpIHRhYmVsDQpoYXNpbF9vbHMgPC0gdGlkeShvbHNfbW9kZWwpDQoNCiMgdGFtcGlsa2FuIHRhYmVsDQprbml0cjo6a2FibGUoDQogIGhhc2lsX29scywNCiAgZGlnaXRzID0gNCwNCiAgY2FwdGlvbiA9ICJIYXNpbCBFc3RpbWFzaSBNb2RlbCBPTFMgdW50dWsgS2FzdXMgVEIiDQopDQpgYGANCg0KQmVyZGFzYXJrYW4gaGFzaWwgZXN0aW1hc2kgT0xTLCB2YXJpYWJlbCBwZW5kdWR1ayBtaXNraW4sIGtlcGFkYXRhbiwgc2FuaXRhc2kgbGF5YWssIGRhbiBISVYgYmVycGVuZ2FydWggc2lnbmlmaWthbiB0ZXJoYWRhcCBrYXN1cyBUQiAocC12YWx1ZSA8IDAsMDUpLiBTZWNhcmEga2h1c3VzLCBzYW5pdGFzaSBsYXlhayBkYW4gcGVuZHVkdWsgbWlza2luIG1lbnVuanVra2FuIHBlbmdhcnVoIG5lZ2F0aWYgeWFuZyBrdWF0IHRlcmhhZGFwIHBlbnVydW5hbiBrYXN1cyBUQi4gU2ViYWxpa255YSwgdmFyaWFiZWwgSElWIG1lbnVuanVra2FuIGh1YnVuZ2FuIHBvc2l0aWYgeWFuZyBzaWduaWZpa2FuLCBtZW5naW5kaWthc2lrYW4gYmFod2EgcGVuaW5na2F0YW4gcHJldmFsZW5zaSBISVYgYmVya29yZWxhc2kgZGVuZ2FuIHBlbmluZ2thdGFuIGp1bWxhaCBrYXN1cyBUQiBkaSB3aWxheWFoIHRlcnNlYnV0Lg0KDQojIyMgMy41LjIgRGlhZ25vc3RpayBBc3Vtc2kgT0xTDQoNClVudHVrIG1lbWFzdGlrYW4gdmFsaWRpdGFzIG1vZGVsIE9MUywgZGlsYWt1a2FuIHVqaSBkaWFnbm9zdGlrIHRlcmhhZGFwIGFzdW1zaSBrbGFzaWssIHlha25pIG5vcm1hbGl0YXMgcmVzaWR1YWwsIGhldGVyb3NrZWRhc3Rpc2l0YXMsIGRhbiBtdWx0aWtvbGluZWFyaXRhcy4NCg0KYGBge3J9DQpyZXMgPC0gcmVzaWR1YWxzKG9sc19tb2RlbCkNCnFxbm9ybShyZXMpDQpxcWxpbmUocmVzLCBjb2wgPSAicmVkIikNCmBgYA0KDQo8ZGl2IGFsaWduPSJjZW50ZXIiPg0KKipHYW1iYXIgOS4qKiBOb3JtYWwgUS1RIFBsb3QNCjwvZGl2Pg0KDQpOb3JtYWwgUS1RIFBsb3QgbWVudW5qdWtrYW4gYWRhbnlhIHBlbnlpbXBhbmdhbiBkYXRhIGRhcmkgZ2FyaXMgcmVmZXJlbnNpIG1lcmFoLCB0ZXJ1dGFtYSBwYWRhIGt1YW50aWwgYXRhcyBkYW4gYmF3YWguIEhhbCBpbmkgbWVuZ2luZGlrYXNpa2FuIGJhaHdhIHJlc2lkdWFsIG1vZGVsIHRpZGFrIHRlcmRpc3RyaWJ1c2kgc2VjYXJhIG5vcm1hbCwgeWFuZyBkaXBlcmt1YXQgb2xlaCBoYXNpbCB1amkgc3RhdGlzdGlrIGZvcm1hbCBwYWRhIFRhYmVsIDEzLg0KDQpgYGB7ciBpbmNsdWRlPUZBTFNFfQ0KIyBSRVNJRFVBTA0KcmVzIDwtIHJlc2lkdWFscyhvbHNfbW9kZWwpDQpxcW5vcm0ocmVzKQ0KcXFsaW5lKHJlcywgY29sID0gInJlZCIpDQoNCiMgTk9STUFMSVRBUyAoU2hhcGlyby1XaWxrKQ0Kc2hhcGlybyA8LSBzaGFwaXJvLnRlc3QocmVzKQ0KDQojIEhFVEVST1NLRURBU1RJU0lUQVMgKEJQIFRlc3QpDQpicF90ZXN0IDwtIGJwdGVzdChvbHNfbW9kZWwpDQoNCiMgTVVMVElLT0xJTkVBUklUQVMgKFZJRikNCnZpZl92YWx1ZXMgPC0gdmlmKG9sc19tb2RlbCkNCg0KIyBUQUJFTCBIQVNJTA0Kbm9ybWFsaXRhc190YmwgPC0gZGF0YS5mcmFtZSgNCiAgVWppID0gIlNoYXBpcm8tV2lsayIsDQogIFN0YXRpc3RpYyA9IHNoYXBpcm8kc3RhdGlzdGljLA0KICBQX3ZhbHVlID0gc2hhcGlybyRwLnZhbHVlDQopDQoNCmhldGVyb190YmwgPC0gZGF0YS5mcmFtZSgNCiAgVWppID0gIkJyZXVzY2gtUGFnYW4iLA0KICBTdGF0aXN0aWMgPSBicF90ZXN0JHN0YXRpc3RpYywNCiAgUF92YWx1ZSA9IGJwX3Rlc3QkcC52YWx1ZQ0KKQ0KDQp2aWZfdGJsIDwtIGRhdGEuZnJhbWUoDQogIFVqaSA9ICJWSUYiLA0KICBWYXJpYWJsZSA9IG5hbWVzKHZpZl92YWx1ZXMpLA0KICBWYWx1ZSA9IGFzLm51bWVyaWModmlmX3ZhbHVlcykNCikNCmBgYA0KDQo8ZGl2IGFsaWduPSJjZW50ZXIiPg0KKipUYWJlbCAxMy4qKiBVamkgTm9ybWFsaXRhcyBSZXNpZHVhbA0KPC9kaXY+DQoNCmBgYHtyfQ0Ka25pdHI6OmthYmxlKA0KICBub3JtYWxpdGFzX3RibCkNCmBgYA0KDQo8ZGl2IGFsaWduPSJjZW50ZXIiPg0KKipUYWJlbCAxNC4qKiBVamkgSGV0ZXJvc2tlZGFzdGlzaXRhcyANCjwvZGl2Pg0KDQpgYGB7cn0NCmtuaXRyOjprYWJsZSgNCiAgaGV0ZXJvX3RibCwNCiAgY2FwdGlvbiA9ICJVamkgSGV0ZXJvc2tlZGFzdGlzaXRhcyAoQnJldXNjaC1QYWdhbikiDQopDQpgYGANCg0KPGRpdiBhbGlnbj0iY2VudGVyIj4NCioqVGFiZWwgMTUuKiogVWppIE11bHRpa29saW5lYXJpdGFzDQo8L2Rpdj4NCg0KYGBge3J9DQprbml0cjo6a2FibGUoDQogIHZpZl90YmwpDQpgYGANCg0KKipJbnRlcnByZXRhc2kgRGlhZ25vc3RpazoqKg0KDQotIE5vcm1hbGl0YXMgUmVzaWR1YWwgKFRhYmVsIDEzKTogSGFzaWwgdWppIFNoYXBpcm8tV2lsayBtZW5naGFzaWxrYW4gcC12YWx1ZSBzZWJlc2FyIDIsMWUtMDYgKDwgMCwwNSksIHlhbmcgYmVyYXJ0aSBhc3Vtc2kgbm9ybWFsaXRhcyByZXNpZHVhbCB0aWRhayB0ZXJwZW51aGkuDQoNCi0gSGV0ZXJvc2tlZGFzdGlzaXRhcyAoVGFiZWwgMTQpOiBVamkgQnJldXNjaC1QYWdhbiBtZW5naGFzaWxrYW4gcC12YWx1ZSBzZWJlc2FyIDEsNjVlLTA1ICg8IDAsMDUpLCB5YW5nIG1lbnVuanVra2FuIGFkYW55YSBtYXNhbGFoIGhldGVyb3NrZWRhc3Rpc2l0YXMgcGFkYSBtb2RlbCBPTFMuDQoNCi0gTXVsdGlrb2xpbmVhcml0YXMgKFRhYmVsIDE1KTogU2VsdXJ1aCBuaWxhaSBWYXJpYW5jZSBJbmZsYXRpb24gRmFjdG9yIChWSUYpIHVudHVrIHNldGlhcCB2YXJpYWJlbCBiZXJhZGEgZGkgYmF3YWggNSwgeWFuZyBtZW5naW5kaWthc2lrYW4gYmFod2EgdGlkYWsgdGVyZGFwYXQgbWFzYWxhaCBtdWx0aWtvbGluZWFyaXRhcyB5YW5nIHNlcml1cyBhbnRhciB2YXJpYWJlbCBpbmRlcGVuZGVuLg0KDQoqKktlc2ltcHVsYW4gRGlhZ25vc3RpazoqKg0KDQpLZWdhZ2FsYW4gZGFsYW0gbWVtZW51aGkgYXN1bXNpIG5vcm1hbGl0YXMgcmVzaWR1YWwgZGFuIGFkYW55YSBoZXRlcm9za2VkYXN0aXNpdGFzIHBhZGEgbW9kZWwgT0xTIG1lbnVuanVra2FuIGJhaHdhIG1vZGVsIGxpbmVhciBzZWRlcmhhbmEgdGlkYWsgY3VrdXAgdW50dWsgbWVuYW5nYW5pIGthcmFrdGVyaXN0aWsgZGF0YSBrYXN1cyBUQiB5YW5nIGNlbmRlcnVuZyBvdmVyZGlzcGVyc2VkLiBPbGVoIGthcmVuYSBpdHUsIGRpcGVybHVrYW4gcGVuZGVrYXRhbiBtb2RlbCB5YW5nIGxlYmloIHNlc3VhaSwgc2VwZXJ0aSBtb2RlbCBHZW5lcmFsaXplZCBMaW5lYXIgTWl4ZWQgTW9kZWwgKEdMTU0pIGRlbmdhbiBkaXN0cmlidXNpIE5lZ2F0aXZlIEJpbm9taWFsIHVudHVrIG1lbmdha29tb2Rhc2kgdmFyaWFuc2kgZGF0YSB5YW5nIHRpZGFrIGtvbnN0YW4gZGFuIGVmZWsgc3BhdGlvLXRlbXBvcmFsLg0KDQoNCiMjIyAzLjUuMyBNb2RlbCBQb2lzc29uIA0KDQpNb2RlbCByZWdyZXNpIFBvaXNzb24gZGl0ZXJhcGthbiB1bnR1ayBtZW1vZGVsa2FuIGRhdGEga2FzdXMgVEIgeWFuZyBiZXJzaWZhdCBkaXNrcml0LiBOYW11biwga2FyZW5hIGFzdW1zaSB1dGFtYSBQb2lzc29uIChrZXNhbWFhbiBtZWFuIGRhbiB2YXJpYW5jZSkgc2VyaW5nIGthbGkgdGlkYWsgdGVycGVudWhpIHBhZGEgZGF0YSBlcGlkZW1pb2xvZ2ksIHVqaSBkaXNwZXJzaSBkaWxha3VrYW4gdW50dWsgbWVuZGV0ZWtzaSBvdmVyZGlzcGVyc2kuDQoNCjxkaXYgYWxpZ249ImNlbnRlciI+DQoqKlRhYmVsIDE2LioqIEhhc2lsIEVzdGltYXNpIE1vZGVsIFJlZ3Jlc2kgUG9pc3Nvbg0KPC9kaXY+DQoNCg0KYGBge3J9DQpwb2lzX21vZGVsIDwtIGdsbW1UTUIoDQogIFRCIH4NCiAgICBwZW5kdWR1a19taXNraW4gKw0KICAgIGtlcGFkYXRhbiArDQogICAgYWlyX21pbnVtX2xheWFrICsNCiAgICBzYW5pdGFzaV9sYXlhayArDQogICAgaGl2ICsNCiAgICBmYWN0b3IodGFodW4pICsgICAgICAgICAgICAgICAgICANCiAgICBvZmZzZXQobG9nKGp1bWxhaF9wZW5kdWR1aykpICsNCiAgICAoMXxuYW1hX2thYnVwYXRlbl9rb3RhKSwgICAgICAgICANCiAgZmFtaWx5ID0gcG9pc3NvbigpLA0KICBkYXRhID0gZGF0YQ0KKQ0KcG9pc19zdW1tYXJ5IDwtIGJyb29tOjp0aWR5KA0KICBwb2lzX21vZGVsLA0KICBjb25mLmludCA9IFRSVUUNCikNCg0Ka25pdHI6OmthYmxlKA0KICBwb2lzX3N1bW1hcnksDQogIGRpZ2l0cyA9IDQNCikNCg0KYGBgDQoNCkJlcmRhc2Fya2FuIGhhc2lsIGVzdGltYXNpIG1vZGVsIFBvaXNzb24gcGFkYSBUYWJlbCAxNjoNCi0gU2VsdXJ1aCB2YXJpYWJlbCBwcmVkaWt0b3IgbWVudW5qdWtrYW4gcGVuZ2FydWggeWFuZyBzaWduaWZpa2FuIHRlcmhhZGFwIGp1bWxhaCBrYXN1cyBUdWJlcmt1bG9zaXMgZGkgSmF3YSBCYXJhdCAocC12YWx1ZSA8IDAsMDUpLiANCg0KLSBWYXJpYWJlbCBrZXBhZGF0YW4gcGVuZHVkdWssIGFrc2VzIGFpciBtaW51bSBsYXlhaywgZGFuIGp1bWxhaCBrYXN1cyBISVYgbWVtaWxpa2kgaHVidW5nYW4gcG9zaXRpZiBkZW5nYW4ganVtbGFoIGthc3VzIFRCLCB5YW5nIG1lbnVuanVra2FuIGJhaHdhIHBlbmluZ2thdGFuIGtldGlnYSBmYWt0b3IgdGVyc2VidXQgY2VuZGVydW5nIGRpaWt1dGkgb2xlaCBwZW5pbmdrYXRhbiBrYXN1cyBUQi4gU2ViYWxpa255YSwgdmFyaWFiZWwgcGVyc2VudGFzZSBwZW5kdWR1ayBtaXNraW4gZGFuIGFrc2VzIHNhbml0YXNpIGxheWFrIG1lbWlsaWtpIGh1YnVuZ2FuIG5lZ2F0aWYgdGVyaGFkYXAganVtbGFoIGthc3VzIFRCLiANCg0KLSBTZWxhaW4gaXR1LCB2YXJpYWJlbCB0YWh1biBqdWdhIG1lbnVuanVra2FuIHBlbmdhcnVoIHlhbmcgc2lnbmlmaWthbiwgZGkgbWFuYSBqdW1sYWgga2FzdXMgVEIgcGFkYSBwZXJpb2RlIDIwMjLigJMyMDI1IGxlYmloIHRpbmdnaSBkaWJhbmRpbmdrYW4gdGFodW4gMjAyMSBzZWJhZ2FpIGthdGVnb3JpIHJlZmVyZW5zaS4gU2VjYXJhIHVtdW0sIGhhc2lsIG1vZGVsIFBvaXNzb24gbWVuZ2luZGlrYXNpa2FuIGJhaHdhIGZha3RvciBzb3NpYWwsIGxpbmdrdW5nYW4sIGRhbiBrZXNlaGF0YW4gYmVycGVyYW4gZGFsYW0gdmFyaWFzaSBrYXN1cyBUQiBhbnRhcndpbGF5YWggZGFuIGFudGFyd2FrdHUuIA0KDQpOYW11biBkZW1pa2lhbiwga2FyZW5hIG1vZGVsIFBvaXNzb24gbWVuZ2FzdW1zaWthbiBrb25kaXNpIGVxdWlkaXNwZXJzaW9uLCBkaXBlcmx1a2FuIHBlbmd1amlhbiBsZWJpaCBsYW5qdXQgdW50dWsgbWVuZGV0ZWtzaSBrZW11bmdraW5hbiB0ZXJqYWRpbnlhIG92ZXJkaXNwZXJzaSBzZWJlbHVtIG1lbmVudHVrYW4gbW9kZWwgYWtoaXIgeWFuZyBwYWxpbmcgc2VzdWFpLg0KDQo8ZGl2IGFsaWduPSJjZW50ZXIiPg0KKipUYWJlbCAxNy4qKiBIYXNpbCBVamkgT3ZlcmRpc3BlcnNpIE1vZGVsIFBvaXNzb24NCjwvZGl2Pg0KDQpgYGB7cn0NCmRpc3BlcnNpb24gPC0NCiAgc3VtKA0KICAgIHJlc2lkdWFscygNCiAgICAgIHBvaXNfbW9kZWwsDQogICAgICB0eXBlID0gInBlYXJzb24iDQogICAgKV4yDQogICkgLw0KICBkZi5yZXNpZHVhbChwb2lzX21vZGVsKSANCg0KaGFzaWxfZGlzcGVyc2lvbiA8LSBkYXRhLmZyYW1lKA0KICBTdGF0aXN0aWsgPSAiRGlzcGVyc2lvbiIsDQogIE5pbGFpID0gcm91bmQoZGlzcGVyc2lvbiwgNCksDQogIEtlc2ltcHVsYW4gPSBpZmVsc2UoDQogICAgZGlzcGVyc2lvbiA+IDEsDQogICAgIlRlcmphZGkgT3ZlcmRpc3BlcnNpIiwNCiAgICAiVGlkYWsgVGVyamFkaSBPdmVyZGlzcGVyc2kiDQogICkNCikNCmtuaXRyOjprYWJsZSgNCiAgaGFzaWxfZGlzcGVyc2lvbg0KKQ0KYGBgDQoNCkhhc2lsIHVqaSBkaXNwZXJzaSBwYWRhIFRhYmVsIDE3IG1lbnVuanVra2FuIG5pbGFpIHN0YXRpc3RpayA+IDEsIHlhbmcgbWVuZ29uZmlybWFzaSB0ZXJqYWRpbnlhIG92ZXJkaXNwZXJzaS4gSGFsIGluaSBtZW5naW5kaWthc2lrYW4gYmFod2EgdmFyaWFuc2kgZGF0YSBrYXN1cyBUQiBqYXVoIGxlYmloIGJlc2FyIGRhcmlwYWRhIHJhdGEtcmF0YW55YSwgc2VoaW5nZ2EgbW9kZWwgUG9pc3NvbiB0aWRhayBlZmlzaWVuIGthcmVuYSBjZW5kZXJ1bmcgbWVuZ2hhc2lsa2FuIHN0YW5kYXIgZXJyb3IgeWFuZyB0ZXJsYWx1IGtlY2lsICh1bmRlcmVzdGltYXRlZCkuDQoNCiMjIyAzLjUuNSBOZWdhdGl2ZSBCaW5vbWlhbCBHTE1NDQoNClVudHVrIG1lbmdhdGFzaSBtYXNhbGFoIG92ZXJkaXNwZXJzaSBkYW4gbWVtcGVydGltYmFuZ2thbiB2YXJpYXNpIGFudGFyd2FrdHUgc2VydGEgYW50YXJ3aWxheWFoLCBkaWd1bmFrYW4gbW9kZWwgR2VuZXJhbGl6ZWQgTGluZWFyIE1peGVkIE1vZGVsIChHTE1NKSBkZW5nYW4gZGlzdHJpYnVzaSBOZWdhdGl2ZSBCaW5vbWlhbC4NCg0KIyMjIyBhLiBIYXNpbCBOZWdhdGl2ZSBCaW5vbWlhbCBHTE1NDQoNCjxkaXYgYWxpZ249ImNlbnRlciI+DQoqKlRhYmVsIDE4LioqIEhhc2lsIEVzdGltYXNpIE5lZ2F0aXZlIEJpbm9taWFsIEdMTU0NCjwvZGl2Pg0KDQpgYGB7cn0NCm1vZGVsX25iIDwtIGdsbW1UTUIoDQogIFRCIH4NCiAgICBwZW5kdWR1a19taXNraW4gKw0KICAgIGtlcGFkYXRhbiArDQogICAgYWlyX21pbnVtX2xheWFrICsNCiAgICBzYW5pdGFzaV9sYXlhayArDQogICAgaGl2ICsNCiAgICBmYWN0b3IodGFodW4pICsgICAgICAgICAgICAgICAgIA0KICAgIG9mZnNldChsb2coanVtbGFoX3BlbmR1ZHVrKSkgKw0KICAgICgxfG5hbWFfa2FidXBhdGVuX2tvdGEpLCAgICAgICAgIA0KICBmYW1pbHkgPSBuYmlub20yLA0KICBkYXRhID0gZGF0YQ0KKQ0KDQpuYl9zdW1tYXJ5IDwtIGJyb29tLm1peGVkOjp0aWR5KA0KICBtb2RlbF9uYiwNCiAgZWZmZWN0cyA9ICJmaXhlZCIsDQogIGNvbmYuaW50ID0gVFJVRQ0KKQ0KDQprbml0cjo6a2FibGUoDQogIG5iX3N1bW1hcnksDQogIGRpZ2l0cyA9IDQNCikNCmBgYA0KDQpFc3RpbWFzaSBtb2RlbCBOZWdhdGl2ZSBCaW5vbWlhbCBHTE1NIChuYmlub20yKSBtZW55YWppa2FuIGtvZWZpc2llbiByZWdyZXNpIHlhbmcgbWVuY2VybWlua2FuIGh1YnVuZ2FuIGFudGFyYSBkZXRlcm1pbmFuIHNvc2lhbC1saW5na3VuZ2FuIGRlbmdhbiBpbnNpZGVuc2kgVHViZXJrdWxvc2lzIChUQikgZGkgSmF3YSBCYXJhdC4gQmVyYmVkYSBkZW5nYW4gbW9kZWwgcmVncmVzaSBzdGFuZGFyLCBtb2RlbCBpbmkgbWVtYmVyaWthbiBlc3RpbWFzaSB5YW5nIGxlYmloIHJvYnVzdCBtZWxhbHVpIHBlbmdndW5hYW4gcGFyYW1ldGVyIGRpc3BlcnNpIHNlcnRhIGludGVncmFzaSBlZmVrIGFjYWsgKHJhbmRvbSBlZmZlY3RzKSB1bnR1ayBtZW5hbmdhbmkgaGV0ZXJvZ2VuaXRhcyBhbnRhcndpbGF5YWggZGFuIGZsdWt0dWFzaSB0ZW1wb3JhbC5IYXNpbCBlc3RpbWFzaSBwYWRhIFRhYmVsIDE4IG1lbnVuanVra2FuIHBvbGEgaHVidW5nYW4gc2ViYWdhaSBiZXJpa3V0Og0KDQotIERldGVybWluYW4gU29zaWFsIGRhbiBMaW5na3VuZ2FuOiBWYXJpYWJlbCBwZW5kdWR1a19taXNraW4sIGtlcGFkYXRhbiwgZGFuIHNhbml0YXNpX2xheWFrIG1lbnVuanVra2FuIHBlbmdhcnVoIHlhbmcgc2lnbmlmaWthbiBzZWNhcmEgc3RhdGlzdGlrIHRlcmhhZGFwIGp1bWxhaCBrYXN1cyBUQiAocCA8IDAsMDUpLiBLb2VmaXNpZW4gbmVnYXRpZiBwYWRhIHZhcmlhYmVsIHNhbml0YXNpX2xheWFrIGRhbiBwZW5kdWR1a19taXNraW4gbWVuZ29uZmlybWFzaSBwZXJhbm55YSBzZWJhZ2FpIGZha3RvciB5YW5nIHNlY2FyYSBzaWduaWZpa2FuIG1lbmVrYW4gYW5na2EgaW5zaWRlbnNpLCBzZXRlbGFoIG1lbmdvbnRyb2wgZWZlayBnZW9ncmFmaXMgZGFuIHRlbXBvcmFsLg0KDQotIFBlbmdhcnVoIFByZXZhbGVuc2kgSElWOiBWYXJpYWJlbCBoaXYgbWVtaWxpa2kga29lZmlzaWVuIHBvc2l0aWYgeWFuZyBzaWduaWZpa2FuLCB5YW5nIG1lbmd1YXRrYW4gaGlwb3Rlc2lzIGJhaHdhIHRpbmdnaW55YSBwcmV2YWxlbnNpIEhJViBiZXJrb250cmlidXNpIHNlY2FyYSBsYW5nc3VuZyB0ZXJoYWRhcCBwZW5pbmdrYXRhbiBiZWJhbiBrYXN1cyBUQiBkaSB3aWxheWFoIHRlcnNlYnV0LCBtZW5jZXJtaW5rYW4ga2VyZW50YW5hbiBpbXVuaXRhcyB5YW5nIGxlYmloIHRpbmdnaSBwYWRhIHBvcHVsYXNpIHRlcmRhbXBhay4NCg0KLSBTdHJ1a3R1ciBFZmVrIEFjYWsgKFJhbmRvbSBFZmZlY3RzKTogS2V1bmdndWxhbiBtb2RlbCBpbmkgdGVybGloYXQgZGFyaSBpbmtsdXNpIGtvbXBvbmVuIHJhbmRvbSBpbnRlcmNlcHQgdW50dWsgbmFtYV9rYWJ1cGF0ZW5fa290YSBkYW4gdGFodW4uIFZhcmlhbnNpIHlhbmcgdGVyYW1hdGkgcGFkYSBlZmVrIGFjYWsgaW5pIG1lbnVuanVra2FuIGJhaHdhIHRlcmRhcGF0IGtlcmFnYW1hbiByaXNpa28gZGFzYXIgKCBiYXNlbGluZSByaXNrKSB5YW5nIG1lbGVrYXQgcGFkYSBtYXNpbmctbWFzaW5nIGthYnVwYXRlbi9rb3RhIHlhbmcgdGlkYWsgdGVyamVsYXNrYW4gb2xlaCB2YXJpYWJlbCBwcmVkaWt0b3IgdGV0YXAsIHNlcnRhIGFkYW55YSBwZW5nYXJ1aCBzaXN0ZW1payB0ZW1wb3JhbCB5YW5nIG1lbWVuZ2FydWhpIHNlbHVydWggd2lsYXlhaCBzZWNhcmEgc2VyZW50YWsgc2VsYW1hIHBlcmlvZGUgcGVuZ2FtYXRhbi4NCg0KLSBSb2J1c3RuZXNzIE1vZGVsOiBQZW5nZ3VuYWFuIGRpc3RyaWJ1c2kgTmVnYXRpdmUgQmlub21pYWwgdGVyYnVrdGkgdGVwYXQgZGFsYW0gbWVuYW5nYW5pIG92ZXJkaXNwZXJzaSBkYXRhIGthc3VzIFRCLiBOaWxhaSBzdGFuZGFyZCBlcnJvciB5YW5nIGRpaGFzaWxrYW4gcGFkYSBtb2RlbCBpbmkgbGViaWgga29uc2VydmF0aWYgZGFuIG1lbmNlcm1pbmthbiBrZXRpZGFrcGFzdGlhbiB5YW5nIGxlYmloIHJlYWxpc3RpcyBkaWJhbmRpbmdrYW4gZGVuZ2FuIG1vZGVsIFBvaXNzb24sIHNlaGluZ2dhIG1lbWJlcmlrYW4gbGFuZGFzYW4gaW5mZXJlbnNpIHlhbmcgbGViaWggc2FoaWggYmFnaSBwZW5nYW1iaWxhbiBrZWJpamFrYW4ga2VzZWhhdGFuIG1hc3lhcmFrYXQuDQoNClNlY2FyYSBrZXNlbHVydWhhbiwgbW9kZWwgTmVnYXRpdmUgQmlub21pYWwgR0xNTSBpbmkgYmVyaGFzaWwgbWVuamVsYXNrYW4gZGluYW1pa2EgVEIgZGVuZ2FuIG1lbXBlcnRpbWJhbmdrYW4ga29tcGxla3NpdGFzIHN0cnVrdHVyIGRhdGEgc3Bhc2lhbCBkYW4gdGVtcG9yYWwgZGkgSmF3YSBCYXJhdCwgc2VrYWxpZ3VzIG1lbWJ1a3Rpa2FuIGJhaHdhIGludGVydmVuc2kga2VzZWhhdGFuIGhhcnVzIGRpbGFrdWthbiBkZW5nYW4gcGVuZGVrYXRhbiB5YW5nIGRpc2VzdWFpa2FuICh0YWlsb3JlZCBpbnRlcnZlbnRpb24pIHRlcmhhZGFwIGthcmFrdGVyaXN0aWsgdW5payB0aWFwIHdpbGF5YWguDQoNCg0KIyMjIyBiLiBJbmNpZGVuY2UgUmF0ZSBSYXRpbyAoSVJSKQ0KDQoNCjxkaXYgYWxpZ249ImNlbnRlciI+DQoqKlRhYmVsIDE5LioqIEluY2lkZW5jZSBSYXRlIFJhdGlvIChJUlIpIE5lZ2F0aXZlIEJpbm9taWFsIEdMTU0NCjwvZGl2Pg0KDQpgYGB7cn0NCm5iX2lyciA8LSBicm9vbS5taXhlZDo6dGlkeSgNCiAgbW9kZWxfbmIsDQogIGVmZmVjdHMgPSAiZml4ZWQiLA0KICBjb25mLmludCA9IFRSVUUNCikgJT4lDQogIG11dGF0ZSgNCiAgICBJUlIgPSBleHAoZXN0aW1hdGUpLA0KICAgIElSUl9Mb3dlciA9IGV4cChjb25mLmxvdyksDQogICAgSVJSX1VwcGVyID0gZXhwKGNvbmYuaGlnaCkNCiAgKQ0KDQprbml0cjo6a2FibGUoDQogIG5iX2lyciwNCiAgZGlnaXRzID0gNA0KKQ0KYGBgDQoNCg0KIyMjIyBjLiBWYXJpYW5zaSBSYW5kb20gRWZmZWN0DQoNCjxkaXYgYWxpZ249ImNlbnRlciI+DQoqKlRhYmVsIDIwLioqIFZhcmlhbnNpIFJhbmRvbSBFZmZlY3QgV2lsYXlhaCBkYW4gVGFodW4NCjwvZGl2Pg0KDQpgYGB7cn0NCnJhbmRvbV9lZmZlY3QgPC0gYnJvb20ubWl4ZWQ6OnRpZHkoDQogIG1vZGVsX25iLA0KICBlZmZlY3RzID0gInJhbl9wYXJzIg0KKQ0KDQprbml0cjo6a2FibGUoDQogIHJhbmRvbV9lZmZlY3QsDQogIGRpZ2l0cyA9IDQpDQpgYGANCg0KVGFiZWwgMjAgbWVudW5qdWtrYW4gYmVzYXJhbiB2YXJpYW5zaSB5YW5nIGJlcmFzYWwgZGFyaSBwZXJiZWRhYW4gYW50YXJ3aWxheWFoIChrYWJ1cGF0ZW4va290YSkgZGFuIGFudGFycGVyaW9kZSAodGFodW4pLiBWYXJpYW5zaSB5YW5nIHNpZ25pZmlrYW4gcGFkYSByYW5kb20gZWZmZWN0IGluaSBtZW5lZ2Fza2FuIGJhaHdhIHRlcmRhcGF0IGthcmFrdGVyaXN0aWsgc3Blc2lmaWsgd2lsYXlhaCB5YW5nIHRpZGFrIHRlcnRhbmdrYXAgb2xlaCB2YXJpYWJlbCBwcmVkaWt0b3IgdGV0YXAgKGZpeGVkIGVmZmVjdHMpLg0KDQojIyAzLjYgUGVyYmFuZGluZ2FuIE1vZGVsDQoNClBlbWlsaWhhbiBtb2RlbCB5YW5nIHRlcGF0IG1lcnVwYWthbiBsYW5na2FoIGtydXNpYWwgZGFsYW0gcGVtb2RlbGFuIHN0YXRpc3RpayB1bnR1ayBtZW1hc3Rpa2FuIGVzdGltYXNpIHBhcmFtZXRlciB5YW5nIGFrdXJhdCBkYW4gcmVsaWFiZWwuIFBhZGEgcGVuZWxpdGlhbiBpbmksIGRpbGFrdWthbiBwZXJiYW5kaW5nYW4ga2luZXJqYSBhbnRhcmEgdGlnYSBtb2RlbCwgeWFpdHUgT3JkaW5hcnkgTGVhc3QgU3F1YXJlcyAoT0xTKSwgUmVncmVzaSBQb2lzc29uLCBkYW4gTmVnYXRpdmUgQmlub21pYWwgR2VuZXJhbGl6ZWQgTGluZWFyIE1peGVkIE1vZGVsIChHTE1NKS4gUGVyYmFuZGluZ2FuIGRpbGFrdWthbiBkZW5nYW4gbWVuZ2FjdSBwYWRhIG5pbGFpIEFrYWlrZSBJbmZvcm1hdGlvbiBDcml0ZXJpb24gKEFJQyksIEJheWVzaWFuIEluZm9ybWF0aW9uIENyaXRlcmlvbiAoQklDKSwgc2VydGEgTG9nLUxpa2VsaWhvb2QuDQoNCjxkaXYgYWxpZ249ImNlbnRlciI+DQoqKlRhYmVsIDIxLioqIFBlcmJhbmRpbmdhbiBLaW5lcmphIE1vZGVsDQo8L2Rpdj4NCg0KYGBge3J9DQpwZXJiYW5kaW5nYW5fbW9kZWwgPC0gZGF0YS5mcmFtZSgNCiAgTW9kZWwgPSBjKA0KICAgICJPTFMiLA0KICAgICJQb2lzc29uIiwNCiAgICAiTmVnYXRpdmUgQmlub21pYWwgR0xNTSINCiAgKSwNCiAgQUlDID0gYygNCiAgICBBSUMob2xzX21vZGVsKSwNCiAgICBBSUMocG9pc19tb2RlbCksDQogICAgQUlDKG1vZGVsX25iKQ0KICApLA0KICBCSUMgPSBjKA0KICAgIEJJQyhvbHNfbW9kZWwpLA0KICAgIEJJQyhwb2lzX21vZGVsKSwNCiAgICBCSUMobW9kZWxfbmIpDQogICksDQogIExvZ0xpayA9IGMoDQogICAgYXMubnVtZXJpYyhsb2dMaWsob2xzX21vZGVsKSksDQogICAgYXMubnVtZXJpYyhsb2dMaWsocG9pc19tb2RlbCkpLA0KICAgIGFzLm51bWVyaWMobG9nTGlrKG1vZGVsX25iKSkNCiAgKQ0KKQ0KDQprbml0cjo6a2FibGUoDQogIHBlcmJhbmRpbmdhbl9tb2RlbCwNCiAgZGlnaXRzID0gMg0KKQ0KYGBgDQoNCkJlcmRhc2Fya2FuIFRhYmVsIDIxLCByaW5na2FzYW4ga2luZXJqYSBtb2RlbCBkYXBhdCBkaWplbGFza2FuIHNlYmFnYWkgYmVyaWt1dDoNCg0KLSBJbnRlcnByZXRhc2kgTmlsYWkgQUlDIGRhbiBCSUM6IE5pbGFpIEFJQyBkYW4gQklDIGJlcmZ1bmdzaSBzZWJhZ2FpIGluZGlrYXRvciBnb29kbmVzcy1vZi1maXQgeWFuZyBtZW5naHVrdW0gbW9kZWwgYXRhcyBrb21wbGVrc2l0YXMgeWFuZyBiZXJsZWJpaGFuIChwYXJzaW1vbnkpLiBUYWJlbCB0ZXJzZWJ1dCBtZW51bmp1a2thbiBiYWh3YSBtb2RlbCBOZWdhdGl2ZSBCaW5vbWlhbCBHTE1NIG1lbmdoYXNpbGthbiBuaWxhaSBBSUMgZGFuIEJJQyB5YW5nIHBhbGluZyByZW5kYWggZGliYW5kaW5na2FuIGRlbmdhbiBtb2RlbCBPTFMgbWF1cHVuIG1vZGVsIFBvaXNzb24uIFBlcmx1IGRpdGVrYW5rYW4gYmFod2EgcGVyYmFuZGluZ2FuIHlhbmcgcGFsaW5nIHJlbGV2YW4gc2VjYXJhIG1ldG9kb2xvZ2lzIGFkYWxhaCBhbnRhcmEgbW9kZWwgUG9pc3NvbiBkYW4gTmVnYXRpdmUgQmlub21pYWwgR0xNTSwgbWVuZ2luZ2F0IGtlZHVhIG1vZGVsIHRlcnNlYnV0IG1lbWlsaWtpIHN0cnVrdHVyIHlhbmcgaWRlbnRpayAoZml4ZWQgZWZmZWN0cyB5YW5nIHNhbWEsIG9mZnNldCBwb3B1bGFzaSwgc2VydGEgcmFuZG9tIGludGVyY2VwdCB3aWxheWFoKSBkYW4gaGFueWEgYmVyYmVkYSBwYWRhIGFzdW1zaSBkaXN0cmlidXNpIHRlcmhhZGFwIHZhcmlhbnMuIFBlbnVydW5hbiBBSUMgZGFuIEJJQyB5YW5nIG55YXRhIHBhZGEgbW9kZWwgTkIgR0xNTSBkaWJhbmRpbmdrYW4gUG9pc3NvbiBHTE1NIGRlbmdhbiBkZW1pa2lhbiBzZWNhcmEgbGFuZ3N1bmcgbWVuZ29uZmlybWFzaSBiYWh3YSBwZW5hbWJhaGFuIHBhcmFtZXRlciBkaXNwZXJzaSBtYW1wdSBtZW1wZXJiYWlraSBrZWNvY29rYW4gbW9kZWwgc2VjYXJhIHN1YnN0YW5zaWFsLCBidWthbiBzZWthZGFyIGFydGVmYWsgZGFyaSBwZW5hbWJhaGFuIGtvbXBsZWtzaXRhcy4gU2VtZW50YXJhIGl0dSwgbmlsYWkgQUlDL0JJQyBtb2RlbCBPTFMgeWFuZyBqYXVoIGxlYmloIHRpbmdnaSB0ZXJ1dGFtYSBiZXJmdW5nc2kgc2ViYWdhaSBiYXNlbGluZSBwZW1iYW5kaW5nIHlhbmcgbWVuZWdhc2thbiBiYWh3YSBwZW5kZWthdGFuIGxpbmVhciBzZWRlcmhhbmEgc2VqYWsgYXdhbCB0aWRhayBzZXN1YWkgdW50dWsgbWVtb2RlbGthbiBkYXRhIGNhY2FoIChjb3VudCBkYXRhKSBzZXBlcnRpIGthc3VzIFRCLCBzZWhpbmdnYSBwZXJiYW5kaW5nYW5ueWEgZGVuZ2FuIGR1YSBtb2RlbCBsYWluIGJlcnNpZmF0IGlsdXN0cmF0aWYgYmVsYWthLCBidWthbiBwZXJiYW5kaW5nYW4geWFuZyBzZXRhcmEgKGFwcGxlLXRvLWFwcGxlKS4NCi0gQW5hbGlzaXMgTG9nLUxpa2VsaWhvb2Q6IE5pbGFpIExvZy1MaWtlbGlob29kIHlhbmcgbGViaWggdGluZ2dpIHBhZGEgbW9kZWwgTmVnYXRpdmUgQmlub21pYWwgR0xNTSBkaWJhbmRpbmdrYW4gbW9kZWwgUG9pc3NvbiBHTE1NIG1lbXBlcmt1YXQgdGVtdWFuIGRpIGF0YXMsIGthcmVuYSBrZW5haWthbiBsaWtlbGlob29kIGluaSB0ZXJqYWRpIHBhZGEgc3RydWt0dXIgbW9kZWwgeWFuZyBzZWJhbmRpbmcsIHNlaGluZ2dhIGRhcGF0IGRpYXRyaWJ1c2lrYW4gc2VjYXJhIHNwZXNpZmlrIHBhZGEgcGVyYmFpa2FuIGFzdW1zaSBkaXN0cmlidXNpIChOZWdhdGl2ZSBCaW5vbWlhbCkgZGFsYW0gbWVuYW5nYW5pIG92ZXJkaXNwZXJzaSwgYnVrYW4gcGFkYSBwZXJiZWRhYW4gc3Blc2lmaWthc2kgbW9kZWwgeWFuZyBtZW5kYXNhci4NCi0gSnVzdGlmaWthc2kgUGVtaWxpaGFuIE1vZGVsOiBLZXRpZGFrc2VzdWFpYW4gbW9kZWwgT0xTIHRlcmhhZGFwIGRhdGEgY2FjYWggc2VydGEga2VnYWdhbGFuIG1vZGVsIFBvaXNzb24gZGFsYW0gbWVtZW51aGkgYXN1bXNpIGVxdWlkaXNwZXJzaW9uIC0gc2ViYWdhaW1hbmEgdGVsYWggZGlidWt0aWthbiBzZWNhcmEga3VhbnRpdGF0aWYgbWVsYWx1aSB1amkgZGlzcGVyc2kgUGVhcnNvbiBwYWRhIFRhYmVsIDE3IC0gbWVuamFkaSBkYXNhciB1dGFtYSBtZW5nYXBhIGtlZHVhIG1vZGVsIHRlcnNlYnV0IG1lbmdoYXNpbGthbiBuaWxhaSBBSUMvQklDIHlhbmcgbGViaWggdGluZ2dpLiBCdWt0aSB1amkgb3ZlcmRpc3BlcnNpIGRhbiBidWt0aSBwZW51cnVuYW4gQUlDL0JJQyBwYWRhIG1vZGVsIE5CIEdMTU0gaW5pIGJlcnNpZmF0IHNhbGluZyBtZWxlbmdrYXBpOiB1amkgZGlzcGVyc2kgbWVuamVsYXNrYW4gbWVuZ2FwYSBhc3Vtc2kgUG9pc3NvbiBkaWxhbmdnYXIsIHNlbWVudGFyYSBrcml0ZXJpYSBpbmZvcm1hc2kgbWVudW5qdWtrYW4gc2VjYXJhIGVtcGlyaXMgc2ViZXJhcGEgYmVzYXIgcGVyYmFpa2FuIHlhbmcgZGlwZXJvbGVoIHNldGVsYWggYmVyYWxpaCBrZSBkaXN0cmlidXNpIE5lZ2F0aXZlIEJpbm9taWFsLiBEZW5nYW4gbWVuZ2Frb21vZGFzaSBwYXJhbWV0ZXIgZGlzcGVyc2kgdGFtYmFoYW4gc2VrYWxpZ3VzIG1lbXBlcnRhaGFua2FuIHN0cnVrdHVyIGVmZWsgYWNhayB3aWxheWFoIGRhbiB0YWh1biwgbW9kZWwgTmVnYXRpdmUgQmlub21pYWwgR0xNTSB0ZXJidWt0aSBwYWxpbmcgZWZla3RpZiBkYWxhbSBtZW5hbmdrYXAgaGV0ZXJvZ2VuaXRhcyBzcGFzaWFsIGRhbiBmbHVrdHVhc2kgdGVtcG9yYWwga2FzdXMgVEIgZGkgSmF3YSBCYXJhdC4NCg0KRGFyaSBrcml0ZXJpYSBpbmZvcm1hc2kgc3RhdGlzdGlrIHRlcnNlYnV0LCBtb2RlbCBOZWdhdGl2ZSBCaW5vbWlhbCBHTE1NIHRlcnBpbGloIHNlYmFnYWkgbW9kZWwgdGVyYmFpaywgZGlkdWt1bmcgb2xlaCBkdWEgbGFwaXMgYnVrdGkgeWFuZyBrb25zaXN0ZW46IGJ1a3RpIGRpYWdub3N0aWsgKG92ZXJkaXNwZXJzaSkgZGFuIGJ1a3RpIGtvbXBhcmF0aWYgKEFJQy9CSUMvTG9nLUxpa2VsaWhvb2QpIHBhZGEgc3RydWt0dXIgbW9kZWwgeWFuZyBzZXRhcmEuIFBlbWlsaWhhbiBpbmkgdGlkYWsgaGFueWEgbWVtYmVyaWthbiBlc3RpbWFzaSBwYXJhbWV0ZXIgeWFuZyBsZWJpaCB2YWxpZCBzZWNhcmEgc3RhdGlzdGlrIGRlbmdhbiBtZW1pbmltYWxpc2lyIGJpYXMgYWtpYmF0IG92ZXJkaXNwZXJzaSwgdGV0YXBpIGp1Z2EgbWVtYmVyaWthbiBwZXJzcGVrdGlmIHlhbmcgbGViaWgga29tcHJlaGVuc2lmIGRhbGFtIG1lbmdpbnRlZ3Jhc2lrYW4gZGluYW1pa2Egc3Bhc2lvLXRlbXBvcmFsIHR1YmVya3Vsb3NpcyBkaSBQcm92aW5zaSBKYXdhIEJhcmF0Lg0KDQojIyAzLjcgV2lsYXlhaCBQcmlvcml0YXMNCg0KYGBge3J9DQpwcmlvcml0YXMgPC0gZGF0YSAlPiUNCiAgZ3JvdXBfYnkoDQogICAgbmFtYV9rYWJ1cGF0ZW5fa290YQ0KICApICU+JQ0KICBzdW1tYXJpc2UoDQogICAgcmF0YV9JUiA9IG1lYW4oSVIpLA0KICAgIHJhdGFfU0lSID0gbWVhbihTSVIpDQogICkgJT4lDQogIGFycmFuZ2UoZGVzYyhyYXRhX1NJUikpDQoNCmthYmxlKA0KICBoZWFkKHByaW9yaXRhcywxMCkNCikNCmBgYA0KDQpXaWxheWFoIHlhbmcgbWVuZW1wYXRpIDEwIHBlcmluZ2thdCB0ZXJhdGFzIGRlbmdhbiBTSVIgdGVydGluZ2dpIGRpaWRlbnRpZmlrYXNpIHNlYmFnYWkga2xhc3RlciBwcmlvcml0YXMuIFRpbmdnaW55YSBuaWxhaSBTSVIgcGFkYSB3aWxheWFoLXdpbGF5YWggaW5pIG1lbnVuanVra2FuIGJhaHdhIHVwYXlhIHBlbmVtdWFuIGthc3VzIGRhbiBpbnRlcnZlbnNpIGtlc2VoYXRhbiBoYXJ1cyBkaXByaW9yaXRhc2thbiBkaSBkYWVyYWggdGVyc2VidXQga2FyZW5hIHJpc2lrbyBUQiBzZWNhcmEgc3RhdGlzdGlrIGphdWggZGkgYXRhcyByYXRhLXJhdGEgcHJvdmluc2kuDQoNCiMjIDMuOCBJbXBsaWthc2kgRXBpZGVtaW9sb2dpcw0KDQpBbmFsaXNpcyBzcGFzaWFsLXRlbXBvcmFsIGluaSBtZW51bmp1a2thbiBiYWh3YSB0cmFuc21pc2kgVEIgZGkgSmF3YSBCYXJhdCB0aWRhayBoYW55YSBkaXBlbmdhcnVoaSBvbGVoIGZha3RvciBzb3NpYWwgZWtvbm9taSwgdGV0YXBpIGp1Z2Egb2xlaCBzdHJ1a3R1ciBwb3B1bGFzaS4NCg0KLSBQZW5nYXJ1aCBLZXBhZGF0YW46IEtlcGFkYXRhbiBwZW5kdWR1ayB5YW5nIHRpbmdnaSBtZW5pbmdrYXRrYW4gcHJvYmFiaWxpdGFzIHRyYW5zbWlzaSBkcm9wbGV0IChrb250YWsgYW50YXJpbmRpdmlkdSksIHlhbmcgYmVya29udHJpYnVzaSBwYWRhIHBlbmluZ2thdGFuIGthc3VzIFRCIHNlY2FyYSBzaWduaWZpa2FuLg0KDQotIFNpbmVyZ2kgVEItSElWOiBIdWJ1bmdhbiBwb3NpdGlmIGFudGFyYSBwcmV2YWxlbnNpIEhJViBkYW4gVEIgbWVuZ29uZmlybWFzaSBwZXJsdW55YSBsYXlhbmFuIGludGVncmFzaSBUQi1ISVYsIG1lbmdpbmdhdCBrZXJlbnRhbmFuIGluZGl2aWR1IGRlbmdhbiBISVYgdGVyaGFkYXAgaW5mZWtzaSBUQiBha2liYXQgcGVudXJ1bmFuIHNpc3RlbSBpbXVuLg0KDQotIEtlYmlqYWthbiBCZXJiYXNpcyBXaWxheWFoOiBIYXNpbCBpbmkgbWVtYmVyaWthbiBsYW5kYXNhbiBiYWdpIHBlbWVyaW50YWggZGFlcmFoIGRhbGFtIG1lcnVtdXNrYW4ga2ViaWpha2FuIHlhbmcgYmVyc2lmYXQgcHJlc2lzaSAocHJlY2lzaW9uIHB1YmxpYyBoZWFsdGgpLCBkaSBtYW5hIGludGVydmVuc2kgdGlkYWsgbGFnaSBiZXJzaWZhdCBzZXJhZ2FtIChvbmUtc2l6ZS1maXRzLWFsbCksIG1lbGFpbmthbiBkaXNlc3VhaWthbiBkZW5nYW4gcHJvZmlsIHJpc2lrbyB0aWFwIGthYnVwYXRlbi9rb3RhLg0KDQojIyAzLjkgS2V0ZXJiYXRhc2FuIFBlbmVsaXRpYW4NCg0KMS4gRGF0YSB5YW5nIGRpZ3VuYWthbiBtZXJ1cGFrYW4gZGF0YSBhZ3JlZ2F0IGthYnVwYXRlbi9rb3RhLg0KMi4gVGlkYWsgdGVyc2VkaWEgaW5mb3JtYXNpIGthcmFrdGVyaXN0aWsgaW5kaXZpZHUgcGVuZGVyaXRhLg0KMy4gRmFrdG9yIHBlcmlsYWt1IGRhbiBrdWFsaXRhcyBwZWxheWFuYW4ga2VzZWhhdGFuIGJlbHVtIHNlcGVudWhueWEgdGVyc2VkaWEuDQoNCiMjIDMuMTAgUmVrb21lbmRhc2kNCg0KMS4gTWVtcGVya3VhdCBza3JpbmluZyBha3RpZiBwYWRhIHdpbGF5YWggZGVuZ2FuIFNJUiB0aW5nZ2kuDQoyLiBNZW5naW50ZWdyYXNpa2FuIHByb2dyYW0gVEIgZGFuIEhJVi4NCjMuIE1lbmluZ2thdGthbiBha3NlcyBzYW5pdGFzaV9sYXlhayBkYW4gZmFzaWxpdGFzIGtlc2VoYXRhbi4NCjQuIE1lbGFrdWthbiBwZW1hbnRhdWFuIGJlcmthbGEgcGFkYSB3aWxheWFoIHByaW9yaXRhcy4NCg0KIyA0IEtlc2ltcHVsYW4gZGFuIFNhcmFuDQoNCiMjIDQuMSBLZXNpbXB1bGFuDQoNCkJlcmRhc2Fya2FuIGhhc2lsIGFuYWxpc2lzIGVwaWRlbWlvbG9naSwgZGlzZWFzZSBtYXBwaW5nLCBkYW4gcGVtb2RlbGFuIHNwYXNpby10ZW1wb3JhbCANClR1YmVya3Vsb3NpcyBkaSBQcm92aW5zaSBKYXdhIEJhcmF0IHBlcmlvZGUgMjAyMeKAkzIwMjUsIGRhcGF0IGRpdGFyaWsga2VzaW1wdWxhbiBzZWJhZ2FpIGJlcmlrdXQ6DQoNCjEuICoqRGlzdHJpYnVzaSBLYXN1cyBkYW4gVWt1cmFuIEVwaWRlbWlvbG9naSoqICANCiAgIEp1bWxhaCBrYXN1cyBUQiBkaSBKYXdhIEJhcmF0IG1lbnVuanVra2FuIHRyZW4gcGVuaW5na2F0YW4geWFuZyBrb25zaXN0ZW4gc2VsYW1hIA0KICAgcGVyaW9kZSBwZW5nYW1hdGFuLCBkYXJpIDg5LjI1NSBrYXN1cyBwYWRhIHRhaHVuIDIwMjEgaGluZ2dhIG1lbmNhcGFpIHB1bmNha255YSANCiAgIDIyOS42ODMga2FzdXMgcGFkYSB0YWh1biAyMDI0LCBrZW11ZGlhbiBzZWRpa2l0IG1lbnVydW4gbWVuamFkaSAyMjUuMzg5IGthc3VzIHBhZGEgDQogICB0YWh1biAyMDI1LiBJbmNpZGVuY2UgUmF0ZSAoSVIpIG1lbmluZ2thdCBkYXJpIDE4MywxMyBwZXIgMTAwLjAwMCBwZW5kdWR1ayAoMjAyMSkgDQogICBtZW5qYWRpIDQ1NiwyMiBwZXIgMTAwLjAwMCBwZW5kdWR1ayAoMjAyNCksIG1lbmNlcm1pbmthbiBpbnRlbnNpZmlrYXNpIHBlbmVtdWFuIA0KICAga2FzdXMgbWF1cHVuIHBlbmluZ2thdGFuIHBlbnVsYXJhbiBha3R1YWwuIE5pbGFpIEtvZWZpc2llbiBWYXJpYXNpIChDVikgeWFuZyBiZXJraXNhciANCiAgIDcy4oCTODAlIG1lbnVuanVra2FuIGRpc3Bhcml0YXMgYmViYW4gVEIgeWFuZyBzYW5nYXQgdGluZ2dpIGFudGFyd2lsYXlhaC4NCg0KMi4gKipQZW1ldGFhbiBSaXNpa28gRW1waXJpY2FsIEJheWVzKiogIA0KICAgRXN0aW1hc2kgcmlzaWtvIGJlcmJhc2lzIEVtcGlyaWNhbCBCYXllcyBtZW5naGFzaWxrYW4gcGV0YSByaXNpa28geWFuZyBsZWJpaCBzdGFiaWwgDQogICBkaWJhbmRpbmdrYW4gU0lSIGtsYXNpaywgdGVydXRhbWEgcGFkYSB3aWxheWFoIGRlbmdhbiBwb3B1bGFzaSBrZWNpbC4gSGFzaWwgDQogICBwZW1ldGFhbiBtZW5naWRlbnRpZmlrYXNpIHNlanVtbGFoIGthYnVwYXRlbi9rb3RhIGRlbmdhbiByaXNpa28gRUIgeWFuZyBzZWNhcmEgDQogICBrb25zaXN0ZW4gdGluZ2dpIGxpbnRhcyB0YWh1biwgbWVuamFkaWthbm55YSBwcmlvcml0YXMgdXRhbWEgZGFsYW0gcGVyZW5jYW5hYW4gDQogICBpbnRlcnZlbnNpIHBlbmdlbmRhbGlhbiBUQiBkaSB0aW5na2F0IGRhZXJhaC4NCg0KMy4gKipBdXRva29yZWxhc2kgU3Bhc2lhbCoqICANCiAgIEhhc2lsIHVqaSBHbG9iYWwgTW9yYW4ncyBJIG1lbnVuanVra2FuIGFkYW55YSBhdXRva29yZWxhc2kgc3Bhc2lhbCB5YW5nIHNpZ25pZmlrYW4gDQogICBwYWRhIGRpc3RyaWJ1c2kgcmlzaWtvIFRCIGRpIEphd2EgQmFyYXQsIG1lbmdpbmRpa2FzaWthbiBiYWh3YSBrYXN1cyBUQiB0aWRhayANCiAgIHRlcnNlYmFyIHNlY2FyYSBhY2FrIG1lbGFpbmthbiBtZW1iZW50dWsgcG9sYSBwZW5nZWxvbXBva2FuIChjbHVzdGVyKSBnZW9ncmFmaXMuIA0KICAgQW5hbGlzaXMgTElTQSBsZWJpaCBsYW5qdXQgbWVuZ2lkZW50aWZpa2FzaSB3aWxheWFoIGtsYXN0ZXIgSGlnaC1IaWdoIChyaXNpa28gdGluZ2dpIA0KICAgZGlrZWxpbGluZ2kgdGV0YW5nZ2EgcmlzaWtvIHRpbmdnaSkgbWF1cHVuIHdpbGF5YWggb3V0bGllciBzcGFzaWFsLCB5YW5nIGRhcGF0IA0KICAgbWVuamFkaSBkYXNhciBwZW5ldGFwYW4gcHJpb3JpdGFzIGludGVydmVuc2kgYmVyYmFzaXMga2V3aWxheWFoYW4uDQoNCjQuICoqUGVtb2RlbGFuIFNwYXNpby1UZW1wb3JhbCBHTE1NIE5lZ2F0aXZlIEJpbm9taWFsKiogIA0KICAgRGF0YSBrYXN1cyBUQiBtZW51bmp1a2thbiBnZWphbGEgb3ZlcmRpc3BlcnNpIHlhbmcgc2lnbmlmaWthbiAoJFxwaGlfe2Rpc3B9ID4gMSQpLCAgc2VoaW5nZ2EgbW9kZWwgUG9pc3NvbiB0aWRhayBtZW1hZGFpIGRhbiBwZW5nZ3VuYWFuIEdMTU0gTmVnYXRpdmUgQmlub21pYWwgDQogICAobmJpbm9tMikgdGVyYnVrdGkgbGViaWggc2VzdWFpLiBNb2RlbCBHTE1NLU5CIHlhbmcgbWVueWVydGFrYW4gZWZlayBhY2FrIHdpbGF5YWggICgkdV9pJCkgZGFuIGVmZWsgYWNhayB0ZW1wb3JhbCAoJHZfdCQpIG1hbXB1LG1lbmdha29tb2Rhc2kgaGV0ZXJvZ2VuaXRhcyBzcGFzaWFsIGRhbiBmbHVrdHVhc2kgdGVtcG9yYWwgc2VjYXJhIHNpbXVsdGFuLiBIYXNpbCBlc3RpbWFzaSBJbmNpZGVuY2UgUmF0ZSBSYXRpbyAoSVJSKSAgbWVudW5qdWtrYW4gYmFod2EgdmFyaWFiZWwgSElWLCBrZXBhZGF0YW4gcGVuZHVkdWssIGRhbiBwZXJzZW50YXNlIHBlbmR1ZHVrIG1pc2tpbiAgIGJlcnBlbmdhcnVoIHBvc2l0aWYgdGVyaGFkYXAgbGFqdSBrZWphZGlhbiBUQiwgc2VtZW50YXJhIGFrc2VzIGFpciBtaW51bSBsYXlhayBkYW4gc2FuaXRhc2kgbGF5YWsgYmVycGVyYW4gc2ViYWdhaSBmYWt0b3IgcHJvdGVrdGlmIHlhbmcgbWVudXJ1bmthbiByaXNpa28gVEIuDQogICANCg0KIyMgNC4yIFNhcmFuDQoNCkJlcmRhc2Fya2FuIGhhc2lsIHBlbmVsaXRpYW4sIGJlYmVyYXBhIHNhcmFuIGRpc2FtcGFpa2FuIHNlYmFnYWkgYmVyaWt1dDoNCg0KMS4gKipJbnRlcnZlbnNpIGJlcmJhc2lzIHdpbGF5YWggcHJpb3JpdGFzKiosICBLYWJ1cGF0ZW4va290YSBkZW5nYW4gbmlsYWkgRUIgUmlzayANCiAgIGRhbiBTSVIga29uc2lzdGVuIGRpIGF0YXMgMSBwZXJsdSBtZW5kYXBhdCBhbG9rYXNpIHN1bWJlciBkYXlhIGxlYmloIGludGVuc2lmLCANCiAgIG1lbmNha3VwIHNrcmluaW5nLCBjb250YWN0IHRyYWNpbmcsIGRhbiBwZW5ndWF0YW4gZmFzaWxpdGFzIHBlbmdvYmF0YW4uDQoNCjIuICoqUGVuYW5nYW5hbiBkZXRlcm1pbmFuIHNvc2lhbC1la29ub21pKiosIFByb2dyYW0gcGVuZ2VuZGFsaWFuIFRCIHBlcmx1IA0KICAgZGlpbnRlZ3Jhc2lrYW4gZGVuZ2FuIHBlbmluZ2thdGFuIHNhbml0YXNpLCBha3NlcyBhaXIgbWludW0gbGF5YWssIGRhbiANCiAgIHBlbmdlbnRhc2FuIGtlbWlza2luYW4sIHRlcnV0YW1hIGRpIHdpbGF5YWggcGFkYXQgcGVuZHVkdWsuDQoNCjMuICoqU2luZXJnaSBUQi1ISVYqKiwgIFBlbmd1YXRhbiBwcm9ncmFtIGtvbGFib3Jhc2kgVEItSElWIGRpcGVybHVrYW4gZGkgd2lsYXlhaCANCiAgIGRlbmdhbiBiZWJhbiBISVYgdGluZ2dpLCBtZW5naW5nYXQgSElWIHRlcmJ1a3RpIGJlcnBlbmdhcnVoIHNpZ25pZmlrYW4gdGVyaGFkYXAgDQogICBsYWp1IGtlamFkaWFuIFRCLg0KDQo0LiAqKlBlbmluZ2thdGFuIGt1YWxpdGFzIHN1cnZlaWxhbnMqKiwgRGlwZXJsdWthbiBzaXN0ZW0gc3VydmVpbGFucyBUQiB5YW5nIA0KICAgYmVya2VsYW5qdXRhbiBkYW4gdGVyaW50ZWdyYXNpIHNlY2FyYSBkaWdpdGFsIGRpIHNlbHVydWggZmFzaWxpdGFzIGtlc2VoYXRhbiANCiAgIEphd2EgQmFyYXQuDQoNCjUuICoqUGVuZ2VtYmFuZ2FuIG1vZGVsIHNwYXNpYWwqKiwgUGVuZ2d1bmFhbiBtb2RlbCBDQVIvQllNIGRhbGFtIGtlcmFuZ2thIEJheWVzaWFuIEhpZXJhcmNoaWNhbCAobWlzYWxueWEgdmlhIGBSLUlOTEFgIGF0YXVgQ0FSQmF5ZXNgKSBzZXJ0YSBwZW5lcmFwYW4gICAgZGVrb21wb3Npc2kgc3Bhc2lvLXRlbXBvcmFsIGRhcGF0IG1lbmdoYXNpbGthbiBlc3RpbWFzaSByaXNpa28gIHlhbmcgbGViaWggYWt1cmF0IGRlbmdhbiBtZW5naW50ZWdyYXNpa2FuIGRlcGVuZGVuc2kgc3Bhc2lhbCBkYW4gdGVtcG9yYWwgc2VjYXJhIGVrc3BsaXNpdC4NCg0KNi4gKipQZXJsdWFzYW4gdmFyaWFiZWwgZGFuIHVuaXQgYW5hbGlzaXMqKiwgUGVuZWxpdGlhbiBsYW5qdXRhbiBkaXNhcmFua2FuIG1lbmFtYmFoa2FuIHZhcmlhYmVsIHNlcGVydGkgSVBNLCBjYWt1cGFuIEJDRywgZGFuIERpYWJldGVzIE1lbGl0dXMsIHNlcnRhIG1lbXBlcnRpbWJhbmdrYW4gYW5hbGlzaXMgcGFkYSB1bml0IGtlY2FtYXRhbiB1bnR1ayBrZXRhamFtYW4gaWRlbnRpZmlrYXNpIGhvdHNwb3QgeWFuZyBsZWJpaCB0aW5nZ2kuDQoNCiMgRGFmdGFyIFB1c3Rha2ENCg0KMS4JQWxtYSwgTC4gUi4sIE9saXZpb25pdGEsIFYuLCAmIFdhcmRhbmksIEguIEUuICgyMDI0KS4gQW4gZWNvbG9naWNhbCBzdHVkeSBvZiBkZXRlcm1pbmFudHMgb2YgdGhlIGluY2lkZW5jZSBvZiB0dWJlcmN1bG9zaXMgaW4gTWFsYW5nIFJheWEgYXJlYS4gUHJldmVudGlhOiBUaGUgSW5kb25lc2lhbiBKb3VybmFsIG9mIFB1YmxpYyBIZWFsdGgsIDkoMSksIDExMuKAkzEyMC4gaHR0cHM6Ly9kb2kub3JnLzEwLjE3OTc3L3VtMDQ0djlpMTIwMjRwMTEyLTEyMA0KMi4JQW5zZWxpbiwgTC4gKDE5OTUpLiBMb2NhbCBpbmRpY2F0b3JzIG9mIHNwYXRpYWwgYXNzb2NpYXRpb24gTElTQS4gR2VvZ3JhcGhpY2FsIEFuYWx5c2lzLCAyNygyKSwgOTPigJMxMTUuIGh0dHBzOi8vZG9pLm9yZy8xMC4xMTExL2ouMTUzOC00NjMyLjE5OTUudGIwMDMzOC54DQozLglBbnNlbGluLCBMLiwgU3lhYnJpLCBJLiwgJiBLaG8sIFkuICgyMDA2KS4gR2VvRGE6IEFuIGludHJvZHVjdGlvbiB0byBzcGF0aWFsIGRhdGEgYW5hbHlzaXMuIEdlb2dyYXBoaWNhbCBBbmFseXNpcywgMzgoMSksIDXigJMyMi4gaHR0cHM6Ly9kb2kub3JnLzEwLjExMTEvai4wMDE2LTczNjMuMjAwNS4wMDY3MS54DQo0LglBdGlsbGFoLCBDLiBOLiwgV3VsYW5kYXJpLCBSLiBBLiwgJiBLdXJuaWFzYXJpLCBGLiAoMjAyMykuIEVudmlyb25tZW50YWwgZmFjdG9ycyBhbmQgcHVsbW9uYXJ5IHR1YmVyY3Vsb3NpcyBjYXNlcyBpbiBCYW5kdW5nIENpdHkuIEp1cm5hbCBJbG1pYWggS2VzZWhhdGFuIE1hc3lhcmFrYXQsIDE1KDQpLCAxNjfigJMxNzUuIGh0dHBzOi8vZG9pLm9yZy8xMC41MjAyMi9qaWttLnYxNWk0LjU2Ng0KNS4JQ2hhbWJlcnMsIFIuLCBEcmVhc3NpLCBFLiwgJiBTYWx2YXRpLCBOLiAoMjAxMykuIERpc2Vhc2UgbWFwcGluZyB2aWEgbmVnYXRpdmUgYmlub21pYWwgcmVncmVzc2lvbiBNLXF1YW50aWxlcy4gYXJYaXYgcHJlcHJpbnQuIGh0dHBzOi8vYXJ4aXYub3JnL2Ficy8xMzEwLjM0MDMNCjYuCUNsYXl0b24sIEQuLCAmIEthbGRvciwgSi4gKDE5ODcpLiBFbXBpcmljYWwgQmF5ZXMgRXN0aW1hdGVzIG9mIEFnZS1zdGFuZGFyZGl6ZWQgUmVsYXRpdmUgUmlza3MgZm9yIFVzZSBpbiBEaXNlYXNlIE1hcHBpbmcuIEJpb21ldHJpY3MsIDQzKDMpLCA2NzEtNjgxLiANCjcuCURpbmFzIEtlc2VoYXRhbiBQcm92aW5zaSBKYXdhIEJhcmF0LiAoMjAyMykuIFByb2ZpbCBrZXNlaGF0YW4gUHJvdmluc2kgSmF3YSBCYXJhdCB0YWh1biAyMDIyLg0KOC4JRGluYXMgS2VzZWhhdGFuIFByb3ZpbnNpIEphd2EgQmFyYXQuICgyMDI0KS4gUHJvZmlsIGtlc2VoYXRhbiBQcm92aW5zaSBKYXdhIEJhcmF0IHRhaHVuIDIwMjMuDQo5LglEaW5hcyBLZXNlaGF0YW4gUHJvdmluc2kgSmF3YSBCYXJhdC4gKDIwMjUpLiBQcm9maWwga2VzZWhhdGFuIFByb3ZpbnNpIEphd2EgQmFyYXQgdGFodW4gMjAyNC4NCjEwLglEemFraXlhaCwgUi4gTi4sIEthcmltYSwgVS4gUS4sIFNpbWFuam9yYW5nLCBDLiwgJiBBcHJpbmluZ3NpaC4gKDIwMjMpLiBEZXRlcm1pbmFuIGtlamFkaWFuIHR1YmVya3Vsb3NpcyBwYXJ1IHBhZGEgdXNpYSBkZXdhc2EuIEp1cm5hbCBQZW5lbGl0aWFuIEtlc2VoYXRhbiBTdWFyYSBGb3Jpa2VzLg0KMTEuCUdpdHlhcmFuaSwgSy4gRy4gKDIwMjQpLiBLZXBhZGF0YW4gaHVuaWFuIGRhbiBrZWphZGlhbiB0dWJlcmt1bG9zaXMgcGFkYSBhbmFrLiBTeW50YXggTGl0ZXJhdGUsIDkoOSkuDQoxMi4JSGFuZGF5YW5pLCBTLiwgTXVzZmlyYWgsIE0uLCAmIEFwcmlhbmEsIEEuICgyMDI0KS4gRGV0ZXJtaW5hbnRzIG9mIHB1bG1vbmFyeSB0dWJlcmN1bG9zaXMuIEp1cm5hbCBJbG1pYWggS2VzZWhhdGFuLCA2KDEpLCA0NeKAkzU0LiBodHRwczovL2RvaS5vcmcvMTAuMzY1OTAvamlrYS52NmkxLjM3NA0KMTMuCUhhcSwgQS4sIEFjaG1hZGksIFUuIEYuLCAmIFN1c2FubmEsIEQuICgyMDIwKS4gQW5hbGlzaXMgc3Bhc2lhbCBUQiBwYXJ1LiBKdXJuYWwgRWtvbG9naSBLZXNlaGF0YW4sIDE4KDMpLiBodHRwczovL2RvaS5vcmcvMTAuMjI0MzUvamVrLnYzaTE4LjgwDQoxNC4JSGFyZGluLCBKLiBXLiwgJiBIaWxiZSwgSi4gTS4gKDIwMDcpLiBHZW5lcmFsaXplZCBMaW5lYXIgTW9kZWxzIGFuZCBFeHRlbnNpb25zLiBTdGF0YSBQcmVzcy4gDQoxNS4JSGlsYmUsIEouIE0uICgyMDExKS4gTmVnYXRpdmUgYmlub21pYWwgcmVncmVzc2lvbiAoMm5kIGVkLikuIENhbWJyaWRnZSBVbml2ZXJzaXR5IFByZXNzLg0KMTYuCUtlbWVudGVyaWFuIEtlc2VoYXRhbiBSZXB1YmxpayBJbmRvbmVzaWEuICgyMDI1KS4gUHJvZmlsIGtlc2VoYXRhbiBJbmRvbmVzaWEgMjAyNC4NCjE3LglLbm9yci1IZWxkLCBMLiAoMjAwMCkuIEJheWVzaWFuIG1vZGVsbGluZyBvZiBnZW9ncmFwaGljYWwgZGlzZWFzZSBwYXR0ZXJuczogQSBjYXNlIHN0dWR5IG9mIGtpZG5leSBjYW5jZXIgaW4gR2VybWFueS4gU3RhdGlzdGljcyBpbiBNZWRpY2luZSwgMTkoMTfigJMxOCksIDI0MjnigJMyNDQ0LiBodHRwczovL2RvaS5vcmcvMTAuMTAwMi8xMDk3LTAyNTgoMjAwMDA5MTUvMzApMTk6MTcvMTg8MjQyOTo6QUlELVNJTTU4Nz4zLjAuQ087Mi1QDQoxOC4JS3Jpc3RpYW5pbmdydW0sIEUuIE4uICgyMDI0KS4gS2VwYWRhdGFuIHBlbmR1ZHVrIGRhbiBUQiBwYXJ1LiBTa3JpcHNpIFVuaXZlcnNpdGFzIER1dGEgQmFuZ3NhLg0KMTkuCUxhb2xpLCBILiBBLiwgTmF6aXJhLCBBLiwgRmFsZXJpYSwgSS4sIFRhcmlnYW4sIEIuLCAmIEdpcnNhbmcsIFYuIEkuICgyMDI0KS4gQ2FzZXMgb2YgcHVsbW9uYXJ5IHR1YmVyY3Vsb3NpcyBhbmQgcG9wdWxhdGlvbiBkZW5zaXR5LiBNSUhISUNvIENvbmZlcmVuY2UgUHJvY2VlZGluZ3MuDQoyMC4JTGF3c29uLCBBLiBCLiAoMjAxOCkuIEJheWVzaWFuIGRpc2Vhc2UgbWFwcGluZyAoM3JkIGVkLikuIENSQyBQcmVzcy4NCjIxLglNYXJzaGFsbCwgUi4gSi4gKDE5OTEpLiBNYXBwaW5nIERpc2Vhc2UgYW5kIE1vcnRhbGl0eSBSYXRlcyBVc2luZyBFbXBpcmljYWwgQmF5ZXMgRXN0aW1hdG9ycy4gSm91cm5hbCBvZiB0aGUgUm95YWwgU3RhdGlzdGljYWwgU29jaWV0eTogU2VyaWVzIEMgKEFwcGxpZWQgU3RhdGlzdGljcyksIDQwKDIpLCAyODMtMjk0LiANCjIyLglOdXJkaW4sIEEuLCBldCBhbC4gKDIwMjUpLiBBbmFsaXNpcyBmYWt0b3IgcmlzaWtvIFRCLiBKdXJuYWwgS2VzZWhhdGFuIFlhbWFzaSBNYWthc3NhciwgOSgyKSwgMeKAkzkuDQoyMy4JUHV0cmksIE4uIEMuIEUuLCBZYW51YXIsIEYuLCAmIFlvenphLCBILiAoMjAxOSkuIE1ldG9kZSBCYXllcyBlbXBpcmlrIHVudHVrIG1lbW9kZWxrYW4gZGF0YSBjYWNhaGFuIGRlbmdhbiBwZXViYWggcGVueWVydGEgcGFkYSBwZW5kdWdhYW4gYXJlYSBrZWNpbC4gSnVybmFsIE1hdGVtYXRpa2EgVU5BTkQsIDgoMSksIDIyNOKAkzIzMS4NCjI0LglSYWhheXUsIEEuICgyMDIwKS4gTW9kZWwtbW9kZWwgcmVncmVzaSB1bnR1ayBtZW5nYXRhc2kgbWFzYWxhaCBvdmVyZGlwZXJzaSBwYWRhIHJlZ3Jlc2kgUG9pc3Nvbi4gSm91cm5hbCBQZXFndXJ1YW5nOiBDb25mZXJlbmNlIFNlcmllcywgMigxKSwgMeKAkzUuIGh0dHBzOi8vZG9pLm9yZy8xMC4zNTMyOS9qcC52MmkxLjE4NjYNCjI1LglSYWhheXUsIEwuIFAuICgyMDE0KS4gS2FqaWFuIG92ZXJkaXNwZXJzaSBwYWRhIHJlZ3Jlc2kgUG9pc3NvbiBkYW4gemVyby1pbmZsYXRlZCBQb2lzc29uIHVudHVrIGJlYmVyYXBhIGthcmFrdGVyaXN0aWsgZGF0YSAoU2tyaXBzaSBzYXJqYW5hLCBJbnN0aXR1dCBQZXJ0YW5pYW4gQm9nb3IpLiBSZXBvc2l0b3J5IEluc3RpdHV0IFBlcnRhbmlhbiBCb2dvci4gaHR0cHM6Ly9yZXBvc2l0b3J5LmlwYi5hYy5pZC9oYW5kbGUvMTIzNDU2Nzg5LzcwMjczDQoyNi4JUm9zYWR5LCBELiBTLiwgWnVsZmEsIE4uIFIuIEEuLCAmIFByYXRhbWEsIFMuIEIuICgyMDI0KS4gU3BhdGlhbCBhbmFseXNpcyBUQiBCYW5kdW5nLiBHbG9iYWwgTWVkaWNhbCAmIEhlYWx0aCBDb21tdW5pY2F0aW9uLCAxMigxKS4gaHR0cHM6Ly9kb2kub3JnLzEwLjI5MzEzL2dtaGMudjEyaTEuMTI0MTANCjI3LglTYXNtaXRhLCBTLiwgSnVuYWlkLCBKLiwgJiBBaW51cmFmaXEsIEEuICgyMDE3KS4gUG9sYSBzcGFzaWFsIFRCIHBhcnUuIEp1cm5hbCBJbG1pYWggTWFoYXNpc3dhIEtlc2VoYXRhbiBNYXN5YXJha2F0Lg0KMjguCVNpaGFsb2hvLCBFLiBELiwgZXQgYWwuICgyMDIxKS4gUGVuZ2FydWgga2VtaXNraW5hbiB0ZXJoYWRhcCBUQi4gSm91cm5hbCBvZiBBcHBsaWVkIEJ1c2luZXNzIGFuZCBFY29ub21pYywgNygzKS4gaHR0cHM6Ly9kb2kub3JnLzEwLjMwOTk4L2phYmUudjdpMy42NDcwDQoyOS4JU2ltYXRhdXcsIEEuLCBTZWRpeW9ubywgRS4sICYgUHJhc2V0eW8sIFMuIFkuIEouICgyMDE5KS4gQXV0b2tvcmVsYXNpIFNwYXNpYWwgdW50dWsgQW5hbGlzaXMgUG9sYSBQZW5nYXdhc2FuIEthd2FzYW4gTGluZHVuZyBkaSBLb3RhIEFtYm9uIE1hbHVrdS4gVGVrbmlrYSwgOCgxKSwgMeKAkzkuIGh0dHBzOi8vZG9pLm9yZy8xMC4zNDE0OC90ZWtuaWthLnY4aTEuMTQ0DQozMC4JU3VyeWFuaSwgRi4gVC4sICYgSWJhZCwgTS4gKDIwMjIpLiBGYWt0b3Iga2VwYWRhdGFuIGRhbiBzYW5pdGFzaSB0ZXJoYWRhcCBUQi4gSnVybmFsIFNvc2lhbCBTYWlucywgMigxMCkuIGh0dHBzOi8vZG9pLm9yZy8xMC4zNjQxOC9qdXJuYWxzb3NhaW5zLnYyaTEwLjQ2OA0KMzEuCVR1cm5lciwgUi4gRC4sIGV0IGFsLiAoMjAxNykuIFR1YmVyY3Vsb3NpcyBpbmZlY3Rpb3VzbmVzcyBhbmQgaG9zdCBzdXNjZXB0aWJpbGl0eS4gSm91cm5hbCBvZiBJbmZlY3Rpb3VzIERpc2Vhc2VzLCAyMTYuIGh0dHBzOi8vZG9pLm9yZy8xMC4xMDkzL2luZmRpcy9qaXgzNjENCjMyLglXYWxsZXIsIEwuIEEuLCAmIEdvdHdheSwgQy4gQS4gKDIwMDQpLiBBcHBsaWVkIHNwYXRpYWwgc3RhdGlzdGljcyBmb3IgcHVibGljIGhlYWx0aCBkYXRhLiBXaWxleS4NCjMzLglXb3JsZCBIZWFsdGggT3JnYW5pemF0aW9uLiAoMjAyNSkuIEdsb2JhbCB0dWJlcmN1bG9zaXMgcmVwb3J0IDIwMjUuIFdITy4NCjM0LgladXVyLCBBLiBGLiwgZXQgYWwuICgyMDA5KS4gTWl4ZWQgZWZmZWN0cyBtb2RlbHMgYW5kIGV4dGVuc2lvbnMgaW4gZWNvbG9neSB3aXRoIFIuIFNwcmluZ2VyLg0K