PROBABILITY DISTRIBUTION

Tugas Week 11 - Probability Distribution

☀️︎ 🌜

<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:

NOTE : maaf Mr. B saya tidak mengikuti babnya Mr. B, karena menurut saya, saya lebih mudah mengerti dengan seperti ini.


1 VARIABLE DISKRIT DAN KONTINU

1.1 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\).


1.2 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:

  • \(P(X = 2)\) berapa?”

tapi kita bicara peluang di interval, misalnya:

  • \(P(1 \le X \le 2)\)

  • \(P(0.5 < X < 0.8)\), dan seterusnya.


1.3 DISKRIT - KONTINUE → PMF ke PDF

  • Diskrit:
    • Kita punya daftar peluang untuk tiap nilai \(\rightarrow\) PMF.

    • Tinggi batang di bar chart = peluang langsung \(P(X = x)\).

  • Kontinu:
    • Tidak bisa “bagi” peluang ke tiap titik (kebagian 0 semua)

    • Tapi kita tetap butuh cara mengukur “seberapa besar peluang di sekitar suatu nilai”.

Solusinya: kita definisikan fungsi kepadatan peluang (PDF) \(f(x)\).


PMF (diskrit): \[ P(X = x) = \text{(angka tertentu)} \]

Keterangan:

  • Memberi peluang langsung pada nilai \(x\).

  • Misalnya \(P(X = 2) = 0{,}3\).


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).


2 RANDOM VARIABLE KONTINU, PDF, dan CDF

2.1 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.


2.2 PROABILITY DENSITY FUNCTION (PDF)

Supaya \(f(x)\) sah sebagai PDF, dua syarat:

Tidak negatif: \[ f(x) \ge 0 \quad \forall x \]

Keterangan:

  • Nilai \(f(x)\) tidak boleh negatif untuk nilai \(x\) yang mungkin.

  • Secara gambar: kurva PDF tidak pernah di bawah sumbu x.


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).


2.3 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.


2.4 CUMULATIVE DISTRIBUTION FUNCTION (CDF)

Definisi CDF: \[ F(x) = P(X \le x) \]

Keterangan:

  • \(F(x)\) : fungsi distribusi kumulatif (CDF).

  • Menyatakan peluang total bahwa \(X\) kurang dari atau sama dengan \(x\).


CDF sebagai integral dari PDF: \[ F(x) = \int_{-\infty}^{x} f(t)\, dt \]

Keterangan:

  • \(f(t)\) : PDF.

  • Integral dari \(-\infty\) sampai \(x\) menjumlahkan semua peluang dari “ujung kiri” sampai titik \(x\).

  • Hasilnya = \(P(X \le x)\).

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:

  • \(F'(x)\) : turunan CDF terhadap \(x\).

  • Kalau kita punya CDF, menurunkannya akan menghasilkan PDF.

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).\]


3 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\)).

    • Mean sampel: \(\bar{X}\)

    • Proporsi sampel: \(\hat{p}\)

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.


4 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:

  • \(\mu_{\bar{X}}\) : mean dari distribusi sampling mean sampel.

  • \(\mu\) : mean populasi.

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).


5 SAMPLING DISTRIBUTION of the SAMPLE PROPORTION & BINOMIAL

Untuk data 0/1 (sukses/gagal):

  • Populasi:
    • proporsi sukses = \(p\).
  • Sampel:
    • jumlah sukses = \(X\),

    • proporsi sampel: \[\hat{p} = \frac{X}{n}\]

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:

  • \(\mu_{\hat{p}}\) : mean dari distribusi sampling proporsi sampel.

  • \(p\) : proporsi asli di populasi.

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.


6 RANGKUMAN

  1. Diskrit \(\rightarrow\) pakai PMF dan “peluang di titik”: \(P(X = x)\).

  2. Kontinu \(\rightarrow\) pakai PDF dan “peluang di interval”: \[ P(a \le X \le b) = \int_a^b f(x)\,dx. \]

  3. Dari PDF, kita bisa bikin CDF: \[ F(x) = P(X \le x). \]

  4. Populasi vs sampel \(\rightarrow\) kita pakai statistik (\(\bar X, \hat p\)) untuk menebak parameter (\(\mu, p\)).

  5. Sampling distribution menjelaskan bagaimana \(\bar X\) dan \(\hat p\) berubah-ubah dari sampel ke sampel.

  6. 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). \]

  1. Binomial adalah cara untuk jumlah sukses, tapi untuk \(n\) besar kita sering pakai normal approximation (pakai \(Z\)) karena lebih simple.

7 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.


7.1 Referensi Video (YouTube)

```

LS0tDQp0aXRsZTogIlBST0JBQklMSVRZIERJU1RSSUJVVElPTiIgICAgICANCnN1YnRpdGxlOiAiVHVnYXMgV2VlayAxMSAtIFByb2JhYmlsaXR5IERpc3RyaWJ1dGlvbiIgIA0KYXV0aG9yOiAiTnVydWwgSWZmYWgiDQpkYXRlOiAiYHIgZm9ybWF0KFN5cy5EYXRlKCksICclQiAlZCwgJVknKWAiIA0Kb3V0cHV0OiAgICAgICAgICAgICAgICAgICAgICAgIA0KICBybWRmb3JtYXRzOjpyZWFkdGhlZG93bjogICAgICANCiAgICBzZWxmX2NvbnRhaW5lZDogdHJ1ZSAgICAgICAgDQogICAgdGh1bWJuYWlsczogdHJ1ZSAgICAgICAgICAgIA0KICAgIGxpZ2h0Ym94OiB0cnVlICAgICAgICAgICAgIA0KICAgIGdhbGxlcnk6IHRydWUgICAgICAgICAgICAgICANCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUgICAgICANCiAgICBsaWJfZGlyOiBsaWJzICAgICAgICAgICAgICAgDQogICAgZGZfcHJpbnQ6ICJwYWdlZCIgICAgICAgICAgIA0KICAgIGNvZGVfZm9sZGluZzogInNob3ciICAgICAgDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KY3NzOiAiWm9vdG9waWEgKERpY2spIiAgIA0KLS0tDQoNCjxkaXYgaWQ9InNpZGViYXItdG9nZ2xlIj4NCiAgPHNwYW4+PC9zcGFuPg0KPC9kaXY+DQoNCg0KPGRpdiBpZD0ibW9kZS10b2dnbGUiIHRpdGxlPSJHYW50aSBMaWdodCAvIERhcmsiPg0KICA8c3BhbiBjbGFzcz0ic3VuIj7imIDvuI/vuI48L3NwYW4+DQogIDxzcGFuIGNsYXNzPSJtb29uIj7wn4ycPC9zcGFuPg0KPC9kaXY+DQoNCg0KPGRpdiBjbGFzcz0ibG9nby13cmFwcGVyIj4NCiAgPGRpdiBjbGFzcz0ibG9nby1mcmFtZSI+DQogICAgPGRpdiBjbGFzcz0ibG9nby1pbm5lciI+DQogICAgICA8aW1nIHNyYz0iZm90b2t1LmpwZyIgYWx0PSJOdXJ1bCBJZmZhaCI+DQogICAgPC9kaXY+DQogIDwvZGl2Pg0KICA8ZGl2IGNsYXNzPSJsb2dvLWNhcHRpb24iPk5VUlVMIElGRkFIPC9kaXY+DQo8L2Rpdj4NCg0KPGRpdiBzdHlsZT0ibWFyZ2luLXRvcDogMS44cmVtOyB0ZXh0LWFsaWduOiBjZW50ZXI7Ij4NCg0KICA8IS0tIEtPVEFLIDEgLS0+DQogIDxwIHN0eWxlPSINCiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7DQogICAgbWluLXdpZHRoOiAxNzBweDsNCiAgICBwYWRkaW5nOiAwLjdyZW0gMS40cmVtOw0KICAgIGJvcmRlci1yYWRpdXM6IDE2cHg7DQogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEzNWRlZywgI2ZmZjdkYSwgI2ZmZWNjMik7ICAvKiBob25leSBwYXN0ZWwgKi8NCiAgICBib3gtc2hhZG93OiAwIDhweCAxOHB4IHJnYmEoMCwwLDAsMC4xMik7DQogICAgZm9udC1mYW1pbHk6ICdRdWlja3NhbmQnLCBzeXN0ZW0tdWksIC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgJ1NlZ29lIFVJJywgc2Fucy1zZXJpZjsNCiAgICBjb2xvcjogIzI0MzAzZTsNCiAgICBmb250LXNpemU6IDE0cHg7DQogICAgZm9udC13ZWlnaHQ6IDYwMDsNCiAgICBsaW5lLWhlaWdodDogMS40Ow0KICAgIG1hcmdpbjogMCAwLjZyZW0gMC42cmVtIDAuNnJlbTsNCiAgIj4NCiAgICBQcm9ncmFtIFN0dWRpPGJyPlNhaW5zIERhdGENCiAgPC9wPg0KDQogIDwhLS0gS09UQUsgMiAtLT4NCiAgPHAgc3R5bGU9Ig0KICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsNCiAgICBtaW4td2lkdGg6IDE3MHB4Ow0KICAgIHBhZGRpbmc6IDAuN3JlbSAxLjRyZW07DQogICAgYm9yZGVyLXJhZGl1czogMTZweDsNCiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCAjZjVmZmU4LCAjZTlmYmQzKTsgIC8qIG1hdGNoYSBwYXN0ZWwgKi8NCiAgICBib3gtc2hhZG93OiAwIDhweCAxOHB4IHJnYmEoMCwwLDAsMC4xMik7DQogICAgZm9udC1mYW1pbHk6ICdRdWlja3NhbmQnLCBzeXN0ZW0tdWksIC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgJ1NlZ29lIFVJJywgc2Fucy1zZXJpZjsNCiAgICBjb2xvcjogIzI0MzAzZTsNCiAgICBmb250LXNpemU6IDE0cHg7DQogICAgZm9udC13ZWlnaHQ6IDYwMDsNCiAgICBsaW5lLWhlaWdodDogMS40Ow0KICAgIG1hcmdpbjogMCAwLjZyZW0gMC42cmVtIDAuNnJlbTsNCiAgIj4NCiAgICBVbml2ZXJzaXRhczxicj5JTlNUSVRVVCBURUtOT0xPR0kgU0FJTlMgQkFORFVORw0KICA8L3A+DQoNCiAgPCEtLSBLT1RBSyAzIC0tPg0KICA8cCBzdHlsZT0iDQogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOw0KICAgIG1pbi13aWR0aDogMTcwcHg7DQogICAgcGFkZGluZzogMC43cmVtIDEuNHJlbTsNCiAgICBib3JkZXItcmFkaXVzOiAxNnB4Ow0KICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxMzVkZWcsICNmZmU3YzIsICNmZmQ0YTMpOyAgLyogaG9uZXktb3JhbmdlIHBhc3RlbCAqLw0KICAgIGJveC1zaGFkb3c6IDAgOHB4IDE4cHggcmdiYSgwLDAsMCwwLjEyKTsNCiAgICBmb250LWZhbWlseTogJ1F1aWNrc2FuZCcsIHN5c3RlbS11aSwgLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCAnU2Vnb2UgVUknLCBzYW5zLXNlcmlmOw0KICAgIGNvbG9yOiAjMjQzMDNlOw0KICAgIGZvbnQtc2l6ZTogMTRweDsNCiAgICBmb250LXdlaWdodDogNjAwOw0KICAgIGxpbmUtaGVpZ2h0OiAxLjQ7DQogICAgbWFyZ2luOiAwIDAuNnJlbSAwLjZyZW0gMC42cmVtOw0KICAiPg0KICAgIERvc2VuIFBlbmdhbXB1PGJyPkJha3RpIFNpcmVnYXIsIE0gU2MuLCBDU0QNCiAgPC9wPg0KDQo8L2Rpdj4NCg0KDQotLS0NCg0KKipQUk9CQUJJTElUWSBESVNUUklCVVRJT04qKg0KDQpEYWxhbSBrZWhpZHVwYW4gc2VoYXJpLWhhcmksIHNhdHUgcGVyY29iYWFuIHlhbmcgc2FtYSBiaXNhIG1lbWJlcmkgaGFzaWwgYmVyYmVkYTogdGluZ2dpIHRpYXAgb3JhbmcgdGlkYWsgc2FtYSwganVtbGFoIGNoYXQgcGVyIGhhcmkgYmVydWJhaCwgaGFzaWwgbGVtcGFyIGtvaW4gYWNhay4gVW50dWsgbWVyYXBpa2FuIGtldGlkYWtwYXN0aWFuIGl0dSwga2l0YSBwYWthaSB2YXJpYWJlbCBhY2FrIHNlYmFnYWkgd2FraWwgaGFzaWwsIGRhbiBkaXN0cmlidXNpIHBlbHVhbmcgKHByb2JhYmlsaXR5IGRpc3RyaWJ1dGlvbikgdW50dWsgbWVudW5qdWtrYW4gc2ViZXJhcGEgYmVzYXIga2VtdW5na2luYW4gdGlhcCBuaWxhaSBtdW5jdWwuDQoNClNlY2FyYSBnYXJpcyBiZXNhciwgYmFiIGluaSBtZW5jYWt1cDoNCg0KLSAqKlZhcmlhYmVsIGFjYWsgZGlza3JpdCBkYW4ga29udGludSoqLCBkYW4gYmFnYWltYW5hIHBlcmJlZGFhbiB0aXBlIGRhdGEgaW5pIG1lbWVuZ2FydWhpIGNhcmEga2l0YSBtZW1vZGVsa2FuIHBlbHVhbmcuDQoNCi0gKipGdW5nc2kga2VwYWRhdGFuIHBlbHVhbmcgKFBERikgZGFuIGZ1bmdzaSBkaXN0cmlidXNpIGt1bXVsYXRpZiAoQ0RGKSoqIHVudHVrIHZhcmlhYmVsIGtvbnRpbnUsIHRlcm1hc3VrIGNhcmEgbWVuZ2hpdHVuZyBwZWx1YW5nIHNlYmFnYWkgbHVhcyBkaSBiYXdhaCBrdXJ2YS4NCg0KLSAqKkRpc3RyaWJ1c2kgc2FtcGxpbmcgdW50dWsgc3RhdGlzdGlrIHNlcGVydGkgcmF0YS1yYXRhIHNhbXBlbCoqICQoXGJhcntYfSkkIGRhbiBwcm9wb3JzaSBzYW1wZWwgJChcaGF0e3B9KSQsIHlhbmcgbWVuamVsYXNrYW4gbWVuZ2FwYSBuaWxhaSBzdGF0aXN0aWsgYmlzYSBiZXJ1YmFoIGRhcmkgc2FtcGVsIGtlIHNhbXBlbC4NCg0KLSAqKlRlb3JlbWEgTGltaXQgVGVuZ2FoIChDZW50cmFsIExpbWl0IFRoZW9yZW0gLyBDTFQpKiosIHlhbmcgbWVuamVsYXNrYW4ga2VuYXBhLCB1bnR1ayBzYW1wZWwgY3VrdXAgYmVzYXIsIGRpc3RyaWJ1c2kgcmF0YS1yYXRhIGRhbiBwcm9wb3JzaSBzYW1wZWwgY2VuZGVydW5nIG1lbmRla2F0aSBub3JtYWwuDQoNCi0gKipEaXN0cmlidXNpIHByb3BvcnNpIHNhbXBlbCBkYW4gZGlzdHJpYnVzaSBiaW5vbWlhbCoqLCBzZXJ0YSBrYXBhbiBraXRhIG1lbWFrYWkgcGVyaGl0dW5nYW4gZXhhY3QgKGJpbm9taWFsKSBkYW4ga2FwYW4gY3VrdXAgbWVtYWthaSBwZW5kZWthdGFuIG5vcm1hbCAoYXBwcm94aW1hdGUpIGRlbmdhbiBiYW50dWFuIENMVC4NCg0KKipOT1RFIDoqKiBtYWFmIE1yLiBCIHNheWEgdGlkYWsgbWVuZ2lrdXRpIGJhYm55YSBNci4gQiwga2FyZW5hIG1lbnVydXQgc2F5YSwgc2F5YSBsZWJpaCBtdWRhaCBtZW5nZXJ0aSBkZW5nYW4gc2VwZXJ0aSBpbmkuDQoNCi0tLQ0KDQojICoqVkFSSUFCTEUgRElTS1JJVCBEQU4gS09OVElOVSoqDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpsaWJyYXJ5KHZlbWJlZHIpDQoNCmVtYmVkX3lvdXR1YmUoIlp5VXpSVmE2aENNIikgfD4NCiAgdXNlX2FsaWduKCJjZW50ZXIiKQ0KYGBgDQoNCiMjICoqVkFSSUFCTEUgRElTS1JJVCoqDQoNCk5pbGFpbnlhICoqdGVyaGl0dW5nKiogKGNvdW50YWJsZSk6ICQwLDEsMiwzLFxsZG90cyQNCg0KQ29udG9oOiAtIGp1bWxhaCBrZXBhbGEgc2FhdCBsZW1wYXIgNCBrb2luLCAtIGp1bWxhaCBzaXN3YSB5YW5nIGx1bHVzLCAtIGp1bWxhaCBrZWxlcmVuZyBoaWphdSB5YW5nIGRpYW1iaWwuDQoNCkJpYXNhbnlhIGRpZ2FtYmFyIHBha2FpICoqYmFyIGNoYXJ0Kio6IC0gdGlhcCBuaWxhaSBwdW55YSBiYXRhbmcgdGVycGlzYWgsIC0gdGluZ2dpIGJhdGFuZyA9IHBlbHVhbmcgJFAoWCA9IGspJC4NCg0KVW50dWsgdmFyaWFiZWwgZGlza3JpdCwga2l0YSBwdW55YSBmdW5nc2kgcGVsdWFuZzogJFAoWCA9IHgpJC4NCg0KS2V0ZXJhbmdhbjoNCg0KLSAkWCQgOiB2YXJpYWJlbCBhY2FrIGRpc2tyaXQgKG1pc2FsIGp1bWxhaCBrZXBhbGEpLg0KDQotICR4JCA6IHNhdHUgbmlsYWkgdGVydGVudHUgeWFuZyBtdW5na2luIChtaXNhbCAyKS4NCg0KLSAkUChYID0geCkkIDogcGVsdWFuZyBiYWh3YSAkWCQgbWVuZ2FtYmlsIG5pbGFpIHRlcGF0ICR4JC4NCg0KKipGdW5nc2kqKiAkUChYID0geCkkIGluaSBkaXNlYnV0IFBNRiAocHJvYmFiaWxpdHkgbWFzcyBmdW5jdGlvbikuDQoNCkRpIGRpc2tyaXQsIHBlbHVhbmcgZGkgdGl0aWsgJFAoWCA9IHgpJCBiaXNhICQ+IDAkLCBtaXNhbG55YSAkUChYID0gMikgPSAweyx9MyQuDQoNCi0tLQ0KDQojIyAqKlZBUklBQkxFIEtPTlRJTlUqKg0KDQpOaWxhaW55YSAqKnRlcnVrdXIqKiwgYmlzYSBwdW55YSBkZXNpbWFsIHRhbnBhIGJhdGFzLg0KDQpDb250b2g6DQoNCi0gdGluZ2dpIGJhZGFuLCBiZXJhdCBiYWRhbiwNCg0KLSB3YWt0dSwgc3VodSwgdW11ciwga2VjZXBhdGFuLCBqYXJhay4NCg0KTmlsYWkgZGkgZGFsYW0gc2F0dSBpbnRlcnZhbCBpdHUgdGFrIGhpbmdnYSBiYW55YWsgKGFudGFyYSAxIGRhbiAyIHN1ZGFoIGFkYSAxLjEsIDEuMTEsIDEuMTExLCBkc3QpLg0KDQpCaWFzYW55YSBkaWdhbWJhciBwYWthaSAqKmhpc3RvZ3JhbSoqIGF0YXUgKiprdXJ2YSBoYWx1cyoqLCAqKmJ1a2FuIGJhdGFuZyB0ZXJwaXNhaC4qKg0KDQpEaSBzaW5pIHRlcmphZGkgaGFsIHBlbnRpbmc6ICoqS2FyZW5hIHRpdGlrbnlhIHRhayBoaW5nZ2EgYmFueWFrLCBwZWx1YW5nIGRpIHNhdHUgdGl0aWsgcGVyc2lzIGphZGkgMC4qKiAkJA0KUChYID0geCkgPSAwIFx0ZXh0eyB1bnR1ayBzZW11YSB9IHgNCiQkIEtldGVyYW5nYW46DQoNCi0gJFgkIDogdmFyaWFiZWwgYWNhayBrb250aW51IChtaXNhbCB0aW5nZ2kpLg0KDQotICR4JCA6IHNhdHUgbmlsYWkgdGVydGVudHUgKG1pc2FsIDE1MCBjbSkuDQoNCi0gUnVtdXMgaW5pIGJpbGFuZzogcGVsdWFuZyB0ZXBhdCBkaSBzYXR1IHRpdGlrIHVudHVrIHZhcmlhYmVsIGtvbnRpbnUgc2VsYWx1IG5vbCAoJFAoWCA9IHgpID0gMCQpLg0KDQpLYXJlbmEgaXR1LCB1bnR1ayBrb250aW51IGtpdGEgdGlkYWsgbGFnaSBiaWNhcmE6DQoNCi0gIiAkUChYID0gMikkIGJlcmFwYT8iDQoNCnRhcGkga2l0YSBiaWNhcmEgcGVsdWFuZyBkaSBpbnRlcnZhbCwgbWlzYWxueWE6DQoNCi0gJFAoMSBcbGUgWCBcbGUgMikkDQoNCi0gJFAoMC41IDwgWCA8IDAuOCkkLCBkYW4gc2V0ZXJ1c255YS4NCg0KLS0tDQoNCiMjICoqRElTS1JJVCAtIEtPTlRJTlVFIOKGkiBQTUYga2UgUERGKioNCg0KLSAqKkRpc2tyaXQ6KioNCiAgLSAgS2l0YSBwdW55YSBkYWZ0YXIgcGVsdWFuZyB1bnR1ayB0aWFwIG5pbGFpICRccmlnaHRhcnJvdyQgUE1GLg0KICAgIA0KICAtIFRpbmdnaSBiYXRhbmcgZGkgYmFyIGNoYXJ0ID0gcGVsdWFuZyBsYW5nc3VuZyAkUChYID0geCkkLg0KICAgIA0KLSAqKktvbnRpbnU6KioNCiAgLSBUaWRhayBiaXNhICJiYWdpIiBwZWx1YW5nIGtlIHRpYXAgdGl0aWsgKGtlYmFnaWFuIDAgc2VtdWEpDQogIA0KICAtIFRhcGkga2l0YSB0ZXRhcCBidXR1aCBjYXJhIG1lbmd1a3VyICJzZWJlcmFwYSBiZXNhciBwZWx1YW5nIGRpIHNla2l0YXIgc3VhdHUgbmlsYWkiLg0KDQoqKlNvbHVzaW55YToqKiBraXRhIGRlZmluaXNpa2FuIGZ1bmdzaSBrZXBhZGF0YW4gcGVsdWFuZyAoUERGKSAkZih4KSQuDQoNCi0tLQ0KDQoqKlBNRiAoZGlza3JpdCk6KioNCiAgICAkJA0KICAgIFAoWCA9IHgpID0gXHRleHR7KGFuZ2thIHRlcnRlbnR1KX0NCiAgICAkJCANCiAgICANCioqS2V0ZXJhbmdhbjoqKg0KDQotIE1lbWJlcmkgcGVsdWFuZyBsYW5nc3VuZyBwYWRhIG5pbGFpICR4JC4NCg0KLSBNaXNhbG55YSAkUChYID0gMikgPSAweyx9MyQuDQoNCi0tLQ0KDQoqKlBERiAoa29udGludSk6KiogDQokJA0KZih4KSA9IFx0ZXh0eyJrZXBhZGF0YW4gcGVsdWFuZyBkaSBzZWtpdGFyIH0geFx0ZXh0eyAifQ0KJCQgKipLZXRlcmFuZ2FuOioqDQoNCi0gJGYoeCkkIFx0ZXh0YmZ7YnVrYW59IHBlbHVhbmcsIG1lbGFpbmthbiBrZXBhZGF0YW4uDQoNCi0gUGVsdWFuZyB5YW5nIHNlYmVuYXJueWEgZGlkYXBhdCBkYXJpIGx1YXMgZGkgYmF3YWgga3VydmEgJGYoeCkkLg0KDQoqKlJ1bXVzIHBlbHVhbmcgdW50dWsgdmFyaWFiZWwga29udGludToqKiANCiQkDQpQKGEgXGxlIFggXGxlIGIpID0gXGludF9hXmIgZih4KVwsIGR4DQokJCANCioqS2V0ZXJhbmdhbjoqKg0KDQotICRhLCBiJCA6IGJhdGFzIGJhd2FoIGRhbiBiYXRhcyBhdGFzIGludGVydmFsLg0KDQotICRcZGlzcGxheXN0eWxlIFxpbnRfYV5iIGYoeClcLCBkeCQgOiBsdWFzIGRpIGJhd2FoIGt1cnZhICRmKHgpJCBkYXJpICR4ID0gYSQgc2FtcGFpICR4ID0gYiQuDQoNCi0gTmlsYWkgaW50ZWdyYWwgaW5pID0gcGVsdWFuZyBiYWh3YSAkWCQgamF0dWggZGkgYW50YXJhICRhJCBkYW4gJGIkLg0KDQoqKlNlY2FyYSB2aXN1YWw6KiogYmFyIGNoYXJ0IGRpc2tyaXQgJFxyaWdodGFycm93JCBiYXRhbmcgbWFraW4gYmFueWFrIGRhbiBtYWtpbiB0aXBpcyAkXHJpZ2h0YXJyb3ckIGxhbWEtbGFtYSBtZW1iZW50dWsga3VydmEgaGFsdXMgJFxyaWdodGFycm93JCBpdHVsYWggaWRlIFBERi4NCg0KKipKYWRpIFBERiBpdHUgc2VwZXJ0aSAidmVyc2kga29udGludSIgZGFyaSB0YWJlbCBwZWx1YW5nIChQTUYpLioqDQoNCi0tLQ0KDQojICoqUkFORE9NIFZBUklBQkxFIEtPTlRJTlUsIFBERiwgZGFuIENERioqDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpsaWJyYXJ5KHZlbWJlZHIpDQoNCmVtYmVkX3lvdXR1YmUoIlp5VXpSVmE2aENNIikgfD4NCiAgdXNlX2FsaWduKCJjZW50ZXIiKQ0KYGBgDQoNCiMjICoqUkFORE9NIFZBUklBQkxFIEtPTlRJTlUqKg0KDQpSYW5kb20gdmFyaWFibGUga29udGludSBhZGFsYWggcGV1YmFoIGFjYWsgeWFuZyBiaXNhIGFtYmlsIG5pbGFpIGFwYSBwdW4gZGFsYW0gc2VidWFoIGludGVydmFsIGRpIGdhcmlzIGJpbGFuZ2FuIHJlYWwuDQoNCkNvbnRvaDogdGluZ2dpLCB3YWt0dSwgc3VodSwgdW11ciwgdGVrYW5hbiwga2VjZXBhdGFuLg0KDQoqKkNpcmkgcGVudGluZzoqKg0KDQotIE5pbGFpIGFkYSBkaSBpbnRlcnZhbCwgbWlzYWxueWEgJChhLGIpJCBhdGF1ICQoLVxpbmZ0eSwgK1xpbmZ0eSkkLg0KDQotIHVudHVrIHNldGlhcCB0aXRpazogDQokJA0KUChYID0geCkgPSAwDQokJA0KDQotIFBlbHVhbmcgaGFueWEgYmVybWFrbmEgcGFkYSBpbnRlcnZhbDoNCiQkDQpQKGEgXGxlIFggXGxlIGIpID0gXGludF9hXmIgZih4KVwsIGR4DQokJCANCioqS2V0ZXJhbmdhbiBydW11czoqKg0KDQotICRYJCA6IHZhcmlhYmVsIGFjYWsga29udGludS4NCg0KLSAkYSwgYiQgOiBiYXRhcyBpbnRlcnZhbC4NCg0KLSAkZih4KSQgOiBQREYuDQoNCi0gJFxkaXNwbGF5c3R5bGUgXGludF9hXmIgZih4KVwsIGR4JCA6IGx1YXMgZGkgYmF3YWgga3VydmEgJGYoeCkkIOKGkiBpdHUgeWFuZyBqYWRpIHBlbHVhbmcuDQoNCi0tLQ0KDQojIyAqKlBST0FCSUxJVFkgREVOU0lUWSBGVU5DVElPTiAoUERGKSoqDQoNClN1cGF5YSAkZih4KSQgc2FoIHNlYmFnYWkgUERGLCBkdWEgc3lhcmF0Og0KDQogKipUaWRhayBuZWdhdGlmOioqIA0KJCQNCmYoeCkgXGdlIDAgXHF1YWQgXGZvcmFsbCB4DQokJCANCg0KKipLZXRlcmFuZ2FuOioqDQoNCi0gTmlsYWkgJGYoeCkkIHRpZGFrIGJvbGVoIG5lZ2F0aWYgdW50dWsgbmlsYWkgJHgkIHlhbmcgbXVuZ2tpbi4NCg0KLSAgIFNlY2FyYSBnYW1iYXI6IGt1cnZhIFBERiB0aWRhayBwZXJuYWggZGkgYmF3YWggc3VtYnUgeC4NCg0KLS0tDQoNCioqTHVhcyB0b3RhbCBkaSBiYXdhaCBrdXJ2YSA9IDE6KiogDQokJA0KIFxpbnRfey1caW5mdHl9XnsrXGluZnR5fSBmKHgpXCxkeCA9IDENCiQkIA0KKipLZXRlcmFuZ2FuOioqDQoNCi0gSW50ZWdyYWwgZGFyaSAkLVxpbmZ0eSQgc2FtcGFpICQrXGluZnR5JDogbWVuanVtbGFoa2FuIHNlbXVhICJsdWFzIHBlbHVhbmciIGRpIHNlbHVydWggZ2FyaXMgYmlsYW5nYW4uDQoNCi0gSGFydXMgc2FtYSBkZW5nYW4gMTogdG90YWwgcGVsdWFuZyB1bnR1ayBzZW11YSBuaWxhaSAkWCQgPSAxIChwYXN0aSB0ZXJqYWRpIGRpIHN1YXR1IHRlbXBhdCkuDQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQoqKkludGVycHJldGFzaToqKg0KDQotICRmKHgpJCBtZW1iZXJpIHRhaHUgc2ViZXJhcGEgcGFkYXQgcGVsdWFuZyBkaSBzZWtpdGFyICR4JC4NCg0KLSBCdWthbiBsYW5nc3VuZyAkUChYID0geCkkLg0KDQotIFBlbHVhbmcgc2ViZW5hcm55YTogDQokJA0KUChhIFxsZSBYIFxsZSBiKSA9IFxpbnRfYV5iIGYoeClcLCBkeA0KJCQgDQoNCioqS2V0ZXJhbmdhbjoqKg0KDQotIFVudHVrIHZhcmlhYmVsIGtvbnRpbnUsIHBlbHVhbmcgaW50ZXJ2YWwgZGloaXR1bmcgc2ViYWdhaSBsdWFzIGRpIGJhd2FoIGt1cnZhIFBERiBhbnRhcmEgJGEkIGRhbiAkYiQuDQoNCi0gSW5pIHlhbmcgbWVuZ2dhbnRpa2FuICJqdW1sYWhrYW4gJFAoWCA9IHgpJCIgZGkga2FzdXMgZGlza3JpdC4NCg0KLS0tDQoNCioqQ29udG9oIFBERjoqKiANCiQkDQpmKHgpID0gM3heMiBccXVhZCBcdGV4dHt1bnR1ayB9IDAgXGxlIHggXGxlIDEuDQokJCANCioqS2V0ZXJhbmdhbjoqKg0KDQotIEJlbnR1ayBrdXJ2YTogJDN4XjIkIOKGkiBtYWtpbiBrZSBrYW5hbiwga2VwYWRhdGFuIG1ha2luIGJlc2FyLg0KDQotIFBERiBpbmkgaGFueWEgYmVybGFrdSBkaSBpbnRlcnZhbCAkMCBcbGUgeCBcbGUgMSQuIERpIGx1YXIgaXR1LCBkaWFuZ2dhcCAkZih4KSA9IDAkLg0KDQoqKkNlayB2YWxpZGl0YXM6KioNCiQkDQpcaW50XzBeMSAzeF4yXCxkeCA9IFxsZWZ0W3heM1xyaWdodF1fMF4xID0gMQ0KJCQgDQoqKktldGVyYW5nYW46KioNCg0KLSBJbnRlZ3JhbCAkM3heMiQgZGFyaSAwIGtlIDEgbWVtYmVyaWthbiBsdWFzIHRvdGFsID0gMS4NCg0KLSBBcnRpbnlhLCBmdW5nc2kgaW5pIG1lbWVudWhpIHN5YXJhdCBQREYgKHRvdGFsIHBlbHVhbmcgPSAxKS4NCg0KLS0tDQoNCiMjICoqUFJPQkFCSUxJVEFTIGRpIElOVEVSVkFMKioNCg0KRGVuZ2FuIGNvbnRvaCAkZih4KSA9IDN4XjIkIGRpICRbMCwxXSQ6DQoNCiQkDQpQKGEgXGxlIFggXGxlIGIpID0gXGludF9hXmIgM3heMlwsIGR4DQokJCANCg0KKipLZXRlcmFuZ2FuOioqDQoNCi0gICBLaXRhIGN1bWEgYm9sZWggYW1iaWwgJGEsIGIkIGRpIGFudGFyYSAwIGRhbiAxLg0KDQotICAgSW50ZWdyYWwgaXR1IG1lbWJlcmkgbHVhcyBkaSBiYXdhaCBrdXJ2YSAkM3heMiQgZGFyaSAkeCA9IGEkIGtlICR4ID0gYiQg4oaSIGl0dWxhaCBwZWx1YW5nbnlhLg0KDQokJA0KXGludF8wXjEgM3heMlwsZHgNCiQkDQoNCmFkYWxhaCBsdWFzIGRpIGJhd2FoIGt1cnZhICQzeF4yJCBkYXJpICR4ID0gMCQgc2FtcGFpICR4ID0gMSQuDQoNCkhhc2lsbnlhICQxJCAkXHJpZ2h0YXJyb3ckIGJlcmFydGkgZnVuZ3NpIGluaSBQREYgeWFuZyBzYWgsIGthcmVuYSB0b3RhbCBwZWx1YW5nID0gMS4NCg0KQ29udG9oIHNwZXNpZmlrOiANCiQkDQpQKDAuNSBcbGUgWCBcbGUgMSkNCj0gXGludF97MC41fV4xIDN4XjJcLCBkeA0KPSBcbGVmdFt4XjNccmlnaHRdX3swLjV9XjENCj0gMSAtIDAuMTI1DQo9IDAuODc1DQokJCANCg0KKipLZXRlcmFuZ2FuOioqDQoNCi0gS2l0YSBjdW1hIGJvbGVoIGFtYmlsICRhLCBiJCBkaSBhbnRhcmEgMCBkYW4gMS4NCg0KLSBJbnRlZ3JhbCBpdHUgbWVtYmVyaSBsdWFzIGRpIGJhd2FoIGt1cnZhICQzeF4yJCBkYXJpICR4ID0gYSQga2UgJHggPSBiJCAkXHJpZ2h0YXJyb3ckIGl0dWxhaCBwZWx1YW5nbnlhLg0KDQotLS0NCg0KIyMgKipDVU1VTEFUSVZFIERJU1RSSUJVVElPTiBGVU5DVElPTiAoQ0RGKSoqDQoNCioqRGVmaW5pc2kgQ0RGOioqDQokJA0KRih4KSA9IFAoWCBcbGUgeCkNCiQkDQoNCktldGVyYW5nYW46DQoNCi0gJEYoeCkkIDogZnVuZ3NpIGRpc3RyaWJ1c2kga3VtdWxhdGlmIChDREYpLg0KDQotIE1lbnlhdGFrYW4gcGVsdWFuZyB0b3RhbCBiYWh3YSAkWCQga3VyYW5nIGRhcmkgYXRhdSBzYW1hIGRlbmdhbiAkeCQuDQoNCi0tLQ0KDQoqKkNERiBzZWJhZ2FpIGludGVncmFsIGRhcmkgUERGOioqIA0KJCQNCkYoeCkgPSBcaW50X3stXGluZnR5fV57eH0gZih0KVwsIGR0DQokJA0KDQoqKktldGVyYW5nYW46KioNCg0KLSAkZih0KSQgOiBQREYuDQoNCi0gSW50ZWdyYWwgZGFyaSAkLVxpbmZ0eSQgc2FtcGFpICR4JCBtZW5qdW1sYWhrYW4gc2VtdWEgcGVsdWFuZyBkYXJpIOKAnHVqdW5nIGtpcmnigJ0gc2FtcGFpIHRpdGlrICR4JC4NCg0KLSBIYXNpbG55YSA9ICRQKFggXGxlIHgpJC4NCg0KVW50dWsgY29udG9oICRmKHQpID0gM3ReMiQgZGkgJFswLDFdJCwga2FyZW5hIGRpIGJhd2FoIDAgcGVsdWFuZ255YSAwLCBraXRhIGJpc2EgdHVsaXM6IA0KJCQNCkYoeCkgPSBcaW50X3swfV57eH0gM3ReMlwsIGR0ID0geF4zDQokJA0KDQoqKktldGVyYW5nYW46KioNCg0KLSBSdW11cyBDREYtbnlhOiAkRih4KSA9IHheMyQgdW50dWsgJDAgXGxlIHggXGxlIDEkLg0KDQotIENvbnRvaDogJEYoMHssfTUpID0gKDB7LH01KV4zID0gMHssfTEyNSQg4oaSIHBlbHVhbmcgJFggXGxlIDB7LH01JCA9IDEyLDUlLg0KDQotLS0NCg0KKipIdWJ1bmdhbiBQREbigJNDREY6KiogDQokJA0KZih4KSA9IEYnKHgpDQokJA0KDQoqKktldGVyYW5nYW46KioNCg0KLSAkRicoeCkkIDogdHVydW5hbiBDREYgdGVyaGFkYXAgJHgkLg0KDQotIEthbGF1IGtpdGEgcHVueWEgQ0RGLCBtZW51cnVua2FubnlhIGFrYW4gbWVuZ2hhc2lsa2FuIFBERi4NCg0KKipTZWJhbGlrbnlhOioqIA0KJCQNCkYoeCkgPSBcaW50IGYoeClcLCBkeCBccXVhZCBcdGV4dHsoZGVuZ2FuIGJhdGFzIHlhbmcgc2VzdWFpKX0NCiQkDQoNCioqS2V0ZXJhbmdhbjoqKg0KDQotIEthbGF1IGtpdGEgcHVueWEgUERGLCBtZW5naW50ZWdyYWxrYW5ueWEgKGRlbmdhbiBiYXRhcykgYWthbiBtZW1iZXJpIENERi4NCg0KKipDb250b2g6KioNCg0KSmlrYSAkRih4KSA9IHheMyQsIG1ha2EgJCRGJyh4KSA9IDN4XjIgPSBmKHgpLiQkDQoNCi0tLQ0KDQojICoqUE9QVUxBU0ksIFNBTVBMRSBEQU4gU0FNUExJTkcgRElTVFJJQlVUSU9OKioNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmxpYnJhcnkodmVtYmVkcikNCg0KZW1iZWRfeW91dHViZSgiN1M3ajc1ZDNHTTQiKSB8Pg0KICB1c2VfYWxpZ24oImNlbnRlciIpDQpgYGANCg0KLSBQb3B1bGFzaTogc2VtdWEgaW5kaXZpZHUgeWFuZyBraXRhIG1pbmF0aS4NCiAtIE1lYW4gcG9wdWxhc2k6ICRcbXUkDQoNCiAtIFNpbXBhbmdhbiBiYWt1IHBvcHVsYXNpOiAkXHNpZ21hJA0KDQogLSBQcm9wb3JzaSBwb3B1bGFzaTogJHAkDQogDQotIFNhbXBlbDogc2ViYWdpYW4ga2VjaWwgZGFyaSBwb3B1bGFzaSAodWt1cmFuICRuJCkuDQogIC0gTWVhbiBzYW1wZWw6ICRcYmFye1h9JA0KDQogIC0gUHJvcG9yc2kgc2FtcGVsOiAkXGhhdHtwfSQNCg0KKipTYW1wbGluZyBkaXN0cmlidXRpb24qKg0KDQotIEtldGlrYSBraXRhIGFtYmlsIGJhbnlhayBzYW1wZWwgdWt1cmFuICRuJC4NCg0KLSBUaWFwIHNhbXBlbCBraXRhIGhpdHVuZyBzdGF0aXN0aWtueWEgKG1pc2FsICRcYmFye1h9JCBhdGF1ICRcaGF0e3B9JCkuDQoNCi0gS3VtcHVsYW4gc2VtdWEgbmlsYWkgJFxiYXJ7WH0kIGluaSBtZW1iZW50dWs6DQokJFx0ZXh0e1NhbXBsaW5nIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc2FtcGxlIG1lYW59JCQNCg0KS3VtcHVsYW4gc2VtdWEgJFxoYXR7cH0kIG1lbWJlbnR1azogDQokJA0KXHRleHR7U2FtcGxpbmcgZGlzdHJpYnV0aW9uIG9mIHRoZSBzYW1wbGUgcHJvcG9ydGlvbn0NCiQkDQoNCkluaSBhZGFsYWggZGlzdHJpYnVzaSBkYXJpIHJpbmdrYXNhbiBkYXRhIChzdGF0aXN0aWspIGRhcmkgYmFueWFrIHNhbXBlbC4gQnVrYW4gZGF0YSBtZW50YWguDQoNCi0tLQ0KDQojICoqU0FNUExJTkcgRElTVFJJQlVUSU9OIG9mIHRoZSBTQU1QTEUgTUVBTiAmIENMVCoqDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpsaWJyYXJ5KHZlbWJlZHIpDQoNCmVtYmVkX3lvdXR1YmUoIml2ZDh3RUhuTUNnIikgfD4NCiAgdXNlX2FsaWduKCJjZW50ZXIiKQ0KYGBgDQoNCioqTWlzYWw6KioNCg0KLSBQb3B1bGFzaSBwdW55YSBtZWFuICRcbXUkIGRhbiBzaW1wYW5nYW4gYmFrdSAkXHNpZ21hJC4NCg0KLSBLaXRhIGFtYmlsIHNhbXBlbCB1a3VyYW4gJG4kLg0KDQotIFN0YXRpc3RpazogJFxiYXJ7WH0kID0gbWVhbiBzYW1wZWwuDQoNCioqTWVhbiBkaXN0cmlidXNpIHNhbXBsaW5nOioqIA0KJCQNClxtdV97XGJhcntYfX0gPSBcbXUNCiQkDQoNCioqS2V0ZXJhbmdhbjoqKg0KDQotICRcbXVfe1xiYXJ7WH19JCA6IG1lYW4gZGFyaSBkaXN0cmlidXNpIHNhbXBsaW5nIG1lYW4gc2FtcGVsLg0KDQotICRcbXUkIDogbWVhbiBwb3B1bGFzaS4NCg0KRGFsYW0gamFuZ2thIHBhbmphbmcsIHJhdGEtcmF0YSBkYXJpIHNlbXVhICRcYmFye1h9JCAoZGFyaSBiYW55YWsgc2FtcGVsKSBha2FuIG1lbmRla2F0aSBtZWFuIHBvcHVsYXNpICRcbXUkLg0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KKipTdGFuZGFyZCBlcnJvciAoc2ltcGFuZ2FuIGJha3UgZGlzdHJpYnVzaSBzYW1wbGluZyk6KiogDQokJA0KXHNpZ21hX3tcYmFye1h9fSA9IFxmcmFje1xzaWdtYX17XHNxcnR7bn19DQokJA0KDQoqKktldGVyYW5nYW46KioNCg0KLSAkXHNpZ21hX3tcYmFye1h9fSQgOiBzaW1wYW5nYW4gYmFrdSAoc3RhbmRhcmQgZXJyb3IpIGRhcmkgbWVhbiBzYW1wZWwgJFxiYXJ7WH0kLg0KDQotICRcc2lnbWEkIDogc2ltcGFuZ2FuIGJha3UgcG9wdWxhc2kuDQoNCi0gJG4kIDogdWt1cmFuIHNhbXBlbC4NCg0KLSAkXHNxcnR7bn0kIDogYWthciBkYXJpIHVrdXJhbiBzYW1wZWwuDQoNClNlbWFraW4gYmVzYXIgJG4kLCAkXHNpZ21hX3tcYmFye1h9fSQgbWFraW4ga2VjaWwg4oaSIG1lYW4gc2FtcGVsIGFudGFyIHNhbXBlbCBtYWtpbiB0aWRhayDigJxsb25jYXQtbG9uY2F04oCdLg0KDQotLS0NCg0KKipDZW50cmFsIExpbWl0IFRoZW9yZW0gKENMVCkgdW50dWsgbWVhbjoqKiANCiQkDQpcYmFye1h9IFxhcHByb3ggTlxsZWZ0KFxtdSwgXGZyYWN7XHNpZ21hfXtcc3FydHtufX1ccmlnaHQpDQokJA0KDQoqKktldGVyYW5nYW46KioNCg0KLSAkXGJhcntYfSQgOiBtZWFuIHNhbXBlbC4NCg0KLSAkXGFwcHJveCBOKFxtdSwgXHNpZ21hIC8gXHNxcnR7bn0pJCA6IGtpcmEta2lyYSBiZXJkaXN0cmlidXNpIG5vcm1hbCBkZW5nYW4gbWVhbiAkXG11JCBkYW4gc2QgJFxkZnJhY3tcc2lnbWF9e1xzcXJ0e259fSQuDQoNCkNMVDogdW50dWsgJG4kIGN1a3VwIGJlc2FyLCBiZW50dWsgZGlzdHJpYnVzaSAkXGJhcntYfSQgYWthbiBtaXJpcCBrdXJ2YSBub3JtYWwsIG1lc2tpcHVuIGRpc3RyaWJ1c2kgZGF0YSBhc2xpbnlhIHRpZGFrIG5vcm1hbC4NCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCioqWi1zY29yZSB1bnR1ayBtZWFuOioqIA0KJCQNClogPSBcZnJhY3tcYmFye1h9IC0gXG11fXtcc2lnbWEgLyBcc3FydHtufX0NCiQkDQoNCioqS2V0ZXJhbmdhbjoqKg0KDQotICRaJCA6IHNrb3IgYmFrdSBkYXJpIG1lYW4gc2FtcGVsLg0KDQotICRcYmFye1h9JCA6IG1lYW4gc2FtcGVsIHlhbmcgZGlhbWF0aS4NCg0KLSAkXG11JCA6IG1lYW4gcG9wdWxhc2kuDQoNCi0gJFxzaWdtYSAvIFxzcXJ0e259JCA6IHN0YW5kYXJkIGVycm9yIG1lYW4uDQoNCkRpcGFrYWkgdW50dWsgbWVuZ3ViYWggJFxiYXJ7WH0kIGtlIHNrYWxhIHN0YW5kYXIsIGFnYXIgYmlzYSBwYWthaSB0YWJlbCBaIChub3JtYWwgYmFrdSkuDQoNCi0tLQ0KDQojICoqU0FNUExJTkcgRElTVFJJQlVUSU9OIG9mIHRoZSBTQU1QTEUgUFJPUE9SVElPTiAmIEJJTk9NSUFMKioNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmxpYnJhcnkodmVtYmVkcikNCg0KZW1iZWRfeW91dHViZSgiYzBtRkVMX1NXekUiKSB8Pg0KICB1c2VfYWxpZ24oImNlbnRlciIpDQpgYGANCg0KKipVbnR1ayBkYXRhIDAvMSAoc3Vrc2VzL2dhZ2FsKToqKg0KDQotICoqUG9wdWxhc2k6KioNCiAgLSBwcm9wb3JzaSBzdWtzZXMgPSAkcCQuDQoNCi0gKipTYW1wZWw6KioNCiAgLSBqdW1sYWggc3Vrc2VzID0gJFgkLA0KDQogIC0gcHJvcG9yc2kgc2FtcGVsOiAkJFxoYXR7cH0gPSBcZnJhY3tYfXtufSQkDQoNCioqS2V0ZXJhbmdhbjoqKg0KDQotICRcaGF0e3B9JCA6IHByb3BvcnNpIHNhbXBlbCAobWlzYWxueWEgMHssfTM3KS4NCg0KLSAkWCQgOiBqdW1sYWggc3Vrc2VzIGRpIHNhbXBlbCAobWlzYWwgMzcgb3JhbmcpLg0KDQotICRuJCA6IHVrdXJhbiBzYW1wZWwgKG1pc2FsIDEwMCBvcmFuZykuDQoNCi0tLQ0KDQoqKk1lYW4gZGlzdHJpYnVzaSBzYW1wbGluZyBwcm9wb3JzaToqKiANCiQkDQpcbXVfe1xoYXR7cH19ID0gcA0KJCQNCg0KKipLZXRlcmFuZ2FuOioqDQoNCi0gJFxtdV97XGhhdHtwfX0kIDogbWVhbiBkYXJpIGRpc3RyaWJ1c2kgc2FtcGxpbmcgcHJvcG9yc2kgc2FtcGVsLg0KDQotICRwJCA6IHByb3BvcnNpIGFzbGkgZGkgcG9wdWxhc2kuDQoNClJhdGEtcmF0YSBzZW11YSAkXGhhdHtwfSQgKGthbGF1IGFtYmlsIHNhbXBlbCBiZXJrYWxpLWthbGkpIGFrYW4gbWVuZGVrYXRpIHByb3BvcnNpIHBvcHVsYXNpICRwJC4NCg0KLS0tDQoNCioqU3RhbmRhcmQgZXJyb3IgcHJvcG9yc2k6KiogDQokJA0KXHNpZ21hX3tcaGF0e3B9fSA9IFxzcXJ0e1xmcmFje3AoMS1wKX17bn19DQokJA0KDQoqKktldGVyYW5nYW46KioNCg0KLSAkXHNpZ21hX3tcaGF0e3B9fSQgOiBzdGFuZGFyZCBlcnJvciBkYXJpICRcaGF0e3B9JC4NCg0KLSAkcCQgOiBwcm9wb3JzaSBzdWtzZXMgZGkgcG9wdWxhc2kuDQoNCi0gJDEgLSBwJCA6IHByb3BvcnNpIGdhZ2FsIGRpIHBvcHVsYXNpLg0KDQotICRuJCA6IHVrdXJhbiBzYW1wZWwuDQoNClNlbWFraW4gYmVzYXIgJG4kLCBzdGFuZGFyZCBlcnJvciBtYWtpbiBrZWNpbCDihpIgJFxoYXR7cH0kIGFudGFyIHNhbXBlbCBtYWtpbiBzdGFiaWwuDQoNCi0tLQ0KDQoqKlN5YXJhdCBDTFQgdW50dWsgcHJvcG9yc2k6KiogDQokJA0KbnAgXGdlIDEwIFxxdWFkIFx0ZXh0e2Rhbn0gXHF1YWQgbigxLXApIFxnZSAxMA0KJCQNCg0KKipLZXRlcmFuZ2FuOioqDQoNCi0gJG5wJCA6IGJhbnlha255YSBzdWtzZXMgeWFuZyBkaWhhcmFwa2FuIGRpIHNhdHUgc2FtcGVsLg0KDQotICRuKDEtcCkkIDogYmFueWFrbnlhIGdhZ2FsIHlhbmcgZGloYXJhcGthbiBkaSBzYXR1IHNhbXBlbC4NCg0KLSBLYWxhdSBkdWEtZHVhbnlhICRcZ2UgMTAkIOKGkiBkaXN0cmlidXNpICRcaGF0e3B9JCBjdWt1cCDigJxoYWx1c+KAnSB1bnR1ayBkaWRla2F0aSBub3JtYWwuDQoNCioqSmlrYSBzeWFyYXQgdGVycGVudWhpOioqDQokJA0KXGhhdHtwfSBcYXBwcm94IE5cbGVmdChwLFwgXHNxcnR7XGZyYWN7cCgxLXApfXtufX1ccmlnaHQpDQokJA0KDQotLS0NCg0KKipaLXNjb3JlIHVudHVrIHByb3BvcnNpOioqIA0KJCQNClogPSBcZnJhY3tcaGF0e3B9IC0gcH17XHNxcnR7XGZyYWN7cCgxLXApfXtufX19DQokJA0KDQoqKktldGVyYW5nYW46KioNCg0KLSAkXGhhdHtwfSQgOiBwcm9wb3JzaSBzYW1wZWwgeWFuZyBkaWFtYXRpLg0KDQotICRwJCA6IHByb3BvcnNpIHBvcHVsYXNpLg0KDQotICRcc3FydHtcZGZyYWN7cCgxLXApfXtufX0kIDogc3RhbmRhcmQgZXJyb3IgcHJvcG9yc2kuDQoNCi0gJFokIDogc2tvciBiYWt1IHByb3BvcnNpLg0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KKipIdWJ1bmdhbiBkZW5nYW4gYmlub21pYWw6KioNCg0KJCQNClggXHNpbSBcdGV4dHtCaW5vbWlhbH0obiwgcCkNCiQkDQoNCiQkDQpQKFggPSBrKSA9IFxiaW5vbXtufXtrfSBwXntrfSAoMSAtIHApXntuLWt9DQokJA0KDQoqKktldGVyYW5nYW46KioNCg0KLSAkWCQgOiBqdW1sYWggc3Vrc2VzIGRhbGFtICRuJCBwZXJjb2JhYW4uDQoNCi0gJFx0ZXh0e0Jpbm9taWFsfShuLCBwKSQgOiBkaXN0cmlidXNpIGJpbm9taWFsIGRlbmdhbiBwYXJhbWV0ZXIgJG4kIGRhbiAkcCQuDQoNCi0gJFAoWCA9IGspJCA6IHBlbHVhbmcgdGVwYXQgJGskIHN1a3Nlcy4NCg0KLSAkXGJpbm9te259e2t9JCA6IGJhbnlha255YSBjYXJhIG1lbWlsaWggJGskIHN1a3NlcyBkYXJpICRuJCBwZXJjb2JhYW4uDQoNCkthcmVuYSAkXGhhdHtwfSA9IFxkZnJhY3tYfXtufSQsIHNpZmF0ICRcaGF0e3B9JCB0dXJ1biBkYXJpIHNpZmF0IGJpbm9taWFsIGluaS4NCg0KVW50dWsgJG4kIGtlY2lsIOKGkiBwYWthaSBiaW5vbWlhbCAoZXhhY3QpLg0KDQpVbnR1ayAkbiQgYmVzYXIg4oaSIGJpYXNhbnlhIHBha2FpIHBlbmRla2F0YW4gbm9ybWFsIChDTFQpIGthcmVuYSBsZWJpaCBwcmFrdGlzLg0KDQotLS0NCg0KIyAqKlJBTkdLVU1BTioqDQoNCjEuICoqRGlza3JpdCoqICRccmlnaHRhcnJvdyQgcGFrYWkgUE1GIGRhbiAicGVsdWFuZyBkaSB0aXRpayI6ICRQKFggPSB4KSQuDQoNCjIuICoqS29udGludSoqICRccmlnaHRhcnJvdyQgcGFrYWkgUERGIGRhbiAicGVsdWFuZyBkaSBpbnRlcnZhbCI6ICQkDQogICAgUChhIFxsZSBYIFxsZSBiKSA9IFxpbnRfYV5iIGYoeClcLGR4Lg0KICAgICQkDQoNCjMuICoqRGFyaSBQREYsIGtpdGEgYmlzYSBiaWtpbiBDREYqKjogJCQNCiAgICBGKHgpID0gUChYIFxsZSB4KS4NCiAgICAkJA0KDQo0LiAqKlBvcHVsYXNpIHZzIHNhbXBlbCoqICRccmlnaHRhcnJvdyQga2l0YSBwYWthaSBzdGF0aXN0aWsgKCRcYmFyIFgsIFxoYXQgcCQpIHVudHVrIG1lbmViYWsgcGFyYW1ldGVyICgkXG11LCBwJCkuDQoNCjUuICoqU2FtcGxpbmcgZGlzdHJpYnV0aW9uKiogbWVuamVsYXNrYW4gYmFnYWltYW5hICRcYmFyIFgkIGRhbiAkXGhhdCBwJCBiZXJ1YmFoLXViYWggZGFyaSBzYW1wZWwga2Ugc2FtcGVsLg0KDQo2LiAqKkNMVCoqOg0KDQotICAgdW50dWsgJG4kIGN1a3VwIGJlc2FyLCAkXGJhciBYJCBkYW4gJFxoYXQgcCQga2lyYS1raXJhIGJlcmRpc3RyaWJ1c2kgbm9ybWFsDQoNCi0gZGVuZ2FuIHN0YW5kYXJkIGVycm9yIHlhbmcgYmVyZ2FudHVuZyBwYWRhICRcc2lnbWEkIGF0YXUgJHAkIGRhbiAkbiQ6ICQkDQogICAgXGJhciBYIFxhcHByb3ggTlwhXGxlZnQoXG11LCBcZnJhY3tcc2lnbWFeMn17bn1ccmlnaHQpLCBccXF1YWQNCiAgICBcaGF0IHAgXGFwcHJveCBOXCFcbGVmdChwLCBcZnJhY3twKDEtcCl9e259XHJpZ2h0KS4NCiAgICAkJA0KDQo3LiAqKkJpbm9taWFsKiogYWRhbGFoIGNhcmEgXHRleHRpdHtleGFjdH0gdW50dWsganVtbGFoIHN1a3NlcywgdGFwaSB1bnR1ayAkbiQgYmVzYXIga2l0YSBzZXJpbmcgcGFrYWkgbm9ybWFsIGFwcHJveGltYXRpb24gKHBha2FpICRaJCkga2FyZW5hIGxlYmloIHNpbXBsZS4NCg0KLS0tDQoNCiMgKipSRUZFUkVOU0kqKg0KDQotICoqU2lyZWdhciwgQi4gKHQudC4pLioqIEludHJvZHVjdGlvbiB0byBTdGF0aXN0aWNzOiBBIERhdGEgU2NpZW5jZSBQZXJzcGVjdGl2ZSB3aXRoIFIuIEJvb2tkb3duLiBCYWdpYW4gdGVudGFuZyBwcm9iYWJpbGl0eSBkaXN0cmlidXRpb25zLCByYW5kb20gdmFyaWFibGVzIGtvbnRpbnUsIGRhbiBzYW1wbGluZyBkaXN0cmlidXRpb25zLiBEaWFrc2VzIGRhcmk6IDxodHRwczovL2Jvb2tkb3duLm9yZy9kc2NpZW5jZWxhYnMvaW50cm9fc3RhdGlzdGljcy8+DQoNCi0gKipPcGVuU3RheC4gKDIwMjMpLioqIEludHJvZHVjdG9yeSBTdGF0aXN0aWNzICgybmQgZWQuKS4gT3BlblN0YXguIEJhYiBkaXN0cmlidXNpIHBldWJhaCBhY2FrLCBDZW50cmFsIExpbWl0IFRoZW9yZW0sIGRhbiBzYW1wbGluZyBkaXN0cmlidXRpb24gKHRlcnV0YW1hIENoYXB0ZXIgNykuDQoNCi0gKipEaWV6LCBELiBNLiwgw4dldGlua2F5YS1SdW5kZWwsIE0uLCAmIEJhcnIsIEMuIEQuICgyMDE5KS4qKiBPcGVuSW50cm8gU3RhdGlzdGljcyAoNHRoIGVkLikuIE9wZW5JbnRyby4gQmFiIGRpc3RyaWJ1dGlvbnMgb2YgcmFuZG9tIHZhcmlhYmxlcyBkYW4gZm91bmRhdGlvbnMgZm9yIGluZmVyZW5jZSAoc2FtcGxpbmcgZGlzdHJpYnV0aW9uLCBDTFQsIHNhbXBsZSBtZWFuICYgc2FtcGxlIHByb3BvcnRpb24pLg0KDQotICoqU2hhZmVyLCBELiwgJiBaaGFuZywgSi4gKHQudC4pLioqIEludHJvZHVjdG9yeSBTdGF0aXN0aWNzLiBMaWJyZVRleHRzLiBCYWdpYW4gY29udGludW91cyByYW5kb20gdmFyaWFibGVzLCBwcm9iYWJpbGl0eSBkZW5zaXR5IGZ1bmN0aW9uIChQREYpLCBjdW11bGF0aXZlIGRpc3RyaWJ1dGlvbiBmdW5jdGlvbiAoQ0RGKSwgZGFuIHBlbmdhbnRhciBzYW1wbGluZyBkaXN0cmlidXRpb25zLg0KDQotICoqSG9nZywgUi4gVi4sIFRhbmlzLCBFLiBBLiwgJiBaaW1tZXJtYW4sIEQuIEwuICgyMDE5KS4qKiBQcm9iYWJpbGl0eSBhbmQgU3RhdGlzdGljYWwgSW5mZXJlbmNlICgxMHRoIGVkLikuIFBlYXJzb24uIFJlZmVyZW5zaSB0ZW9yaSB1bnR1ayBkaXNjcmV0ZSB2cyBjb250aW51b3VzIHJhbmRvbSB2YXJpYWJsZXMsIFBERi9DREYsIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiBvZiAkXGJhciBYJCwgc2FtcGxlIHByb3BvcnRpb24sIGRhbiBDTFQuDQoNCi0gKipLaGFuIEFjYWRlbXkuICh0LnQuKS4qKiBTYW1wbGluZyBkaXN0cmlidXRpb25zICYgQ2VudHJhbCBsaW1pdCB0aGVvcmVtLiBVbml0IG9ubGluZSB5YW5nIG1lbmplbGFza2FuIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc2FtcGxlIG1lYW4gZGFuIHNhbXBsZSBwcm9wb3J0aW9uLCBzeWFyYXQgJG5wIFxnZSAxMCQsIGRhbiBwZW5lcmFwYW4gQ0xUIHNlY2FyYSBpbnR1aXRpZi4NCg0KRGlub3YsIEkuIEQuLCBDaHJpc3RvdSwgTi4sICYgU2FuY2hleiwgSi4gKDIwMDgpLiBDZW50cmFsIExpbWl0IFRoZW9yZW06IE5ldyBTT0NSIEFwcGxldCBhbmQgRGVtb25zdHJhdGlvbiBBY3Rpdml0eS4gSm91cm5hbCBvZiBTdGF0aXN0aWNzIEVkdWNhdGlvbi4gQXJ0aWtlbCBqdXJuYWwgeWFuZyBtZW1iYWhhcyBzaW11bGFzaSBDTFQgZGFuIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbnMgdW50dWsgbWVtYmFudHUgcGVtYWhhbWFuIHZpc3VhbC4NCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiMjICoqUmVmZXJlbnNpIFZpZGVvIChZb3VUdWJlKSoqDQoNCi0gU2ltcGxlIExlYXJuaW5nIFByby4gKHQudC4pLiBTZXJpIHZpZGVvIFByb2JhYmlsaXR5IERpc3RyaWJ1dGlvbnMgJiBTYW1wbGluZyBEaXN0cmlidXRpb25zICg3LjHigJM3LjUpIFtWaWRlb10uIFlvdVR1YmUuDQogICAtIEludHJvZHVjdGlvbiB0byB0aGUgUHJvYmFiaWxpdHkgb2YgQ29udGludW91cyBWYXJpYWJsZXMgKDcuMSkgPGh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9WnlVelJWYTZoQ00+DQoNCiAgIC0gU2FtcGxpbmcgRGlzdHJpYnV0aW9ucyAoNy4yKSA8aHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj03UzdqNzVkM0dNND4NCg0KICAgLSBUaGUgQ2VudHJhbCBMaW1pdCBUaGVvcmVtICg3LjMpIDxodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PWl2ZDh3RUhuTUNnPg0KDQogICAtIFNhbXBsaW5nIERpc3RyaWJ1dGlvbiBvZiB0aGUgU2FtcGxlIFByb3BvcnRpb24gKDcuNCkgPGh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9cTJlNG1LMEZUYnc+DQoNCiAgIC0gUmV2aWV3OiBTYW1wbGluZyBEaXN0cmlidXRpb24gb2YgdGhlIFNhbXBsZSBQcm9wb3J0aW9uLCBCaW5vbWlhbCBEaXN0cmlidXRpb24sIFByb2JhYmlsaXR5ICg3LjUpIDxodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PWMwbUZFTF9TV3pFPg0KDQo8c2NyaXB0Pg0KZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsIGZ1bmN0aW9uKCkgew0KDQogIHZhciBib2R5ID0gZG9jdW1lbnQuYm9keTsNCg0KICAvKiA9PT09PT0gU1RBUlQ6IFNJREVCQVIgT1RPTUFUSVMgS0VUVVRVUCA9PT09PT0gKi8NCiAgLy8gcGFzIHBlcnRhbWEga2FsaSBoYWxhbWFuIHNlbGVzYWkgZGktbG9hZCwgbGFuZ3N1bmcgbW9kZSAiY29sbGFwc2VkIg0KICBib2R5LmNsYXNzTGlzdC5hZGQoInNpZGViYXItY29sbGFwc2VkIik7DQogIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLw0KDQogIC8vID09PT0gVE9HR0xFIFNJREVCQVIgKEhBTUJVUkdFUikgPT09PQ0KICB2YXIgbWVudUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzaWRlYmFyLXRvZ2dsZSIpOw0KICBpZiAobWVudUJ0bikgew0KICAgIG1lbnVCdG4uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbiAoKSB7DQogICAgICAvLyBrbGlrID0gYnVrYSAvIHR1dHVwIGFyZWEgDQogICAgICBib2R5LmNsYXNzTGlzdC50b2dnbGUoInNpZGViYXItY29sbGFwc2VkIik7DQogICAgfSk7DQogIH0NCg0KICAvLyA9PT09IFRPR0dMRSBMSUdIVCAvIERBUksgTU9ERSA9PT09DQogIHZhciBtb2RlQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm1vZGUtdG9nZ2xlIik7DQogIGlmIChtb2RlQnRuKSB7DQoNCiAgICAvLyBjb2JhIGJhY2EgbW9kZSB5YW5nIGRpc2ltcGFuIChrYWxhdSBhZGEpDQogICAgdmFyIHNhdmVkTW9kZSA9IG51bGw7DQogICAgdHJ5IHsNCiAgICAgIHNhdmVkTW9kZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCJudXJ1bC10aGVtZS1tb2RlIik7DQogICAgfSBjYXRjaCAoZSkgew0KICAgICAgc2F2ZWRNb2RlID0gbnVsbDsNCiAgICB9DQogICAgaWYgKHNhdmVkTW9kZSA9PT0gImRhcmsiKSB7DQogICAgICBib2R5LmNsYXNzTGlzdC5hZGQoImRhcmstbW9kZSIpOw0KICAgIH0NCg0KICAgIG1vZGVCdG4uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbiAoKSB7DQogICAgICBib2R5LmNsYXNzTGlzdC50b2dnbGUoImRhcmstbW9kZSIpOw0KICAgICAgdHJ5IHsNCiAgICAgICAgdmFyIGlzRGFyayA9IGJvZHkuY2xhc3NMaXN0LmNvbnRhaW5zKCJkYXJrLW1vZGUiKTsNCiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oIm51cnVsLXRoZW1lLW1vZGUiLCBpc0RhcmsgPyAiZGFyayIgOiAibGlnaHQiKTsNCiAgICAgIH0gY2F0Y2ggKGUpIHsNCiAgICAgICAgLy8ga2FsYXUgbG9jYWxTdG9yYWdlIG5nZ2FrIGJpc2EsIGRpZW0gYWphDQogICAgICB9DQogICAgfSk7DQogIH0NCg0KfSk7DQo8L3NjcmlwdD4NCmBgYA0K