TUGAS STATISTIKA DASAR

Konsep Dasar Probabilitas

Fikaa.jpg


7.7 Studi Kasus 1

Penerapan Probabilitas dalam Prediksi Kualitas Produk:

Sebuah perusahaan manufaktur memproduksi barang elektronik dan ingin memprediksi apakah suatu produk akan cacat atau tidak. Data historis menunjukkan bahwa 5% dari produk yang diproduksi adalah cacat. Perusahaan menggunakan data tentang jenis komponen dan proses produksi untuk memprediksi cacat produk menggunakan teknik probabilitas.

7.7.1 Fitur Data

  • Komponen (C):Apakah komponen elektronik yang digunakan adalah berkualitas tinggi atau rendah

  • Proses produksi (P):Apakah Proses Produksi dilakukan di bawah standar atau sesuai standar.

  • Cacat (D) Status cacat produk(ya/tidak)

7.7.2 Data Historis (Contoh)

  • Probabilitas produk cacat (\(P\)(\(D\) = Yes) ) = \(5%\)

  • Probabilitas produk tidak cacat ( \(P\)(\(D\) = No)) = \(95%\)

  • Probabilitas menggunakan komponen berkualitas rendah (\(P\)(\(C\) = Low)) = \(30%\)

  • Probabilitas menggunakan komponen berkualitas tinggi (P(C = High)) = 70%

  • Probabilitas proses produksi di bawah standar (P(P = Below)) = 40%

  • Probabilitas proses produksi sesuai berkualitas rendah (P(C = Low)) 30% =

  • Probabilitas menggunakan komponen berkualitas tinggi (P(C = High)) = 70%

  • Probabilitas proses produksi di bawah standar (P(P = Below)) = 40%

  • Probabilitas proses produksi sesuai standar (P(P = Standard)) = 60%

Bagaimana probabilitas bahwa suatu produk akan cacat (D = Yes), jika diketahui komponen yang digunakan berkualitas rendah dan proses produksi di bawah standar?

Gunakan Teorema Bayes untuk menghitung probabilitas bersyarat ini:

\[ P ( D = \text{Yes} | C = \text{Low}, P = \text{Below} ) = \frac {P(C = \text{Low}, P = \text{Below} | D = \text{Yes}) \cdot P(D = \text{Yes})}{P(C = \text{Low} , P = \text{Below})} \]

7.7.3 Penyelesaian Studi kasus \(1\): Prediksi Kualitas Produk Menggunakan Probabilitas

Deskripsi Masalah

Sebuah perusahaan manufaktur memproduksi barang elektronik dan ingin memprediksi apakah suatu produk akan cacat atau tidak cacat. Untuk memprediksi hal ini, perusahaan menggunakan data tentang:

  • Jenis Komponen (\(C\): Apakah komponen elektronik yang digunakan berkualitas tinggi atau rendah.

  • Proses Produksi (\(P\)): Apakah proses produksi dilakukan di bawah standar atau sesuai standar.

Dari data historis,diketahui bahwa:

  • \(5%\) dari produk yang dihasilkan adalah cacat.

  • Kita ingin menghitung probabilitas bahwa produk akan cacat jika komponen yang digunakan berkualitas rendah dan proses produksinya di bawah standar.

Untuk Menyelesaikan masalah ini,kita akan menggunakan Teorema Bayes.

Rumus Teorema Bayes

Rumus Teorema Bayes untuk menghitung probabilitas bahwa produk akan cacat (\(D\)=Yes dengan kondisi komponen rendah (\(C\))= Low dan proses produksi di bawah standar (\(P\))=Below adalah:

\[ P ( D = \text{Yes} | C = \text{Low}, P = \text{Below} ) = \frac {P(C = \text{Low}, P = \text{Below} | D = \text{Yes}) \cdot P(D = \text{Yes})}{P(C = \text{Low} , P = \text{Below})} \]

1. Data Historis yang Diketahui

Dari soal,kita memiliki data probabilitas berikut:

1. Probabilitas produk cacat:

\[ P (D=Yes)= 5\%=0,05 \]

2. Probabilitas produk tidak cacat:

\[ P (D=No) = 95\% = 0,95 \]

3. Probabilitas komponen berkualitas rendah:

\[ P (C=Low) = 30\% = 0.30 \]

4. Probabilitas proses produk di bawah standar:

\[ P (P=Below) = 40\% =0,40 \]

5. Probabilitas komponen berkualitas rendah jika produk cacat:

\[ P (Low | D = Yes) = 60\%=0,60 \]

6. Probabilitas proses produksi di bawah standar jika produk cacat:

\[ P (P=Below | D = Yes) = 70\% =0,70 \]

2. Menghitung \(P\) (\(C\)\(Low\)\(P\)=\(Below\)|\(D\)=Yes,)

Untuk menghitung probabilitas komponen rendah dan proses di bawah standar jika produk cacat, kita asumsikan bahwa komponen dan proses produksi independen. Oleh karena itu, kita kalikan kedua probabilitas bersyarat:

\[ P(C=Low,P=Below|D = Yes)=P(C=Low|D=Yes)\times P(P=Below|D=Yes) \] Substitusi nilai-nilainya:

\[ P(C=low,P=Below | D=Yes) =0,60\times0,70=0,42 \]

**3.Menghitung \(P\)(\(c\)=\(Low\),\(P\)=\(Below\))

Untuk menghitung probabilitas bahwa komponen rendah dan proses di bawah standar secara umum (tanpa memperhatikan cacat atau tidak), kita kalikan probabilitas komponen rendah dengan probabilitas proses di bawah standar:

\[ P(C=low,P=Below)=P(C=Low)\times P(P=Below) \]

Substitusi nilai-nilainya:

\[ P(C=Low,P=Below)=0,30\times0,40=0,12 \]

4. Menghitung Probabilitas Menggunakan Teorema Bayes

Sekarang, kita substitusi semua nilai ke dalam rumus Teorema Bayes:

\[ P ( D = \text{Yes} | C = \text{Low}, P = \text{Below} ) = \frac {P(C = \text{Low}, P = \text{Below} | D = \text{Yes}) \cdot P(D = \text{Yes})}{P(C = \text{Low} , P = \text{Below})} \]

Substitusi angka-angka yang sudah dihitung:

\[ P (D=Yes|C=Low,P=Below)=\frac {0,42 \times 0,05}{0,12} \]

\[ P (D=Yes|C=Low,P=Below)=0,175 \]

5.Hasil akhir

Jadi, probabilitas bahwa produk akan cacat jika komponen yang digunakan berkualitas rendah dan proses produksi dilakukan di bawah standar adalah:

\[ 17,5% \]

Penjelasan Intuitif

  • Dari Data Historis: Hanya \(5%\) dari produk yang dibuat diketahui cacat.

  • Jika produk ternyata cacat, ada kemungkinan besar bahwa komponen yang digunakan berkualitas rendah (\(60%\) dan proses produksi dilakukan di bawah standar (\(70%\).

  • Dengan mempertimbangkan semua faktor ini, ketika kita tahu bahwa komponen yang digunakan rendah dan proses produksinya di bawah standar, kemungkinan produk tersebut cacat meningkat menjadi \(17,5%\).

Implementasi Kode Python

 # Data dari soal 📊
prob_cacat <- 0.05               # Probabilitas produk cacat (P(D = Yes))
prob_low_jika_cacat <- 0.70      # Probabilitas komponen kualitas rendah kalau produk cacat (P(C = Low | D = Yes))
prob_below_jika_cacat <- 0.60    # Probabilitas proses di bawah standar kalau produk cacat (P(P = Below | D = Yes))
prob_low <- 0.30                 # Probabilitas komponen kualitas rendah secara umum (P(C = Low))
prob_below <- 0.40               # Probabilitas proses di bawah standar secara umum (P(P = Below))

# Langkah 1: Cari probabilitas komponen low DAN proses di bawah standar jika produk cacat
prob_low_dan_below_jika_cacat <- prob_low_jika_cacat * prob_below_jika_cacat

# Langkah 2: Cari probabilitas komponen low DAN proses di bawah standar secara umum
prob_low_dan_below <- prob_low * prob_below

# Langkah 3: Gunakan Teorema Bayes untuk menghitung probabilitas produk cacat
prob_cacat_jika_low_dan_below <- (prob_low_dan_below_jika_cacat * prob_cacat) / prob_low_dan_below

# Cetak hasilnya dalam bentuk persentase
cat("Kemungkinan produk cacat jika komponen rendah dan proses di bawah standar adalah:",
    round(prob_cacat_jika_low_dan_below, 4) * 100, "%\n")
## Kemungkinan produk cacat jika komponen rendah dan proses di bawah standar adalah: 17.5 %

7.8 Studi Kasus 2

Penerapan Probabilitas dalam Deteksi Penipuan Transaksi: Sebuah perusahaan e-commerce ingin mendeteksi transaksi yang berpotensi penipuan. Berdasarkan data historis, \(1%\) dari transaksi yang dilakukan adalah penipuan. Perusahaan ingin menggunakan fitur-fitur tertentu seperti lokasi transaksi, jumlah pembelian, dan metode pembayaran untuk memprediksi apakah suatu transaksi adalah penipuan atau tidak.

7.8.1 Fitur Data

  • Lokasi (L):Negara atau kota tempat transaksi dilakukan.

  • Jumlah Pembelian (A):Jumlah uang yang dibelanjakan.

  • Metode Pembayaran (M): Metode Pembayaran yang digunakan (kartu kredit,dompet digital,dll)

  • Penipuan (F): Status transaksi apakah penipuan atau tidak.

7.8.2 Data Historis (Contoh) - Probabilitas transaksi adalah penipuan (P(F = Fraud)) = \(1%\)

  • Probabilitas transaksi bukan penipuan (P(F = Not Fraud)) = \(99%\)

  • Probabilitas lokasi tertentu adalah di luar negeri (P(L = Foreign)) = \(20%\)

  • Probabilitas jumlah pembelian lebih dari \(500\)(P(A = )$) = \(10%\)

  • Probabilitas menggunakan kartu kredit sebagai metode pembayaran ( P(M = Credit Card)) = \(50%\)

Bagaimana probabilitas bahwa suatu transaksi adalah penipuan (F = Fraud), jika diketahui transaksi dilakukan dari lokasi luar negeri, jumlah pembelian lebih dari \($500\), dan metode pembayaran menggunakan kartu kredit?

\[ \begin{split} P(F = \text{Fraud} \mid L, A, M ) = \frac{P(L, A, M \mid F = \text{Fraud}) \cdot P(F = \text{Fraud})}{P(L, A, M)} \end{split} \] ## 7.8.2 Langkah-langkah penyelesaian

Kita diminta mencari probabilitas bahwa transaksi adalah penipuan (Fraud) jika diketahui bahwa:

  • Lokasi transaksi: Luar negeri (L = Foreign)

  • Jumlah pembelian: Lebih dari \($500\) (A = High)

  • Metode pembayaran: Menggunakan kartu kredit (M = Credit Card)

Rumus yang akan kita gunakan adalah Teorema Bayes:

\[ \begin{split} P(F = \text{Fraud} \mid L, A, M ) = \frac{P(L, A, M \mid F = \text{Fraud}) \cdot P(F = \text{Fraud})}{P(L, A, M)} \end{split} \]

**1. Diketahui dari Data Historis

  • \(P\)(F=Fraud) =\(1%\)=\(0.01\) Probabilitas transaksi adalah penipuan.

  • \(P\)(F=Not Fraud)=\(99%\)=\(0.99\) Probabilitas transaksi bukan penipuan.

  • \(P\)(L=Foreign)=\(20%\)=\(0,20\) Probabilitas lokasi transaksi di luar negeri.

  • \(P\)(A=High)=\(10%\)=\(0.10\) robabilitas jumlah pembelian lebih dari \($500\).

  • \(P\)(M=Credit Card)=\(50%\)=\(0.50%\) probabilitas jumlah pembelian lebih dari \($500\).

Kita memerlukan dua komponen:

**Probabilitas bersyarat bahwa transaksi dilakukan di luar negeri, jumlah tinggi, dan menggunakan kartu kredit jika penipuan:

\[ P(L=Foreign,A=High,M=Credit Card | F=Fraud) \]

Probabilitas gabungan dari kondisi tersebut secara umum:

\[ P(L=Foreign,A=High,M=Credit Card) \]

2. Asumsi Data Tambahan

Untuk mempermudah perhitungan, kita buat beberapa asumsi tambahan berdasarkan pola historis yang masuk akal:

1.Jika transaksi adalah penipuan \((F=Fraud\)):

  • Probabilitas transaksi dilakukan di luar negeri: \(P(L=Foreign | F= Fraud)=0.70\)

  • Probabilitas jumlah pembelian lebih dari 500: \(P(A=High | F=Fraud)= 0.60\)

  • Probabilitas menggunakan kartu kredit: \(P(M=credit card | F=Fraud)= 0.80\)

2.Jika transaksi bukan penipuan (\(F\) = Not Fraud):

  • Probabilitas transaksi dilakukan di luar negeri:\(P(L=Foreign | F= Not Fraud) = 0.15\)

  • Probabilitas jumlah pembelian lebih dari \($500\): \(P\)(A=High | F=Fraud)=\(0.05\)

  • Probabilitas menggunakan kartu kredit:

\[ (P(M=credit card | F=Fraud)= 0.50 \]

Hitung Probabilitas bersyarat

Langkah 1 : Hitung \(P(L, A, M \mid Fraud)\)

\[ P(L, A, M \mid Fraud) = P(L \mid Froud) \times P(A \mid Fraud) \times P(M \mid Fraud) \]

Subtitusikan nilai

\[ \begin{split} P(L, A, M \mid Fraud) &= P(L \mid Froud) \times P(A \mid Fraud) \times P(M \mid Fraud) \\ &= 0,70 \times 0,60 \times 0,80 \\ &= 0,336 \end{split} \]

Langkah 2 : $P(L, A, M)

Menggunakan aturan total probabilitas :

\[ P(L, A, M) = P(L, A, M \mid F = Fraud) \cdot P(F = Fraud) + P(L, A, M \mid F = Not Fraud) \]

Hitung bagian pertama

\[ 0,00375 \times 0,01 = 0,00336 \]

Hitung bagian kedua

\[ P(L, A, M \mid F = Not Fraud ) = 0,15 \times 0,05 \times 0,50 = 0,00375 \]

Total :

\[ 0,00336 + 0,0037125 = 0,0070725 \]

Langkah 3 : Hitung Probabilitas Final dengan Teorema Bayes

\[ \begin{split} P(F = Fraud \mid L, A, M) &= \frac{0,336 \times 0,01}{0,0070725} \\ &= \frac{0,00336}{0,0070725} \\ &= 0,475 \end{split} \]

Hasil Akhir \(47,5\%\)

Kemungkinan bahwa suatu transaksi adalah penipuan jika diketahui dilakukan dari luar negeri, jumlah pembelian lebih dari $500, dan menggunakan kartu kredit adalah sekitar 47.5%.

Perhitungan Menggunakan Sistem

# Data historis
prob_fraud <- 0.01             # Probabilitas transaksi adalah penipuan (P(F = Fraud))
prob_not_fraud <- 0.99         # Probabilitas transaksi bukan penipuan (P(F = Not Fraud))

# Probabilitas bersyarat jika penipuan (F = Fraud)
prob_foreign_given_fraud <- 0.70        # P(L = Foreign | F = Fraud)
prob_high_given_fraud <- 0.60           # P(A = High | F = Fraud)
prob_card_given_fraud <- 0.80           # P(M = Credit Card | F = Fraud)

# Probabilitas bersyarat jika bukan penipuan (F = Not Fraud)
prob_foreign_given_not_fraud <- 0.15    # P(L = Foreign | F = Not Fraud)
prob_high_given_not_fraud <- 0.05       # P(A = High | F = Not Fraud)
prob_card_given_not_fraud <- 0.50       # P(M = Credit Card | F = Not Fraud)

# Langkah 1: Hitung P(L = Foreign, A = High, M = Credit Card | F = Fraud)
prob_combined_given_fraud <- prob_foreign_given_fraud * prob_high_given_fraud * prob_card_given_fraud

# Langkah 2: Hitung P(L = Foreign, A = High, M = Credit Card | F = Not Fraud)
prob_combined_given_not_fraud <- prob_foreign_given_not_fraud * prob_high_given_not_fraud * prob_card_given_not_fraud

# Langkah 3: Hitung P(L = Foreign, A = High, M = Credit Card) menggunakan aturan total probabilitas
prob_combined <- (prob_combined_given_fraud * prob_fraud) + (prob_combined_given_not_fraud * prob_not_fraud)

# Langkah 4: Gunakan Teorema Bayes untuk menghitung P(F = Fraud | L = Foreign, A = High, M = Credit Card)
prob_fraud_given_combined <- (prob_combined_given_fraud * prob_fraud) / prob_combined

# Cetak hasil dalam bentuk persentase
cat("Probabilitas transaksi adalah penipuan jika diketahui lokasi luar negeri, jumlah lebih dari $500, dan menggunakan kartu kredit adalah:",
    round(prob_fraud_given_combined, 4) * 100, "%\n")
## Probabilitas transaksi adalah penipuan jika diketahui lokasi luar negeri, jumlah lebih dari $500, dan menggunakan kartu kredit adalah: 47.51 %

Referensi

LS0tDQp0aXRsZTogIlRVR0FTIFNUQVRJU1RJS0EgREFTQVIiDQoNCnN1YnRpdGxlOiAiS29uc2VwIERhc2FyIFByb2JhYmlsaXRhcyINCg0KYXV0aG9yOiANCiAgLSAiIEZpa2EgSXJzYW5kaSBEZXN2eWFudGkgKDUyMjQwMDAxMykiDQogIA0KZGF0ZTogICJgciBmb3JtYXQoU3lzLkRhdGUoKSwgJyVCICVkLCAlWScpYCINCm91dHB1dDoNCiAgcm1kZm9ybWF0czo6cmVhZHRoZWRvd246DQogICAgc2VsZl9jb250YWluZWQ6IHRydWUNCiAgICB0aHVtYm5haWxzOiB0cnVlDQogICAgbGlnaHRib3g6IHRydWUNCiAgICBnYWxsZXJ5OiB0cnVlDQogICAgbGliX2RpcjogbGlicw0KICAgIGRmX3ByaW50OiAicGFnZWQiDQogICAgY29kZV9mb2xkaW5nOiAic2hvdyINCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgICBjc3M6ICJTdHlsZS5jc3MiDQogICAgDQotLS0NCg0KIDxpbWcgaWQ9ImxvZ28tdXRhbWEiIHNyYz0iRmlrYWEuanBnIiBhbHQ9IkZpa2FhLmpwZyIgc3R5bGU9IndpZHRoOjIwMHB4OyBkaXNwbGF5OiBibG9jazsgbWFyZ2luOiBhdXRvOyI+DQoNCi0tLQ0KDQoNCiMgNy43IFN0dWRpIEthc3VzIDENCg0KUGVuZXJhcGFuIFByb2JhYmlsaXRhcyBkYWxhbSBQcmVkaWtzaSBLdWFsaXRhcyBQcm9kdWs6DQoNClNlYnVhaCBwZXJ1c2FoYWFuIG1hbnVmYWt0dXIgbWVtcHJvZHVrc2kgYmFyYW5nIGVsZWt0cm9uaWsgZGFuIGluZ2luIG1lbXByZWRpa3NpIGFwYWthaCBzdWF0dSBwcm9kdWsgYWthbiBjYWNhdCBhdGF1IHRpZGFrLiBEYXRhIGhpc3RvcmlzIG1lbnVuanVra2FuIGJhaHdhIDUlIGRhcmkgcHJvZHVrIHlhbmcgZGlwcm9kdWtzaSBhZGFsYWggY2FjYXQuIFBlcnVzYWhhYW4gbWVuZ2d1bmFrYW4gZGF0YSB0ZW50YW5nIGplbmlzIGtvbXBvbmVuIGRhbiBwcm9zZXMgcHJvZHVrc2kgdW50dWsgbWVtcHJlZGlrc2kgY2FjYXQgcHJvZHVrIG1lbmdndW5ha2FuIHRla25payBwcm9iYWJpbGl0YXMuDQoNCg0KIyMgNy43LjEgRml0dXIgRGF0YQ0KDQotIEtvbXBvbmVuIChDKTpBcGFrYWgga29tcG9uZW4gZWxla3Ryb25payB5YW5nIGRpZ3VuYWthbiBhZGFsYWggYmVya3VhbGl0YXMgdGluZ2dpIGF0YXUgcmVuZGFoDQoNCi0gUHJvc2VzIHByb2R1a3NpIChQKTpBcGFrYWggUHJvc2VzIFByb2R1a3NpIGRpbGFrdWthbiBkaSBiYXdhaCBzdGFuZGFyIGF0YXUgc2VzdWFpIHN0YW5kYXIuDQoNCi0gQ2FjYXQgKEQpIFN0YXR1cyBjYWNhdCBwcm9kdWsoeWEvdGlkYWspDQoNCiMjIDcuNy4yIERhdGEgSGlzdG9yaXMgKENvbnRvaCkNCg0KLSBQcm9iYWJpbGl0YXMgcHJvZHVrIGNhY2F0IChcKFBcKShcKERcKSA9IFllcykgKSA9IFwoNSVcKQ0KDQotIFByb2JhYmlsaXRhcyBwcm9kdWsgdGlkYWsgY2FjYXQgKCBcKFBcKShcKERcKSA9IE5vKSkgPSBcKDk1JVwpDQoNCi0gUHJvYmFiaWxpdGFzIG1lbmdndW5ha2FuIGtvbXBvbmVuIGJlcmt1YWxpdGFzIHJlbmRhaCAoXChQXCkoXChDXCkgPSBMb3cpKSA9IFwoMzAlXCkgDQoNCi0gUHJvYmFiaWxpdGFzIG1lbmdndW5ha2FuIGtvbXBvbmVuIGJlcmt1YWxpdGFzIHRpbmdnaSAoUChDID0gSGlnaCkpID0gNzAlDQoNCi0gUHJvYmFiaWxpdGFzIHByb3NlcyBwcm9kdWtzaSBkaSBiYXdhaCBzdGFuZGFyIChQKFAgPSBCZWxvdykpID0gNDAlDQoNCi0gUHJvYmFiaWxpdGFzIHByb3NlcyBwcm9kdWtzaSBzZXN1YWkgYmVya3VhbGl0YXMgcmVuZGFoIChQKEMgPSBMb3cpKSAzMCUgPQ0KDQotIFByb2JhYmlsaXRhcyBtZW5nZ3VuYWthbiBrb21wb25lbiBiZXJrdWFsaXRhcyB0aW5nZ2kgKFAoQyA9IEhpZ2gpKSA9IDcwJQ0KDQotIFByb2JhYmlsaXRhcyBwcm9zZXMgcHJvZHVrc2kgZGkgYmF3YWggc3RhbmRhciAoUChQID0gQmVsb3cpKSA9IDQwJQ0KDQotIFByb2JhYmlsaXRhcyBwcm9zZXMgcHJvZHVrc2kgc2VzdWFpIHN0YW5kYXIgKFAoUCA9IFN0YW5kYXJkKSkgPSA2MCUNCg0KQmFnYWltYW5hIHByb2JhYmlsaXRhcyBiYWh3YSBzdWF0dSBwcm9kdWsgYWthbiBjYWNhdCAoRCA9IFllcyksIGppa2EgZGlrZXRhaHVpIGtvbXBvbmVuIHlhbmcgZGlndW5ha2FuIGJlcmt1YWxpdGFzIHJlbmRhaCBkYW4gcHJvc2VzIHByb2R1a3NpIGRpIGJhd2FoIHN0YW5kYXI/DQoNCkd1bmFrYW4gVGVvcmVtYSBCYXllcyB1bnR1ayBtZW5naGl0dW5nIHByb2JhYmlsaXRhcyBiZXJzeWFyYXQgaW5pOg0KDQokJA0KUCAoIEQgPSBcdGV4dHtZZXN9IHwgQyA9IFx0ZXh0e0xvd30sIFAgPSBcdGV4dHtCZWxvd30gKSA9IFxmcmFjIHtQKEMgPSBcdGV4dHtMb3d9LCBQID0gXHRleHR7QmVsb3d9IHwgRCA9IFx0ZXh0e1llc30pIFxjZG90IFAoRCA9IFx0ZXh0e1llc30pfXtQKEMgPSBcdGV4dHtMb3d9ICwgUCA9IFx0ZXh0e0JlbG93fSl9DQokJCANCg0KIyMgNy43LjMgUGVueWVsZXNhaWFuIFN0dWRpIGthc3VzIFwoMVwpOiBQcmVkaWtzaSBLdWFsaXRhcyBQcm9kdWsgTWVuZ2d1bmFrYW4gUHJvYmFiaWxpdGFzIA0KDQojIyMgRGVza3JpcHNpIE1hc2FsYWgNCg0KU2VidWFoIHBlcnVzYWhhYW4gbWFudWZha3R1ciBtZW1wcm9kdWtzaSBiYXJhbmcgZWxla3Ryb25payBkYW4gaW5naW4gbWVtcHJlZGlrc2kgYXBha2FoIHN1YXR1IHByb2R1ayBha2FuIGNhY2F0IGF0YXUgdGlkYWsgY2FjYXQuIFVudHVrIG1lbXByZWRpa3NpIGhhbCBpbmksIHBlcnVzYWhhYW4gbWVuZ2d1bmFrYW4gZGF0YSB0ZW50YW5nOg0KDQotIEplbmlzIEtvbXBvbmVuIChcKENcKTogQXBha2FoIGtvbXBvbmVuIGVsZWt0cm9uaWsgeWFuZyBkaWd1bmFrYW4gYmVya3VhbGl0YXMgdGluZ2dpIGF0YXUgcmVuZGFoLg0KDQotIFByb3NlcyBQcm9kdWtzaSAoXChQXCkpOiBBcGFrYWggcHJvc2VzIHByb2R1a3NpIGRpbGFrdWthbiBkaSBiYXdhaCBzdGFuZGFyIGF0YXUgc2VzdWFpIHN0YW5kYXIuDQoNCkRhcmkgZGF0YSBoaXN0b3JpcyxkaWtldGFodWkgYmFod2E6DQoNCi0gXCg1JVwpIGRhcmkgcHJvZHVrIHlhbmcgZGloYXNpbGthbiBhZGFsYWggY2FjYXQuDQoNCi0gS2l0YSBpbmdpbiBtZW5naGl0dW5nIHByb2JhYmlsaXRhcyBiYWh3YSBwcm9kdWsgYWthbiBjYWNhdCBqaWthIGtvbXBvbmVuIHlhbmcgZGlndW5ha2FuIGJlcmt1YWxpdGFzIHJlbmRhaCBkYW4gcHJvc2VzIHByb2R1a3NpbnlhIGRpIGJhd2FoIHN0YW5kYXIuDQoNClVudHVrIE1lbnllbGVzYWlrYW4gbWFzYWxhaCBpbmksa2l0YSBha2FuIG1lbmdndW5ha2FuICoqVGVvcmVtYSBCYXllcy4qKg0KDQoqKlJ1bXVzIFRlb3JlbWEgQmF5ZXMqKg0KDQpSdW11cyBUZW9yZW1hIEJheWVzIHVudHVrIG1lbmdoaXR1bmcgcHJvYmFiaWxpdGFzIGJhaHdhIHByb2R1ayBha2FuIGNhY2F0IChcKERcKT1ZZXMgZGVuZ2FuIGtvbmRpc2kga29tcG9uZW4gcmVuZGFoIChcKENcKSk9IExvdyBkYW4gcHJvc2VzIHByb2R1a3NpIGRpIGJhd2FoIHN0YW5kYXIgKFwoUFwpKT1CZWxvdyBhZGFsYWg6DQoNCiQkDQpQICggRCA9IFx0ZXh0e1llc30gfCBDID0gXHRleHR7TG93fSwgUCA9IFx0ZXh0e0JlbG93fSApID0gXGZyYWMge1AoQyA9IFx0ZXh0e0xvd30sIFAgPSBcdGV4dHtCZWxvd30gfCBEID0gXHRleHR7WWVzfSkgXGNkb3QgUChEID0gXHRleHR7WWVzfSl9e1AoQyA9IFx0ZXh0e0xvd30gLCBQID0gXHRleHR7QmVsb3d9KX0NCiQkIA0KDQoNCioqMS4gRGF0YSBIaXN0b3JpcyB5YW5nIERpa2V0YWh1aSoqDQoNCkRhcmkgc29hbCxraXRhIG1lbWlsaWtpIGRhdGEgcHJvYmFiaWxpdGFzIGJlcmlrdXQ6DQoNCioqKjEuIFByb2JhYmlsaXRhcyBwcm9kdWsgY2FjYXQ6KioqDQoNCiQkDQpQIChEPVllcyk9IDVcJT0wLDA1DQokJA0KDQoqKioyLiBQcm9iYWJpbGl0YXMgcHJvZHVrIHRpZGFrIGNhY2F0OioqKg0KDQokJA0KUCAoRD1ObykgPSA5NVwlID0gMCw5NQ0KJCQNCg0KDQoqKiozLiBQcm9iYWJpbGl0YXMga29tcG9uZW4gYmVya3VhbGl0YXMgcmVuZGFoOioqKg0KDQokJA0KUCAoQz1Mb3cpID0gMzBcJSA9IDAuMzANCiQkDQoNCioqKjQuIFByb2JhYmlsaXRhcyBwcm9zZXMgcHJvZHVrIGRpIGJhd2FoIHN0YW5kYXI6KioqDQoNCiQkDQpQIChQPUJlbG93KSA9IDQwXCUgPTAsNDANCiQkDQoNCioqKjUuIFByb2JhYmlsaXRhcyBrb21wb25lbiBiZXJrdWFsaXRhcyByZW5kYWggamlrYSBwcm9kdWsgY2FjYXQ6KioqDQoNCiQkDQpQIChMb3cgfCBEID0gWWVzKSA9IDYwXCU9MCw2MA0KJCQNCg0KKioqNi4gUHJvYmFiaWxpdGFzIHByb3NlcyBwcm9kdWtzaSBkaSBiYXdhaCBzdGFuZGFyIGppa2EgcHJvZHVrIGNhY2F0OioqKg0KDQokJA0KUCAoUD1CZWxvdyB8IEQgPSBZZXMpID0gNzBcJSA9MCw3MA0KJCQNCg0KKioyLiBNZW5naGl0dW5nIFwoUFwpIChcKENcKVwoTG93XClcKFBcKT1cKEJlbG93XCl8XChEXCk9WWVzLCkqKg0KDQpVbnR1ayBtZW5naGl0dW5nIHByb2JhYmlsaXRhcyBrb21wb25lbiByZW5kYWggZGFuIHByb3NlcyBkaSBiYXdhaCBzdGFuZGFyIGppa2EgcHJvZHVrIGNhY2F0LCBraXRhIGFzdW1zaWthbiBiYWh3YSBrb21wb25lbiBkYW4gcHJvc2VzIHByb2R1a3NpICoqaW5kZXBlbmRlbioqLiBPbGVoIGthcmVuYSBpdHUsIGtpdGEga2FsaWthbiBrZWR1YSBwcm9iYWJpbGl0YXMgYmVyc3lhcmF0Og0KDQokJA0KUChDPUxvdyxQPUJlbG93fEQgPSBZZXMpPVAoQz1Mb3d8RD1ZZXMpXHRpbWVzIFAoUD1CZWxvd3xEPVllcykNCiQkDQpTdWJzdGl0dXNpIG5pbGFpLW5pbGFpbnlhOg0KDQokJA0KUChDPWxvdyxQPUJlbG93IHwgRD1ZZXMpID0wLDYwXHRpbWVzMCw3MD0wLDQyDQokJA0KDQoqKjMuTWVuZ2hpdHVuZyBcKFBcKShcKGNcKT1cKExvd1wpLFwoUFwpPVwoQmVsb3dcKSkNCg0KVW50dWsgbWVuZ2hpdHVuZyBwcm9iYWJpbGl0YXMgYmFod2Ega29tcG9uZW4gcmVuZGFoIGRhbiBwcm9zZXMgZGkgYmF3YWggc3RhbmRhciBzZWNhcmEgdW11bSAodGFucGEgbWVtcGVyaGF0aWthbiBjYWNhdCBhdGF1IHRpZGFrKSwga2l0YSBrYWxpa2FuIHByb2JhYmlsaXRhcyBrb21wb25lbiByZW5kYWggZGVuZ2FuIHByb2JhYmlsaXRhcyBwcm9zZXMgZGkgYmF3YWggc3RhbmRhcjoNCg0KJCQNClAoQz1sb3csUD1CZWxvdyk9UChDPUxvdylcdGltZXMgUChQPUJlbG93KQ0KJCQNCg0KU3Vic3RpdHVzaSBuaWxhaS1uaWxhaW55YToNCg0KJCQNClAoQz1Mb3csUD1CZWxvdyk9MCwzMFx0aW1lczAsNDA9MCwxMg0KJCQNCg0KKio0LiBNZW5naGl0dW5nIFByb2JhYmlsaXRhcyBNZW5nZ3VuYWthbiBUZW9yZW1hIEJheWVzKioNCg0KU2VrYXJhbmcsIGtpdGEgc3Vic3RpdHVzaSBzZW11YSBuaWxhaSBrZSBkYWxhbSBydW11cyBUZW9yZW1hIEJheWVzOg0KDQokJA0KUCAoIEQgPSBcdGV4dHtZZXN9IHwgQyA9IFx0ZXh0e0xvd30sIFAgPSBcdGV4dHtCZWxvd30gKSA9IFxmcmFjIHtQKEMgPSBcdGV4dHtMb3d9LCBQID0gXHRleHR7QmVsb3d9IHwgRCA9IFx0ZXh0e1llc30pIFxjZG90IFAoRCA9IFx0ZXh0e1llc30pfXtQKEMgPSBcdGV4dHtMb3d9ICwgUCA9IFx0ZXh0e0JlbG93fSl9DQokJCANCg0KU3Vic3RpdHVzaSBhbmdrYS1hbmdrYSB5YW5nIHN1ZGFoIGRpaGl0dW5nOg0KDQokJA0KUCAoRD1ZZXN8Qz1Mb3csUD1CZWxvdyk9XGZyYWMgezAsNDIgXHRpbWVzIDAsMDV9ezAsMTJ9DQokJA0KDQoNCiQkDQpQIChEPVllc3xDPUxvdyxQPUJlbG93KT0wLDE3NQ0KJCQNCg0KKio1Lkhhc2lsIGFraGlyKioNCg0KSmFkaSwgcHJvYmFiaWxpdGFzIGJhaHdhIHByb2R1ayBha2FuIGNhY2F0IGppa2Ega29tcG9uZW4geWFuZyBkaWd1bmFrYW4gYmVya3VhbGl0YXMgcmVuZGFoIGRhbiBwcm9zZXMgcHJvZHVrc2kgZGlsYWt1a2FuIGRpIGJhd2FoIHN0YW5kYXIgYWRhbGFoOg0KDQokJA0KMTcsNSUNCiQkDQoNCioqUGVuamVsYXNhbiBJbnR1aXRpZioqDQoNCi0gRGFyaSBEYXRhIEhpc3RvcmlzOiBIYW55YSBcKDUlXCkgZGFyaSBwcm9kdWsgeWFuZyBkaWJ1YXQgZGlrZXRhaHVpIGNhY2F0Lg0KDQotIEppa2EgcHJvZHVrIHRlcm55YXRhIGNhY2F0LCBhZGEga2VtdW5na2luYW4gYmVzYXIgYmFod2Ega29tcG9uZW4geWFuZyBkaWd1bmFrYW4gYmVya3VhbGl0YXMgcmVuZGFoIChcKDYwJVwpIGRhbiBwcm9zZXMgcHJvZHVrc2kgZGlsYWt1a2FuIGRpIGJhd2FoIHN0YW5kYXIgKFwoNzAlXCkuDQoNCi0gRGVuZ2FuIG1lbXBlcnRpbWJhbmdrYW4gc2VtdWEgZmFrdG9yIGluaSwga2V0aWthIGtpdGEgdGFodSBiYWh3YSBrb21wb25lbiB5YW5nIGRpZ3VuYWthbiByZW5kYWggZGFuIHByb3NlcyBwcm9kdWtzaW55YSBkaSBiYXdhaCBzdGFuZGFyLCBrZW11bmdraW5hbiBwcm9kdWsgdGVyc2VidXQgY2FjYXQgbWVuaW5na2F0IG1lbmphZGkgXCgxNyw1JVwpLg0KDQoqKkltcGxlbWVudGFzaSBLb2RlIFB5dGhvbioqDQoNCmBgYHtyIGVjaG89VFJVRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiAjIERhdGEgZGFyaSBzb2FsIPCfk4oNCnByb2JfY2FjYXQgPC0gMC4wNSAgICAgICAgICAgICAgICMgUHJvYmFiaWxpdGFzIHByb2R1ayBjYWNhdCAoUChEID0gWWVzKSkNCnByb2JfbG93X2ppa2FfY2FjYXQgPC0gMC43MCAgICAgICMgUHJvYmFiaWxpdGFzIGtvbXBvbmVuIGt1YWxpdGFzIHJlbmRhaCBrYWxhdSBwcm9kdWsgY2FjYXQgKFAoQyA9IExvdyB8IEQgPSBZZXMpKQ0KcHJvYl9iZWxvd19qaWthX2NhY2F0IDwtIDAuNjAgICAgIyBQcm9iYWJpbGl0YXMgcHJvc2VzIGRpIGJhd2FoIHN0YW5kYXIga2FsYXUgcHJvZHVrIGNhY2F0IChQKFAgPSBCZWxvdyB8IEQgPSBZZXMpKQ0KcHJvYl9sb3cgPC0gMC4zMCAgICAgICAgICAgICAgICAgIyBQcm9iYWJpbGl0YXMga29tcG9uZW4ga3VhbGl0YXMgcmVuZGFoIHNlY2FyYSB1bXVtIChQKEMgPSBMb3cpKQ0KcHJvYl9iZWxvdyA8LSAwLjQwICAgICAgICAgICAgICAgIyBQcm9iYWJpbGl0YXMgcHJvc2VzIGRpIGJhd2FoIHN0YW5kYXIgc2VjYXJhIHVtdW0gKFAoUCA9IEJlbG93KSkNCg0KIyBMYW5na2FoIDE6IENhcmkgcHJvYmFiaWxpdGFzIGtvbXBvbmVuIGxvdyBEQU4gcHJvc2VzIGRpIGJhd2FoIHN0YW5kYXIgamlrYSBwcm9kdWsgY2FjYXQNCnByb2JfbG93X2Rhbl9iZWxvd19qaWthX2NhY2F0IDwtIHByb2JfbG93X2ppa2FfY2FjYXQgKiBwcm9iX2JlbG93X2ppa2FfY2FjYXQNCg0KIyBMYW5na2FoIDI6IENhcmkgcHJvYmFiaWxpdGFzIGtvbXBvbmVuIGxvdyBEQU4gcHJvc2VzIGRpIGJhd2FoIHN0YW5kYXIgc2VjYXJhIHVtdW0NCnByb2JfbG93X2Rhbl9iZWxvdyA8LSBwcm9iX2xvdyAqIHByb2JfYmVsb3cNCg0KIyBMYW5na2FoIDM6IEd1bmFrYW4gVGVvcmVtYSBCYXllcyB1bnR1ayBtZW5naGl0dW5nIHByb2JhYmlsaXRhcyBwcm9kdWsgY2FjYXQNCnByb2JfY2FjYXRfamlrYV9sb3dfZGFuX2JlbG93IDwtIChwcm9iX2xvd19kYW5fYmVsb3dfamlrYV9jYWNhdCAqIHByb2JfY2FjYXQpIC8gcHJvYl9sb3dfZGFuX2JlbG93DQoNCiMgQ2V0YWsgaGFzaWxueWEgZGFsYW0gYmVudHVrIHBlcnNlbnRhc2UNCmNhdCgiS2VtdW5na2luYW4gcHJvZHVrIGNhY2F0IGppa2Ega29tcG9uZW4gcmVuZGFoIGRhbiBwcm9zZXMgZGkgYmF3YWggc3RhbmRhciBhZGFsYWg6IiwNCiAgICByb3VuZChwcm9iX2NhY2F0X2ppa2FfbG93X2Rhbl9iZWxvdywgNCkgKiAxMDAsICIlXG4iKQ0KDQoNCmBgYA0KIyA3LjggU3R1ZGkgS2FzdXMgMiANCg0KUGVuZXJhcGFuIFByb2JhYmlsaXRhcyBkYWxhbSBEZXRla3NpIFBlbmlwdWFuIFRyYW5zYWtzaToNClNlYnVhaCBwZXJ1c2FoYWFuIGUtY29tbWVyY2UgaW5naW4gbWVuZGV0ZWtzaSB0cmFuc2Frc2kgeWFuZyBiZXJwb3RlbnNpIHBlbmlwdWFuLiBCZXJkYXNhcmthbiBkYXRhIGhpc3RvcmlzLCBcKDElXCkgZGFyaSB0cmFuc2Frc2kgeWFuZyBkaWxha3VrYW4gYWRhbGFoIHBlbmlwdWFuLiBQZXJ1c2FoYWFuIGluZ2luIG1lbmdndW5ha2FuIGZpdHVyLWZpdHVyIHRlcnRlbnR1IHNlcGVydGkgKipsb2thc2kgdHJhbnNha3NpKiosICoqanVtbGFoIHBlbWJlbGlhbioqLCBkYW4gKiptZXRvZGUgcGVtYmF5YXJhbioqIHVudHVrIG1lbXByZWRpa3NpIGFwYWthaCBzdWF0dSB0cmFuc2Frc2kgYWRhbGFoIHBlbmlwdWFuIGF0YXUgdGlkYWsuDQoNCiMjIDcuOC4xIEZpdHVyIERhdGENCg0KLSAqKkxva2FzaSAoTCkqKjpOZWdhcmEgYXRhdSBrb3RhIHRlbXBhdCB0cmFuc2Frc2kgZGlsYWt1a2FuLg0KDQotICoqSnVtbGFoIFBlbWJlbGlhbiAoQSkqKjpKdW1sYWggdWFuZyB5YW5nIGRpYmVsYW5qYWthbi4NCg0KLSAqKk1ldG9kZSBQZW1iYXlhcmFuIChNKSoqOiBNZXRvZGUgUGVtYmF5YXJhbiB5YW5nIGRpZ3VuYWthbiAoa2FydHUga3JlZGl0LGRvbXBldCBkaWdpdGFsLGRsbCkNCg0KLSAqKlBlbmlwdWFuIChGKSoqOiBTdGF0dXMgdHJhbnNha3NpIGFwYWthaCBwZW5pcHVhbiBhdGF1IHRpZGFrLg0KDQo3LjguMiBEYXRhIEhpc3RvcmlzIChDb250b2gpDQotIFByb2JhYmlsaXRhcyB0cmFuc2Frc2kgYWRhbGFoIHBlbmlwdWFuIChQKEYgPSBGcmF1ZCkpID0gXCgxJVwpDQoNCi0gUHJvYmFiaWxpdGFzIHRyYW5zYWtzaSBidWthbiBwZW5pcHVhbiAoUChGID0gTm90IEZyYXVkKSkgPSBcKDk5JVwpDQoNCi0gUHJvYmFiaWxpdGFzIGxva2FzaSB0ZXJ0ZW50dSBhZGFsYWggZGkgbHVhciBuZWdlcmkgKFAoTCA9IEZvcmVpZ24pKSA9IFwoMjAlXCkNCg0KLSBQcm9iYWJpbGl0YXMganVtbGFoIHBlbWJlbGlhbiBsZWJpaCBkYXJpIFwoNTAwXCkoUChBID0gKSQpID0gXCgxMCVcKQ0KDQotIFByb2JhYmlsaXRhcyBtZW5nZ3VuYWthbiBrYXJ0dSBrcmVkaXQgc2ViYWdhaSBtZXRvZGUgcGVtYmF5YXJhbiAoIFAoTSA9IENyZWRpdCBDYXJkKSkgPSBcKDUwJVwpDQoNCkJhZ2FpbWFuYSBwcm9iYWJpbGl0YXMgYmFod2Egc3VhdHUgdHJhbnNha3NpIGFkYWxhaCBwZW5pcHVhbiAoRiA9IEZyYXVkKSwgamlrYSBkaWtldGFodWkgdHJhbnNha3NpIGRpbGFrdWthbiBkYXJpIGxva2FzaSBsdWFyIG5lZ2VyaSwganVtbGFoIHBlbWJlbGlhbiBsZWJpaCBkYXJpIFwoJDUwMFwpLCBkYW4gbWV0b2RlIHBlbWJheWFyYW4gbWVuZ2d1bmFrYW4ga2FydHUga3JlZGl0Pw0KDQokJA0KXGJlZ2lue3NwbGl0fQ0KUChGID0gXHRleHR7RnJhdWR9IFxtaWQgTCwgQSwgTSApIA0KPSBcZnJhY3tQKEwsIEEsIE0gXG1pZCBGID0gXHRleHR7RnJhdWR9KSBcY2RvdCBQKEYgPSBcdGV4dHtGcmF1ZH0pfXtQKEwsIEEsIE0pfQ0KXGVuZHtzcGxpdH0NCiQkDQojIyA3LjguMiBMYW5na2FoLWxhbmdrYWggcGVueWVsZXNhaWFuDQoNCktpdGEgZGltaW50YSBtZW5jYXJpIHByb2JhYmlsaXRhcyBiYWh3YSB0cmFuc2Frc2kgYWRhbGFoIHBlbmlwdWFuIChGcmF1ZCkgamlrYSBkaWtldGFodWkgYmFod2E6DQoNCi0gKipMb2thc2kgdHJhbnNha3NpKio6IEx1YXIgbmVnZXJpIChMID0gRm9yZWlnbikNCg0KLSAqKkp1bWxhaCBwZW1iZWxpYW4qKjogTGViaWggZGFyaSBcKCQ1MDBcKSAoQSA9IEhpZ2gpDQoNCi0gKipNZXRvZGUgcGVtYmF5YXJhbioqOiBNZW5nZ3VuYWthbiBrYXJ0dSBrcmVkaXQgKE0gPSBDcmVkaXQgQ2FyZCkNCg0KUnVtdXMgeWFuZyBha2FuIGtpdGEgZ3VuYWthbiBhZGFsYWggVGVvcmVtYSBCYXllczoNCg0KJCQNClxiZWdpbntzcGxpdH0NClAoRiA9IFx0ZXh0e0ZyYXVkfSBcbWlkIEwsIEEsIE0gKSANCj0gXGZyYWN7UChMLCBBLCBNIFxtaWQgRiA9IFx0ZXh0e0ZyYXVkfSkgXGNkb3QgUChGID0gXHRleHR7RnJhdWR9KX17UChMLCBBLCBNKX0NClxlbmR7c3BsaXR9DQokJA0KDQoqKjEuIERpa2V0YWh1aSBkYXJpIERhdGEgSGlzdG9yaXMNCg0KLSBcKFBcKShGPUZyYXVkKSA9XCgxJVwpPVwoMC4wMVwpIFByb2JhYmlsaXRhcyB0cmFuc2Frc2kgYWRhbGFoIHBlbmlwdWFuLg0KDQotIFwoUFwpKEY9Tm90IEZyYXVkKT1cKDk5JVwpPVwoMC45OVwpIFByb2JhYmlsaXRhcyB0cmFuc2Frc2kgYnVrYW4gcGVuaXB1YW4uDQoNCi0gXChQXCkoTD1Gb3JlaWduKT1cKDIwJVwpPVwoMCwyMFwpIFByb2JhYmlsaXRhcyBsb2thc2kgdHJhbnNha3NpIGRpIGx1YXIgbmVnZXJpLg0KDQotIFwoUFwpKEE9SGlnaCk9XCgxMCVcKT1cKDAuMTBcKSByb2JhYmlsaXRhcyBqdW1sYWggcGVtYmVsaWFuIGxlYmloIGRhcmkgXCgkNTAwXCkuDQoNCi0gXChQXCkoTT1DcmVkaXQgQ2FyZCk9XCg1MCVcKT1cKDAuNTAlXCkgcHJvYmFiaWxpdGFzIGp1bWxhaCBwZW1iZWxpYW4gbGViaWggZGFyaSBcKCQ1MDBcKS4NCg0KS2l0YSBtZW1lcmx1a2FuIGR1YSBrb21wb25lbjoNCg0KKipQcm9iYWJpbGl0YXMgYmVyc3lhcmF0IGJhaHdhIHRyYW5zYWtzaSBkaWxha3VrYW4gZGkgbHVhciBuZWdlcmksIGp1bWxhaCB0aW5nZ2ksIGRhbiBtZW5nZ3VuYWthbiBrYXJ0dSBrcmVkaXQgamlrYSBwZW5pcHVhbjoNCg0KJCQNClAoTD1Gb3JlaWduLEE9SGlnaCxNPUNyZWRpdCBDYXJkIHwgRj1GcmF1ZCkNCiQkDQoNCioqUHJvYmFiaWxpdGFzIGdhYnVuZ2FuIGRhcmkga29uZGlzaSB0ZXJzZWJ1dCBzZWNhcmEgdW11bToqKg0KDQokJA0KUChMPUZvcmVpZ24sQT1IaWdoLE09Q3JlZGl0IENhcmQpDQokJA0KDQoqKjIuIEFzdW1zaSBEYXRhIFRhbWJhaGFuKioNCg0KVW50dWsgbWVtcGVybXVkYWggcGVyaGl0dW5nYW4sIGtpdGEgYnVhdCBiZWJlcmFwYSBhc3Vtc2kgdGFtYmFoYW4gYmVyZGFzYXJrYW4gcG9sYSBoaXN0b3JpcyB5YW5nIG1hc3VrIGFrYWw6DQoNCjEuKipKaWthIHRyYW5zYWtzaSBhZGFsYWggcGVuaXB1YW4gXCgoRj1GcmF1ZFwpKToqKg0KDQotIFByb2JhYmlsaXRhcyB0cmFuc2Frc2kgZGlsYWt1a2FuIGRpIGx1YXIgbmVnZXJpOiAkUChMPUZvcmVpZ24gfCBGPSBGcmF1ZCk9MC43MCQNCg0KLSBQcm9iYWJpbGl0YXMganVtbGFoIHBlbWJlbGlhbiBsZWJpaCBkYXJpIDUwMDogJFAoQT1IaWdoIHwgRj1GcmF1ZCk9IDAuNjAkDQoNCi0gUHJvYmFiaWxpdGFzIG1lbmdndW5ha2FuIGthcnR1IGtyZWRpdDogJFAoTT1jcmVkaXQgY2FyZCB8IEY9RnJhdWQpPSAwLjgwJA0KDQoqKjIuSmlrYSB0cmFuc2Frc2kgYnVrYW4gcGVuaXB1YW4gKFwoRlwpID0gTm90IEZyYXVkKToqKg0KDQotIFByb2JhYmlsaXRhcyB0cmFuc2Frc2kgZGlsYWt1a2FuIGRpIGx1YXIgbmVnZXJpOiRQKEw9Rm9yZWlnbiB8IEY9IE5vdCBGcmF1ZCkgPSAwLjE1JA0KDQotIFByb2JhYmlsaXRhcyBqdW1sYWggcGVtYmVsaWFuIGxlYmloIGRhcmkgXCgkNTAwXCk6IFwoUFwpKEE9SGlnaCB8IEY9RnJhdWQpPVwoMC4wNVwpDQoNCi0gUHJvYmFiaWxpdGFzIG1lbmdndW5ha2FuIGthcnR1IGtyZWRpdDogDQoNCiQkDQooUChNPWNyZWRpdCBjYXJkIHwgRj1GcmF1ZCk9IDAuNTAgDQokJA0KDQoqKkhpdHVuZyBQcm9iYWJpbGl0YXMgYmVyc3lhcmF0KioNCg0KKipMYW5na2FoIDEgOiBIaXR1bmcgJFAoTCwgQSwgTSBcbWlkIEZyYXVkKSQqKg0KDQokJA0KUChMLCBBLCBNIFxtaWQgRnJhdWQpID0gUChMIFxtaWQgRnJvdWQpIFx0aW1lcyBQKEEgXG1pZCBGcmF1ZCkgXHRpbWVzIFAoTSBcbWlkIEZyYXVkKQ0KJCQNCg0KU3VidGl0dXNpa2FuIG5pbGFpIA0KDQokJA0KXGJlZ2lue3NwbGl0fQ0KUChMLCBBLCBNIFxtaWQgRnJhdWQpICY9IFAoTCBcbWlkIEZyb3VkKSBcdGltZXMgUChBIFxtaWQgRnJhdWQpIFx0aW1lcyBQKE0gXG1pZCBGcmF1ZCkgXFwNCiY9IDAsNzAgXHRpbWVzIDAsNjAgXHRpbWVzIDAsODAgXFwNCiY9IDAsMzM2DQpcZW5ke3NwbGl0fQ0KJCQNCg0KKipMYW5na2FoIDIgOiAkUChMLCBBLCBNKSoqDQoNCk1lbmdndW5ha2FuIGF0dXJhbiB0b3RhbCBwcm9iYWJpbGl0YXMgOg0KDQokJA0KUChMLCBBLCBNKSA9IFAoTCwgQSwgTSBcbWlkIEYgPSBGcmF1ZCkgXGNkb3QgUChGID0gRnJhdWQpICsgUChMLCBBLCBNIFxtaWQgRiA9IE5vdCBGcmF1ZCkNCiQkIA0KDQpIaXR1bmcgYmFnaWFuIHBlcnRhbWENCg0KJCQNCjAsMDAzNzUgXHRpbWVzIDAsMDEgPSAwLDAwMzM2DQokJA0KDQpIaXR1bmcgYmFnaWFuIGtlZHVhIA0KDQokJA0KUChMLCBBLCBNIFxtaWQgRiA9IE5vdCBGcmF1ZCApID0gMCwxNSBcdGltZXMgMCwwNSBcdGltZXMgMCw1MCA9IDAsMDAzNzUNCiQkDQoNClRvdGFsIDoNCg0KJCQNCjAsMDAzMzYgKyAwLDAwMzcxMjUgPSAwLDAwNzA3MjUNCiQkDQoNCioqTGFuZ2thaCAzIDogSGl0dW5nIFByb2JhYmlsaXRhcyBGaW5hbCBkZW5nYW4gVGVvcmVtYSBCYXllcyoqDQoNCiQkDQpcYmVnaW57c3BsaXR9DQpQKEYgPSBGcmF1ZCBcbWlkIEwsIEEsIE0pIA0KJj0gXGZyYWN7MCwzMzYgXHRpbWVzIDAsMDF9ezAsMDA3MDcyNX0gXFwNCiY9IFxmcmFjezAsMDAzMzZ9ezAsMDA3MDcyNX0gXFwNCiY9IDAsNDc1DQpcZW5ke3NwbGl0fQ0KJCQNCg0KKipIYXNpbCBBa2hpciAkNDcsNVwlJCoqIA0KDQpLZW11bmdraW5hbiBiYWh3YSBzdWF0dSB0cmFuc2Frc2kgYWRhbGFoIHBlbmlwdWFuIGppa2EgZGlrZXRhaHVpIGRpbGFrdWthbiBkYXJpIGx1YXIgbmVnZXJpLCBqdW1sYWggcGVtYmVsaWFuIGxlYmloIGRhcmkgJDUwMCwgZGFuIG1lbmdndW5ha2FuIGthcnR1IGtyZWRpdCBhZGFsYWggc2VraXRhciA0Ny41JS4NCg0KKipQZXJoaXR1bmdhbiBNZW5nZ3VuYWthbiBTaXN0ZW0qKg0KDQpgYGB7ciBlY2hvPVRSVUUsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIERhdGEgaGlzdG9yaXMNCnByb2JfZnJhdWQgPC0gMC4wMSAgICAgICAgICAgICAjIFByb2JhYmlsaXRhcyB0cmFuc2Frc2kgYWRhbGFoIHBlbmlwdWFuIChQKEYgPSBGcmF1ZCkpDQpwcm9iX25vdF9mcmF1ZCA8LSAwLjk5ICAgICAgICAgIyBQcm9iYWJpbGl0YXMgdHJhbnNha3NpIGJ1a2FuIHBlbmlwdWFuIChQKEYgPSBOb3QgRnJhdWQpKQ0KDQojIFByb2JhYmlsaXRhcyBiZXJzeWFyYXQgamlrYSBwZW5pcHVhbiAoRiA9IEZyYXVkKQ0KcHJvYl9mb3JlaWduX2dpdmVuX2ZyYXVkIDwtIDAuNzAgICAgICAgICMgUChMID0gRm9yZWlnbiB8IEYgPSBGcmF1ZCkNCnByb2JfaGlnaF9naXZlbl9mcmF1ZCA8LSAwLjYwICAgICAgICAgICAjIFAoQSA9IEhpZ2ggfCBGID0gRnJhdWQpDQpwcm9iX2NhcmRfZ2l2ZW5fZnJhdWQgPC0gMC44MCAgICAgICAgICAgIyBQKE0gPSBDcmVkaXQgQ2FyZCB8IEYgPSBGcmF1ZCkNCg0KIyBQcm9iYWJpbGl0YXMgYmVyc3lhcmF0IGppa2EgYnVrYW4gcGVuaXB1YW4gKEYgPSBOb3QgRnJhdWQpDQpwcm9iX2ZvcmVpZ25fZ2l2ZW5fbm90X2ZyYXVkIDwtIDAuMTUgICAgIyBQKEwgPSBGb3JlaWduIHwgRiA9IE5vdCBGcmF1ZCkNCnByb2JfaGlnaF9naXZlbl9ub3RfZnJhdWQgPC0gMC4wNSAgICAgICAjIFAoQSA9IEhpZ2ggfCBGID0gTm90IEZyYXVkKQ0KcHJvYl9jYXJkX2dpdmVuX25vdF9mcmF1ZCA8LSAwLjUwICAgICAgICMgUChNID0gQ3JlZGl0IENhcmQgfCBGID0gTm90IEZyYXVkKQ0KDQojIExhbmdrYWggMTogSGl0dW5nIFAoTCA9IEZvcmVpZ24sIEEgPSBIaWdoLCBNID0gQ3JlZGl0IENhcmQgfCBGID0gRnJhdWQpDQpwcm9iX2NvbWJpbmVkX2dpdmVuX2ZyYXVkIDwtIHByb2JfZm9yZWlnbl9naXZlbl9mcmF1ZCAqIHByb2JfaGlnaF9naXZlbl9mcmF1ZCAqIHByb2JfY2FyZF9naXZlbl9mcmF1ZA0KDQojIExhbmdrYWggMjogSGl0dW5nIFAoTCA9IEZvcmVpZ24sIEEgPSBIaWdoLCBNID0gQ3JlZGl0IENhcmQgfCBGID0gTm90IEZyYXVkKQ0KcHJvYl9jb21iaW5lZF9naXZlbl9ub3RfZnJhdWQgPC0gcHJvYl9mb3JlaWduX2dpdmVuX25vdF9mcmF1ZCAqIHByb2JfaGlnaF9naXZlbl9ub3RfZnJhdWQgKiBwcm9iX2NhcmRfZ2l2ZW5fbm90X2ZyYXVkDQoNCiMgTGFuZ2thaCAzOiBIaXR1bmcgUChMID0gRm9yZWlnbiwgQSA9IEhpZ2gsIE0gPSBDcmVkaXQgQ2FyZCkgbWVuZ2d1bmFrYW4gYXR1cmFuIHRvdGFsIHByb2JhYmlsaXRhcw0KcHJvYl9jb21iaW5lZCA8LSAocHJvYl9jb21iaW5lZF9naXZlbl9mcmF1ZCAqIHByb2JfZnJhdWQpICsgKHByb2JfY29tYmluZWRfZ2l2ZW5fbm90X2ZyYXVkICogcHJvYl9ub3RfZnJhdWQpDQoNCiMgTGFuZ2thaCA0OiBHdW5ha2FuIFRlb3JlbWEgQmF5ZXMgdW50dWsgbWVuZ2hpdHVuZyBQKEYgPSBGcmF1ZCB8IEwgPSBGb3JlaWduLCBBID0gSGlnaCwgTSA9IENyZWRpdCBDYXJkKQ0KcHJvYl9mcmF1ZF9naXZlbl9jb21iaW5lZCA8LSAocHJvYl9jb21iaW5lZF9naXZlbl9mcmF1ZCAqIHByb2JfZnJhdWQpIC8gcHJvYl9jb21iaW5lZA0KDQojIENldGFrIGhhc2lsIGRhbGFtIGJlbnR1ayBwZXJzZW50YXNlDQpjYXQoIlByb2JhYmlsaXRhcyB0cmFuc2Frc2kgYWRhbGFoIHBlbmlwdWFuIGppa2EgZGlrZXRhaHVpIGxva2FzaSBsdWFyIG5lZ2VyaSwganVtbGFoIGxlYmloIGRhcmkgJDUwMCwgZGFuIG1lbmdndW5ha2FuIGthcnR1IGtyZWRpdCBhZGFsYWg6IiwNCiAgICByb3VuZChwcm9iX2ZyYXVkX2dpdmVuX2NvbWJpbmVkLCA0KSAqIDEwMCwgIiVcbiIpDQoNCmBgYA0KDQojIFJlZmVyZW5zaSANCg0KLSBLaGFuIEFjYWRlbXkuIChuLmQuKS4gUHJvYmFiaWxpdHkgYW5kIFN0YXRpc3RpY3MuIERpYWtzZXMgcGFkYSBbaHR0cHM6Ly93d3cua2hhbmFjYWRlbXkub3JnL21hdGgvc3RhdGlzdGljcy1wcm9iYWJpbGl0eS9wcm9iYWJpbGl0eS1saWJyYXJ5XShodHRwczovL3d3dy5raGFuYWNhZGVteS5vcmcvbWF0aC9zdGF0aXN0aWNzLXByb2JhYmlsaXR5L3Byb2JhYmlsaXR5LWxpYnJhcnkpLg0KDQotIFN0YXQgVHJlay4gKG4uZC4pLiBJbnRyb2R1Y3Rpb24gdG8gUHJvYmFiaWxpdHkuIERpYWtzZXMgcGFkYSBbaHR0cHM6Ly9zdGF0dHJlay5jb20vcHJvYmFiaWxpdHkvcHJvYmFiaWxpdHkuYXNweF0oaHR0cHM6Ly9zdGF0dHJlay5jb20vcHJvYmFiaWxpdHkvcHJvYmFiaWxpdHkuYXNweCkuDQoNCi0gQ291cnNlcmEuIChuLmQuKS4gSW50cm9kdWN0aW9uIHRvIFByb2JhYmlsaXR5IGFuZCBEYXRhLiBEaWFrc2VzIHBhZGEgW2h0dHBzOi8vd3d3LmNvdXJzZXJhLm9yZy9sZWFybi9wcm9iYWJpbGl0eS1hbmQtZGF0YV0oaHR0cHM6Ly93d3cuY291cnNlcmEub3JnL2xlYXJuL3Byb2JhYmlsaXR5LWFuZC1kYXRhKS4NCg0KLSBNYXNzYWNodXNldHRzIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LiAoMjAxNCkuIEludHJvZHVjdGlvbiB0byBQcm9iYWJpbGl0eS4gTUlUIE9wZW5Db3Vyc2VXYXJlLiBEaWFrc2VzIHBhZGEgW2h0dHBzOi8vb2N3Lm1pdC5lZHUvY291cnNlcy9tYXRoZW1hdGljcy8xOC0xMDBjLWludHJvZHVjdGlvbi10by1wcm9iYWJpbGl0eS1mYWxsLTIwMTQvXShodHRwczovL29jdy5taXQuZWR1L2NvdXJzZXMvbWF0aGVtYXRpY3MvMTgtMTAwYy1pbnRyb2R1Y3Rpb24tdG8tcHJvYmFiaWxpdHktZmFsbC0yMDE0LykuDQoNCi0gV2lraXBlZGlhLiAobi5kLikuIFByb2JhYmlsaXR5LiBEaWFrc2VzIHBhZGEgW2h0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1Byb2JhYmlsaXR5XShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Qcm9iYWJpbGl0eSkuDQo=