Probability of distribution

tugas 11

1 Pendahuluan – Probability Distribution

Probability distribution adalah konsep fundamental dalam statistika yang menggambarkan bagaimana kemungkinan suatu nilai pada variabel acak tersebar. Distribusi ini memberikan informasi mengenai nilai-nilai apa saja yang mungkin muncul serta seberapa besar peluang kemunculannya. Dengan memahami bentuk dan karakteristik distribusi probabilitas, kita dapat menganalisis pola data, melakukan perhitungan probabilitas, dan membuat prediksi yang lebih akurat.

2 Countinous Random - Variabel acak kontinu

Variabel Acak Kontinu

Variabel acak kontinu adalah variabel acak yang dapat mengambil tak hingga banyak nilai dalam suatu interval pada garis bilangan real. Nilai-nilai tersebut bersifat kontinu, sehingga peluang tidak dihitung dari satu titik tertentu, tetapi dari luas area di bawah kurva fungsi densitas probabilitas (Probability Density Function/PDF) pada interval tertentu.

2.1 Definisi Formal

Jika \(X\) adalah variabel acak kontinu dengan fungsi densitas probabilitas \(f(x)\), maka:

\[ P(a \le X \le b) = \int_{a}^{b} f(x)\, dx \]

Untuk menjadi fungsi densitas yang valid, harus memenuhi:

\[ f(x) \ge 0 \quad \text{untuk seluruh } x \]

\[ \int_{-\infty}^{\infty} f(x)\, dx = 1 \]

2.2 Variabel Acak Diskrit dan Kontinu

2.2.1 Variabel Acak Diskrit

Variabel yang hanya dapat mengambil nilai tertentu  

(misal: jumlah anak, lemparan dadu).

2.2.2 Variabel Acak Kontinu

Variabel yang dapat mengambil nilai pada suatu rentang tertentu
(misal: tinggi badan, waktu, berat badan).


2.3 Probability Mass Function (PMF)

PMF digunakan untuk variabel acak **diskrit**.  

PMF memberikan probabilitas untuk setiap nilai spesifik \(X = x\).

Sifat PMF: - \(P(X = x) \ge 0\) - \(\sum P(X = x) = 1\)

Contoh distribusi diskrit:

  • Binomial
  • Bernoulli
  • Poisson

2.4 Probability Density Function (PDF)

PDF digunakan untuk variabel acak **kontinu**.  

Probabilitas ditentukan sebagai luas area di bawah kurva PDF.

Sifat PDF:

  • \(f(x) \ge 0\)
  • \(\int_{-\infty}^{\infty} f(x) dx = 1\)

Probabilitas: \[ P(a < X < b) = \int_{a}^{b} f(x)\,dx \]

Contoh distribusi kontinu:

  • Normal
  • Uniform
  • Eksponensial

2.5 Cumulative Distribution Function (CDF)

CDF memberikan probabilitas bahwa variabel acak bernilai  

kurang dari atau sama dengan suatu nilai \(x\):

\[
  F(x) = P(X \le x)
  \]

Sifat CDF:

  • Selalu meningkat
  • Nilainya antara 0 sampai 1

2.6 Distribusi Umum

2.6.1 Normal Distribution

- Berbentuk lonceng (*bell-shaped*)  
  • Simetris terhadap mean
  • Parameter: mean (\(\mu\)) dan standar deviasi (\(\sigma\))

2.6.2 Uniform Distribution

  • Semua nilai dalam interval memiliki probabilitas yang sama
  • PDF konstan pada interval tersebut

2.6.3 Exponential Distribution

  • Model untuk waktu tunggu

  • Memiliki sifat memoryless


3 Sampling Distribution - Distribusi Sampel

3.1 Perbedaan Tiga Jenis Distribusi

3.1.1 Distribusi Populasi

Data yang digambarkan:
Mengukur semua individu dalam suatu populasi penuh
(contoh: tinggi 10.000 orang).

Statistik kunci:
- Rata-rata populasi: \(\mu\)
- Simpangan baku populasi: \(\sigma\)


3.1.2 Distribusi Sampel

Data yang digambarkan:
Mengukur semua individu dalam satu sampel yang diambil dari populasi.

Statistik kunci:
- Rata-rata sampel: \(\bar{x}\)


3.1.3 Distribusi Sampling (Sampling Distribution)

Data yang digambarkan:
Mengukur statistik (misalnya, \(\bar{x}\)) dari banyak sampel acak yang diambil berulang dari populasi yang sama.

Statistik kunci:
- Rata-rata distribusi sampling: \(\mu_{\bar{x}}\)
- Standard Error (SE): \(\sigma_{\bar{x}}\)


3.2 Karakteristik Kunci Distribusi Sampling

3.2.1 ata-rata Distribusi Sampling

Distribusi sampling memiliki rata-rata:

\[ \mu_{\bar{x}} = \mu \]

Artinya, rata-rata dari rata-rata sampel selalu sama dengan rata-rata populasi.


3.2.2 standard Error (SE)

Variabilitas rata-rata sampel disebut Standard Error, dan selalu lebih kecil dari simpangan baku populasi.

\[ \sigma_{\bar{x}} = \frac{\sigma}{\sqrt{n}} \]

di mana:
- \(\sigma\) = simpangan baku populasi
- \(n\) = ukuran sampel

Semakin besar ukuran sampel → SE semakin kecil → rata-rata sampel semakin stabil.


3.2.3 Bentuk Distribusi

Menurut Central Limit Theorem (CLT):

Ketika ukuran sampel cukup besar, distribusi sampling dari \(\bar{x}\) akan mendekati Distribusi Normal,
meskipun populasi asal tidak normal.

Visual bentuknya adalah kurva lonceng (bell-shaped).


3.3 Penerapan Rumus Z-Score pada Distribusi Sampling

Ketika menghitung probabilitas rata-rata sampel, kita menggunakan rumus Z yang sudah disesuaikan, yaitu mengganti \(\sigma\) dengan Standard Error \(\sigma_{\bar{x}}\):

\[ Z = \frac{\bar{x} - \mu}{\sigma / \sqrt{n}} \]

Rumus ini digunakan untuk menghitung probabilitas nilai rata-rata sampel tertentu, sehingga kita bisa memahami karakteristik populasi tanpa harus mengukur seluruh populasi.

4 Central Limit Theorem - Teorema Limit Pusat (CLT)

4.1 Inti dari Central Limit Theorem (CLT)

Central Limit Theorem (CLT) menyatakan bahwa:

Jika kita mengambil sampel acak berukuran cukup besar secara berulang dari populasi apa pun, maka distribusi rata-rata sampel \({X}\) akan mendekati Distribusi Normal — terlepas dari bentuk populasi aslinya.

4.1.1 Rumus Inti Distribusi Sampling Rata-rata

Distribusi rata-rata sampel:

\[ \bar{X} \sim N\left(\mu,\; \frac{\sigma}{\sqrt{n}}\right) \]

Dengan: - \(\) = mean populasi
- \(\) = standar deviasi populasi
- \(n\) = ukuran sampel


4.2 turan Umum Ukuran Sampel (n)

Kapan CLT bekerja dengan baik?

  • CLT biasanya dianggap valid apabila:

\[ n \ge 30 \]

Jika n < 30, maka distribusi sampling rata-rata masih dapat bias dan belum mendekati normal, terutama jika populasi awal sangat miring (skewed).


4.3 Signifikansi CLT

CLT sangat penting dalam statistika karena:

  • Memungkinkan penggunaan Distribusi Normal untuk banyak prosedur inferensi.
  • Membantu menghitung Z-score untuk rata-rata sampel:

\[ Z = \frac{\bar{X} - \mu}{\sigma / \sqrt{n}} \]

  • Memberikan dasar bagi banyak teknik inferensi modern (uji hipotesis, confidence interval, dsb).

4.4 Ilustrasi Grafik PDF vs CDF — Distribusi Normal

4.4.1 🔹 Plot PDF (Probability Density Function)

x <- seq(-4, 4, length = 400)
y <- dnorm(x, mean = 0, sd = 1)

plot(x, y, type = "l", lwd = 3,
     main = "PDF (Probability Density Function)",
     xlab = "x", ylab = "f(x)")

x <- seq(-4, 4, length = 400)
y <- pnorm(x, mean = 0, sd = 1)

plot(x, y, type = "l", lwd = 3,
main = "CDF (Cumulative Distribution Function)",
xlab = "x", ylab = "F(x)")

5 Sample Propotion

5.1 Karakteristik Distribusi Sampling Proporsi Sampel ()

Distribusi Sampling dari proporsi sampel () akan mendekati Distribusi Normal apabila ukuran sampel cukup besar.
Karakteristik utamanya adalah sebagai berikut:


5.1.1 Rata-Rata (Mean)

\[ \mu_{\hat{P}} = P \]

Artinya, nilai tengah dari semua proporsi sampel () sama dengan proporsi populasi (P).


5.1.2 Standard Error (SE)

\[ \sigma_{\hat{P}} = \sqrt{\frac{P(1-P)}{n}} \]

Standard Error menunjukkan seberapa besar variasi antar sampel.


5.1.3 Z-Score Untuk Proporsi Sampel

\[ Z = \frac{\hat{P} - P}{\sigma_{\hat{P}}} \]

Rumus ini digunakan untuk menghitung probabilitas bahwa berada pada jarak tertentu dari P, selama Distribusi Sampling berdistribusi Normal.



5.2 Kondisi Penerapan CLT (Normalitas)

Agar dapat diasumsikan Normal dan bisa memakai rumus Z-Score, perlu dipenuhi dua syarat utama berikut:


5.2.1 Jumlah Keberhasilan Minimal

\[ n \cdot P \ge 10 \]

5.2.2 Jumlah Kegagalan Minimal

\[ n \cdot (1 - P) \ge 10 \]

Jika kedua syarat terpenuhi → Distribusi Sampling dianggap Normal dan analisis probabilitas dengan Z-Score dapat digunakan.


5.3 Tujuan Utama

Materi ini menjelaskan bagaimana statistik digunakan untuk mengestimasi Proporsi Populasi (P)
(misal: persentase siswa yang suka matematika, persen orang bermata hijau, dll.)
berdasarkan Proporsi Sampel (P̂) yang diperoleh dari pengambilan sampel berulang.

Estimasi ini menjadi dasar dalam inferensi statistik untuk proporsi.


6 Review Sampling Distribution - Tinjauan Distribusi Sampel

6.1 Probabilitas Sederhana / Ruang Sampel

Digunakan ketika jumlah percobaan sangat kecil sehingga semua kemungkinan hasil dapat dituliskan secara eksplisit.


6.1.1 🔹 Kapan Digunakan

  • Cocok untuk percobaan kecil, misalnya \(n = 3\).

6.1.2 🔹 Metode

  • Menyusun seluruh kemungkinan hasil (ruang sampel).
  • Menghitung peluang dari hasil yang diinginkan.

6.1.3 🔹 Kelemahan

  • Tidak efisien ketika \(n\) menjadi besar, karena jumlah kemungkinan meningkat sangat cepat.


6.2 Distribusi Binomial

Distribusi Binomial digunakan untuk menghitung probabilitas sejumlah keberhasilan tertentu dalam percobaan berulang.


6.2.1 🔹 Kapan Digunakan

  • Ketika jumlah percobaan kecil–sedang, misalnya \(n = 5\).

6.2.2 🔹 Metode

Menggunakan rumus probabilitas Binomial: \[ P(X = k) = \binom{n}{k} p^k (1-p)^{n-k} \]

6.2.3 🔹 Kelemahan

  • Jika \(n\) sangat besar (contoh: \(n = 100\)) dan pertanyaannya berupa rentang probabilitas seperti “minimal k”,
    maka rumus harus dihitung berkali-kali → tidak efisien.


6.3 Distribusi Sampling Proporsi Sampel (Menggunakan CLT)

Ketika ukuran sampel besar, proporsi sampel () dapat diperlakukan seolah-olah berdistribusi Normal menggunakan CLT.


6.3.1 🔹 Kapan Digunakan

  • Untuk jumlah percobaan yang sangat besar, misalnya \(n = 100\).

6.3.2 🔹 Asumsi Kunci

Mengandalkan Teorema Limit Pusat (CLT) sehingga Distribusi Sampling dari mendekati Normal.


6.3.3 🔹 Syarat Normalitas

Harus memenuhi dua kondisi: \[ n \cdot P \ge 10 \] \[ n \cdot (1-P) \ge 10 \]

Jika terpenuhi → distribusi dianggap Normal.


6.3.4 🔹 Perhitungan

Menggunakan Z-Score untuk proporsi: \[ Z = \frac{\hat{P} - P}{\sqrt{\frac{P(1-P)}{n}}} \]

Probabilitas dihitung menggunakan tabel Z atau fungsi Normal.


6.3.5 🔹 Interpretasi

Metode ini memberikan probabilitas pendekatan (approximate) yang:

  • Sangat akurat
  • Paling efisien
  • Ideal untuk dataset besar

7 Kesimpulan

library(knitr)
library(kableExtra)
## Warning: package 'kableExtra' was built under R version 4.5.2
summary_table <- data.frame(
  Bagian = c(
    "1. Probability Distribution",
    "2. Variabel Acak",
    "3. Distribusi Umum",
    "4. Distribusi Sampling",
    "5. Central Limit Theorem",
    "6. Sampling Distribution untuk Proporsi"
  ),
  Ringkasan = c(
    "Menjelaskan bagaimana probabilitas tersebar pada suatu variabel acak, baik diskrit (PMF) maupun kontinu (PDF).",
    "Variabel acak diskrit memiliki nilai tertentu; kontinu memiliki rentang nilai tak terhingga.",
    "Contoh umum: Normal, Uniform, Exponential, Binomial.",
    "Distribusi statistik dari banyak sampel; rata-rata mendekati populasi dengan Standard Error.",
    "Rata-rata sampel mendekati Normal jika n ≥ 30 menurut CLT.",
    "Proporsi sampel Normal jika nP ≥ 10 dan n(1−P) ≥ 10."
  )
)

summary_table %>%
  kable("html", col.names = c("Bagian", "Ringkasan")) %>%
  kable_styling(
    bootstrap_options = c("striped", "hover", "condensed", "responsive"),
    full_width = FALSE,
    position = "center"
  ) %>%
  column_spec(1, bold = TRUE) %>%
  column_spec(2)
Bagian Ringkasan
  1. Probability Distribution
Menjelaskan bagaimana probabilitas tersebar pada suatu variabel acak, baik diskrit (PMF) maupun kontinu (PDF).
  1. Variabel Acak
Variabel acak diskrit memiliki nilai tertentu; kontinu memiliki rentang nilai tak terhingga.
  1. Distribusi Umum
Contoh umum: Normal, Uniform, Exponential, Binomial.
  1. Distribusi Sampling
Distribusi statistik dari banyak sampel; rata-rata mendekati populasi dengan Standard Error.
  1. Central Limit Theorem
Rata-rata sampel mendekati Normal jika n ≥ 30 menurut CLT.
  1. Sampling Distribution untuk Proporsi
Proporsi sampel Normal jika nP ≥ 10 dan n(1−P) ≥ 10.

8 Referensi

Sheldon Ross. A First Course in Probabilit. Stat Trek. (n.d.). Sampling Distributions.

LS0tDQp0aXRsZTogIlByb2JhYmlsaXR5IG9mIGRpc3RyaWJ1dGlvbiINCnN1YnRpdGxlOiAidHVnYXMgMTEiDQphdXRob3I6DQotICAgIkZyaXp6eSBMaXRobWVudHN5YWggKDUyMjUwMDYyKSINCg0KZGF0ZTogImByIGZvcm1hdChTeXMuRGF0ZSgpLCAnJUIgJWQsICVZJylgIg0Kb3V0cHV0Og0KICBybWRmb3JtYXRzOjpyZWFkdGhlZG93bjoNCiAgICBzZWxmX2NvbnRhaW5lZDogdHJ1ZQ0KICAgIHRodW1ibmFpbHM6IHRydWUNCiAgICBsaWdodGJveDogdHJ1ZQ0KICAgIGdhbGxlcnk6IHRydWUNCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUNCiAgICBsaWJfZGlyOiBsaWJzDQogICAgZGZfcHJpbnQ6ICJwYWdlZCINCiAgICBjb2RlX2ZvbGRpbmc6ICJzaG93Ig0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KLS0tDQo8ZGl2IGNsYXNzPSJpbWctY29udGFpbmVyIj4NCiAgPGltZyBzcmM9IkM6L1VzZXJzL2ZyaXp6eS9EZXNrdG9wL3N0YXRpcyByYW5na3VtYW4vZm90b2dudGcuanBlZyI+DQo8L2Rpdj4NCg0KPHN0eWxlPg0KLmltZy1jb250YWluZXIgew0KICB3aWR0aDogMTAwJTsNCiAgZGlzcGxheTogZmxleDsNCiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7DQogIG1hcmdpbjogMjBweCAwOw0KfQ0KDQouaW1nLWNvbnRhaW5lciBpbWcgew0KICB3aWR0aDogMjgwcHg7DQogIGJvcmRlci1yYWRpdXM6IDE4cHg7DQogIGJveC1zaGFkb3c6IDBweCA1cHggMThweCByZ2JhKDAsIDAsIDAsIDAuMTgpOw0KICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4zcyBlYXNlLCBib3gtc2hhZG93IDAuM3MgZWFzZTsNCn0NCg0KLmltZy1jb250YWluZXIgaW1nOmhvdmVyIHsNCiAgdHJhbnNmb3JtOiBzY2FsZSgxLjA1KTsNCiAgYm94LXNoYWRvdzogMHB4IDhweCAyNXB4IHJnYmEoMCwgMCwgMCwgMC4yNSk7DQp9DQo8L3N0eWxlPg0KDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQ0KYGBgDQoNCiMgIFBlbmRhaHVsdWFuIOKAkyBQcm9iYWJpbGl0eSBEaXN0cmlidXRpb24NCg0KICBQcm9iYWJpbGl0eSBkaXN0cmlidXRpb24gYWRhbGFoIGtvbnNlcCBmdW5kYW1lbnRhbCBkYWxhbSBzdGF0aXN0aWthIHlhbmcgbWVuZ2dhbWJhcmthbiBiYWdhaW1hbmEga2VtdW5na2luYW4gc3VhdHUgbmlsYWkgcGFkYSB2YXJpYWJlbCBhY2FrIHRlcnNlYmFyLiBEaXN0cmlidXNpIGluaSBtZW1iZXJpa2FuIGluZm9ybWFzaSBtZW5nZW5haSBuaWxhaS1uaWxhaSBhcGEgc2FqYSB5YW5nIG11bmdraW4gbXVuY3VsIHNlcnRhIHNlYmVyYXBhIGJlc2FyIHBlbHVhbmcga2VtdW5jdWxhbm55YS4gRGVuZ2FuIG1lbWFoYW1pIGJlbnR1ayBkYW4ga2FyYWt0ZXJpc3RpayBkaXN0cmlidXNpIHByb2JhYmlsaXRhcywga2l0YSBkYXBhdCBtZW5nYW5hbGlzaXMgcG9sYSBkYXRhLCBtZWxha3VrYW4gcGVyaGl0dW5nYW4gcHJvYmFiaWxpdGFzLCBkYW4gbWVtYnVhdCBwcmVkaWtzaSB5YW5nIGxlYmloIGFrdXJhdC4NCg0KIyBDb3VudGlub3VzIFJhbmRvbSAtIFZhcmlhYmVsIGFjYWsga29udGludQ0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCmtuaXRyOjppbmNsdWRlX3VybCgiaHR0cHM6Ly93d3cueW91dHViZS5jb20vZW1iZWQvWnlVelJWYTZoQ00iKQ0KYGBgDQoNCiAgDQo+ICMjIFZhcmlhYmVsIEFjYWsgS29udGludSAgDQo+IFZhcmlhYmVsIGFjYWsga29udGludSBhZGFsYWggdmFyaWFiZWwgYWNhayB5YW5nIGRhcGF0IG1lbmdhbWJpbCB0YWsgaGluZ2dhIGJhbnlhayBuaWxhaSBkYWxhbSBzdWF0dSBpbnRlcnZhbCBwYWRhIGdhcmlzIGJpbGFuZ2FuIHJlYWwuIE5pbGFpLW5pbGFpIHRlcnNlYnV0IGJlcnNpZmF0IGtvbnRpbnUsIHNlaGluZ2dhIHBlbHVhbmcgdGlkYWsgZGloaXR1bmcgZGFyaSBzYXR1IHRpdGlrIHRlcnRlbnR1LCB0ZXRhcGkgZGFyaSBsdWFzIGFyZWEgZGkgYmF3YWgga3VydmEgZnVuZ3NpIGRlbnNpdGFzIHByb2JhYmlsaXRhcyAoUHJvYmFiaWxpdHkgRGVuc2l0eSBGdW5jdGlvbi9QREYpIHBhZGEgaW50ZXJ2YWwgdGVydGVudHUuDQoNCg0KIyMgRGVmaW5pc2kgRm9ybWFsDQogIA0KICBKaWthIFwoWFwpIGFkYWxhaCB2YXJpYWJlbCBhY2FrIGtvbnRpbnUgZGVuZ2FuIGZ1bmdzaSBkZW5zaXRhcyBwcm9iYWJpbGl0YXMgXChmKHgpXCksIG1ha2E6DQogIA0KICBcWw0KICAgIFAoYSBcbGUgWCBcbGUgYikgPSBcaW50X3thfV57Yn0gZih4KVwsIGR4DQogICAgXF0NCg0KVW50dWsgbWVuamFkaSBmdW5nc2kgZGVuc2l0YXMgeWFuZyB2YWxpZCwgaGFydXMgbWVtZW51aGk6DQogIA0KICBcWw0KICAgIGYoeCkgXGdlIDAgXHF1YWQgXHRleHR7dW50dWsgc2VsdXJ1aCB9IHgNCiAgICBcXQ0KDQpcWw0KICBcaW50X3stXGluZnR5fV57XGluZnR5fSBmKHgpXCwgZHggPSAxDQogIFxdDQoNCiANCiMjICBWYXJpYWJlbCBBY2FrIERpc2tyaXQgZGFuIEtvbnRpbnUNCiAgICANCiMjIyBWYXJpYWJlbCBBY2FrIERpc2tyaXQNCiAgICBWYXJpYWJlbCB5YW5nIGhhbnlhIGRhcGF0IG1lbmdhbWJpbCBuaWxhaSB0ZXJ0ZW50dSAgDQogIChtaXNhbDogKmp1bWxhaCBhbmFrKiwgKmxlbXBhcmFuIGRhZHUqKS4NCiAgDQojIyMgVmFyaWFiZWwgQWNhayBLb250aW51DQogIFZhcmlhYmVsIHlhbmcgZGFwYXQgbWVuZ2FtYmlsIG5pbGFpIHBhZGEgc3VhdHUgcmVudGFuZyB0ZXJ0ZW50dSAgDQogIChtaXNhbDogKnRpbmdnaSBiYWRhbiosICp3YWt0dSosICpiZXJhdCBiYWRhbiopLg0KICANCiAgLS0tDQogICAgDQojIyBQcm9iYWJpbGl0eSBNYXNzIEZ1bmN0aW9uIChQTUYpDQogICAgDQogICAgUE1GIGRpZ3VuYWthbiB1bnR1ayB2YXJpYWJlbCBhY2FrICoqZGlza3JpdCoqLiAgDQogIFBNRiBtZW1iZXJpa2FuIHByb2JhYmlsaXRhcyB1bnR1ayBzZXRpYXAgbmlsYWkgc3Blc2lmaWsgXChYID0geFwpLg0KICANCiAgKipTaWZhdCBQTUY6KioNCiAgICAtIFwoUChYID0geCkgXGdlIDBcKQ0KICAtIFwoXHN1bSBQKFggPSB4KSA9IDFcKQ0KICANCiAgKipDb250b2ggZGlzdHJpYnVzaSBkaXNrcml0OioqDQogIA0KICAtIEJpbm9taWFsICANCiAgLSBCZXJub3VsbGkgIA0KICAtIFBvaXNzb24gIA0KICANCiAgLS0tDQogICAgDQojIyBQcm9iYWJpbGl0eSBEZW5zaXR5IEZ1bmN0aW9uIChQREYpDQogICAgDQogICAgUERGIGRpZ3VuYWthbiB1bnR1ayB2YXJpYWJlbCBhY2FrICoqa29udGludSoqLiAgDQogIFByb2JhYmlsaXRhcyBkaXRlbnR1a2FuIHNlYmFnYWkgKmx1YXMgYXJlYSogZGkgYmF3YWgga3VydmEgUERGLg0KICANCiAgKipTaWZhdCBQREY6KioNCiAgICANCiAgLSBcKGYoeCkgXGdlIDBcKQ0KICAtIFwoXGludF97LVxpbmZ0eX1ee1xpbmZ0eX0gZih4KSBkeCA9IDFcKQ0KICANCiAgUHJvYmFiaWxpdGFzOg0KICAgIFxbDQogICAgICBQKGEgPCBYIDwgYikgPSBcaW50X3thfV57Yn0gZih4KVwsZHgNCiAgICAgIFxdDQogIA0KICAqKkNvbnRvaCBkaXN0cmlidXNpIGtvbnRpbnU6KioNCiAgICANCiAgLSBOb3JtYWwgIA0KICAtIFVuaWZvcm0gIA0KICAtIEVrc3BvbmVuc2lhbCAgDQogIA0KICAtLS0NCiAgICANCiMjIEN1bXVsYXRpdmUgRGlzdHJpYnV0aW9uIEZ1bmN0aW9uIChDREYpDQogICAgDQogICAgQ0RGIG1lbWJlcmlrYW4gcHJvYmFiaWxpdGFzIGJhaHdhIHZhcmlhYmVsIGFjYWsgYmVybmlsYWkgIA0KICAqKmt1cmFuZyBkYXJpIGF0YXUgc2FtYSBkZW5nYW4qKiBzdWF0dSBuaWxhaSBcKHhcKToNCiAgICANCiAgICBcWw0KICAgICAgRih4KSA9IFAoWCBcbGUgeCkNCiAgICAgIFxdDQogIA0KICAqKlNpZmF0IENERjoqKg0KICAgIA0KICAtIFNlbGFsdSBtZW5pbmdrYXQgIA0KICAtIE5pbGFpbnlhIGFudGFyYSAwIHNhbXBhaSAxICANCiAgDQogIC0tLQ0KICAgIA0KIyMgRGlzdHJpYnVzaSBVbXVtDQogICAgDQojIyMgTm9ybWFsIERpc3RyaWJ1dGlvbg0KICAgIC0gQmVyYmVudHVrIGxvbmNlbmcgKCpiZWxsLXNoYXBlZCopICANCiAgLSBTaW1ldHJpcyB0ZXJoYWRhcCBtZWFuICANCiAgLSBQYXJhbWV0ZXI6IG1lYW4gKFwoXG11XCkpIGRhbiBzdGFuZGFyIGRldmlhc2kgKFwoXHNpZ21hXCkpDQogIA0KIyMjIFVuaWZvcm0gRGlzdHJpYnV0aW9uDQogIC0gU2VtdWEgbmlsYWkgZGFsYW0gaW50ZXJ2YWwgbWVtaWxpa2kgcHJvYmFiaWxpdGFzIHlhbmcgc2FtYSAgDQogIC0gUERGIGtvbnN0YW4gcGFkYSBpbnRlcnZhbCB0ZXJzZWJ1dCAgDQogIA0KIyMjIEV4cG9uZW50aWFsIERpc3RyaWJ1dGlvbg0KICAtIE1vZGVsIHVudHVrIHdha3R1IHR1bmdndSAgDQogIC0gTWVtaWxpa2kgc2lmYXQgKm1lbW9yeWxlc3MqICANCiAgICANCiAgICAtLS0NCg0KDQoNCiMgU2FtcGxpbmcgRGlzdHJpYnV0aW9uIC0gRGlzdHJpYnVzaSBTYW1wZWwNCg0KYGBge3IsIGVjaG89RkFMU0V9DQprbml0cjo6aW5jbHVkZV91cmwoImh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL2VtYmVkLzdTN2o3NWQzR000IikNCmBgYA0KDQojIyBQZXJiZWRhYW4gVGlnYSBKZW5pcyBEaXN0cmlidXNpDQoNCiMjIyBEaXN0cmlidXNpIFBvcHVsYXNpDQoqKkRhdGEgeWFuZyBkaWdhbWJhcmthbjoqKiAgDQpNZW5ndWt1ciBzZW11YSBpbmRpdmlkdSBkYWxhbSBzdWF0dSBwb3B1bGFzaSBwZW51aCAgDQooY29udG9oOiB0aW5nZ2kgMTAuMDAwIG9yYW5nKS4NCg0KKipTdGF0aXN0aWsga3VuY2k6KiogIA0KLSBSYXRhLXJhdGEgcG9wdWxhc2k6IFwoXG11XCkgIA0KLSBTaW1wYW5nYW4gYmFrdSBwb3B1bGFzaTogXChcc2lnbWFcKQ0KDQotLS0NCg0KIyMjIERpc3RyaWJ1c2kgU2FtcGVsDQoqKkRhdGEgeWFuZyBkaWdhbWJhcmthbjoqKiAgDQpNZW5ndWt1ciBzZW11YSBpbmRpdmlkdSBkYWxhbSAqKnNhdHUgc2FtcGVsKiogeWFuZyBkaWFtYmlsIGRhcmkgcG9wdWxhc2kuDQoNCioqU3RhdGlzdGlrIGt1bmNpOioqICANCi0gUmF0YS1yYXRhIHNhbXBlbDogXChcYmFye3h9XCkNCg0KLS0tDQoNCiMjIyBEaXN0cmlidXNpIFNhbXBsaW5nIChTYW1wbGluZyBEaXN0cmlidXRpb24pDQoqKkRhdGEgeWFuZyBkaWdhbWJhcmthbjoqKiAgDQpNZW5ndWt1ciAqKnN0YXRpc3RpayoqIChtaXNhbG55YSwgXChcYmFye3h9XCkpIGRhcmkgKipiYW55YWsgc2FtcGVsIGFjYWsqKiB5YW5nIGRpYW1iaWwgYmVydWxhbmcgZGFyaSBwb3B1bGFzaSB5YW5nIHNhbWEuDQoNCioqU3RhdGlzdGlrIGt1bmNpOioqICANCi0gUmF0YS1yYXRhIGRpc3RyaWJ1c2kgc2FtcGxpbmc6IFwoXG11X3tcYmFye3h9fVwpICANCi0gU3RhbmRhcmQgRXJyb3IgKFNFKTogXChcc2lnbWFfe1xiYXJ7eH19XCkNCg0KLS0tDQoNCiMjIEthcmFrdGVyaXN0aWsgS3VuY2kgRGlzdHJpYnVzaSBTYW1wbGluZw0KDQojIyMgYXRhLXJhdGEgRGlzdHJpYnVzaSBTYW1wbGluZw0KRGlzdHJpYnVzaSBzYW1wbGluZyBtZW1pbGlraSByYXRhLXJhdGE6DQoNClxbDQpcbXVfe1xiYXJ7eH19ID0gXG11DQpcXQ0KDQpBcnRpbnlhLCAqKnJhdGEtcmF0YSBkYXJpIHJhdGEtcmF0YSBzYW1wZWwgc2VsYWx1IHNhbWEgZGVuZ2FuIHJhdGEtcmF0YSBwb3B1bGFzaSoqLg0KDQotLS0NCg0KIyMjIHN0YW5kYXJkIEVycm9yIChTRSkNClZhcmlhYmlsaXRhcyByYXRhLXJhdGEgc2FtcGVsIGRpc2VidXQgKipTdGFuZGFyZCBFcnJvcioqLCBkYW4gc2VsYWx1IGxlYmloIGtlY2lsIGRhcmkgc2ltcGFuZ2FuIGJha3UgcG9wdWxhc2kuDQoNClxbDQpcc2lnbWFfe1xiYXJ7eH19ID0gXGZyYWN7XHNpZ21hfXtcc3FydHtufX0NClxdDQoNCmRpIG1hbmE6ICANCi0gXChcc2lnbWFcKSA9IHNpbXBhbmdhbiBiYWt1IHBvcHVsYXNpICANCi0gXChuXCkgPSB1a3VyYW4gc2FtcGVsICANCg0KPiBTZW1ha2luIGJlc2FyIHVrdXJhbiBzYW1wZWwg4oaSIFNFIHNlbWFraW4ga2VjaWwg4oaSIHJhdGEtcmF0YSBzYW1wZWwgc2VtYWtpbiBzdGFiaWwuDQoNCi0tLQ0KDQojIyMgQmVudHVrIERpc3RyaWJ1c2kNCk1lbnVydXQgKipDZW50cmFsIExpbWl0IFRoZW9yZW0gKENMVCkqKjoNCg0KPiBLZXRpa2EgdWt1cmFuIHNhbXBlbCBjdWt1cCBiZXNhciwgZGlzdHJpYnVzaSBzYW1wbGluZyBkYXJpIFwoXGJhcnt4fVwpIGFrYW4gbWVuZGVrYXRpICoqRGlzdHJpYnVzaSBOb3JtYWwqKiwgIA0KPiBtZXNraXB1biBwb3B1bGFzaSBhc2FsIHRpZGFrIG5vcm1hbC4NCg0KVmlzdWFsIGJlbnR1a255YSBhZGFsYWggKiprdXJ2YSBsb25jZW5nIChiZWxsLXNoYXBlZCkqKi4NCg0KLS0tDQoNCiMjIFBlbmVyYXBhbiBSdW11cyBaLVNjb3JlIHBhZGEgRGlzdHJpYnVzaSBTYW1wbGluZw0KDQpLZXRpa2EgbWVuZ2hpdHVuZyBwcm9iYWJpbGl0YXMgcmF0YS1yYXRhIHNhbXBlbCwga2l0YSBtZW5nZ3VuYWthbiBydW11cyBaIHlhbmcgc3VkYWggZGlzZXN1YWlrYW4sIHlhaXR1IG1lbmdnYW50aSBcKFxzaWdtYVwpIGRlbmdhbiBTdGFuZGFyZCBFcnJvciBcKFxzaWdtYV97XGJhcnt4fX1cKToNCg0KXFsNClogPSBcZnJhY3tcYmFye3h9IC0gXG11fXtcc2lnbWEgLyBcc3FydHtufX0NClxdDQoNClJ1bXVzIGluaSBkaWd1bmFrYW4gdW50dWsgbWVuZ2hpdHVuZyBwcm9iYWJpbGl0YXMgbmlsYWkgcmF0YS1yYXRhIHNhbXBlbCB0ZXJ0ZW50dSwgc2VoaW5nZ2Ega2l0YSBiaXNhIG1lbWFoYW1pIGthcmFrdGVyaXN0aWsgcG9wdWxhc2kgKip0YW5wYSBoYXJ1cyBtZW5ndWt1ciBzZWx1cnVoIHBvcHVsYXNpKiouDQoNCg0KDQogDQoNCiMgQ2VudHJhbCBMaW1pdCBUaGVvcmVtIC0gVGVvcmVtYSBMaW1pdCBQdXNhdCAoQ0xUKQ0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCmtuaXRyOjppbmNsdWRlX3VybCgiaHR0cHM6Ly93d3cueW91dHViZS5jb20vZW1iZWQvaXZkOHdFSG5NQ2ciKQ0KYGBgDQoNCiMjIEludGkgZGFyaSBDZW50cmFsIExpbWl0IFRoZW9yZW0gKENMVCkNCg0KQ2VudHJhbCBMaW1pdCBUaGVvcmVtIChDTFQpIG1lbnlhdGFrYW4gYmFod2E6DQoNCj4gKipKaWthIGtpdGEgbWVuZ2FtYmlsIHNhbXBlbCBhY2FrIGJlcnVrdXJhbiBjdWt1cCBiZXNhciBzZWNhcmEgYmVydWxhbmcgZGFyaSBwb3B1bGFzaSBhcGEgcHVuLCBtYWthIGRpc3RyaWJ1c2kgcmF0YS1yYXRhIHNhbXBlbCBcXChcYmFye1h9XFwpIGFrYW4gbWVuZGVrYXRpIERpc3RyaWJ1c2kgTm9ybWFsIOKAlCB0ZXJsZXBhcyBkYXJpIGJlbnR1ayBwb3B1bGFzaSBhc2xpbnlhLioqDQoNCiMjIyBSdW11cyBJbnRpIERpc3RyaWJ1c2kgU2FtcGxpbmcgUmF0YS1yYXRhDQoNCkRpc3RyaWJ1c2kgcmF0YS1yYXRhIHNhbXBlbDoNCg0KXFsNClxiYXJ7WH0gXHNpbSBOXGxlZnQoXG11LFw7IFxmcmFje1xzaWdtYX17XHNxcnR7bn19XHJpZ2h0KQ0KXF0NCg0KRGVuZ2FuOg0KLSBcXChcbXVcXCkgPSBtZWFuIHBvcHVsYXNpICANCi0gXFwoXHNpZ21hXFwpID0gc3RhbmRhciBkZXZpYXNpIHBvcHVsYXNpICANCi0gXFwoblxcKSA9IHVrdXJhbiBzYW1wZWwgIA0KDQotLS0NCg0KIyMgdHVyYW4gVW11bSBVa3VyYW4gU2FtcGVsIChuKQ0KDQoqKkthcGFuIENMVCBiZWtlcmphIGRlbmdhbiBiYWlrPyoqDQoNCi0gQ0xUIGJpYXNhbnlhIGRpYW5nZ2FwIHZhbGlkIGFwYWJpbGE6DQoNClxbDQpuIFxnZSAzMA0KXF0NCg0KSmlrYSAqKm4gPCAzMCoqLCBtYWthIGRpc3RyaWJ1c2kgc2FtcGxpbmcgcmF0YS1yYXRhIG1hc2loIGRhcGF0IGJpYXMgZGFuIGJlbHVtIG1lbmRla2F0aSBub3JtYWwsIHRlcnV0YW1hIGppa2EgcG9wdWxhc2kgYXdhbCBzYW5nYXQgbWlyaW5nIChza2V3ZWQpLg0KDQotLS0NCg0KIyMgU2lnbmlmaWthbnNpIENMVA0KDQpDTFQgc2FuZ2F0IHBlbnRpbmcgZGFsYW0gc3RhdGlzdGlrYSBrYXJlbmE6DQoNCi0gTWVtdW5na2lua2FuIHBlbmdndW5hYW4gKipEaXN0cmlidXNpIE5vcm1hbCoqIHVudHVrIGJhbnlhayBwcm9zZWR1ciBpbmZlcmVuc2kuDQotIE1lbWJhbnR1IG1lbmdoaXR1bmcgKipaLXNjb3JlKiogdW50dWsgcmF0YS1yYXRhIHNhbXBlbDoNCg0KXFsNClogPSBcZnJhY3tcYmFye1h9IC0gXG11fXtcc2lnbWEgLyBcc3FydHtufX0NClxdDQoNCi0gTWVtYmVyaWthbiBkYXNhciBiYWdpIGJhbnlhayB0ZWtuaWsgaW5mZXJlbnNpIG1vZGVybiAodWppIGhpcG90ZXNpcywgY29uZmlkZW5jZSBpbnRlcnZhbCwgZHNiKS4NCg0KLS0tDQoNCiMjIElsdXN0cmFzaSBHcmFmaWsgUERGIHZzIENERiDigJQgRGlzdHJpYnVzaSBOb3JtYWwNCg0KIyMjIPCflLkgUGxvdCBQREYgKFByb2JhYmlsaXR5IERlbnNpdHkgRnVuY3Rpb24pDQoNCmBgYHtyLCBmaWcuYWxpZ249ImNlbnRlciJ9DQp4IDwtIHNlcSgtNCwgNCwgbGVuZ3RoID0gNDAwKQ0KeSA8LSBkbm9ybSh4LCBtZWFuID0gMCwgc2QgPSAxKQ0KDQpwbG90KHgsIHksIHR5cGUgPSAibCIsIGx3ZCA9IDMsDQogICAgIG1haW4gPSAiUERGIChQcm9iYWJpbGl0eSBEZW5zaXR5IEZ1bmN0aW9uKSIsDQogICAgIHhsYWIgPSAieCIsIHlsYWIgPSAiZih4KSIpDQpgYGANCg0KYGBge3IsIGZpZy5hbGlnbj0iY2VudGVyIn0NCnggPC0gc2VxKC00LCA0LCBsZW5ndGggPSA0MDApDQp5IDwtIHBub3JtKHgsIG1lYW4gPSAwLCBzZCA9IDEpDQoNCnBsb3QoeCwgeSwgdHlwZSA9ICJsIiwgbHdkID0gMywNCm1haW4gPSAiQ0RGIChDdW11bGF0aXZlIERpc3RyaWJ1dGlvbiBGdW5jdGlvbikiLA0KeGxhYiA9ICJ4IiwgeWxhYiA9ICJGKHgpIikNCmBgYA0KDQoNCiMgU2FtcGxlIFByb3BvdGlvbg0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCmtuaXRyOjppbmNsdWRlX3VybCgiaHR0cHM6Ly93d3cueW91dHViZS5jb20vZW1iZWQvcTJlNG1LMEZUYnciKQ0KYGBgDQojIyBLYXJha3RlcmlzdGlrIERpc3RyaWJ1c2kgU2FtcGxpbmcgUHJvcG9yc2kgU2FtcGVsICgqUMyCKikNCg0KRGlzdHJpYnVzaSBTYW1wbGluZyBkYXJpIHByb3BvcnNpIHNhbXBlbCAoKlDMgiopIGFrYW4gbWVuZGVrYXRpICoqRGlzdHJpYnVzaSBOb3JtYWwqKiBhcGFiaWxhIHVrdXJhbiBzYW1wZWwgY3VrdXAgYmVzYXIuICANCkthcmFrdGVyaXN0aWsgdXRhbWFueWEgYWRhbGFoIHNlYmFnYWkgYmVyaWt1dDoNCg0KLS0tDQoNCiMjIyAgKipSYXRhLVJhdGEgKE1lYW4pKioNClxbDQpcbXVfe1xoYXR7UH19ID0gUA0KXF0NCg0KQXJ0aW55YSwgbmlsYWkgdGVuZ2FoIGRhcmkgc2VtdWEgcHJvcG9yc2kgc2FtcGVsICgqUMyCKikgc2FtYSBkZW5nYW4gKipwcm9wb3JzaSBwb3B1bGFzaSAoUCkqKi4NCg0KLS0tDQoNCiMjIyAgKipTdGFuZGFyZCBFcnJvciAoU0UpKioNClxbDQpcc2lnbWFfe1xoYXR7UH19ID0gXHNxcnR7XGZyYWN7UCgxLVApfXtufX0NClxdDQoNClN0YW5kYXJkIEVycm9yIG1lbnVuanVra2FuIHNlYmVyYXBhIGJlc2FyIHZhcmlhc2kgKlDMgiogYW50YXIgc2FtcGVsLg0KDQotLS0NCg0KIyMjICAqKlotU2NvcmUgVW50dWsgUHJvcG9yc2kgU2FtcGVsKioNClxbDQpaID0gXGZyYWN7XGhhdHtQfSAtIFB9e1xzaWdtYV97XGhhdHtQfX19DQpcXQ0KDQpSdW11cyBpbmkgZGlndW5ha2FuIHVudHVrIG1lbmdoaXR1bmcgcHJvYmFiaWxpdGFzIGJhaHdhICpQzIIqIGJlcmFkYSBwYWRhIGphcmFrIHRlcnRlbnR1IGRhcmkgUCwgc2VsYW1hIERpc3RyaWJ1c2kgU2FtcGxpbmcgYmVyZGlzdHJpYnVzaSBOb3JtYWwuDQoNCi0tLQ0KDQotLS0NCg0KIyMgS29uZGlzaSBQZW5lcmFwYW4gQ0xUIChOb3JtYWxpdGFzKQ0KDQpBZ2FyICpQzIIqIGRhcGF0IGRpYXN1bXNpa2FuIE5vcm1hbCBkYW4gYmlzYSBtZW1ha2FpIHJ1bXVzIFotU2NvcmUsIHBlcmx1IGRpcGVudWhpICoqZHVhIHN5YXJhdCB1dGFtYSoqIGJlcmlrdXQ6DQoNCi0tLQ0KDQojIyMgKipKdW1sYWggS2ViZXJoYXNpbGFuIE1pbmltYWwqKg0KXFsNCm4gXGNkb3QgUCBcZ2UgMTANClxdDQoNCiMjIyAgKipKdW1sYWggS2VnYWdhbGFuIE1pbmltYWwqKg0KXFsNCm4gXGNkb3QgKDEgLSBQKSBcZ2UgMTANClxdDQoNCkppa2Ega2VkdWEgc3lhcmF0IHRlcnBlbnVoaSDihpIgRGlzdHJpYnVzaSBTYW1wbGluZyAqUMyCKiBkaWFuZ2dhcCBOb3JtYWwgZGFuIGFuYWxpc2lzIHByb2JhYmlsaXRhcyBkZW5nYW4gWi1TY29yZSBkYXBhdCBkaWd1bmFrYW4uDQoNCi0tLQ0KDQojIyAgVHVqdWFuIFV0YW1hDQpNYXRlcmkgaW5pIG1lbmplbGFza2FuIGJhZ2FpbWFuYSBzdGF0aXN0aWsgZGlndW5ha2FuIHVudHVrICoqbWVuZ2VzdGltYXNpIFByb3BvcnNpIFBvcHVsYXNpIChQKSoqICANCihtaXNhbDogcGVyc2VudGFzZSBzaXN3YSB5YW5nIHN1a2EgbWF0ZW1hdGlrYSwgcGVyc2VuIG9yYW5nIGJlcm1hdGEgaGlqYXUsIGRsbC4pICANCmJlcmRhc2Fya2FuICoqUHJvcG9yc2kgU2FtcGVsIChQzIIpKiogeWFuZyBkaXBlcm9sZWggZGFyaSBwZW5nYW1iaWxhbiBzYW1wZWwgYmVydWxhbmcuDQoNCkVzdGltYXNpIGluaSBtZW5qYWRpIGRhc2FyIGRhbGFtIGluZmVyZW5zaSBzdGF0aXN0aWsgdW50dWsgcHJvcG9yc2kuDQoNCi0tLQ0KDQoNCg0KIyBSZXZpZXcgU2FtcGxpbmcgRGlzdHJpYnV0aW9uIC0gVGluamF1YW4gRGlzdHJpYnVzaSBTYW1wZWwNCg0KYGBge3IsIGVjaG89RkFMU0V9DQprbml0cjo6aW5jbHVkZV91cmwoImh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL2VtYmVkL2MwbUZFTF9TV3pFIikNCmBgYA0KDQojIyBQcm9iYWJpbGl0YXMgU2VkZXJoYW5hIC8gUnVhbmcgU2FtcGVsDQoNCkRpZ3VuYWthbiBrZXRpa2EganVtbGFoIHBlcmNvYmFhbiBzYW5nYXQga2VjaWwgc2VoaW5nZ2Egc2VtdWEga2VtdW5na2luYW4gaGFzaWwgZGFwYXQgZGl0dWxpc2thbiBzZWNhcmEgZWtzcGxpc2l0Lg0KDQotLS0NCg0KIyMjIPCflLkgKipLYXBhbiBEaWd1bmFrYW4qKg0KLSBDb2NvayB1bnR1ayBwZXJjb2JhYW4ga2VjaWwsIG1pc2FsbnlhIFwoIG4gPSAzIFwpLg0KDQojIyMg8J+UuSAqKk1ldG9kZSoqDQotIE1lbnl1c3VuIHNlbHVydWgga2VtdW5na2luYW4gaGFzaWwgKHJ1YW5nIHNhbXBlbCkuDQotIE1lbmdoaXR1bmcgcGVsdWFuZyBkYXJpIGhhc2lsIHlhbmcgZGlpbmdpbmthbi4NCg0KIyMjIPCflLkgKipLZWxlbWFoYW4qKg0KLSBUaWRhayBlZmlzaWVuIGtldGlrYSBcKCBuIFwpIG1lbmphZGkgYmVzYXIsIGthcmVuYSBqdW1sYWgga2VtdW5na2luYW4gbWVuaW5na2F0IHNhbmdhdCBjZXBhdC4NCg0KLS0tDQoNCi0tLQ0KDQojIyBEaXN0cmlidXNpIEJpbm9taWFsDQoNCkRpc3RyaWJ1c2kgQmlub21pYWwgZGlndW5ha2FuIHVudHVrIG1lbmdoaXR1bmcgcHJvYmFiaWxpdGFzIHNlanVtbGFoIGtlYmVyaGFzaWxhbiB0ZXJ0ZW50dSBkYWxhbSBwZXJjb2JhYW4gYmVydWxhbmcuDQoNCi0tLQ0KDQojIyMg8J+UuSAqKkthcGFuIERpZ3VuYWthbioqDQotIEtldGlrYSBqdW1sYWggcGVyY29iYWFuIGtlY2ls4oCTc2VkYW5nLCBtaXNhbG55YSBcKCBuID0gNSBcKS4NCg0KIyMjIPCflLkgKipNZXRvZGUqKg0KTWVuZ2d1bmFrYW4gcnVtdXMgcHJvYmFiaWxpdGFzIEJpbm9taWFsOg0KXFsNClAoWCA9IGspID0gXGJpbm9te259e2t9IHBeayAoMS1wKV57bi1rfQ0KXF0NCg0KIyMjIPCflLkgKipLZWxlbWFoYW4qKg0KLSBKaWthIFwoIG4gXCkgc2FuZ2F0IGJlc2FyIChjb250b2g6IFwoIG4gPSAxMDAgXCkpIGRhbiBwZXJ0YW55YWFubnlhIGJlcnVwYSByZW50YW5nIHByb2JhYmlsaXRhcyBzZXBlcnRpIOKAnG1pbmltYWwga+KAnSwgIA0KICBtYWthIHJ1bXVzIGhhcnVzIGRpaGl0dW5nIGJlcmthbGkta2FsaSDihpIgKip0aWRhayBlZmlzaWVuKiouDQoNCi0tLQ0KDQotLS0NCg0KIyMgRGlzdHJpYnVzaSBTYW1wbGluZyBQcm9wb3JzaSBTYW1wZWwgKE1lbmdndW5ha2FuIENMVCkNCg0KS2V0aWthIHVrdXJhbiBzYW1wZWwgYmVzYXIsIHByb3BvcnNpIHNhbXBlbCAoKlDMgiopIGRhcGF0IGRpcGVybGFrdWthbiBzZW9sYWgtb2xhaCBiZXJkaXN0cmlidXNpIE5vcm1hbCBtZW5nZ3VuYWthbiBDTFQuDQoNCi0tLQ0KDQojIyMg8J+UuSAqKkthcGFuIERpZ3VuYWthbioqDQotIFVudHVrIGp1bWxhaCBwZXJjb2JhYW4geWFuZyBzYW5nYXQgYmVzYXIsIG1pc2FsbnlhIFwoIG4gPSAxMDAgXCkuDQoNCi0tLQ0KDQojIyMg8J+UuSAqKkFzdW1zaSBLdW5jaSoqDQpNZW5nYW5kYWxrYW4gKipUZW9yZW1hIExpbWl0IFB1c2F0IChDTFQpKiogc2VoaW5nZ2EgRGlzdHJpYnVzaSBTYW1wbGluZyBkYXJpICpQzIIqIG1lbmRla2F0aSBOb3JtYWwuDQoNCi0tLQ0KDQojIyMg8J+UuSAqKlN5YXJhdCBOb3JtYWxpdGFzKioNCkhhcnVzIG1lbWVudWhpIGR1YSBrb25kaXNpOg0KXFsNCm4gXGNkb3QgUCBcZ2UgMTANClxdDQpcWw0KbiBcY2RvdCAoMS1QKSBcZ2UgMTANClxdDQoNCkppa2EgdGVycGVudWhpIOKGkiBkaXN0cmlidXNpICpQzIIqIGRpYW5nZ2FwIE5vcm1hbC4NCg0KLS0tDQoNCiMjIyDwn5S5ICoqUGVyaGl0dW5nYW4qKg0KTWVuZ2d1bmFrYW4gWi1TY29yZSB1bnR1ayBwcm9wb3JzaToNClxbDQpaID0gXGZyYWN7XGhhdHtQfSAtIFB9e1xzcXJ0e1xmcmFje1AoMS1QKX17bn19fQ0KXF0NCg0KUHJvYmFiaWxpdGFzIGRpaGl0dW5nIG1lbmdndW5ha2FuIHRhYmVsIFogYXRhdSBmdW5nc2kgTm9ybWFsLg0KDQotLS0NCg0KIyMjIPCflLkgKipJbnRlcnByZXRhc2kqKg0KTWV0b2RlIGluaSBtZW1iZXJpa2FuICoqcHJvYmFiaWxpdGFzIHBlbmRla2F0YW4gKGFwcHJveGltYXRlKSoqIHlhbmc6DQoNCi0gU2FuZ2F0IGFrdXJhdCAgDQotIFBhbGluZyBlZmlzaWVuICANCi0gSWRlYWwgdW50dWsgZGF0YXNldCBiZXNhciAgDQoNCi0tLQ0KDQojIEtlc2ltcHVsYW4NCg0KYGBge3IsIG1lc3NhZ2U9RkFMU0V9DQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KDQpzdW1tYXJ5X3RhYmxlIDwtIGRhdGEuZnJhbWUoDQogIEJhZ2lhbiA9IGMoDQogICAgIjEuIFByb2JhYmlsaXR5IERpc3RyaWJ1dGlvbiIsDQogICAgIjIuIFZhcmlhYmVsIEFjYWsiLA0KICAgICIzLiBEaXN0cmlidXNpIFVtdW0iLA0KICAgICI0LiBEaXN0cmlidXNpIFNhbXBsaW5nIiwNCiAgICAiNS4gQ2VudHJhbCBMaW1pdCBUaGVvcmVtIiwNCiAgICAiNi4gU2FtcGxpbmcgRGlzdHJpYnV0aW9uIHVudHVrIFByb3BvcnNpIg0KICApLA0KICBSaW5na2FzYW4gPSBjKA0KICAgICJNZW5qZWxhc2thbiBiYWdhaW1hbmEgcHJvYmFiaWxpdGFzIHRlcnNlYmFyIHBhZGEgc3VhdHUgdmFyaWFiZWwgYWNhaywgYmFpayBkaXNrcml0IChQTUYpIG1hdXB1biBrb250aW51IChQREYpLiIsDQogICAgIlZhcmlhYmVsIGFjYWsgZGlza3JpdCBtZW1pbGlraSBuaWxhaSB0ZXJ0ZW50dTsga29udGludSBtZW1pbGlraSByZW50YW5nIG5pbGFpIHRhayB0ZXJoaW5nZ2EuIiwNCiAgICAiQ29udG9oIHVtdW06IE5vcm1hbCwgVW5pZm9ybSwgRXhwb25lbnRpYWwsIEJpbm9taWFsLiIsDQogICAgIkRpc3RyaWJ1c2kgc3RhdGlzdGlrIGRhcmkgYmFueWFrIHNhbXBlbDsgcmF0YS1yYXRhIG1lbmRla2F0aSBwb3B1bGFzaSBkZW5nYW4gU3RhbmRhcmQgRXJyb3IuIiwNCiAgICAiUmF0YS1yYXRhIHNhbXBlbCBtZW5kZWthdGkgTm9ybWFsIGppa2EgbiDiiaUgMzAgbWVudXJ1dCBDTFQuIiwNCiAgICAiUHJvcG9yc2kgc2FtcGVsIE5vcm1hbCBqaWthIG5QIOKJpSAxMCBkYW4gbigx4oiSUCkg4omlIDEwLiINCiAgKQ0KKQ0KDQpzdW1tYXJ5X3RhYmxlICU+JQ0KICBrYWJsZSgiaHRtbCIsIGNvbC5uYW1lcyA9IGMoIkJhZ2lhbiIsICJSaW5na2FzYW4iKSkgJT4lDQogIGthYmxlX3N0eWxpbmcoDQogICAgYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIsICJyZXNwb25zaXZlIiksDQogICAgZnVsbF93aWR0aCA9IEZBTFNFLA0KICAgIHBvc2l0aW9uID0gImNlbnRlciINCiAgKSAlPiUNCiAgY29sdW1uX3NwZWMoMSwgYm9sZCA9IFRSVUUpICU+JQ0KICBjb2x1bW5fc3BlYygyKQ0KYGBgDQoNCiMgUmVmZXJlbnNpDQoNClNoZWxkb24gUm9zcy4gQSBGaXJzdCBDb3Vyc2UgaW4gUHJvYmFiaWxpdC4NClN0YXQgVHJlay4gKG4uZC4pLiBTYW1wbGluZyBEaXN0cmlidXRpb25zLg0KDQo=