<div class="logo-inner">
<img src="fotoku.jpg" alt="Nurul Iffah">
</div>
NURUL IFFAH
Program Studi
Sains Data
Universitas
INSTITUT TEKNOLOGI SAINS BANDUNG
Dosen Pengampu
Bakti Siregar, M Sc., CSD
PROBABILITY DISTRIBUTION
Dalam kehidupan sehari-hari, satu percobaan yang sama bisa memberi
hasil berbeda: tinggi tiap orang tidak sama, jumlah chat per hari
berubah, hasil lempar koin acak. Untuk merapikan ketidakpastian itu,
kita pakai variabel acak sebagai wakil hasil, dan distribusi peluang
(probability distribution) untuk menunjukkan seberapa besar kemungkinan
tiap nilai muncul.
Secara garis besar, bab ini mencakup:
Variabel acak diskrit dan kontinu, dan bagaimana
perbedaan tipe data ini memengaruhi cara kita memodelkan
peluang.
Fungsi kepadatan peluang (PDF) dan fungsi distribusi
kumulatif (CDF) untuk variabel kontinu, termasuk cara
menghitung peluang sebagai luas di bawah kurva.
Distribusi sampling untuk statistik seperti rata-rata
sampel \((\bar{X})\) dan
proporsi sampel \((\hat{p})\), yang
menjelaskan mengapa nilai statistik bisa berubah dari sampel ke
sampel.
Teorema Limit Tengah (Central Limit Theorem /
CLT), yang menjelaskan kenapa, untuk sampel cukup besar,
distribusi rata-rata dan proporsi sampel cenderung mendekati
normal.
Distribusi proporsi sampel dan distribusi
binomial, serta kapan kita memakai perhitungan exact (binomial)
dan kapan cukup memakai pendekatan normal (approximate) dengan bantuan
CLT.
NOTE : maaf Mr. B saya tidak mengikuti babnya Mr. B,
karena menurut saya, saya lebih mudah mengerti dengan seperti ini.
VARIABLE
DISKRIT DAN KONTINU
VARIABLE
DISKRIT
Nilainya terhitung (countable): \(0,1,2,3,\ldots\)
Contoh: - jumlah kepala saat lempar 4 koin, - jumlah siswa yang
lulus, - jumlah kelereng hijau yang diambil.
Biasanya digambar pakai bar chart: - tiap nilai
punya batang terpisah, - tinggi batang = peluang \(P(X = k)\).
Untuk variabel diskrit, kita punya fungsi peluang: \(P(X = x)\).
Keterangan:
\(X\) : variabel acak diskrit
(misal jumlah kepala).
\(x\) : satu nilai tertentu yang
mungkin (misal 2).
\(P(X = x)\) : peluang bahwa
\(X\) mengambil nilai tepat \(x\).
Fungsi \(P(X = x)\)
ini disebut PMF (probability mass function).
Di diskrit, peluang di titik \(P(X =
x)\) bisa \(> 0\), misalnya
\(P(X = 2) = 0{,}3\).
VARIABLE
KONTINU
Nilainya terukur, bisa punya desimal tanpa
batas.
Contoh:
tinggi badan, berat badan,
waktu, suhu, umur, kecepatan, jarak.
Nilai di dalam satu interval itu tak hingga banyak (antara 1 dan 2
sudah ada 1.1, 1.11, 1.111, dst).
Biasanya digambar pakai histogram atau kurva
halus, bukan batang terpisah.
Di sini terjadi hal penting: Karena titiknya tak hingga
banyak, peluang di satu titik persis jadi 0. \[
P(X = x) = 0 \text{ untuk semua } x
\] Keterangan:
\(X\) : variabel acak kontinu
(misal tinggi).
\(x\) : satu nilai tertentu
(misal 150 cm).
Rumus ini bilang: peluang tepat di satu titik untuk variabel
kontinu selalu nol (\(P(X = x) =
0\)).
Karena itu, untuk kontinu kita tidak lagi bicara:
tapi kita bicara peluang di interval, misalnya:
DISKRIT -
KONTINUE → PMF ke PDF
Solusinya: kita definisikan fungsi kepadatan peluang
(PDF) \(f(x)\).
PMF (diskrit): \[
P(X = x) = \text{(angka tertentu)}
\]
Keterangan:
PDF (kontinu): \[
f(x) = \text{"kepadatan peluang di sekitar } x\text{ "}
\] Keterangan:
\(f(x)\) peluang, melainkan
kepadatan.
Peluang yang sebenarnya didapat dari luas di bawah kurva \(f(x)\).
Rumus peluang untuk variabel kontinu: \[
P(a \le X \le b) = \int_a^b f(x)\, dx
\] Keterangan:
\(a, b\) : batas bawah dan batas
atas interval.
\(\displaystyle \int_a^b f(x)\,
dx\) : luas di bawah kurva \(f(x)\) dari \(x =
a\) sampai \(x = b\).
Nilai integral ini = peluang bahwa \(X\) jatuh di antara \(a\) dan \(b\).
Secara visual: bar chart diskrit \(\rightarrow\) batang makin banyak dan makin
tipis \(\rightarrow\) lama-lama
membentuk kurva halus \(\rightarrow\)
itulah ide PDF.
Jadi PDF itu seperti “versi kontinu” dari tabel peluang
(PMF).
RANDOM VARIABLE
KONTINU, PDF, dan CDF
RANDOM
VARIABLE KONTINU
Random variable kontinu adalah peubah acak yang bisa ambil nilai apa
pun dalam sebuah interval di garis bilangan real.
Contoh: tinggi, waktu, suhu, umur, tekanan, kecepatan.
Ciri penting:
Nilai ada di interval, misalnya \((a,b)\) atau \((-\infty, +\infty)\).
untuk setiap titik: \[
P(X = x) = 0
\]
Peluang hanya bermakna pada interval: \[
P(a \le X \le b) = \int_a^b f(x)\, dx
\] Keterangan rumus:
\(X\) : variabel acak
kontinu.
\(a, b\) : batas
interval.
\(f(x)\) : PDF.
\(\displaystyle \int_a^b f(x)\,
dx\) : luas di bawah kurva \(f(x)\) → itu yang jadi peluang.
PROABILITY
DENSITY FUNCTION (PDF)
Supaya \(f(x)\) sah sebagai PDF, dua
syarat:
Tidak negatif: \[
f(x) \ge 0 \quad \forall x
\]
Keterangan:
Luas total di bawah kurva = 1: \[
\int_{-\infty}^{+\infty} f(x)\,dx = 1
\] Keterangan:
Integral dari \(-\infty\) sampai
\(+\infty\): menjumlahkan semua “luas
peluang” di seluruh garis bilangan.
Harus sama dengan 1: total peluang untuk semua nilai \(X\) = 1 (pasti terjadi di suatu
tempat).
Interpretasi:
\(f(x)\) memberi tahu seberapa
padat peluang di sekitar \(x\).
Bukan langsung \(P(X =
x)\).
Peluang sebenarnya: \[
P(a \le X \le b) = \int_a^b f(x)\, dx
\]
Keterangan:
Untuk variabel kontinu, peluang interval dihitung sebagai luas di
bawah kurva PDF antara \(a\) dan \(b\).
Ini yang menggantikan “jumlahkan \(P(X
= x)\)” di kasus diskrit.
Contoh PDF: \[
f(x) = 3x^2 \quad \text{untuk } 0 \le x \le 1.
\] Keterangan:
Bentuk kurva: \(3x^2\) → makin
ke kanan, kepadatan makin besar.
PDF ini hanya berlaku di interval \(0
\le x \le 1\). Di luar itu, dianggap \(f(x) = 0\).
Cek validitas: \[
\int_0^1 3x^2\,dx = \left[x^3\right]_0^1 = 1
\] Keterangan:
Integral \(3x^2\) dari 0 ke 1
memberikan luas total = 1.
Artinya, fungsi ini memenuhi syarat PDF (total peluang =
1).
PROBABILITAS
di INTERVAL
Dengan contoh \(f(x) = 3x^2\) di
\([0,1]\):
\[
P(a \le X \le b) = \int_a^b 3x^2\, dx
\]
Keterangan:
Kita cuma boleh ambil \(a, b\)
di antara 0 dan 1.
Integral itu memberi luas di bawah kurva \(3x^2\) dari \(x =
a\) ke \(x = b\) → itulah
peluangnya.
\[
\int_0^1 3x^2\,dx
\]
adalah luas di bawah kurva \(3x^2\)
dari \(x = 0\) sampai \(x = 1\).
Hasilnya \(1\) \(\rightarrow\) berarti fungsi ini PDF yang
sah, karena total peluang = 1.
Contoh spesifik: \[
P(0.5 \le X \le 1)
= \int_{0.5}^1 3x^2\, dx
= \left[x^3\right]_{0.5}^1
= 1 - 0.125
= 0.875
\]
Keterangan:
Kita cuma boleh ambil \(a, b\)
di antara 0 dan 1.
Integral itu memberi luas di bawah kurva \(3x^2\) dari \(x =
a\) ke \(x = b\) \(\rightarrow\) itulah peluangnya.
CUMULATIVE
DISTRIBUTION FUNCTION (CDF)
Definisi CDF: \[
F(x) = P(X \le x)
\]
Keterangan:
CDF sebagai integral dari PDF: \[
F(x) = \int_{-\infty}^{x} f(t)\, dt
\]
Keterangan:
Untuk contoh \(f(t) = 3t^2\) di
\([0,1]\), karena di bawah 0 peluangnya
0, kita bisa tulis: \[
F(x) = \int_{0}^{x} 3t^2\, dt = x^3
\]
Keterangan:
Rumus CDF-nya: \(F(x) = x^3\)
untuk \(0 \le x \le 1\).
Contoh: \(F(0{,}5) = (0{,}5)^3 =
0{,}125\) → peluang \(X \le
0{,}5\) = 12,5%.
Hubungan PDF–CDF: \[
f(x) = F'(x)
\]
Keterangan:
Sebaliknya: \[
F(x) = \int f(x)\, dx \quad \text{(dengan batas yang sesuai)}
\]
Keterangan:
- Kalau kita punya PDF, mengintegralkannya (dengan batas) akan memberi
CDF.
Contoh:
Jika \(F(x) = x^3\), maka \[F'(x) = 3x^2 = f(x).\]
POPULASI,
SAMPLE DAN SAMPLING DISTRIBUTION
Populasi: semua individu yang kita minati.
Mean populasi: \(\mu\)
Simpangan baku populasi: \(\sigma\)
Proporsi populasi: \(p\)
Sampel: sebagian kecil dari populasi (ukuran \(n\)).
Sampling distribution
Ketika kita ambil banyak sampel ukuran \(n\).
Tiap sampel kita hitung statistiknya (misal \(\bar{X}\) atau \(\hat{p}\)).
Kumpulan semua nilai \(\bar{X}\)
ini membentuk: \[\text{Sampling distribution
of the sample mean}\]
Kumpulan semua \(\hat{p}\)
membentuk: \[
\text{Sampling distribution of the sample proportion}
\]
Ini adalah distribusi dari ringkasan data (statistik) dari banyak
sampel. Bukan data mentah.
SAMPLING
DISTRIBUTION of the SAMPLE MEAN & CLT
Misal:
Populasi punya mean \(\mu\) dan
simpangan baku \(\sigma\).
Kita ambil sampel ukuran \(n\).
Statistik: \(\bar{X}\) = mean
sampel.
Mean distribusi sampling: \[
\mu_{\bar{X}} = \mu
\]
Keterangan:
Dalam jangka panjang, rata-rata dari semua \(\bar{X}\) (dari banyak sampel) akan
mendekati mean populasi \(\mu\).
Standard error (simpangan baku distribusi sampling):
\[
\sigma_{\bar{X}} = \frac{\sigma}{\sqrt{n}}
\]
Keterangan:
\(\sigma_{\bar{X}}\) : simpangan
baku (standard error) dari mean sampel \(\bar{X}\).
\(\sigma\) : simpangan baku
populasi.
\(n\) : ukuran sampel.
\(\sqrt{n}\) : akar dari ukuran
sampel.
Semakin besar \(n\), \(\sigma_{\bar{X}}\) makin kecil → mean
sampel antar sampel makin tidak “loncat-loncat”.
Central Limit Theorem (CLT) untuk mean: \[
\bar{X} \approx N\left(\mu, \frac{\sigma}{\sqrt{n}}\right)
\]
Keterangan:
\(\bar{X}\) : mean
sampel.
\(\approx N(\mu, \sigma /
\sqrt{n})\) : kira-kira berdistribusi normal dengan mean \(\mu\) dan sd \(\dfrac{\sigma}{\sqrt{n}}\).
CLT: untuk \(n\) cukup besar, bentuk
distribusi \(\bar{X}\) akan mirip kurva
normal, meskipun distribusi data aslinya tidak normal.
Z-score untuk mean: \[
Z = \frac{\bar{X} - \mu}{\sigma / \sqrt{n}}
\]
Keterangan:
\(Z\) : skor baku dari mean
sampel.
\(\bar{X}\) : mean sampel yang
diamati.
\(\mu\) : mean
populasi.
\(\sigma / \sqrt{n}\) : standard
error mean.
Dipakai untuk mengubah \(\bar{X}\)
ke skala standar, agar bisa pakai tabel Z (normal baku).
SAMPLING
DISTRIBUTION of the SAMPLE PROPORTION & BINOMIAL
Untuk data 0/1 (sukses/gagal):
Keterangan:
\(\hat{p}\) : proporsi sampel
(misalnya 0{,}37).
\(X\) : jumlah sukses di sampel
(misal 37 orang).
\(n\) : ukuran sampel (misal 100
orang).
Mean distribusi sampling proporsi: \[
\mu_{\hat{p}} = p
\]
Keterangan:
Rata-rata semua \(\hat{p}\) (kalau
ambil sampel berkali-kali) akan mendekati proporsi populasi \(p\).
Standard error proporsi: \[
\sigma_{\hat{p}} = \sqrt{\frac{p(1-p)}{n}}
\]
Keterangan:
\(\sigma_{\hat{p}}\) : standard
error dari \(\hat{p}\).
\(p\) : proporsi sukses di
populasi.
\(1 - p\) : proporsi gagal di
populasi.
\(n\) : ukuran sampel.
Semakin besar \(n\), standard error
makin kecil → \(\hat{p}\) antar sampel
makin stabil.
Syarat CLT untuk proporsi: \[
np \ge 10 \quad \text{dan} \quad n(1-p) \ge 10
\]
Keterangan:
\(np\) : banyaknya sukses yang
diharapkan di satu sampel.
\(n(1-p)\) : banyaknya gagal
yang diharapkan di satu sampel.
Kalau dua-duanya \(\ge 10\) →
distribusi \(\hat{p}\) cukup “halus”
untuk didekati normal.
Jika syarat terpenuhi: \[
\hat{p} \approx N\left(p,\ \sqrt{\frac{p(1-p)}{n}}\right)
\]
Z-score untuk proporsi: \[
Z = \frac{\hat{p} - p}{\sqrt{\frac{p(1-p)}{n}}}
\]
Keterangan:
\(\hat{p}\) : proporsi sampel
yang diamati.
\(p\) : proporsi
populasi.
\(\sqrt{\dfrac{p(1-p)}{n}}\) :
standard error proporsi.
\(Z\) : skor baku
proporsi.
Hubungan dengan binomial:
\[
X \sim \text{Binomial}(n, p)
\]
\[
P(X = k) = \binom{n}{k} p^{k} (1 - p)^{n-k}
\]
Keterangan:
\(X\) : jumlah sukses dalam
\(n\) percobaan.
\(\text{Binomial}(n, p)\) :
distribusi binomial dengan parameter \(n\) dan \(p\).
\(P(X = k)\) : peluang tepat
\(k\) sukses.
\(\binom{n}{k}\) : banyaknya
cara memilih \(k\) sukses dari \(n\) percobaan.
Karena \(\hat{p} = \dfrac{X}{n}\),
sifat \(\hat{p}\) turun dari sifat
binomial ini.
Untuk \(n\) kecil → pakai binomial
(exact).
Untuk \(n\) besar → biasanya pakai
pendekatan normal (CLT) karena lebih praktis.
RANGKUMAN
Diskrit \(\rightarrow\) pakai PMF dan “peluang di
titik”: \(P(X = x)\).
Kontinu \(\rightarrow\) pakai PDF dan “peluang di
interval”: \[
P(a \le X \le b) = \int_a^b f(x)\,dx.
\]
Dari PDF, kita bisa bikin CDF: \[
F(x) = P(X \le x).
\]
Populasi vs sampel \(\rightarrow\) kita pakai statistik (\(\bar X, \hat p\)) untuk menebak parameter
(\(\mu, p\)).
Sampling distribution menjelaskan bagaimana
\(\bar X\) dan \(\hat p\) berubah-ubah dari sampel ke
sampel.
CLT:
untuk \(n\) cukup besar, \(\bar X\) dan \(\hat p\) kira-kira berdistribusi
normal
dengan standard error yang bergantung pada \(\sigma\) atau \(p\) dan \(n\): \[
\bar X \approx N\!\left(\mu, \frac{\sigma^2}{n}\right), \qquad
\hat p \approx N\!\left(p, \frac{p(1-p)}{n}\right).
\]
- Binomial adalah cara untuk jumlah sukses, tapi
untuk \(n\) besar kita sering pakai
normal approximation (pakai \(Z\))
karena lebih simple.
REFERENSI
Siregar, B. (t.t.). Introduction to Statistics:
A Data Science Perspective with R. Bookdown. Bagian tentang probability
distributions, random variables kontinu, dan sampling distributions.
Diakses dari: https://bookdown.org/dsciencelabs/intro_statistics/
OpenStax. (2023). Introductory Statistics (2nd
ed.). OpenStax. Bab distribusi peubah acak, Central Limit Theorem, dan
sampling distribution (terutama Chapter 7).
Diez, D. M., Çetinkaya-Rundel, M., & Barr, C. D.
(2019). OpenIntro Statistics (4th ed.). OpenIntro. Bab
distributions of random variables dan foundations for inference
(sampling distribution, CLT, sample mean & sample
proportion).
Shafer, D., & Zhang, J. (t.t.). Introductory
Statistics. LibreTexts. Bagian continuous random variables, probability
density function (PDF), cumulative distribution function (CDF), dan
pengantar sampling distributions.
Hogg, R. V., Tanis, E. A., & Zimmerman, D. L.
(2019). Probability and Statistical Inference (10th ed.).
Pearson. Referensi teori untuk discrete vs continuous random variables,
PDF/CDF, sampling distribution of \(\bar
X\), sample proportion, dan CLT.
Khan Academy. (t.t.). Sampling distributions
& Central limit theorem. Unit online yang menjelaskan sampling
distribution of the sample mean dan sample proportion, syarat \(np \ge 10\), dan penerapan CLT secara
intuitif.
Dinov, I. D., Christou, N., & Sanchez, J. (2008). Central Limit
Theorem: New SOCR Applet and Demonstration Activity. Journal of
Statistics Education. Artikel jurnal yang membahas simulasi CLT dan
sampling distributions untuk membantu pemahaman visual.
Referensi
Video (YouTube)
- Simple Learning Pro. (t.t.). Seri video Probability Distributions
& Sampling Distributions (7.1–7.5) [Video]. YouTube.
```
LS0tDQp0aXRsZTogIlBST0JBQklMSVRZIERJU1RSSUJVVElPTiIgICAgICANCnN1YnRpdGxlOiAiVHVnYXMgV2VlayAxMSAtIFByb2JhYmlsaXR5IERpc3RyaWJ1dGlvbiIgIA0KYXV0aG9yOiAiTnVydWwgSWZmYWgiDQpkYXRlOiAiYHIgZm9ybWF0KFN5cy5EYXRlKCksICclQiAlZCwgJVknKWAiIA0Kb3V0cHV0OiAgICAgICAgICAgICAgICAgICAgICAgIA0KICBybWRmb3JtYXRzOjpyZWFkdGhlZG93bjogICAgICANCiAgICBzZWxmX2NvbnRhaW5lZDogdHJ1ZSAgICAgICAgDQogICAgdGh1bWJuYWlsczogdHJ1ZSAgICAgICAgICAgIA0KICAgIGxpZ2h0Ym94OiB0cnVlICAgICAgICAgICAgIA0KICAgIGdhbGxlcnk6IHRydWUgICAgICAgICAgICAgICANCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUgICAgICANCiAgICBsaWJfZGlyOiBsaWJzICAgICAgICAgICAgICAgDQogICAgZGZfcHJpbnQ6ICJwYWdlZCIgICAgICAgICAgIA0KICAgIGNvZGVfZm9sZGluZzogInNob3ciICAgICAgDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KY3NzOiAiWm9vdG9waWEgKERpY2spIiAgIA0KLS0tDQoNCjxkaXYgaWQ9InNpZGViYXItdG9nZ2xlIj4NCiAgPHNwYW4+PC9zcGFuPg0KPC9kaXY+DQoNCg0KPGRpdiBpZD0ibW9kZS10b2dnbGUiIHRpdGxlPSJHYW50aSBMaWdodCAvIERhcmsiPg0KICA8c3BhbiBjbGFzcz0ic3VuIj7imIDvuI/vuI48L3NwYW4+DQogIDxzcGFuIGNsYXNzPSJtb29uIj7wn4ycPC9zcGFuPg0KPC9kaXY+DQoNCg0KPGRpdiBjbGFzcz0ibG9nby13cmFwcGVyIj4NCiAgPGRpdiBjbGFzcz0ibG9nby1mcmFtZSI+DQogICAgPGRpdiBjbGFzcz0ibG9nby1pbm5lciI+DQogICAgICA8aW1nIHNyYz0iZm90b2t1LmpwZyIgYWx0PSJOdXJ1bCBJZmZhaCI+DQogICAgPC9kaXY+DQogIDwvZGl2Pg0KICA8ZGl2IGNsYXNzPSJsb2dvLWNhcHRpb24iPk5VUlVMIElGRkFIPC9kaXY+DQo8L2Rpdj4NCg0KPGRpdiBzdHlsZT0ibWFyZ2luLXRvcDogMS44cmVtOyB0ZXh0LWFsaWduOiBjZW50ZXI7Ij4NCg0KICA8IS0tIEtPVEFLIDEgLS0+DQogIDxwIHN0eWxlPSINCiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7DQogICAgbWluLXdpZHRoOiAxNzBweDsNCiAgICBwYWRkaW5nOiAwLjdyZW0gMS40cmVtOw0KICAgIGJvcmRlci1yYWRpdXM6IDE2cHg7DQogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEzNWRlZywgI2ZmZjdkYSwgI2ZmZWNjMik7ICAvKiBob25leSBwYXN0ZWwgKi8NCiAgICBib3gtc2hhZG93OiAwIDhweCAxOHB4IHJnYmEoMCwwLDAsMC4xMik7DQogICAgZm9udC1mYW1pbHk6ICdRdWlja3NhbmQnLCBzeXN0ZW0tdWksIC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgJ1NlZ29lIFVJJywgc2Fucy1zZXJpZjsNCiAgICBjb2xvcjogIzI0MzAzZTsNCiAgICBmb250LXNpemU6IDE0cHg7DQogICAgZm9udC13ZWlnaHQ6IDYwMDsNCiAgICBsaW5lLWhlaWdodDogMS40Ow0KICAgIG1hcmdpbjogMCAwLjZyZW0gMC42cmVtIDAuNnJlbTsNCiAgIj4NCiAgICBQcm9ncmFtIFN0dWRpPGJyPlNhaW5zIERhdGENCiAgPC9wPg0KDQogIDwhLS0gS09UQUsgMiAtLT4NCiAgPHAgc3R5bGU9Ig0KICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsNCiAgICBtaW4td2lkdGg6IDE3MHB4Ow0KICAgIHBhZGRpbmc6IDAuN3JlbSAxLjRyZW07DQogICAgYm9yZGVyLXJhZGl1czogMTZweDsNCiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCAjZjVmZmU4LCAjZTlmYmQzKTsgIC8qIG1hdGNoYSBwYXN0ZWwgKi8NCiAgICBib3gtc2hhZG93OiAwIDhweCAxOHB4IHJnYmEoMCwwLDAsMC4xMik7DQogICAgZm9udC1mYW1pbHk6ICdRdWlja3NhbmQnLCBzeXN0ZW0tdWksIC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgJ1NlZ29lIFVJJywgc2Fucy1zZXJpZjsNCiAgICBjb2xvcjogIzI0MzAzZTsNCiAgICBmb250LXNpemU6IDE0cHg7DQogICAgZm9udC13ZWlnaHQ6IDYwMDsNCiAgICBsaW5lLWhlaWdodDogMS40Ow0KICAgIG1hcmdpbjogMCAwLjZyZW0gMC42cmVtIDAuNnJlbTsNCiAgIj4NCiAgICBVbml2ZXJzaXRhczxicj5JTlNUSVRVVCBURUtOT0xPR0kgU0FJTlMgQkFORFVORw0KICA8L3A+DQoNCiAgPCEtLSBLT1RBSyAzIC0tPg0KICA8cCBzdHlsZT0iDQogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOw0KICAgIG1pbi13aWR0aDogMTcwcHg7DQogICAgcGFkZGluZzogMC43cmVtIDEuNHJlbTsNCiAgICBib3JkZXItcmFkaXVzOiAxNnB4Ow0KICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxMzVkZWcsICNmZmU3YzIsICNmZmQ0YTMpOyAgLyogaG9uZXktb3JhbmdlIHBhc3RlbCAqLw0KICAgIGJveC1zaGFkb3c6IDAgOHB4IDE4cHggcmdiYSgwLDAsMCwwLjEyKTsNCiAgICBmb250LWZhbWlseTogJ1F1aWNrc2FuZCcsIHN5c3RlbS11aSwgLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCAnU2Vnb2UgVUknLCBzYW5zLXNlcmlmOw0KICAgIGNvbG9yOiAjMjQzMDNlOw0KICAgIGZvbnQtc2l6ZTogMTRweDsNCiAgICBmb250LXdlaWdodDogNjAwOw0KICAgIGxpbmUtaGVpZ2h0OiAxLjQ7DQogICAgbWFyZ2luOiAwIDAuNnJlbSAwLjZyZW0gMC42cmVtOw0KICAiPg0KICAgIERvc2VuIFBlbmdhbXB1PGJyPkJha3RpIFNpcmVnYXIsIE0gU2MuLCBDU0QNCiAgPC9wPg0KDQo8L2Rpdj4NCg0KDQotLS0NCg0KKipQUk9CQUJJTElUWSBESVNUUklCVVRJT04qKg0KDQpEYWxhbSBrZWhpZHVwYW4gc2VoYXJpLWhhcmksIHNhdHUgcGVyY29iYWFuIHlhbmcgc2FtYSBiaXNhIG1lbWJlcmkgaGFzaWwgYmVyYmVkYTogdGluZ2dpIHRpYXAgb3JhbmcgdGlkYWsgc2FtYSwganVtbGFoIGNoYXQgcGVyIGhhcmkgYmVydWJhaCwgaGFzaWwgbGVtcGFyIGtvaW4gYWNhay4gVW50dWsgbWVyYXBpa2FuIGtldGlkYWtwYXN0aWFuIGl0dSwga2l0YSBwYWthaSB2YXJpYWJlbCBhY2FrIHNlYmFnYWkgd2FraWwgaGFzaWwsIGRhbiBkaXN0cmlidXNpIHBlbHVhbmcgKHByb2JhYmlsaXR5IGRpc3RyaWJ1dGlvbikgdW50dWsgbWVudW5qdWtrYW4gc2ViZXJhcGEgYmVzYXIga2VtdW5na2luYW4gdGlhcCBuaWxhaSBtdW5jdWwuDQoNClNlY2FyYSBnYXJpcyBiZXNhciwgYmFiIGluaSBtZW5jYWt1cDoNCg0KLSAqKlZhcmlhYmVsIGFjYWsgZGlza3JpdCBkYW4ga29udGludSoqLCBkYW4gYmFnYWltYW5hIHBlcmJlZGFhbiB0aXBlIGRhdGEgaW5pIG1lbWVuZ2FydWhpIGNhcmEga2l0YSBtZW1vZGVsa2FuIHBlbHVhbmcuDQoNCi0gKipGdW5nc2kga2VwYWRhdGFuIHBlbHVhbmcgKFBERikgZGFuIGZ1bmdzaSBkaXN0cmlidXNpIGt1bXVsYXRpZiAoQ0RGKSoqIHVudHVrIHZhcmlhYmVsIGtvbnRpbnUsIHRlcm1hc3VrIGNhcmEgbWVuZ2hpdHVuZyBwZWx1YW5nIHNlYmFnYWkgbHVhcyBkaSBiYXdhaCBrdXJ2YS4NCg0KLSAqKkRpc3RyaWJ1c2kgc2FtcGxpbmcgdW50dWsgc3RhdGlzdGlrIHNlcGVydGkgcmF0YS1yYXRhIHNhbXBlbCoqICQoXGJhcntYfSkkIGRhbiBwcm9wb3JzaSBzYW1wZWwgJChcaGF0e3B9KSQsIHlhbmcgbWVuamVsYXNrYW4gbWVuZ2FwYSBuaWxhaSBzdGF0aXN0aWsgYmlzYSBiZXJ1YmFoIGRhcmkgc2FtcGVsIGtlIHNhbXBlbC4NCg0KLSAqKlRlb3JlbWEgTGltaXQgVGVuZ2FoIChDZW50cmFsIExpbWl0IFRoZW9yZW0gLyBDTFQpKiosIHlhbmcgbWVuamVsYXNrYW4ga2VuYXBhLCB1bnR1ayBzYW1wZWwgY3VrdXAgYmVzYXIsIGRpc3RyaWJ1c2kgcmF0YS1yYXRhIGRhbiBwcm9wb3JzaSBzYW1wZWwgY2VuZGVydW5nIG1lbmRla2F0aSBub3JtYWwuDQoNCi0gKipEaXN0cmlidXNpIHByb3BvcnNpIHNhbXBlbCBkYW4gZGlzdHJpYnVzaSBiaW5vbWlhbCoqLCBzZXJ0YSBrYXBhbiBraXRhIG1lbWFrYWkgcGVyaGl0dW5nYW4gZXhhY3QgKGJpbm9taWFsKSBkYW4ga2FwYW4gY3VrdXAgbWVtYWthaSBwZW5kZWthdGFuIG5vcm1hbCAoYXBwcm94aW1hdGUpIGRlbmdhbiBiYW50dWFuIENMVC4NCg0KKipOT1RFIDoqKiBtYWFmIE1yLiBCIHNheWEgdGlkYWsgbWVuZ2lrdXRpIGJhYm55YSBNci4gQiwga2FyZW5hIG1lbnVydXQgc2F5YSwgc2F5YSBsZWJpaCBtdWRhaCBtZW5nZXJ0aSBkZW5nYW4gc2VwZXJ0aSBpbmkuDQoNCi0tLQ0KDQojICoqVkFSSUFCTEUgRElTS1JJVCBEQU4gS09OVElOVSoqDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpsaWJyYXJ5KHZlbWJlZHIpDQoNCmVtYmVkX3lvdXR1YmUoIlp5VXpSVmE2aENNIikgfD4NCiAgdXNlX2FsaWduKCJjZW50ZXIiKQ0KYGBgDQoNCiMjICoqVkFSSUFCTEUgRElTS1JJVCoqDQoNCk5pbGFpbnlhICoqdGVyaGl0dW5nKiogKGNvdW50YWJsZSk6ICQwLDEsMiwzLFxsZG90cyQNCg0KQ29udG9oOiAtIGp1bWxhaCBrZXBhbGEgc2FhdCBsZW1wYXIgNCBrb2luLCAtIGp1bWxhaCBzaXN3YSB5YW5nIGx1bHVzLCAtIGp1bWxhaCBrZWxlcmVuZyBoaWphdSB5YW5nIGRpYW1iaWwuDQoNCkJpYXNhbnlhIGRpZ2FtYmFyIHBha2FpICoqYmFyIGNoYXJ0Kio6IC0gdGlhcCBuaWxhaSBwdW55YSBiYXRhbmcgdGVycGlzYWgsIC0gdGluZ2dpIGJhdGFuZyA9IHBlbHVhbmcgJFAoWCA9IGspJC4NCg0KVW50dWsgdmFyaWFiZWwgZGlza3JpdCwga2l0YSBwdW55YSBmdW5nc2kgcGVsdWFuZzogJFAoWCA9IHgpJC4NCg0KS2V0ZXJhbmdhbjoNCg0KLSAkWCQgOiB2YXJpYWJlbCBhY2FrIGRpc2tyaXQgKG1pc2FsIGp1bWxhaCBrZXBhbGEpLg0KDQotICR4JCA6IHNhdHUgbmlsYWkgdGVydGVudHUgeWFuZyBtdW5na2luIChtaXNhbCAyKS4NCg0KLSAkUChYID0geCkkIDogcGVsdWFuZyBiYWh3YSAkWCQgbWVuZ2FtYmlsIG5pbGFpIHRlcGF0ICR4JC4NCg0KKipGdW5nc2kqKiAkUChYID0geCkkIGluaSBkaXNlYnV0IFBNRiAocHJvYmFiaWxpdHkgbWFzcyBmdW5jdGlvbikuDQoNCkRpIGRpc2tyaXQsIHBlbHVhbmcgZGkgdGl0aWsgJFAoWCA9IHgpJCBiaXNhICQ+IDAkLCBtaXNhbG55YSAkUChYID0gMikgPSAweyx9MyQuDQoNCi0tLQ0KDQojIyAqKlZBUklBQkxFIEtPTlRJTlUqKg0KDQpOaWxhaW55YSAqKnRlcnVrdXIqKiwgYmlzYSBwdW55YSBkZXNpbWFsIHRhbnBhIGJhdGFzLg0KDQpDb250b2g6DQoNCi0gdGluZ2dpIGJhZGFuLCBiZXJhdCBiYWRhbiwNCg0KLSB3YWt0dSwgc3VodSwgdW11ciwga2VjZXBhdGFuLCBqYXJhay4NCg0KTmlsYWkgZGkgZGFsYW0gc2F0dSBpbnRlcnZhbCBpdHUgdGFrIGhpbmdnYSBiYW55YWsgKGFudGFyYSAxIGRhbiAyIHN1ZGFoIGFkYSAxLjEsIDEuMTEsIDEuMTExLCBkc3QpLg0KDQpCaWFzYW55YSBkaWdhbWJhciBwYWthaSAqKmhpc3RvZ3JhbSoqIGF0YXUgKiprdXJ2YSBoYWx1cyoqLCAqKmJ1a2FuIGJhdGFuZyB0ZXJwaXNhaC4qKg0KDQpEaSBzaW5pIHRlcmphZGkgaGFsIHBlbnRpbmc6ICoqS2FyZW5hIHRpdGlrbnlhIHRhayBoaW5nZ2EgYmFueWFrLCBwZWx1YW5nIGRpIHNhdHUgdGl0aWsgcGVyc2lzIGphZGkgMC4qKiAkJA0KUChYID0geCkgPSAwIFx0ZXh0eyB1bnR1ayBzZW11YSB9IHgNCiQkIEtldGVyYW5nYW46DQoNCi0gJFgkIDogdmFyaWFiZWwgYWNhayBrb250aW51IChtaXNhbCB0aW5nZ2kpLg0KDQotICR4JCA6IHNhdHUgbmlsYWkgdGVydGVudHUgKG1pc2FsIDE1MCBjbSkuDQoNCi0gUnVtdXMgaW5pIGJpbGFuZzogcGVsdWFuZyB0ZXBhdCBkaSBzYXR1IHRpdGlrIHVudHVrIHZhcmlhYmVsIGtvbnRpbnUgc2VsYWx1IG5vbCAoJFAoWCA9IHgpID0gMCQpLg0KDQpLYXJlbmEgaXR1LCB1bnR1ayBrb250aW51IGtpdGEgdGlkYWsgbGFnaSBiaWNhcmE6DQoNCi0gIiAkUChYID0gMikkIGJlcmFwYT8iDQoNCnRhcGkga2l0YSBiaWNhcmEgcGVsdWFuZyBkaSBpbnRlcnZhbCwgbWlzYWxueWE6DQoNCi0gJFAoMSBcbGUgWCBcbGUgMikkDQoNCi0gJFAoMC41IDwgWCA8IDAuOCkkLCBkYW4gc2V0ZXJ1c255YS4NCg0KLS0tDQoNCiMjICoqRElTS1JJVCAtIEtPTlRJTlVFIOKGkiBQTUYga2UgUERGKioNCg0KLSAqKkRpc2tyaXQ6KioNCiAgLSAgS2l0YSBwdW55YSBkYWZ0YXIgcGVsdWFuZyB1bnR1ayB0aWFwIG5pbGFpICRccmlnaHRhcnJvdyQgUE1GLg0KICAgIA0KICAtIFRpbmdnaSBiYXRhbmcgZGkgYmFyIGNoYXJ0ID0gcGVsdWFuZyBsYW5nc3VuZyAkUChYID0geCkkLg0KICAgIA0KLSAqKktvbnRpbnU6KioNCiAgLSBUaWRhayBiaXNhICJiYWdpIiBwZWx1YW5nIGtlIHRpYXAgdGl0aWsgKGtlYmFnaWFuIDAgc2VtdWEpDQogIA0KICAtIFRhcGkga2l0YSB0ZXRhcCBidXR1aCBjYXJhIG1lbmd1a3VyICJzZWJlcmFwYSBiZXNhciBwZWx1YW5nIGRpIHNla2l0YXIgc3VhdHUgbmlsYWkiLg0KDQoqKlNvbHVzaW55YToqKiBraXRhIGRlZmluaXNpa2FuIGZ1bmdzaSBrZXBhZGF0YW4gcGVsdWFuZyAoUERGKSAkZih4KSQuDQoNCi0tLQ0KDQoqKlBNRiAoZGlza3JpdCk6KioNCiAgICAkJA0KICAgIFAoWCA9IHgpID0gXHRleHR7KGFuZ2thIHRlcnRlbnR1KX0NCiAgICAkJCANCiAgICANCioqS2V0ZXJhbmdhbjoqKg0KDQotIE1lbWJlcmkgcGVsdWFuZyBsYW5nc3VuZyBwYWRhIG5pbGFpICR4JC4NCg0KLSBNaXNhbG55YSAkUChYID0gMikgPSAweyx9MyQuDQoNCi0tLQ0KDQoqKlBERiAoa29udGludSk6KiogDQokJA0KZih4KSA9IFx0ZXh0eyJrZXBhZGF0YW4gcGVsdWFuZyBkaSBzZWtpdGFyIH0geFx0ZXh0eyAifQ0KJCQgKipLZXRlcmFuZ2FuOioqDQoNCi0gJGYoeCkkIFx0ZXh0YmZ7YnVrYW59IHBlbHVhbmcsIG1lbGFpbmthbiBrZXBhZGF0YW4uDQoNCi0gUGVsdWFuZyB5YW5nIHNlYmVuYXJueWEgZGlkYXBhdCBkYXJpIGx1YXMgZGkgYmF3YWgga3VydmEgJGYoeCkkLg0KDQoqKlJ1bXVzIHBlbHVhbmcgdW50dWsgdmFyaWFiZWwga29udGludToqKiANCiQkDQpQKGEgXGxlIFggXGxlIGIpID0gXGludF9hXmIgZih4KVwsIGR4DQokJCANCioqS2V0ZXJhbmdhbjoqKg0KDQotICRhLCBiJCA6IGJhdGFzIGJhd2FoIGRhbiBiYXRhcyBhdGFzIGludGVydmFsLg0KDQotICRcZGlzcGxheXN0eWxlIFxpbnRfYV5iIGYoeClcLCBkeCQgOiBsdWFzIGRpIGJhd2FoIGt1cnZhICRmKHgpJCBkYXJpICR4ID0gYSQgc2FtcGFpICR4ID0gYiQuDQoNCi0gTmlsYWkgaW50ZWdyYWwgaW5pID0gcGVsdWFuZyBiYWh3YSAkWCQgamF0dWggZGkgYW50YXJhICRhJCBkYW4gJGIkLg0KDQoqKlNlY2FyYSB2aXN1YWw6KiogYmFyIGNoYXJ0IGRpc2tyaXQgJFxyaWdodGFycm93JCBiYXRhbmcgbWFraW4gYmFueWFrIGRhbiBtYWtpbiB0aXBpcyAkXHJpZ2h0YXJyb3ckIGxhbWEtbGFtYSBtZW1iZW50dWsga3VydmEgaGFsdXMgJFxyaWdodGFycm93JCBpdHVsYWggaWRlIFBERi4NCg0KKipKYWRpIFBERiBpdHUgc2VwZXJ0aSAidmVyc2kga29udGludSIgZGFyaSB0YWJlbCBwZWx1YW5nIChQTUYpLioqDQoNCi0tLQ0KDQojICoqUkFORE9NIFZBUklBQkxFIEtPTlRJTlUsIFBERiwgZGFuIENERioqDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpsaWJyYXJ5KHZlbWJlZHIpDQoNCmVtYmVkX3lvdXR1YmUoIlp5VXpSVmE2aENNIikgfD4NCiAgdXNlX2FsaWduKCJjZW50ZXIiKQ0KYGBgDQoNCiMjICoqUkFORE9NIFZBUklBQkxFIEtPTlRJTlUqKg0KDQpSYW5kb20gdmFyaWFibGUga29udGludSBhZGFsYWggcGV1YmFoIGFjYWsgeWFuZyBiaXNhIGFtYmlsIG5pbGFpIGFwYSBwdW4gZGFsYW0gc2VidWFoIGludGVydmFsIGRpIGdhcmlzIGJpbGFuZ2FuIHJlYWwuDQoNCkNvbnRvaDogdGluZ2dpLCB3YWt0dSwgc3VodSwgdW11ciwgdGVrYW5hbiwga2VjZXBhdGFuLg0KDQoqKkNpcmkgcGVudGluZzoqKg0KDQotIE5pbGFpIGFkYSBkaSBpbnRlcnZhbCwgbWlzYWxueWEgJChhLGIpJCBhdGF1ICQoLVxpbmZ0eSwgK1xpbmZ0eSkkLg0KDQotIHVudHVrIHNldGlhcCB0aXRpazogDQokJA0KUChYID0geCkgPSAwDQokJA0KDQotIFBlbHVhbmcgaGFueWEgYmVybWFrbmEgcGFkYSBpbnRlcnZhbDoNCiQkDQpQKGEgXGxlIFggXGxlIGIpID0gXGludF9hXmIgZih4KVwsIGR4DQokJCANCioqS2V0ZXJhbmdhbiBydW11czoqKg0KDQotICRYJCA6IHZhcmlhYmVsIGFjYWsga29udGludS4NCg0KLSAkYSwgYiQgOiBiYXRhcyBpbnRlcnZhbC4NCg0KLSAkZih4KSQgOiBQREYuDQoNCi0gJFxkaXNwbGF5c3R5bGUgXGludF9hXmIgZih4KVwsIGR4JCA6IGx1YXMgZGkgYmF3YWgga3VydmEgJGYoeCkkIOKGkiBpdHUgeWFuZyBqYWRpIHBlbHVhbmcuDQoNCi0tLQ0KDQojIyAqKlBST0FCSUxJVFkgREVOU0lUWSBGVU5DVElPTiAoUERGKSoqDQoNClN1cGF5YSAkZih4KSQgc2FoIHNlYmFnYWkgUERGLCBkdWEgc3lhcmF0Og0KDQogKipUaWRhayBuZWdhdGlmOioqIA0KJCQNCmYoeCkgXGdlIDAgXHF1YWQgXGZvcmFsbCB4DQokJCANCg0KKipLZXRlcmFuZ2FuOioqDQoNCi0gTmlsYWkgJGYoeCkkIHRpZGFrIGJvbGVoIG5lZ2F0aWYgdW50dWsgbmlsYWkgJHgkIHlhbmcgbXVuZ2tpbi4NCg0KLSAgIFNlY2FyYSBnYW1iYXI6IGt1cnZhIFBERiB0aWRhayBwZXJuYWggZGkgYmF3YWggc3VtYnUgeC4NCg0KLS0tDQoNCioqTHVhcyB0b3RhbCBkaSBiYXdhaCBrdXJ2YSA9IDE6KiogDQokJA0KIFxpbnRfey1caW5mdHl9XnsrXGluZnR5fSBmKHgpXCxkeCA9IDENCiQkIA0KKipLZXRlcmFuZ2FuOioqDQoNCi0gSW50ZWdyYWwgZGFyaSAkLVxpbmZ0eSQgc2FtcGFpICQrXGluZnR5JDogbWVuanVtbGFoa2FuIHNlbXVhICJsdWFzIHBlbHVhbmciIGRpIHNlbHVydWggZ2FyaXMgYmlsYW5nYW4uDQoNCi0gSGFydXMgc2FtYSBkZW5nYW4gMTogdG90YWwgcGVsdWFuZyB1bnR1ayBzZW11YSBuaWxhaSAkWCQgPSAxIChwYXN0aSB0ZXJqYWRpIGRpIHN1YXR1IHRlbXBhdCkuDQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQoqKkludGVycHJldGFzaToqKg0KDQotICRmKHgpJCBtZW1iZXJpIHRhaHUgc2ViZXJhcGEgcGFkYXQgcGVsdWFuZyBkaSBzZWtpdGFyICR4JC4NCg0KLSBCdWthbiBsYW5nc3VuZyAkUChYID0geCkkLg0KDQotIFBlbHVhbmcgc2ViZW5hcm55YTogDQokJA0KUChhIFxsZSBYIFxsZSBiKSA9IFxpbnRfYV5iIGYoeClcLCBkeA0KJCQgDQoNCioqS2V0ZXJhbmdhbjoqKg0KDQotIFVudHVrIHZhcmlhYmVsIGtvbnRpbnUsIHBlbHVhbmcgaW50ZXJ2YWwgZGloaXR1bmcgc2ViYWdhaSBsdWFzIGRpIGJhd2FoIGt1cnZhIFBERiBhbnRhcmEgJGEkIGRhbiAkYiQuDQoNCi0gSW5pIHlhbmcgbWVuZ2dhbnRpa2FuICJqdW1sYWhrYW4gJFAoWCA9IHgpJCIgZGkga2FzdXMgZGlza3JpdC4NCg0KLS0tDQoNCioqQ29udG9oIFBERjoqKiANCiQkDQpmKHgpID0gM3heMiBccXVhZCBcdGV4dHt1bnR1ayB9IDAgXGxlIHggXGxlIDEuDQokJCANCioqS2V0ZXJhbmdhbjoqKg0KDQotIEJlbnR1ayBrdXJ2YTogJDN4XjIkIOKGkiBtYWtpbiBrZSBrYW5hbiwga2VwYWRhdGFuIG1ha2luIGJlc2FyLg0KDQotIFBERiBpbmkgaGFueWEgYmVybGFrdSBkaSBpbnRlcnZhbCAkMCBcbGUgeCBcbGUgMSQuIERpIGx1YXIgaXR1LCBkaWFuZ2dhcCAkZih4KSA9IDAkLg0KDQoqKkNlayB2YWxpZGl0YXM6KioNCiQkDQpcaW50XzBeMSAzeF4yXCxkeCA9IFxsZWZ0W3heM1xyaWdodF1fMF4xID0gMQ0KJCQgDQoqKktldGVyYW5nYW46KioNCg0KLSBJbnRlZ3JhbCAkM3heMiQgZGFyaSAwIGtlIDEgbWVtYmVyaWthbiBsdWFzIHRvdGFsID0gMS4NCg0KLSBBcnRpbnlhLCBmdW5nc2kgaW5pIG1lbWVudWhpIHN5YXJhdCBQREYgKHRvdGFsIHBlbHVhbmcgPSAxKS4NCg0KLS0tDQoNCiMjICoqUFJPQkFCSUxJVEFTIGRpIElOVEVSVkFMKioNCg0KRGVuZ2FuIGNvbnRvaCAkZih4KSA9IDN4XjIkIGRpICRbMCwxXSQ6DQoNCiQkDQpQKGEgXGxlIFggXGxlIGIpID0gXGludF9hXmIgM3heMlwsIGR4DQokJCANCg0KKipLZXRlcmFuZ2FuOioqDQoNCi0gICBLaXRhIGN1bWEgYm9sZWggYW1iaWwgJGEsIGIkIGRpIGFudGFyYSAwIGRhbiAxLg0KDQotICAgSW50ZWdyYWwgaXR1IG1lbWJlcmkgbHVhcyBkaSBiYXdhaCBrdXJ2YSAkM3heMiQgZGFyaSAkeCA9IGEkIGtlICR4ID0gYiQg4oaSIGl0dWxhaCBwZWx1YW5nbnlhLg0KDQokJA0KXGludF8wXjEgM3heMlwsZHgNCiQkDQoNCmFkYWxhaCBsdWFzIGRpIGJhd2FoIGt1cnZhICQzeF4yJCBkYXJpICR4ID0gMCQgc2FtcGFpICR4ID0gMSQuDQoNCkhhc2lsbnlhICQxJCAkXHJpZ2h0YXJyb3ckIGJlcmFydGkgZnVuZ3NpIGluaSBQREYgeWFuZyBzYWgsIGthcmVuYSB0b3RhbCBwZWx1YW5nID0gMS4NCg0KQ29udG9oIHNwZXNpZmlrOiANCiQkDQpQKDAuNSBcbGUgWCBcbGUgMSkNCj0gXGludF97MC41fV4xIDN4XjJcLCBkeA0KPSBcbGVmdFt4XjNccmlnaHRdX3swLjV9XjENCj0gMSAtIDAuMTI1DQo9IDAuODc1DQokJCANCg0KKipLZXRlcmFuZ2FuOioqDQoNCi0gS2l0YSBjdW1hIGJvbGVoIGFtYmlsICRhLCBiJCBkaSBhbnRhcmEgMCBkYW4gMS4NCg0KLSBJbnRlZ3JhbCBpdHUgbWVtYmVyaSBsdWFzIGRpIGJhd2FoIGt1cnZhICQzeF4yJCBkYXJpICR4ID0gYSQga2UgJHggPSBiJCAkXHJpZ2h0YXJyb3ckIGl0dWxhaCBwZWx1YW5nbnlhLg0KDQotLS0NCg0KIyMgKipDVU1VTEFUSVZFIERJU1RSSUJVVElPTiBGVU5DVElPTiAoQ0RGKSoqDQoNCioqRGVmaW5pc2kgQ0RGOioqDQokJA0KRih4KSA9IFAoWCBcbGUgeCkNCiQkDQoNCktldGVyYW5nYW46DQoNCi0gJEYoeCkkIDogZnVuZ3NpIGRpc3RyaWJ1c2kga3VtdWxhdGlmIChDREYpLg0KDQotIE1lbnlhdGFrYW4gcGVsdWFuZyB0b3RhbCBiYWh3YSAkWCQga3VyYW5nIGRhcmkgYXRhdSBzYW1hIGRlbmdhbiAkeCQuDQoNCi0tLQ0KDQoqKkNERiBzZWJhZ2FpIGludGVncmFsIGRhcmkgUERGOioqIA0KJCQNCkYoeCkgPSBcaW50X3stXGluZnR5fV57eH0gZih0KVwsIGR0DQokJA0KDQoqKktldGVyYW5nYW46KioNCg0KLSAkZih0KSQgOiBQREYuDQoNCi0gSW50ZWdyYWwgZGFyaSAkLVxpbmZ0eSQgc2FtcGFpICR4JCBtZW5qdW1sYWhrYW4gc2VtdWEgcGVsdWFuZyBkYXJpIOKAnHVqdW5nIGtpcmnigJ0gc2FtcGFpIHRpdGlrICR4JC4NCg0KLSBIYXNpbG55YSA9ICRQKFggXGxlIHgpJC4NCg0KVW50dWsgY29udG9oICRmKHQpID0gM3ReMiQgZGkgJFswLDFdJCwga2FyZW5hIGRpIGJhd2FoIDAgcGVsdWFuZ255YSAwLCBraXRhIGJpc2EgdHVsaXM6IA0KJCQNCkYoeCkgPSBcaW50X3swfV57eH0gM3ReMlwsIGR0ID0geF4zDQokJA0KDQoqKktldGVyYW5nYW46KioNCg0KLSBSdW11cyBDREYtbnlhOiAkRih4KSA9IHheMyQgdW50dWsgJDAgXGxlIHggXGxlIDEkLg0KDQotIENvbnRvaDogJEYoMHssfTUpID0gKDB7LH01KV4zID0gMHssfTEyNSQg4oaSIHBlbHVhbmcgJFggXGxlIDB7LH01JCA9IDEyLDUlLg0KDQotLS0NCg0KKipIdWJ1bmdhbiBQREbigJNDREY6KiogDQokJA0KZih4KSA9IEYnKHgpDQokJA0KDQoqKktldGVyYW5nYW46KioNCg0KLSAkRicoeCkkIDogdHVydW5hbiBDREYgdGVyaGFkYXAgJHgkLg0KDQotIEthbGF1IGtpdGEgcHVueWEgQ0RGLCBtZW51cnVua2FubnlhIGFrYW4gbWVuZ2hhc2lsa2FuIFBERi4NCg0KKipTZWJhbGlrbnlhOioqIA0KJCQNCkYoeCkgPSBcaW50IGYoeClcLCBkeCBccXVhZCBcdGV4dHsoZGVuZ2FuIGJhdGFzIHlhbmcgc2VzdWFpKX0NCiQkDQoNCioqS2V0ZXJhbmdhbjoqKg0KDQotIEthbGF1IGtpdGEgcHVueWEgUERGLCBtZW5naW50ZWdyYWxrYW5ueWEgKGRlbmdhbiBiYXRhcykgYWthbiBtZW1iZXJpIENERi4NCg0KKipDb250b2g6KioNCg0KSmlrYSAkRih4KSA9IHheMyQsIG1ha2EgJCRGJyh4KSA9IDN4XjIgPSBmKHgpLiQkDQoNCi0tLQ0KDQojICoqUE9QVUxBU0ksIFNBTVBMRSBEQU4gU0FNUExJTkcgRElTVFJJQlVUSU9OKioNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmxpYnJhcnkodmVtYmVkcikNCg0KZW1iZWRfeW91dHViZSgiN1M3ajc1ZDNHTTQiKSB8Pg0KICB1c2VfYWxpZ24oImNlbnRlciIpDQpgYGANCg0KLSBQb3B1bGFzaTogc2VtdWEgaW5kaXZpZHUgeWFuZyBraXRhIG1pbmF0aS4NCiAtIE1lYW4gcG9wdWxhc2k6ICRcbXUkDQoNCiAtIFNpbXBhbmdhbiBiYWt1IHBvcHVsYXNpOiAkXHNpZ21hJA0KDQogLSBQcm9wb3JzaSBwb3B1bGFzaTogJHAkDQogDQotIFNhbXBlbDogc2ViYWdpYW4ga2VjaWwgZGFyaSBwb3B1bGFzaSAodWt1cmFuICRuJCkuDQogIC0gTWVhbiBzYW1wZWw6ICRcYmFye1h9JA0KDQogIC0gUHJvcG9yc2kgc2FtcGVsOiAkXGhhdHtwfSQNCg0KKipTYW1wbGluZyBkaXN0cmlidXRpb24qKg0KDQotIEtldGlrYSBraXRhIGFtYmlsIGJhbnlhayBzYW1wZWwgdWt1cmFuICRuJC4NCg0KLSBUaWFwIHNhbXBlbCBraXRhIGhpdHVuZyBzdGF0aXN0aWtueWEgKG1pc2FsICRcYmFye1h9JCBhdGF1ICRcaGF0e3B9JCkuDQoNCi0gS3VtcHVsYW4gc2VtdWEgbmlsYWkgJFxiYXJ7WH0kIGluaSBtZW1iZW50dWs6DQokJFx0ZXh0e1NhbXBsaW5nIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc2FtcGxlIG1lYW59JCQNCg0KS3VtcHVsYW4gc2VtdWEgJFxoYXR7cH0kIG1lbWJlbnR1azogDQokJA0KXHRleHR7U2FtcGxpbmcgZGlzdHJpYnV0aW9uIG9mIHRoZSBzYW1wbGUgcHJvcG9ydGlvbn0NCiQkDQoNCkluaSBhZGFsYWggZGlzdHJpYnVzaSBkYXJpIHJpbmdrYXNhbiBkYXRhIChzdGF0aXN0aWspIGRhcmkgYmFueWFrIHNhbXBlbC4gQnVrYW4gZGF0YSBtZW50YWguDQoNCi0tLQ0KDQojICoqU0FNUExJTkcgRElTVFJJQlVUSU9OIG9mIHRoZSBTQU1QTEUgTUVBTiAmIENMVCoqDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpsaWJyYXJ5KHZlbWJlZHIpDQoNCmVtYmVkX3lvdXR1YmUoIml2ZDh3RUhuTUNnIikgfD4NCiAgdXNlX2FsaWduKCJjZW50ZXIiKQ0KYGBgDQoNCioqTWlzYWw6KioNCg0KLSBQb3B1bGFzaSBwdW55YSBtZWFuICRcbXUkIGRhbiBzaW1wYW5nYW4gYmFrdSAkXHNpZ21hJC4NCg0KLSBLaXRhIGFtYmlsIHNhbXBlbCB1a3VyYW4gJG4kLg0KDQotIFN0YXRpc3RpazogJFxiYXJ7WH0kID0gbWVhbiBzYW1wZWwuDQoNCioqTWVhbiBkaXN0cmlidXNpIHNhbXBsaW5nOioqIA0KJCQNClxtdV97XGJhcntYfX0gPSBcbXUNCiQkDQoNCioqS2V0ZXJhbmdhbjoqKg0KDQotICRcbXVfe1xiYXJ7WH19JCA6IG1lYW4gZGFyaSBkaXN0cmlidXNpIHNhbXBsaW5nIG1lYW4gc2FtcGVsLg0KDQotICRcbXUkIDogbWVhbiBwb3B1bGFzaS4NCg0KRGFsYW0gamFuZ2thIHBhbmphbmcsIHJhdGEtcmF0YSBkYXJpIHNlbXVhICRcYmFye1h9JCAoZGFyaSBiYW55YWsgc2FtcGVsKSBha2FuIG1lbmRla2F0aSBtZWFuIHBvcHVsYXNpICRcbXUkLg0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KKipTdGFuZGFyZCBlcnJvciAoc2ltcGFuZ2FuIGJha3UgZGlzdHJpYnVzaSBzYW1wbGluZyk6KiogDQokJA0KXHNpZ21hX3tcYmFye1h9fSA9IFxmcmFje1xzaWdtYX17XHNxcnR7bn19DQokJA0KDQoqKktldGVyYW5nYW46KioNCg0KLSAkXHNpZ21hX3tcYmFye1h9fSQgOiBzaW1wYW5nYW4gYmFrdSAoc3RhbmRhcmQgZXJyb3IpIGRhcmkgbWVhbiBzYW1wZWwgJFxiYXJ7WH0kLg0KDQotICRcc2lnbWEkIDogc2ltcGFuZ2FuIGJha3UgcG9wdWxhc2kuDQoNCi0gJG4kIDogdWt1cmFuIHNhbXBlbC4NCg0KLSAkXHNxcnR7bn0kIDogYWthciBkYXJpIHVrdXJhbiBzYW1wZWwuDQoNClNlbWFraW4gYmVzYXIgJG4kLCAkXHNpZ21hX3tcYmFye1h9fSQgbWFraW4ga2VjaWwg4oaSIG1lYW4gc2FtcGVsIGFudGFyIHNhbXBlbCBtYWtpbiB0aWRhayDigJxsb25jYXQtbG9uY2F04oCdLg0KDQotLS0NCg0KKipDZW50cmFsIExpbWl0IFRoZW9yZW0gKENMVCkgdW50dWsgbWVhbjoqKiANCiQkDQpcYmFye1h9IFxhcHByb3ggTlxsZWZ0KFxtdSwgXGZyYWN7XHNpZ21hfXtcc3FydHtufX1ccmlnaHQpDQokJA0KDQoqKktldGVyYW5nYW46KioNCg0KLSAkXGJhcntYfSQgOiBtZWFuIHNhbXBlbC4NCg0KLSAkXGFwcHJveCBOKFxtdSwgXHNpZ21hIC8gXHNxcnR7bn0pJCA6IGtpcmEta2lyYSBiZXJkaXN0cmlidXNpIG5vcm1hbCBkZW5nYW4gbWVhbiAkXG11JCBkYW4gc2QgJFxkZnJhY3tcc2lnbWF9e1xzcXJ0e259fSQuDQoNCkNMVDogdW50dWsgJG4kIGN1a3VwIGJlc2FyLCBiZW50dWsgZGlzdHJpYnVzaSAkXGJhcntYfSQgYWthbiBtaXJpcCBrdXJ2YSBub3JtYWwsIG1lc2tpcHVuIGRpc3RyaWJ1c2kgZGF0YSBhc2xpbnlhIHRpZGFrIG5vcm1hbC4NCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCioqWi1zY29yZSB1bnR1ayBtZWFuOioqIA0KJCQNClogPSBcZnJhY3tcYmFye1h9IC0gXG11fXtcc2lnbWEgLyBcc3FydHtufX0NCiQkDQoNCioqS2V0ZXJhbmdhbjoqKg0KDQotICRaJCA6IHNrb3IgYmFrdSBkYXJpIG1lYW4gc2FtcGVsLg0KDQotICRcYmFye1h9JCA6IG1lYW4gc2FtcGVsIHlhbmcgZGlhbWF0aS4NCg0KLSAkXG11JCA6IG1lYW4gcG9wdWxhc2kuDQoNCi0gJFxzaWdtYSAvIFxzcXJ0e259JCA6IHN0YW5kYXJkIGVycm9yIG1lYW4uDQoNCkRpcGFrYWkgdW50dWsgbWVuZ3ViYWggJFxiYXJ7WH0kIGtlIHNrYWxhIHN0YW5kYXIsIGFnYXIgYmlzYSBwYWthaSB0YWJlbCBaIChub3JtYWwgYmFrdSkuDQoNCi0tLQ0KDQojICoqU0FNUExJTkcgRElTVFJJQlVUSU9OIG9mIHRoZSBTQU1QTEUgUFJPUE9SVElPTiAmIEJJTk9NSUFMKioNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmxpYnJhcnkodmVtYmVkcikNCg0KZW1iZWRfeW91dHViZSgiYzBtRkVMX1NXekUiKSB8Pg0KICB1c2VfYWxpZ24oImNlbnRlciIpDQpgYGANCg0KKipVbnR1ayBkYXRhIDAvMSAoc3Vrc2VzL2dhZ2FsKToqKg0KDQotICoqUG9wdWxhc2k6KioNCiAgLSBwcm9wb3JzaSBzdWtzZXMgPSAkcCQuDQoNCi0gKipTYW1wZWw6KioNCiAgLSBqdW1sYWggc3Vrc2VzID0gJFgkLA0KDQogIC0gcHJvcG9yc2kgc2FtcGVsOiAkJFxoYXR7cH0gPSBcZnJhY3tYfXtufSQkDQoNCioqS2V0ZXJhbmdhbjoqKg0KDQotICRcaGF0e3B9JCA6IHByb3BvcnNpIHNhbXBlbCAobWlzYWxueWEgMHssfTM3KS4NCg0KLSAkWCQgOiBqdW1sYWggc3Vrc2VzIGRpIHNhbXBlbCAobWlzYWwgMzcgb3JhbmcpLg0KDQotICRuJCA6IHVrdXJhbiBzYW1wZWwgKG1pc2FsIDEwMCBvcmFuZykuDQoNCi0tLQ0KDQoqKk1lYW4gZGlzdHJpYnVzaSBzYW1wbGluZyBwcm9wb3JzaToqKiANCiQkDQpcbXVfe1xoYXR7cH19ID0gcA0KJCQNCg0KKipLZXRlcmFuZ2FuOioqDQoNCi0gJFxtdV97XGhhdHtwfX0kIDogbWVhbiBkYXJpIGRpc3RyaWJ1c2kgc2FtcGxpbmcgcHJvcG9yc2kgc2FtcGVsLg0KDQotICRwJCA6IHByb3BvcnNpIGFzbGkgZGkgcG9wdWxhc2kuDQoNClJhdGEtcmF0YSBzZW11YSAkXGhhdHtwfSQgKGthbGF1IGFtYmlsIHNhbXBlbCBiZXJrYWxpLWthbGkpIGFrYW4gbWVuZGVrYXRpIHByb3BvcnNpIHBvcHVsYXNpICRwJC4NCg0KLS0tDQoNCioqU3RhbmRhcmQgZXJyb3IgcHJvcG9yc2k6KiogDQokJA0KXHNpZ21hX3tcaGF0e3B9fSA9IFxzcXJ0e1xmcmFje3AoMS1wKX17bn19DQokJA0KDQoqKktldGVyYW5nYW46KioNCg0KLSAkXHNpZ21hX3tcaGF0e3B9fSQgOiBzdGFuZGFyZCBlcnJvciBkYXJpICRcaGF0e3B9JC4NCg0KLSAkcCQgOiBwcm9wb3JzaSBzdWtzZXMgZGkgcG9wdWxhc2kuDQoNCi0gJDEgLSBwJCA6IHByb3BvcnNpIGdhZ2FsIGRpIHBvcHVsYXNpLg0KDQotICRuJCA6IHVrdXJhbiBzYW1wZWwuDQoNClNlbWFraW4gYmVzYXIgJG4kLCBzdGFuZGFyZCBlcnJvciBtYWtpbiBrZWNpbCDihpIgJFxoYXR7cH0kIGFudGFyIHNhbXBlbCBtYWtpbiBzdGFiaWwuDQoNCi0tLQ0KDQoqKlN5YXJhdCBDTFQgdW50dWsgcHJvcG9yc2k6KiogDQokJA0KbnAgXGdlIDEwIFxxdWFkIFx0ZXh0e2Rhbn0gXHF1YWQgbigxLXApIFxnZSAxMA0KJCQNCg0KKipLZXRlcmFuZ2FuOioqDQoNCi0gJG5wJCA6IGJhbnlha255YSBzdWtzZXMgeWFuZyBkaWhhcmFwa2FuIGRpIHNhdHUgc2FtcGVsLg0KDQotICRuKDEtcCkkIDogYmFueWFrbnlhIGdhZ2FsIHlhbmcgZGloYXJhcGthbiBkaSBzYXR1IHNhbXBlbC4NCg0KLSBLYWxhdSBkdWEtZHVhbnlhICRcZ2UgMTAkIOKGkiBkaXN0cmlidXNpICRcaGF0e3B9JCBjdWt1cCDigJxoYWx1c+KAnSB1bnR1ayBkaWRla2F0aSBub3JtYWwuDQoNCioqSmlrYSBzeWFyYXQgdGVycGVudWhpOioqDQokJA0KXGhhdHtwfSBcYXBwcm94IE5cbGVmdChwLFwgXHNxcnR7XGZyYWN7cCgxLXApfXtufX1ccmlnaHQpDQokJA0KDQotLS0NCg0KKipaLXNjb3JlIHVudHVrIHByb3BvcnNpOioqIA0KJCQNClogPSBcZnJhY3tcaGF0e3B9IC0gcH17XHNxcnR7XGZyYWN7cCgxLXApfXtufX19DQokJA0KDQoqKktldGVyYW5nYW46KioNCg0KLSAkXGhhdHtwfSQgOiBwcm9wb3JzaSBzYW1wZWwgeWFuZyBkaWFtYXRpLg0KDQotICRwJCA6IHByb3BvcnNpIHBvcHVsYXNpLg0KDQotICRcc3FydHtcZGZyYWN7cCgxLXApfXtufX0kIDogc3RhbmRhcmQgZXJyb3IgcHJvcG9yc2kuDQoNCi0gJFokIDogc2tvciBiYWt1IHByb3BvcnNpLg0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KKipIdWJ1bmdhbiBkZW5nYW4gYmlub21pYWw6KioNCg0KJCQNClggXHNpbSBcdGV4dHtCaW5vbWlhbH0obiwgcCkNCiQkDQoNCiQkDQpQKFggPSBrKSA9IFxiaW5vbXtufXtrfSBwXntrfSAoMSAtIHApXntuLWt9DQokJA0KDQoqKktldGVyYW5nYW46KioNCg0KLSAkWCQgOiBqdW1sYWggc3Vrc2VzIGRhbGFtICRuJCBwZXJjb2JhYW4uDQoNCi0gJFx0ZXh0e0Jpbm9taWFsfShuLCBwKSQgOiBkaXN0cmlidXNpIGJpbm9taWFsIGRlbmdhbiBwYXJhbWV0ZXIgJG4kIGRhbiAkcCQuDQoNCi0gJFAoWCA9IGspJCA6IHBlbHVhbmcgdGVwYXQgJGskIHN1a3Nlcy4NCg0KLSAkXGJpbm9te259e2t9JCA6IGJhbnlha255YSBjYXJhIG1lbWlsaWggJGskIHN1a3NlcyBkYXJpICRuJCBwZXJjb2JhYW4uDQoNCkthcmVuYSAkXGhhdHtwfSA9IFxkZnJhY3tYfXtufSQsIHNpZmF0ICRcaGF0e3B9JCB0dXJ1biBkYXJpIHNpZmF0IGJpbm9taWFsIGluaS4NCg0KVW50dWsgJG4kIGtlY2lsIOKGkiBwYWthaSBiaW5vbWlhbCAoZXhhY3QpLg0KDQpVbnR1ayAkbiQgYmVzYXIg4oaSIGJpYXNhbnlhIHBha2FpIHBlbmRla2F0YW4gbm9ybWFsIChDTFQpIGthcmVuYSBsZWJpaCBwcmFrdGlzLg0KDQotLS0NCg0KIyAqKlJBTkdLVU1BTioqDQoNCjEuICoqRGlza3JpdCoqICRccmlnaHRhcnJvdyQgcGFrYWkgUE1GIGRhbiAicGVsdWFuZyBkaSB0aXRpayI6ICRQKFggPSB4KSQuDQoNCjIuICoqS29udGludSoqICRccmlnaHRhcnJvdyQgcGFrYWkgUERGIGRhbiAicGVsdWFuZyBkaSBpbnRlcnZhbCI6ICQkDQogICAgUChhIFxsZSBYIFxsZSBiKSA9IFxpbnRfYV5iIGYoeClcLGR4Lg0KICAgICQkDQoNCjMuICoqRGFyaSBQREYsIGtpdGEgYmlzYSBiaWtpbiBDREYqKjogJCQNCiAgICBGKHgpID0gUChYIFxsZSB4KS4NCiAgICAkJA0KDQo0LiAqKlBvcHVsYXNpIHZzIHNhbXBlbCoqICRccmlnaHRhcnJvdyQga2l0YSBwYWthaSBzdGF0aXN0aWsgKCRcYmFyIFgsIFxoYXQgcCQpIHVudHVrIG1lbmViYWsgcGFyYW1ldGVyICgkXG11LCBwJCkuDQoNCjUuICoqU2FtcGxpbmcgZGlzdHJpYnV0aW9uKiogbWVuamVsYXNrYW4gYmFnYWltYW5hICRcYmFyIFgkIGRhbiAkXGhhdCBwJCBiZXJ1YmFoLXViYWggZGFyaSBzYW1wZWwga2Ugc2FtcGVsLg0KDQo2LiAqKkNMVCoqOg0KDQotICAgdW50dWsgJG4kIGN1a3VwIGJlc2FyLCAkXGJhciBYJCBkYW4gJFxoYXQgcCQga2lyYS1raXJhIGJlcmRpc3RyaWJ1c2kgbm9ybWFsDQoNCi0gZGVuZ2FuIHN0YW5kYXJkIGVycm9yIHlhbmcgYmVyZ2FudHVuZyBwYWRhICRcc2lnbWEkIGF0YXUgJHAkIGRhbiAkbiQ6ICQkDQogICAgXGJhciBYIFxhcHByb3ggTlwhXGxlZnQoXG11LCBcZnJhY3tcc2lnbWFeMn17bn1ccmlnaHQpLCBccXF1YWQNCiAgICBcaGF0IHAgXGFwcHJveCBOXCFcbGVmdChwLCBcZnJhY3twKDEtcCl9e259XHJpZ2h0KS4NCiAgICAkJA0KDQo3LiAqKkJpbm9taWFsKiogYWRhbGFoIGNhcmEgXHRleHRpdHtleGFjdH0gdW50dWsganVtbGFoIHN1a3NlcywgdGFwaSB1bnR1ayAkbiQgYmVzYXIga2l0YSBzZXJpbmcgcGFrYWkgbm9ybWFsIGFwcHJveGltYXRpb24gKHBha2FpICRaJCkga2FyZW5hIGxlYmloIHNpbXBsZS4NCg0KLS0tDQoNCiMgKipSRUZFUkVOU0kqKg0KDQotICoqU2lyZWdhciwgQi4gKHQudC4pLioqIEludHJvZHVjdGlvbiB0byBTdGF0aXN0aWNzOiBBIERhdGEgU2NpZW5jZSBQZXJzcGVjdGl2ZSB3aXRoIFIuIEJvb2tkb3duLiBCYWdpYW4gdGVudGFuZyBwcm9iYWJpbGl0eSBkaXN0cmlidXRpb25zLCByYW5kb20gdmFyaWFibGVzIGtvbnRpbnUsIGRhbiBzYW1wbGluZyBkaXN0cmlidXRpb25zLiBEaWFrc2VzIGRhcmk6IDxodHRwczovL2Jvb2tkb3duLm9yZy9kc2NpZW5jZWxhYnMvaW50cm9fc3RhdGlzdGljcy8+DQoNCi0gKipPcGVuU3RheC4gKDIwMjMpLioqIEludHJvZHVjdG9yeSBTdGF0aXN0aWNzICgybmQgZWQuKS4gT3BlblN0YXguIEJhYiBkaXN0cmlidXNpIHBldWJhaCBhY2FrLCBDZW50cmFsIExpbWl0IFRoZW9yZW0sIGRhbiBzYW1wbGluZyBkaXN0cmlidXRpb24gKHRlcnV0YW1hIENoYXB0ZXIgNykuDQoNCi0gKipEaWV6LCBELiBNLiwgw4dldGlua2F5YS1SdW5kZWwsIE0uLCAmIEJhcnIsIEMuIEQuICgyMDE5KS4qKiBPcGVuSW50cm8gU3RhdGlzdGljcyAoNHRoIGVkLikuIE9wZW5JbnRyby4gQmFiIGRpc3RyaWJ1dGlvbnMgb2YgcmFuZG9tIHZhcmlhYmxlcyBkYW4gZm91bmRhdGlvbnMgZm9yIGluZmVyZW5jZSAoc2FtcGxpbmcgZGlzdHJpYnV0aW9uLCBDTFQsIHNhbXBsZSBtZWFuICYgc2FtcGxlIHByb3BvcnRpb24pLg0KDQotICoqU2hhZmVyLCBELiwgJiBaaGFuZywgSi4gKHQudC4pLioqIEludHJvZHVjdG9yeSBTdGF0aXN0aWNzLiBMaWJyZVRleHRzLiBCYWdpYW4gY29udGludW91cyByYW5kb20gdmFyaWFibGVzLCBwcm9iYWJpbGl0eSBkZW5zaXR5IGZ1bmN0aW9uIChQREYpLCBjdW11bGF0aXZlIGRpc3RyaWJ1dGlvbiBmdW5jdGlvbiAoQ0RGKSwgZGFuIHBlbmdhbnRhciBzYW1wbGluZyBkaXN0cmlidXRpb25zLg0KDQotICoqSG9nZywgUi4gVi4sIFRhbmlzLCBFLiBBLiwgJiBaaW1tZXJtYW4sIEQuIEwuICgyMDE5KS4qKiBQcm9iYWJpbGl0eSBhbmQgU3RhdGlzdGljYWwgSW5mZXJlbmNlICgxMHRoIGVkLikuIFBlYXJzb24uIFJlZmVyZW5zaSB0ZW9yaSB1bnR1ayBkaXNjcmV0ZSB2cyBjb250aW51b3VzIHJhbmRvbSB2YXJpYWJsZXMsIFBERi9DREYsIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiBvZiAkXGJhciBYJCwgc2FtcGxlIHByb3BvcnRpb24sIGRhbiBDTFQuDQoNCi0gKipLaGFuIEFjYWRlbXkuICh0LnQuKS4qKiBTYW1wbGluZyBkaXN0cmlidXRpb25zICYgQ2VudHJhbCBsaW1pdCB0aGVvcmVtLiBVbml0IG9ubGluZSB5YW5nIG1lbmplbGFza2FuIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc2FtcGxlIG1lYW4gZGFuIHNhbXBsZSBwcm9wb3J0aW9uLCBzeWFyYXQgJG5wIFxnZSAxMCQsIGRhbiBwZW5lcmFwYW4gQ0xUIHNlY2FyYSBpbnR1aXRpZi4NCg0KRGlub3YsIEkuIEQuLCBDaHJpc3RvdSwgTi4sICYgU2FuY2hleiwgSi4gKDIwMDgpLiBDZW50cmFsIExpbWl0IFRoZW9yZW06IE5ldyBTT0NSIEFwcGxldCBhbmQgRGVtb25zdHJhdGlvbiBBY3Rpdml0eS4gSm91cm5hbCBvZiBTdGF0aXN0aWNzIEVkdWNhdGlvbi4gQXJ0aWtlbCBqdXJuYWwgeWFuZyBtZW1iYWhhcyBzaW11bGFzaSBDTFQgZGFuIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbnMgdW50dWsgbWVtYmFudHUgcGVtYWhhbWFuIHZpc3VhbC4NCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiMjICoqUmVmZXJlbnNpIFZpZGVvIChZb3VUdWJlKSoqDQoNCi0gU2ltcGxlIExlYXJuaW5nIFByby4gKHQudC4pLiBTZXJpIHZpZGVvIFByb2JhYmlsaXR5IERpc3RyaWJ1dGlvbnMgJiBTYW1wbGluZyBEaXN0cmlidXRpb25zICg3LjHigJM3LjUpIFtWaWRlb10uIFlvdVR1YmUuDQogICAtIEludHJvZHVjdGlvbiB0byB0aGUgUHJvYmFiaWxpdHkgb2YgQ29udGludW91cyBWYXJpYWJsZXMgKDcuMSkgPGh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9WnlVelJWYTZoQ00+DQoNCiAgIC0gU2FtcGxpbmcgRGlzdHJpYnV0aW9ucyAoNy4yKSA8aHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj03UzdqNzVkM0dNND4NCg0KICAgLSBUaGUgQ2VudHJhbCBMaW1pdCBUaGVvcmVtICg3LjMpIDxodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PWl2ZDh3RUhuTUNnPg0KDQogICAtIFNhbXBsaW5nIERpc3RyaWJ1dGlvbiBvZiB0aGUgU2FtcGxlIFByb3BvcnRpb24gKDcuNCkgPGh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9cTJlNG1LMEZUYnc+DQoNCiAgIC0gUmV2aWV3OiBTYW1wbGluZyBEaXN0cmlidXRpb24gb2YgdGhlIFNhbXBsZSBQcm9wb3J0aW9uLCBCaW5vbWlhbCBEaXN0cmlidXRpb24sIFByb2JhYmlsaXR5ICg3LjUpIDxodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PWMwbUZFTF9TV3pFPg0KDQo8c2NyaXB0Pg0KZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsIGZ1bmN0aW9uKCkgew0KDQogIHZhciBib2R5ID0gZG9jdW1lbnQuYm9keTsNCg0KICAvKiA9PT09PT0gU1RBUlQ6IFNJREVCQVIgT1RPTUFUSVMgS0VUVVRVUCA9PT09PT0gKi8NCiAgLy8gcGFzIHBlcnRhbWEga2FsaSBoYWxhbWFuIHNlbGVzYWkgZGktbG9hZCwgbGFuZ3N1bmcgbW9kZSAiY29sbGFwc2VkIg0KICBib2R5LmNsYXNzTGlzdC5hZGQoInNpZGViYXItY29sbGFwc2VkIik7DQogIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLw0KDQogIC8vID09PT0gVE9HR0xFIFNJREVCQVIgKEhBTUJVUkdFUikgPT09PQ0KICB2YXIgbWVudUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzaWRlYmFyLXRvZ2dsZSIpOw0KICBpZiAobWVudUJ0bikgew0KICAgIG1lbnVCdG4uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbiAoKSB7DQogICAgICAvLyBrbGlrID0gYnVrYSAvIHR1dHVwIGFyZWEgDQogICAgICBib2R5LmNsYXNzTGlzdC50b2dnbGUoInNpZGViYXItY29sbGFwc2VkIik7DQogICAgfSk7DQogIH0NCg0KICAvLyA9PT09IFRPR0dMRSBMSUdIVCAvIERBUksgTU9ERSA9PT09DQogIHZhciBtb2RlQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm1vZGUtdG9nZ2xlIik7DQogIGlmIChtb2RlQnRuKSB7DQoNCiAgICAvLyBjb2JhIGJhY2EgbW9kZSB5YW5nIGRpc2ltcGFuIChrYWxhdSBhZGEpDQogICAgdmFyIHNhdmVkTW9kZSA9IG51bGw7DQogICAgdHJ5IHsNCiAgICAgIHNhdmVkTW9kZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCJudXJ1bC10aGVtZS1tb2RlIik7DQogICAgfSBjYXRjaCAoZSkgew0KICAgICAgc2F2ZWRNb2RlID0gbnVsbDsNCiAgICB9DQogICAgaWYgKHNhdmVkTW9kZSA9PT0gImRhcmsiKSB7DQogICAgICBib2R5LmNsYXNzTGlzdC5hZGQoImRhcmstbW9kZSIpOw0KICAgIH0NCg0KICAgIG1vZGVCdG4uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbiAoKSB7DQogICAgICBib2R5LmNsYXNzTGlzdC50b2dnbGUoImRhcmstbW9kZSIpOw0KICAgICAgdHJ5IHsNCiAgICAgICAgdmFyIGlzRGFyayA9IGJvZHkuY2xhc3NMaXN0LmNvbnRhaW5zKCJkYXJrLW1vZGUiKTsNCiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oIm51cnVsLXRoZW1lLW1vZGUiLCBpc0RhcmsgPyAiZGFyayIgOiAibGlnaHQiKTsNCiAgICAgIH0gY2F0Y2ggKGUpIHsNCiAgICAgICAgLy8ga2FsYXUgbG9jYWxTdG9yYWdlIG5nZ2FrIGJpc2EsIGRpZW0gYWphDQogICAgICB9DQogICAgfSk7DQogIH0NCg0KfSk7DQo8L3NjcmlwdD4NCmBgYA0K