Aljabar Linear

Carol Dupino Pereira

NIM: 52250051

Mahasiswa Sains Data ITSB

R Programming Data Science Statistics

1 . IMPLEMENTASI DAN APLIKASI KONSEP ALJABAR LINEAR

1.1 Sistem Persamaan Linear (SPL) & Matriks

  • Rumus Utama: \(A\mathbf{x} = \mathbf{b}\)(Di mana \(A\) adalah matriks koefisien, \(\mathbf{x}\) vektor variabel, dan \(\mathbf{b}\) vektor konstanta)

  • Aplikasi: Analisis Arus Jaringan pada Teknik Elektro (Hukum Kirchhoff).

  • Penjelasan Matematis: Digunakan untuk mencari nilai variabel yang tidak diketahui dalam sistem yang saling terhubung.

  • Contoh Kasus: Menghitung arus listrik pada dua loop:

\(5I_1 + 2I_2 = 10\)\(2I_1 + 10I_2 = 20\)

Bentuk Matriks:

\(\begin{bmatrix} 5 & 2 \\ 2 & 10 \end{bmatrix} \begin{bmatrix} I_1 \\ I_2 \end{bmatrix} = \begin{bmatrix} 10 \\ 20 \end{bmatrix}\).

Penyelesaian menggunakan operasi baris elementer atau invers matriks \(\mathbf{x} = A^{-1}\mathbf{b}\).

1.1.1 Penjelasan Visualisasi 3D:

  • Dua Bidang (Surfaces): Dalam grafik 3D ini, setiap persamaan linear direpresentasikan sebagai sebuah bidang miring.

  • Perpotongan Bidang: Solusi dari SPL adalah titik di mana kedua bidang tersebut saling berpotongan tepat di ketinggian \(Z = 0\).

  • Titik Hitam (Solusi): Saya telah menambahkan marker pada koordinat \((\frac{5}{3}, \frac{5}{3})\) atau sekitar \((1.67, 1.67)\). Di titik inilah kedua sistem mencapai kesetimbangan (nol).

1.2 Determinan Matriks

  • Rumus Utama: Untuk matriks \(2 \times 2\), \(\det(A) = ad - bc\).

  • Aplikasi: Perubahan variabel dalam Kalkulus (Matriks Jacobian).

  • Penjelasan Matematis: Determinan memberikan informasi tentang faktor skala perubahan luas atau volume dari sebuah transformasi.

  • Contoh Kasus: Transformasi koordinat Kartesius ke Polar (\(x = r \cos \theta, y = r \sin \theta\)).

Matriks Jacobian (\(J\)): \(\begin{bmatrix} \cos \theta & -r \sin \theta \\ \sin \theta & r \cos \theta \end{bmatrix}\).

Nilai \(\det(J) = r\). Oleh karena itu, elemen luas \(dA = dx\,dy\) menjadi \(r\,dr\,d\theta\).

1.2.1 Penjelasan Visualisasi 3D:

Saat Anda memutar grafik di atas, Anda akan melihat beberapa poin penting terkait \(\det(J) = r\):

  • Grid yang Memuai: Perhatikan bahwa di dekat pusat (\(r\) kecil), “kotak-kotak” grid sangat rapat. Semakin jauh dari pusat (\(r\) besar), luas setiap segmen grid semakin besar secara linear. Inilah alasan mengapa elemen luasnya adalah \(r \, dr \, d\theta\).

  • Peran \(r\) sebagai Faktor Skala: Jika \(r = 0\), maka luasnya nol (titik pusat). Semakin besar \(r\), semakin besar kontribusi luasnya terhadap integral. Secara geometris, determinan Jacobian memberitahu kita seberapa besar transformasi tersebut “meregang” atau “menyusutkan” unit area. Dalam kasus polar:

\[dA = |J| \, dr \, d\theta = r \, dr \, d\theta\] ## Ruang Vektor \(\mathbb{R}^n\)

  • Rumus Utama: Kombinasi Linear \(\mathbf{v} = c_1\mathbf{v}_1 + c_2\mathbf{v}_2 + \dots + c_n\mathbf{v}_n\).

  • Aplikasi: Pemrosesan Warna Digital (Ruang Warna RGB).

  • Penjelasan Matematis: Setiap titik dalam ruang \(\mathbb{R}^n\) merepresentasikan satu entitas data spesifik.

  • Contoh Kasus: Warna oranye dalam komputer disimpan sebagai vektor \(\mathbf{v} = [255, 165, 0]\).

Ini adalah kombinasi linear dari basis standar \(\mathbb{R}^3\): \(255\mathbf{e}_1 + 165\mathbf{e}_2 + 0\mathbf{e}_3\).

1.2.2 Penjelasan Visualisasi 3D:

warna oranye tersebut adalah vektor \(\mathbf{v}\) yang merupakan hasil kombinasi linear dari basis standar \(\mathbb{R}^3\), di mana:

  • \(\mathbf{e}_1 = [1, 0, 0]\) (Komponen Merah Murni)

  • \(\mathbf{e}_2 = [0, 1, 0]\) (Komponen Hijau Murni)

  • \(\mathbf{e}_3 = [0, 0, 1]\) (Komponen Biru Murni)

Maka:

\[\mathbf{v} = 255 \begin{bmatrix} 1 \\ 0 \\ 0 \end{bmatrix} + 165 \begin{bmatrix} 0 \\ 1 \\ 0 \end{bmatrix} + 0 \begin{bmatrix} 0 \\ 0 \\ 1 \end{bmatrix} = \begin{bmatrix} 255 \\ 165 \\ 0 \end{bmatrix}\] Menariknya, dalam komputer grafis, kita sering mengubah basis warna (Transformasi Linear). Contohnya dari RGB ke Grayscale (skala abu-abu).

Misalkan kita ingin mengubah warna menjadi grayscale menggunakan bobot luminansi. Transformasi ini adalah perkalian dot product (atau perkalian matriks):

\[Y = 0.299R + 0.587G + 0.114B\]

Secara aljabar linear, ini adalah proyeksi dari ruang \(\mathbb{R}^3\) ke \(\mathbb{R}^1\) (garis skalar).

Mengapa ini penting

  • Kompresi Gambar: Teknik seperti JPEG menggunakan perubahan basis dari RGB ke YCbCr (Luminansi dan Krominansi) untuk membuang data yang tidak terlihat oleh mata manusia.

  • Filter Foto: Filter pada aplikasi seperti Instagram pada dasarnya adalah matriks transformasi yang dikalikan ke setiap vektor warna pada piksel gambar.

1.3 Ruang Vektor Secara Umum

  • Rumus Utama: Aksioma Ruang Vektor (Penjumlahan dan Perkalian Skalar pada himpunan objek seperti fungsi atau polinomial).

  • Aplikasi: Teori Persamaan Diferensial Linear.

  • Penjelasan Matematis: Himpunan semua solusi dari persamaan diferensial homogen membentuk subruang vektor.

  • Contoh Kasus: Pada persamaan \(y'' + y = 0\).

Karena solusinya adalah \(\sin(x)\) dan \(\cos(x)\), maka setiap kombinasi linear \(y = A\sin(x) + B\cos(x)\) juga merupakan solusi valid.

1.3.1 Penjelasan Visualisasi 3D:

bagaimana perubahan skalar \(A\) dan \(B\) menghasilkan kurva solusi yang berbeda namun tetap memenuhi karakteristik persamaan diferensial yang sama.

Cara yang lebih “aljabar linear” untuk melihat ini adalah melalui Ruang Fase. Jika kita definisikan \(y_1 = y\) dan \(y_2 = y'\), maka sistemnya menjadi:

\[\begin{bmatrix} y_1' \\ y_2' \end{bmatrix} = \begin{bmatrix} 0 & 1 \\ -1 & 0 \end{bmatrix} \begin{bmatrix} y_1 \\ y_2 \end{bmatrix}\]

Matriks di atas memiliki eigenvalues imajiner murni (\(\pm i\)), yang secara geometris berarti rotasi. Inilah mengapa solusinya berbentuk lingkaran atau elips dalam ruang fase, mencerminkan sifat osilasi dari sinus dan kosinus.

Penjelasan Geometris dalam 3D

  • Bidang Datar (Linearity): Perhatikan bahwa permukaan yang dihasilkan oleh add_surface di atas adalah sebuah bidang datar miring. Ini secara visual membuktikan sifat linearitas. Karena \(y\) adalah kombinasi linear dari \(A\) dan \(B\), maka perubahan pada \(A\) atau \(B\) akan mengakibatkan perubahan proporsional pada nilai \(y\).

  • Ruang Solusi: Setiap titik \((A, B)\) pada bidang horizontal tersebut mewakili satu solusi spesifik dari persamaan diferensial. Jika kita menggeser titik di bidang tersebut, kita sebenarnya sedang memilih “campuran” yang berbeda antara fungsi sinus dan kosinus.

1.3.2 Visualisasi Alternatif: Evolusi Waktu (3D Path)

Jika ingin melihat bagaimana solusi ini berosilasi seiring waktu (\(x\)) dalam bentuk spiral (ruang fase yang ditarik secara vertikal), kita bisa menggunakan add_paths:

Dalam bahasa aljabar linear, kita katakan bahwa operator diferensial \(L = \frac{d^2}{dx^2} + I\) memiliki Kernel (ruang nol) yang direntang (spanned) oleh \(\{\sin x, \cos x\}\). Visualisasi 3D ini membantu kita melihat bahwa seluruh “permukaan” solusi adalah hasil rentangan dari dua vektor basis tersebut.

1.4 Nilai dan Vektor Eigen

  • Rumus Utama: \(A\mathbf{v} = \lambda\mathbf{v}\) atau \(\det(A - \lambda I) = 0\).

  • Aplikasi: Analisis Frekuensi Alami dan Stabilitas Struktur.

  • Penjelasan Matematis: Nilai eigen (\(\lambda\)) sering merepresentasikan karakteristik fisik sistem (seperti frekuensi), dan vektor eigen (\(\mathbf{v}\)) merepresentasikan bentuk atau arah getarannya.

  • Contoh Kasus: Matriks kekakuan jembatan \(K = \begin{bmatrix} 2 & -1 \\ -1 & 2 \end{bmatrix}\).

Akar karakteristik memberikan \(\lambda_1 = 3\) dan \(\lambda_2 = 1\).

Frekuensi alami struktur didapat dari \(\omega = \sqrt{\lambda}\).

1.4.1 Interpretasi Geometris 3D

  • Bentuk Mangkuk (Paraboloid): Permukaan ini menunjukkan bahwa titik \((0,0)\) adalah posisi setimbang stabil (energi minimum).

  • Kelengkungan (Curvature): Jika Anda perhatikan, permukaan ini lebih “curam” di satu arah dan lebih “landai” di arah lain.

Arah yang paling curam berhubungan dengan \(\lambda_1 = 3\) (mode kaku).

Arah yang paling landai berhubungan dengan \(\lambda_2 = 1\) (mode fleksibel).

  • Elips Kontur: Jika kita memotong permukaan ini secara horizontal, kita akan mendapatkan elips. Sumbu utama elips tersebut adalah arah dari Vektor Eigen.

ini penting bagi Insinyur:

Jika frekuensi beban luar (seperti angin atau langkah kaki orang) sama dengan salah satu frekuensi alami (\(\omega = 1\) atau \(1.73\)), maka akan terjadi Resonansi yang bisa meruntuhkan jembatan. Inilah mengapa menghitung nilai eigen dari matriks kekakuan adalah langkah wajib dalam desain jembatan.

1.5 Ruang Hasil Kali Dalam (Inner Product Space)

  • Rumus Utama: \(\langle \mathbf{f}, \mathbf{g} \rangle = \int_{a}^{b} f(x)g(x) \, dx\).

  • Aplikasi: Pemrosesan Sinyal (Deret Fourier).

Penjelasan Matematis: Digunakan untuk menentukan seberapa mirip dua fungsi (korelasi) melalui proyeksi ortogonal.

  • Contoh Kasus: Mengambil frekuensi tertentu dari suara mentah \(f(x)\) dengan memproyeksikannya ke basis sinus/kosinus:\(a_n = \frac{1}{\pi} \int_{-\pi}^{\pi} f(x) \cos(nx) \, dx\).

1.5.1 Interpretasi Geometris 3D

setiap garis pada sumbu \(n\) menunjukkan seberapa kuat sinyal asli beresonansi dengan frekuensi tersebut. Jika garisnya sangat berosilasi menjauh dari nol, berarti frekuensi tersebut dominan dalam suara mentah kita.

1.6 Diagonalisasi & Bentuk Kuadratik

  • Rumus Utama: \(Q(x) = \mathbf{x}^T A \mathbf{x}\).

  • Aplikasi: Klasifikasi Penampang Kerucut (Astronomi/Desain Antena).

  • Penjelasan Matematis: Diagonalisasi digunakan untuk menyederhanakan persamaan kuadrat rumit dengan menghilangkan suku silang (\(xy\)).

  • Contoh Kasus: Persamaan \(5x^2 + 8xy + 5y^2 = 9\).

Melalui transformasi koordinat (diagonalisasi), persamaan berubah menjadi \(9x'^2 + 1y'^2 = 9\).

Bentuk ini secara matematis dikenali sebagai Elips.

1.6.1 Interpretasi Geometris 3D

  • Kelonjongan Mangkuk: Perhatikan bahwa mangkuk tersebut tidak simetris sempurna secara radial. Ia lebih “tajam” ke satu arah dan lebih “lebar” ke arah lain. Arah-arah utama ini ditentukan oleh Vektor Eigen.

  • Efek Diagonalisasi: Diagonalisasi pada dasarnya adalah memutar kamera Anda atau memutar grafik tersebut sehingga sumbu utamanya sejajar dengan sumbu \(X\) dan \(Y\).

  • Nilai Eigen sebagai Skala: * \(\lambda = 9\) (sangat curam) membuat sumbu elips menjadi pendek (\(1/\sqrt{9} = 1/3\)).\(\lambda = 1\) (kurang curam) membuat sumbu elips menjadi panjang (\(1/\sqrt{1} = 1\)).

1.7 Transformasi Linear

  • Rumus Utama: \(\mathbf{x}' = M \mathbf{x}\).

  • Aplikasi: Animasi Komputer dan Grafika 3D.

  • Penjelasan Matematis: Memetakan vektor dari ruang asal ke ruang tujuan menggunakan matriks transformasi.

  • Contoh Kasus: Rotasi titik \((1, 0)\) sebesar \(90^\circ\).

Menggunakan matriks rotasi \(M = \begin{bmatrix} 0 & -1 \\ 1 & 0 \end{bmatrix}\).

Hasil: \(\begin{bmatrix} 0 & -1 \\ 1 & 0 \end{bmatrix} \begin{bmatrix} 1 \\ 0 \end{bmatrix} = \begin{bmatrix} 0 \\ 1 \end{bmatrix}\).

1.7.1 Interpretasi

  • Pemetaan Basis: Matriks \(M = \begin{bmatrix} \mathbf{v}_1 & \mathbf{v}_2 \end{bmatrix}\) sebenarnya memberitahu kita ke mana arah sumbu \(x\) dan \(y\) setelah transformasi.Kolom pertama \([0, 1]^T\) adalah posisi baru dari unit vektor sumbu \(x\) (\(\mathbf{e}_1\)).Kolom kedua \([-1, 0]^T\) adalah posisi baru dari unit vektor sumbu \(y\) (\(\mathbf{e}_2\)).Determinant: Nilai \(\det(M) = (0 \cdot 0) - (-1 \cdot 1) = 1\). Karena determinannya \(1\), orientasi ruang tetap terjaga dan tidak ada perubahan luas (tidak ada penyusutan atau pemuaian).

1.7.2 Aplikasi di Dunia Nyata

  • Robotika: Lengan robot menggunakan matriks rotasi (seringkali dalam format 3D yang disebut Euler Angles atau Quaternions) untuk menentukan posisi tangan robot di ruang 3D.

  • Game Development: Setiap kali Anda memutar karakter atau kamera dalam game, komputer sedang mengalikan ribuan koordinat titik (viking, mobil, atau pohon) dengan matriks rotasi seperti ini secara real-time.

  • Pengolahan Citra: Operasi “Rotate 90°” pada aplikasi edit foto secara matematis melakukan perkalian matriks ini pada setiap indeks piksel gambar.

1.8 RUJUKAN:

Anton, H., & Rorres, C. (2013). Elementary Linear Algebra: Applications Version. John Wiley & Sons.

Kreyzig, E. (2011). Advanced Engineering Mathematics. John Wiley & Sons.Lay, D. C. (2012). Linear Algebra and Its Applications. Pearson.

LS0tDQp0aXRsZTogIkFsamFiYXIgTGluZWFyIiAgICAgICAgICAgICMgTWFpbiB0aXRsZSBvZiB0aGUgZG9jdW1lbnQNCmF1dGhvcjogIkNhcm9sIER1cGlubyBQZXJlaXJhIiAgICAgICMgUmVwbGFjZSB3aXRoIHlvdXIgZnVsbCBuYW1lDQpkYXRlOiAgImByIGZvcm1hdChTeXMuRGF0ZSgpLCAnJUIgJWQsICVZJylgIiAjIEF1dG8gZGlzcGxheXMgdGhlIGN1cnJlbnQgZGF0ZQ0Kb3V0cHV0OiAgICAgICAgICAgICAgICAgICAgICAgICAjIE91dHB1dCBzZWN0aW9uIGRlZmluZXMgdGhlIGZvcm1hdCBhbmQgbGF5b3V0IA0KICBybWRmb3JtYXRzOjpyZWFkdGhlZG93bjogICAgICAjIGh0dHBzOi8vZ2l0aHViLmNvbS9qdWJhL3JtZGZvcm1hdHMNCiAgICBzZWxmX2NvbnRhaW5lZDogdHJ1ZSAgICAgICAgIyBFbWJlZHMgYWxsIHJlc291cmNlcyAoQ1NTLCBKUywgaW1hZ2VzKSANCiAgICB0aHVtYm5haWxzOiB0cnVlICAgICAgICAgICAgIyBEaXNwbGF5cyBpbWFnZSB0aHVtYm5haWxzIGluIHRoZSBkb2MNCiAgICBsaWdodGJveDogdHJ1ZSAgICAgICAgICAgICAgIyBFbmFibGVzIGNsaWNrIHRvIGVubGFyZ2UgaW1hZ2VzDQogICAgZ2FsbGVyeTogdHJ1ZSAgICAgICAgICAgICAgICMgR3JvdXBzIGltYWdlcyBpbnRvIGFuIGludGVyYWN0aXZlIGdhbGxlcnkNCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUgICAgICAgIyBBdXRvbWF0aWNhbGx5IG51bWJlcnMgYWxsIHNlY3Rpb25zDQogICAgbGliX2RpcjogbGlicyAgICAgICAgICAgICAgICMgRGlyZWN0b3J5IHdoZXJlIEphdmFTY3JpcHQvQ1NTIGxpYnJhcmllcw0KICAgIGRmX3ByaW50OiAicGFnZWQiICAgICAgICAgICAjIERpc3BsYXlzIGRhdGEgZnJhbWVzIGFzIGludGVyYWN0aXZlIHBhZ2VkIA0KICAgIGNvZGVfZm9sZGluZzogInNob3ciICAgICAgICAjIEFsbG93cyBmb2xkaW5nL3VuZm9sZGluZyBSIGNvZGUgYmxvY2tzIA0KICAgIGNvZGVfZG93bmxvYWQ6IHllcyAgICAgICAgICAjIEFkZHMgYSBidXR0b24gdG8gZG93bmxvYWQgYWxsIFIgY29kZQ0KICAgIGNzczogImFhYWEuY3NzIg0KLS0tDQoNCg0KYGBge3IgcHJvZmlsZSwgZWNobz1GQUxTRX0NCmxpYnJhcnkoaHRtbHRvb2xzKQ0KDQpIVE1MKCcNCjxkaXYgc3R5bGU9IndpZHRoOiA0MDBweDsgaGVpZ2h0OiAyNTBweDsgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEzNWRlZywgI2ZmZmZmZiAwJSwgI2YwZjBmMCAxMDAlKTsgYm9yZGVyOiAycHggc29saWQgIzJjM2U1MDsgYm9yZGVyLXJhZGl1czogMTVweDsgYm94LXNoYWRvdzogMCA4cHggMjBweCByZ2JhKDAsMCwwLDAuMTUpOyBwYWRkaW5nOiAyMHB4OyBkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDIwcHg7IGZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjsgbWFyZ2luOiAyMHB4IGF1dG87IG92ZXJmbG93OiBoaWRkZW47Ij4NCiAgPGRpdiBzdHlsZT0iZmxleDogMTsgb3ZlcmZsb3c6IGhpZGRlbjsiPg0KICAgIDxkaXYgc3R5bGU9ImJhY2tncm91bmQ6ICNlY2YwZjE7IGJvcmRlcjogMXB4IHNvbGlkICNiZGMzYzc7IGJvcmRlci1yYWRpdXM6IDhweDsgcGFkZGluZzogOHB4OyBtYXJnaW4tYm90dG9tOiAxMHB4OyI+DQogICAgICA8aDEgc3R5bGU9ImNvbG9yOiAjMzQ0OTVlOyBmb250LXNpemU6IDE4cHg7IG1hcmdpbjogMDsgZm9udC13ZWlnaHQ6IG5vcm1hbDsiPkNhcm9sIER1cGlubyBQZXJlaXJhPC9oMT4NCiAgICAgIDxoMiBzdHlsZT0iY29sb3I6ICMzNDQ5NWU7IGZvbnQtc2l6ZTogMThweDsgbWFyZ2luOiAwOyBmb250LXdlaWdodDogbm9ybWFsOyI+TklNOiA1MjI1MDA1MTwvaDI+DQogICAgPC9kaXY+DQogICAgPHAgc3R5bGU9ImNvbG9yOiAjN2Y4YzhkOyBmb250LXNpemU6IDEycHg7IG1hcmdpbjogMCAwIDE1cHggMDsiPk1haGFzaXN3YSBTYWlucyBEYXRhIElUU0I8L3A+DQogICAgDQogICAgPGRpdiBzdHlsZT0iZGlzcGxheTogZmxleDsgZmxleC13cmFwOiB3cmFwOyBnYXA6IDhweDsiPg0KICAgICAgPHNwYW4gc3R5bGU9ImJhY2tncm91bmQ6ICMzNDk4ZGI7IGNvbG9yOiB3aGl0ZTsgcGFkZGluZzogNHB4IDEwcHg7IGJvcmRlci1yYWRpdXM6IDE1cHg7IGZvbnQtc2l6ZTogMTBweDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5SIFByb2dyYW1taW5nPC9zcGFuPg0KICAgICAgPHNwYW4gc3R5bGU9ImJhY2tncm91bmQ6ICNlNzRjM2M7IGNvbG9yOiB3aGl0ZTsgcGFkZGluZzogNHB4IDEwcHg7IGJvcmRlci1yYWRpdXM6IDE1cHg7IGZvbnQtc2l6ZTogMTBweDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5EYXRhIFNjaWVuY2U8L3NwYW4+DQogICAgICA8c3BhbiBzdHlsZT0iYmFja2dyb3VuZDogIzJlY2M3MTsgY29sb3I6IHdoaXRlOyBwYWRkaW5nOiA0cHggMTBweDsgYm9yZGVyLXJhZGl1czogMTVweDsgZm9udC1zaXplOiAxMHB4OyBmb250LXdlaWdodDogYm9sZDsiPlN0YXRpc3RpY3M8L3NwYW4+DQogICAgPC9kaXY+DQogIDwvZGl2Pg0KPC9kaXY+DQonKQ0KYGBgDQojIC4gSU1QTEVNRU5UQVNJIERBTiBBUExJS0FTSSBLT05TRVAgQUxKQUJBUiBMSU5FQVIgDQoNCiMjICBTaXN0ZW0gUGVyc2FtYWFuIExpbmVhciAoU1BMKSAmIE1hdHJpa3MNCg0KLSBSdW11cyBVdGFtYTogJEFcbWF0aGJme3h9ID0gXG1hdGhiZntifSQoRGkgbWFuYSAkQSQgYWRhbGFoIG1hdHJpa3Mga29lZmlzaWVuLCAkXG1hdGhiZnt4fSQgdmVrdG9yIHZhcmlhYmVsLCBkYW4gJFxtYXRoYmZ7Yn0kIHZla3RvciBrb25zdGFudGEpDQoNCi0gQXBsaWthc2k6IEFuYWxpc2lzIEFydXMgSmFyaW5nYW4gcGFkYSBUZWtuaWsgRWxla3RybyAoSHVrdW0gS2lyY2hob2ZmKS4NCg0KLSBQZW5qZWxhc2FuIE1hdGVtYXRpczogRGlndW5ha2FuIHVudHVrIG1lbmNhcmkgbmlsYWkgdmFyaWFiZWwgeWFuZyB0aWRhayBkaWtldGFodWkgZGFsYW0gc2lzdGVtIHlhbmcgc2FsaW5nIHRlcmh1YnVuZy4NCg0KLSBDb250b2ggS2FzdXM6IE1lbmdoaXR1bmcgYXJ1cyBsaXN0cmlrIHBhZGEgZHVhIGxvb3A6DQoNCiQ1SV8xICsgMklfMiA9IDEwJCQySV8xICsgMTBJXzIgPSAyMCQNCg0KQmVudHVrIE1hdHJpa3M6DQoNCiRcYmVnaW57Ym1hdHJpeH0gNSAmIDIgXFwgMiAmIDEwIFxlbmR7Ym1hdHJpeH0gXGJlZ2lue2JtYXRyaXh9IElfMSBcXCBJXzIgXGVuZHtibWF0cml4fSA9IFxiZWdpbntibWF0cml4fSAxMCBcXCAyMCBcZW5ke2JtYXRyaXh9JC4NCg0KUGVueWVsZXNhaWFuIG1lbmdndW5ha2FuIG9wZXJhc2kgYmFyaXMgZWxlbWVudGVyIGF0YXUgaW52ZXJzIG1hdHJpa3MgJFxtYXRoYmZ7eH0gPSBBXnstMX1cbWF0aGJme2J9JC4NCg0KYGBge3IsZWNobz1GQUxTRSxtZXNzYWdlPUZBTFNFLHdhcm5pbmc9RkFMU0V9DQojIEluc3RhbGwgcGxvdGx5IGppa2EgYmVsdW0gYWRhOiBpbnN0YWxsLnBhY2thZ2VzKCJwbG90bHkiKQ0KbGlicmFyeShwbG90bHkpDQpsaWJyYXJ5KHJlc2hhcGUyKQ0KDQojIDEuIFBlcnNpYXBhbiBEYXRhDQojIEtpdGEgYnVhdCBncmlkIG5pbGFpIHVudHVrIEkxIGRhbiBJMg0KaTFfdmVjIDwtIHNlcSgwLCAzLCBsZW5ndGgub3V0ID0gNTApDQppMl92ZWMgPC0gc2VxKDAsIDMsIGxlbmd0aC5vdXQgPSA1MCkNCmdyaWQgPC0gZXhwYW5kLmdyaWQoSTEgPSBpMV92ZWMsIEkyID0gaTJfdmVjKQ0KDQojIEtpdGEgZGVmaW5pc2lrYW4gZnVuZ3NpIGYoSTEsIEkyKSA9IDAgdW50dWsgbWFzaW5nLW1hc2luZyBwZXJzYW1hYW4NCiMgUGVyc2FtYWFuIDE6IDVJMSArIDJJMiAtIDEwID0gWjENCiMgUGVyc2FtYWFuIDI6IDJJMSArIDEwSTIgLSAyMCA9IFoyDQpncmlkJFoxIDwtIDUqZ3JpZCRJMSArIDIqZ3JpZCRJMiAtIDEwDQpncmlkJFoyIDwtIDIqZ3JpZCRJMSArIDEwKmdyaWQkSTIgLSAyMA0KDQojIFViYWgga2UgZm9ybWF0IG1hdHJpa3MgdW50dWsgcGxvdGx5IHN1cmZhY2UNCnoxX21hdHJpeCA8LSBtYXRyaXgoZ3JpZCRaMSwgbnJvdyA9IDUwLCBuY29sID0gNTApDQp6Ml9tYXRyaXggPC0gbWF0cml4KGdyaWQkWjIsIG5yb3cgPSA1MCwgbmNvbCA9IDUwKQ0KDQojIDIuIE1lbWJ1YXQgUGxvdCAzRA0KcGxvdF9seSgpICU+JQ0KICAjIEJpZGFuZyBQZXJzYW1hYW4gMQ0KICBhZGRfc3VyZmFjZSh4ID0gfmkxX3ZlYywgeSA9IH5pMl92ZWMsIHogPSB+ejFfbWF0cml4LCANCiAgICAgICAgICAgICAgbmFtZSA9ICI1STEgKyAySTIgPSAxMCIsIG9wYWNpdHkgPSAwLjcsIGNvbG9yc2NhbGUgPSAiVmlyaWRpcyIpICU+JQ0KICAjIEJpZGFuZyBQZXJzYW1hYW4gMg0KICBhZGRfc3VyZmFjZSh4ID0gfmkxX3ZlYywgeSA9IH5pMl92ZWMsIHogPSB+ejJfbWF0cml4LCANCiAgICAgICAgICAgICAgbmFtZSA9ICIySTEgKyAxMEkyID0gMjAiLCBvcGFjaXR5ID0gMC43LCBjb2xvcnNjYWxlID0gIkhvdCIpICU+JQ0KICAjIFRpdGlrIFNvbHVzaSAoZGkgbWFuYSBaMSA9IDAgZGFuIFoyID0gMCkNCiAgYWRkX21hcmtlcnMoeCA9IDEuNjY3LCB5ID0gMS42NjcsIHogPSAwLCANCiAgICAgICAgICAgICAgbWFya2VyID0gbGlzdChzaXplID0gOCwgY29sb3IgPSAiYmxhY2siLCBzeW1ib2wgPSAiZGlhbW9uZCIpLA0KICAgICAgICAgICAgICBuYW1lID0gIlRpdGlrIFNvbHVzaSAoMS42NywgMS42NykiKSAlPiUNCiAgbGF5b3V0KA0KICAgIHRpdGxlID0gIlZpc3VhbGlzYXNpIDNEIFNQTCBBcnVzIExpc3RyaWsiLA0KICAgIHNjZW5lID0gbGlzdCgNCiAgICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJBcnVzIEkxIChBKSIpLA0KICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIkFydXMgSTIgKEEpIiksDQogICAgICB6YXhpcyA9IGxpc3QodGl0bGUgPSAiZihJMSwgSTIpIiksDQogICAgICBjYW1lcmEgPSBsaXN0KGV5ZSA9IGxpc3QoeCA9IDEuNSwgeSA9IDEuNSwgeiA9IDEuNSkpDQogICAgKQ0KICApDQpgYGANCg0KIyMjICAgUGVuamVsYXNhbiBWaXN1YWxpc2FzaSAzRDoNCg0KLSBEdWEgQmlkYW5nIChTdXJmYWNlcyk6IERhbGFtIGdyYWZpayAzRCBpbmksIHNldGlhcCBwZXJzYW1hYW4gbGluZWFyIGRpcmVwcmVzZW50YXNpa2FuIHNlYmFnYWkgc2VidWFoIGJpZGFuZyBtaXJpbmcuDQoNCi0gUGVycG90b25nYW4gQmlkYW5nOiBTb2x1c2kgZGFyaSBTUEwgYWRhbGFoIHRpdGlrIGRpIG1hbmEga2VkdWEgYmlkYW5nIHRlcnNlYnV0IHNhbGluZyBiZXJwb3RvbmdhbiB0ZXBhdCBkaSBrZXRpbmdnaWFuICRaID0gMCQuDQoNCi0gVGl0aWsgSGl0YW0gKFNvbHVzaSk6IFNheWEgdGVsYWggbWVuYW1iYWhrYW4gbWFya2VyIHBhZGEga29vcmRpbmF0ICQoXGZyYWN7NX17M30sIFxmcmFjezV9ezN9KSQgYXRhdSBzZWtpdGFyICQoMS42NywgMS42NykkLiBEaSB0aXRpayBpbmlsYWgga2VkdWEgc2lzdGVtIG1lbmNhcGFpIGtlc2V0aW1iYW5nYW4gKG5vbCkuDQoNCiMjICBEZXRlcm1pbmFuIE1hdHJpa3MgDQoNCi0gUnVtdXMgVXRhbWE6IFVudHVrIG1hdHJpa3MgJDIgXHRpbWVzIDIkLCAkXGRldChBKSA9IGFkIC0gYmMkLg0KDQotIEFwbGlrYXNpOiBQZXJ1YmFoYW4gdmFyaWFiZWwgZGFsYW0gS2Fsa3VsdXMgKE1hdHJpa3MgSmFjb2JpYW4pLg0KDQotIFBlbmplbGFzYW4gTWF0ZW1hdGlzOiBEZXRlcm1pbmFuIG1lbWJlcmlrYW4gaW5mb3JtYXNpIHRlbnRhbmcgZmFrdG9yIHNrYWxhIHBlcnViYWhhbiBsdWFzIGF0YXUgdm9sdW1lIGRhcmkgc2VidWFoIHRyYW5zZm9ybWFzaS4NCg0KLSBDb250b2ggS2FzdXM6IFRyYW5zZm9ybWFzaSBrb29yZGluYXQgS2FydGVzaXVzIGtlIFBvbGFyICgkeCA9IHIgXGNvcyBcdGhldGEsIHkgPSByIFxzaW4gXHRoZXRhJCkuDQoNCk1hdHJpa3MgSmFjb2JpYW4gKCRKJCk6DQokXGJlZ2lue2JtYXRyaXh9IFxjb3MgXHRoZXRhICYgLXIgXHNpbiBcdGhldGEgXFwgXHNpbiBcdGhldGEgJiByIFxjb3MgXHRoZXRhIFxlbmR7Ym1hdHJpeH0kLg0KDQpOaWxhaSAkXGRldChKKSA9IHIkLiBPbGVoIGthcmVuYSBpdHUsIGVsZW1lbiBsdWFzICRkQSA9IGR4XCxkeSQgbWVuamFkaSAkclwsZHJcLGRcdGhldGEkLg0KDQpgYGB7cixlY2hvPUZBTFNFfQ0KbGlicmFyeShwbG90bHkpDQoNCiMgMS4gRGVmaW5pc2lrYW4gcmVudGFuZyB1bnR1ayByIChyYWRpdXMpIGRhbiB0aGV0YSAoc3VkdXQpDQpyIDwtIHNlcSgwLCA1LCBsZW5ndGgub3V0ID0gMzApDQp0aGV0YSA8LSBzZXEoMCwgMiAqIHBpLCBsZW5ndGgub3V0ID0gNjApDQoNCiMgMi4gQnVhdCBncmlkIHBvbGFyDQpncmlkIDwtIGV4cGFuZC5ncmlkKHIgPSByLCB0aGV0YSA9IHRoZXRhKQ0KDQojIDMuIFRyYW5zZm9ybWFzaSBrZSBLYXJ0ZXNpdXMgKHgsIHkpIG1lbmdndW5ha2FuIHJ1bXVzIHlhbmcgQW5kYSBzZWJ1dGthbg0KZ3JpZCR4IDwtIGdyaWQkciAqIGNvcyhncmlkJHRoZXRhKQ0KZ3JpZCR5IDwtIGdyaWQkciAqIHNpbihncmlkJHRoZXRhKQ0KDQojIE1pc2Fsa2FuIGtpdGEgYnVhdCBkaW1lbnNpIFogc2ViYWdhaSBmdW5nc2kgZGFyaSByLCBjb250b2g6IFogPSByXjIgKFBhcmFib2xvaWQpDQpncmlkJHogPC0gZ3JpZCRyXjINCg0KIyA0LiBTdXN1biB1bGFuZyBkYXRhIHVudHVrIHBsb3R0aW5nIHN1cmZhY2UNCiMgS2FyZW5hIHBsb3RseSBzdXJmYWNlIG1lbWVybHVrYW4gbWF0cml4LCBraXRhIHJlc2hhcGUgeg0Kel9tYXRyaXggPC0gbWF0cml4KGdyaWQkeiwgbnJvdyA9IGxlbmd0aChyKSwgbmNvbCA9IGxlbmd0aCh0aGV0YSkpDQp4X21hdHJpeCA8LSBtYXRyaXgoZ3JpZCR4LCBucm93ID0gbGVuZ3RoKHIpLCBuY29sID0gbGVuZ3RoKHRoZXRhKSkNCnlfbWF0cml4IDwtIG1hdHJpeChncmlkJHksIG5yb3cgPSBsZW5ndGgociksIG5jb2wgPSBsZW5ndGgodGhldGEpKQ0KDQojIDUuIFBsb3QgM0QNCnBsb3RfbHkoKSAlPiUNCiAgYWRkX3N1cmZhY2UoeCA9IH54X21hdHJpeCwgeSA9IH55X21hdHJpeCwgeiA9IH56X21hdHJpeCwNCiAgICAgICAgICAgICAgY29sb3JzY2FsZSA9ICJTcGVjdHJhbCIsDQogICAgICAgICAgICAgIGNvbG9yYmFyID0gbGlzdCh0aXRsZSA9ICJOaWxhaSBaIChywrIpIikpICU+JQ0KICBsYXlvdXQoDQogICAgdGl0bGUgPSAiVmlzdWFsaXNhc2kgVHJhbnNmb3JtYXNpIFBvbGFyOiBaID0gcsKyIiwNCiAgICBzY2VuZSA9IGxpc3QoDQogICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiWCA9IHIgY29zKM64KSIpLA0KICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIlkgPSByIHNpbijOuCkiKSwNCiAgICAgIHpheGlzID0gbGlzdCh0aXRsZSA9ICJaID0gcsKyIikNCiAgICApDQogICkNCmBgYA0KIyMjICAgUGVuamVsYXNhbiBWaXN1YWxpc2FzaSAzRDoNCg0KU2FhdCBBbmRhIG1lbXV0YXIgZ3JhZmlrIGRpIGF0YXMsIEFuZGEgYWthbiBtZWxpaGF0IGJlYmVyYXBhIHBvaW4gcGVudGluZyB0ZXJrYWl0ICRcZGV0KEopID0gciQ6DQoNCi0gR3JpZCB5YW5nIE1lbXVhaTogUGVyaGF0aWthbiBiYWh3YSBkaSBkZWthdCBwdXNhdCAoJHIkIGtlY2lsKSwgImtvdGFrLWtvdGFrIiBncmlkIHNhbmdhdCByYXBhdC4gU2VtYWtpbiBqYXVoIGRhcmkgcHVzYXQgKCRyJCBiZXNhciksIGx1YXMgc2V0aWFwIHNlZ21lbiBncmlkIHNlbWFraW4gYmVzYXIgc2VjYXJhIGxpbmVhci4gSW5pbGFoIGFsYXNhbiBtZW5nYXBhIGVsZW1lbiBsdWFzbnlhIGFkYWxhaCAkciBcLCBkciBcLCBkXHRoZXRhJC4NCg0KLSBQZXJhbiAkciQgc2ViYWdhaSBGYWt0b3IgU2thbGE6IEppa2EgJHIgPSAwJCwgbWFrYSBsdWFzbnlhIG5vbCAodGl0aWsgcHVzYXQpLiBTZW1ha2luIGJlc2FyICRyJCwgc2VtYWtpbiBiZXNhciBrb250cmlidXNpIGx1YXNueWEgdGVyaGFkYXAgaW50ZWdyYWwuDQpTZWNhcmEgZ2VvbWV0cmlzLCBkZXRlcm1pbmFuIEphY29iaWFuIG1lbWJlcml0YWh1IGtpdGEgc2ViZXJhcGEgYmVzYXIgdHJhbnNmb3JtYXNpIHRlcnNlYnV0ICJtZXJlZ2FuZyIgYXRhdSAibWVueXVzdXRrYW4iIHVuaXQgYXJlYS4gRGFsYW0ga2FzdXMgcG9sYXI6DQoNCiQkZEEgPSB8SnwgXCwgZHIgXCwgZFx0aGV0YSA9IHIgXCwgZHIgXCwgZFx0aGV0YSQkDQojIyAgUnVhbmcgVmVrdG9yICRcbWF0aGJie1J9Xm4kDQoNCi0gUnVtdXMgVXRhbWE6IEtvbWJpbmFzaSBMaW5lYXIgJFxtYXRoYmZ7dn0gPSBjXzFcbWF0aGJme3Z9XzEgKyBjXzJcbWF0aGJme3Z9XzIgKyBcZG90cyArIGNfblxtYXRoYmZ7dn1fbiQuDQoNCi0gQXBsaWthc2k6IFBlbXJvc2VzYW4gV2FybmEgRGlnaXRhbCAoUnVhbmcgV2FybmEgUkdCKS4NCg0KLSBQZW5qZWxhc2FuIE1hdGVtYXRpczogU2V0aWFwIHRpdGlrIGRhbGFtIHJ1YW5nICRcbWF0aGJie1J9Xm4kIG1lcmVwcmVzZW50YXNpa2FuIHNhdHUgZW50aXRhcyBkYXRhIHNwZXNpZmlrLg0KDQotIENvbnRvaCBLYXN1czogV2FybmEgb3JhbnllIGRhbGFtIGtvbXB1dGVyIGRpc2ltcGFuIHNlYmFnYWkgdmVrdG9yICRcbWF0aGJme3Z9ID0gWzI1NSwgMTY1LCAwXSQuDQoNCkluaSBhZGFsYWgga29tYmluYXNpIGxpbmVhciBkYXJpIGJhc2lzIHN0YW5kYXIgJFxtYXRoYmJ7Un1eMyQ6ICQyNTVcbWF0aGJme2V9XzEgKyAxNjVcbWF0aGJme2V9XzIgKyAwXG1hdGhiZntlfV8zJC4NCg0KYGBge3IsZWNobz1GQUxTRSxtZXNzYWdlPUZBTFNFLHdhcm5pbmc9RkFMU0V9DQpsaWJyYXJ5KHBsb3RseSkNCg0KIyBEZWZpbmlzaWthbiB2ZWt0b3Igd2FybmENCm9yYW5nZV92ZWMgPC0gYygyNTUsIDE2NSwgMCkNCg0KIyBCdWF0IHBsb3QgM0QNCnBsb3RfbHkoKSAlPiUNCiAgIyBWZWt0b3IgT3JhbnllDQogIGFkZF9zZWdtZW50cyh4ID0gMCwgeSA9IDAsIHogPSAwLCANCiAgICAgICAgICAgICAgIHhlbmQgPSBvcmFuZ2VfdmVjWzFdLCB5ZW5kID0gb3JhbmdlX3ZlY1syXSwgemVuZCA9IG9yYW5nZV92ZWNbM10sDQogICAgICAgICAgICAgICBsaW5lID0gbGlzdChjb2xvciA9ICJvcmFuZ2UiLCB3aWR0aCA9IDEwKSwNCiAgICAgICAgICAgICAgIG5hbWUgPSAiVmVrdG9yIE9yYW55ZSIpICU+JQ0KICAjIFRpdGlrIFVqdW5nIFZla3Rvcg0KICBhZGRfbWFya2Vycyh4ID0gb3JhbmdlX3ZlY1sxXSwgeSA9IG9yYW5nZV92ZWNbMl0sIHogPSBvcmFuZ2VfdmVjWzNdLA0KICAgICAgICAgICAgICBtYXJrZXIgPSBsaXN0KGNvbG9yID0gIm9yYW5nZSIsIHNpemUgPSAxMCksDQogICAgICAgICAgICAgIG5hbWUgPSAiV2FybmE6ICgyNTUsIDE2NSwgMCkiKSAlPiUNCiAgbGF5b3V0KA0KICAgIHNjZW5lID0gbGlzdCgNCiAgICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJSZWQgKFIpIiwgcmFuZ2UgPSBjKDAsIDI1NSkpLA0KICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIkdyZWVuIChHKSIsIHJhbmdlID0gYygwLCAyNTUpKSwNCiAgICAgIHpheGlzID0gbGlzdCh0aXRsZSA9ICJCbHVlIChCKSIsIHJhbmdlID0gYygwLCAyNTUpKSwNCiAgICAgIGFzcGVjdG1vZGUgPSAiY3ViZSINCiAgICApLA0KICAgIHRpdGxlID0gIlJlcHJlc2VudGFzaSBWZWt0b3IgV2FybmEgT3JhbnllIGRhbGFtIFJ1YW5nIFJHQiINCiAgKQ0KYGBgDQojIyMgICBQZW5qZWxhc2FuIFZpc3VhbGlzYXNpIDNEOg0KDQp3YXJuYSBvcmFueWUgdGVyc2VidXQgYWRhbGFoIHZla3RvciAkXG1hdGhiZnt2fSQgeWFuZyBtZXJ1cGFrYW4gaGFzaWwga29tYmluYXNpIGxpbmVhciBkYXJpIGJhc2lzIHN0YW5kYXIgJFxtYXRoYmJ7Un1eMyQsIGRpIG1hbmE6DQoNCi0gJFxtYXRoYmZ7ZX1fMSA9IFsxLCAwLCAwXSQgKEtvbXBvbmVuIE1lcmFoIE11cm5pKQ0KDQotICRcbWF0aGJme2V9XzIgPSBbMCwgMSwgMF0kIChLb21wb25lbiBIaWphdSBNdXJuaSkNCg0KLSAkXG1hdGhiZntlfV8zID0gWzAsIDAsIDFdJCAoS29tcG9uZW4gQmlydSBNdXJuaSkNCg0KTWFrYToNCg0KJCRcbWF0aGJme3Z9ID0gMjU1IFxiZWdpbntibWF0cml4fSAxIFxcIDAgXFwgMCBcZW5ke2JtYXRyaXh9ICsgMTY1IFxiZWdpbntibWF0cml4fSAwIFxcIDEgXFwgMCBcZW5ke2JtYXRyaXh9ICsgMCBcYmVnaW57Ym1hdHJpeH0gMCBcXCAwIFxcIDEgXGVuZHtibWF0cml4fSA9IFxiZWdpbntibWF0cml4fSAyNTUgXFwgMTY1IFxcIDAgXGVuZHtibWF0cml4fSQkDQpNZW5hcmlrbnlhLCBkYWxhbSBrb21wdXRlciBncmFmaXMsIGtpdGEgc2VyaW5nIG1lbmd1YmFoIGJhc2lzIHdhcm5hIChUcmFuc2Zvcm1hc2kgTGluZWFyKS4gQ29udG9obnlhIGRhcmkgUkdCIGtlIEdyYXlzY2FsZSAoc2thbGEgYWJ1LWFidSkuDQoNCk1pc2Fsa2FuIGtpdGEgaW5naW4gbWVuZ3ViYWggd2FybmEgbWVuamFkaSBncmF5c2NhbGUgbWVuZ2d1bmFrYW4gYm9ib3QgbHVtaW5hbnNpLiBUcmFuc2Zvcm1hc2kgaW5pIGFkYWxhaCBwZXJrYWxpYW4gZG90IHByb2R1Y3QgKGF0YXUgcGVya2FsaWFuIG1hdHJpa3MpOg0KDQokJFkgPSAwLjI5OVIgKyAwLjU4N0cgKyAwLjExNEIkJA0KDQpTZWNhcmEgYWxqYWJhciBsaW5lYXIsIGluaSBhZGFsYWggcHJveWVrc2kgZGFyaSBydWFuZyAkXG1hdGhiYntSfV4zJCBrZSAkXG1hdGhiYntSfV4xJCAoZ2FyaXMgc2thbGFyKS4NCg0KTWVuZ2FwYSBpbmkgcGVudGluZw0KDQotIEtvbXByZXNpIEdhbWJhcjogVGVrbmlrIHNlcGVydGkgSlBFRyBtZW5nZ3VuYWthbiBwZXJ1YmFoYW4gYmFzaXMgZGFyaSBSR0Iga2UgWUNiQ3IgKEx1bWluYW5zaSBkYW4gS3JvbWluYW5zaSkgdW50dWsgbWVtYnVhbmcgZGF0YSB5YW5nIHRpZGFrIHRlcmxpaGF0IG9sZWggbWF0YSBtYW51c2lhLg0KDQotIEZpbHRlciBGb3RvOiBGaWx0ZXIgcGFkYSBhcGxpa2FzaSBzZXBlcnRpIEluc3RhZ3JhbSBwYWRhIGRhc2FybnlhIGFkYWxhaCBtYXRyaWtzIHRyYW5zZm9ybWFzaSB5YW5nIGRpa2FsaWthbiBrZSBzZXRpYXAgdmVrdG9yIHdhcm5hIHBhZGEgcGlrc2VsIGdhbWJhci4NCg0KIyMgIFJ1YW5nIFZla3RvciBTZWNhcmEgVW11bSANCg0KLSBSdW11cyBVdGFtYTogQWtzaW9tYSBSdWFuZyBWZWt0b3IgKFBlbmp1bWxhaGFuIGRhbiBQZXJrYWxpYW4gU2thbGFyIHBhZGEgaGltcHVuYW4gb2JqZWsgc2VwZXJ0aSBmdW5nc2kgYXRhdSBwb2xpbm9taWFsKS4NCg0KLSBBcGxpa2FzaTogVGVvcmkgUGVyc2FtYWFuIERpZmVyZW5zaWFsIExpbmVhci4NCg0KLSBQZW5qZWxhc2FuIE1hdGVtYXRpczogSGltcHVuYW4gc2VtdWEgc29sdXNpIGRhcmkgcGVyc2FtYWFuIGRpZmVyZW5zaWFsIGhvbW9nZW4gbWVtYmVudHVrIHN1YnJ1YW5nIHZla3Rvci4NCg0KLSBDb250b2ggS2FzdXM6IFBhZGEgcGVyc2FtYWFuICR5JycgKyB5ID0gMCQuDQoNCkthcmVuYSBzb2x1c2lueWEgYWRhbGFoICRcc2luKHgpJCBkYW4gJFxjb3MoeCkkLCBtYWthIHNldGlhcCBrb21iaW5hc2kgbGluZWFyICR5ID0gQVxzaW4oeCkgKyBCXGNvcyh4KSQganVnYSBtZXJ1cGFrYW4gc29sdXNpIHZhbGlkLg0KDQpgYGB7cixlY2hvPUZBTFNFfQ0KbGlicmFyeShwbG90bHkpDQoNCiMgMS4gRGVmaW5pc2lrYW4gcmVudGFuZyBwYXJhbWV0ZXINCnhfdmFscyA8LSBzZXEoMCwgMTAsIGxlbmd0aC5vdXQgPSAxMDApICAjIERvbWFpbiB3YWt0dS9wb3Npc2kNCkFfdmFscyA8LSBzZXEoLTIsIDIsIGxlbmd0aC5vdXQgPSA1MCkgICAjIEtvZWZpc2llbiB1bnR1ayBzaW4oeCkNCkJfdmFscyA8LSBzZXEoLTIsIDIsIGxlbmd0aC5vdXQgPSA1MCkgICAjIEtvZWZpc2llbiB1bnR1ayBjb3MoeCkNCg0KIyAyLiBQaWxpaCBzYXR1IG5pbGFpIHggc3Blc2lmaWsgdW50dWsgbWVsaWhhdCAicGVybXVrYWFuIHNvbHVzaSINCiMgQXRhdSBraXRhIGJ1YXQgZnVuZ3NpIGRpIG1hbmEgWiBhZGFsYWggbmlsYWkgeSh4KSBwYWRhIHggdGVydGVudHUNCmdyaWQgPC0gZXhwYW5kLmdyaWQoQSA9IEFfdmFscywgQiA9IEJfdmFscykNCmdyaWQkWiA8LSBncmlkJEEgKiBzaW4oNSkgKyBncmlkJEIgKiBjb3MoNSkgIyBDb250b2ggbmlsYWkgeSBwYWRhIHg9NQ0KDQojIDMuIFRyYW5zZm9ybWFzaSBrZSBtYXRyaWtzIHVudHVrIHN1cmZhY2UgcGxvdA0Kel9tYXRyaXggPC0gbWF0cml4KGdyaWQkWiwgbnJvdyA9IGxlbmd0aChBX3ZhbHMpLCBuY29sID0gbGVuZ3RoKEJfdmFscykpDQoNCiMgNC4gUGxvdCBtZW5nZ3VuYWthbiBQbG90bHkNCnBsb3RfbHkoKSAlPiUNCiAgYWRkX3N1cmZhY2UoeCA9IH5BX3ZhbHMsIHkgPSB+Ql92YWxzLCB6ID0gfnpfbWF0cml4LA0KICAgICAgICAgICAgICBjb2xvcnNjYWxlID0gIlJkQnUiKSAlPiUNCiAgbGF5b3V0KA0KICAgIHRpdGxlID0gIlBlcm11a2FhbiBTb2x1c2kgeSA9IEEgc2luKHgpICsgQiBjb3MoeCkgcGFkYSB4ID0gNSIsDQogICAgc2NlbmUgPSBsaXN0KA0KICAgICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIktvZWZpc2llbiBBIChCYXNpcyBTaW4pIiksDQogICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiS29lZmlzaWVuIEIgKEJhc2lzIENvcykiKSwNCiAgICAgIHpheGlzID0gbGlzdCh0aXRsZSA9ICJPdXRwdXQgeSh4KSIpDQogICAgKQ0KICApDQpgYGANCiMjIyAgIFBlbmplbGFzYW4gVmlzdWFsaXNhc2kgM0Q6DQpiYWdhaW1hbmEgcGVydWJhaGFuIHNrYWxhciAkQSQgZGFuICRCJCBtZW5naGFzaWxrYW4ga3VydmEgc29sdXNpIHlhbmcgYmVyYmVkYSBuYW11biB0ZXRhcCBtZW1lbnVoaSBrYXJha3RlcmlzdGlrIHBlcnNhbWFhbiBkaWZlcmVuc2lhbCB5YW5nIHNhbWEuDQoNCkNhcmEgeWFuZyBsZWJpaCAiYWxqYWJhciBsaW5lYXIiIHVudHVrIG1lbGloYXQgaW5pIGFkYWxhaCBtZWxhbHVpIFJ1YW5nIEZhc2UuIEppa2Ega2l0YSBkZWZpbmlzaWthbiAkeV8xID0geSQgZGFuICR5XzIgPSB5JyQsIG1ha2Egc2lzdGVtbnlhIG1lbmphZGk6DQoNCiQkXGJlZ2lue2JtYXRyaXh9IHlfMScgXFwgeV8yJyBcZW5ke2JtYXRyaXh9ID0gXGJlZ2lue2JtYXRyaXh9IDAgJiAxIFxcIC0xICYgMCBcZW5ke2JtYXRyaXh9IFxiZWdpbntibWF0cml4fSB5XzEgXFwgeV8yIFxlbmR7Ym1hdHJpeH0kJA0KDQpNYXRyaWtzIGRpIGF0YXMgbWVtaWxpa2kgZWlnZW52YWx1ZXMgaW1hamluZXIgbXVybmkgKCRccG0gaSQpLCB5YW5nIHNlY2FyYSBnZW9tZXRyaXMgYmVyYXJ0aSByb3Rhc2kuIEluaWxhaCBtZW5nYXBhIHNvbHVzaW55YSBiZXJiZW50dWsgbGluZ2thcmFuIGF0YXUgZWxpcHMgZGFsYW0gcnVhbmcgZmFzZSwgbWVuY2VybWlua2FuIHNpZmF0IG9zaWxhc2kgZGFyaSBzaW51cyBkYW4ga29zaW51cy4NCg0KUGVuamVsYXNhbiBHZW9tZXRyaXMgZGFsYW0gM0QNCg0KLSBCaWRhbmcgRGF0YXIgKExpbmVhcml0eSk6IFBlcmhhdGlrYW4gYmFod2EgcGVybXVrYWFuIHlhbmcgZGloYXNpbGthbiBvbGVoIGFkZF9zdXJmYWNlIGRpIGF0YXMgYWRhbGFoIHNlYnVhaCBiaWRhbmcgZGF0YXIgbWlyaW5nLiBJbmkgc2VjYXJhIHZpc3VhbCBtZW1idWt0aWthbiBzaWZhdCBsaW5lYXJpdGFzLiBLYXJlbmEgJHkkIGFkYWxhaCBrb21iaW5hc2kgbGluZWFyIGRhcmkgJEEkIGRhbiAkQiQsIG1ha2EgcGVydWJhaGFuIHBhZGEgJEEkIGF0YXUgJEIkIGFrYW4gbWVuZ2FraWJhdGthbiBwZXJ1YmFoYW4gcHJvcG9yc2lvbmFsIHBhZGEgbmlsYWkgJHkkLg0KDQotIFJ1YW5nIFNvbHVzaTogU2V0aWFwIHRpdGlrICQoQSwgQikkIHBhZGEgYmlkYW5nIGhvcml6b250YWwgdGVyc2VidXQgbWV3YWtpbGkgc2F0dSBzb2x1c2kgc3Blc2lmaWsgZGFyaSBwZXJzYW1hYW4gZGlmZXJlbnNpYWwuIEppa2Ega2l0YSBtZW5nZ2VzZXIgdGl0aWsgZGkgYmlkYW5nIHRlcnNlYnV0LCBraXRhIHNlYmVuYXJueWEgc2VkYW5nIG1lbWlsaWggImNhbXB1cmFuIiB5YW5nIGJlcmJlZGEgYW50YXJhIGZ1bmdzaSBzaW51cyBkYW4ga29zaW51cy4NCg0KDQojIyMgVmlzdWFsaXNhc2kgQWx0ZXJuYXRpZjogRXZvbHVzaSBXYWt0dSAoM0QgUGF0aCkNCg0KSmlrYSAgaW5naW4gbWVsaWhhdCBiYWdhaW1hbmEgc29sdXNpIGluaSBiZXJvc2lsYXNpIHNlaXJpbmcgd2FrdHUgKCR4JCkgZGFsYW0gYmVudHVrIHNwaXJhbCAocnVhbmcgZmFzZSB5YW5nIGRpdGFyaWsgc2VjYXJhIHZlcnRpa2FsKSwga2l0YSBiaXNhIG1lbmdndW5ha2FuIGFkZF9wYXRoczoNCg0KYGBge3IsZWNobz1GQUxTRX0NCiMgTWVtYnVhdCBiZWJlcmFwYSBsaW50YXNhbiBzb2x1c2kgdW50dWsgbmlsYWkgQSBkYW4gQiB5YW5nIGJlcmJlZGENCnQgPC0gc2VxKDAsIDEwLCBsZW5ndGgub3V0ID0gNTAwKQ0KZGYxIDwtIGRhdGEuZnJhbWUodCA9IHQsIHkgPSAxKnNpbih0KSArIDAqY29zKHQpLCBsYWJlbCA9ICJNdXJuaSBTaW4iKQ0KZGYyIDwtIGRhdGEuZnJhbWUodCA9IHQsIHkgPSAwKnNpbih0KSArIDEqY29zKHQpLCBsYWJlbCA9ICJNdXJuaSBDb3MiKQ0KZGYzIDwtIGRhdGEuZnJhbWUodCA9IHQsIHkgPSAxKnNpbih0KSArIDEqY29zKHQpLCBsYWJlbCA9ICJDYW1wdXJhbiAoQT0xLCBCPTEpIikNCg0KcGxvdF9seSh0eXBlID0gJ3NjYXR0ZXIzZCcsIG1vZGUgPSAnbGluZXMnKSAlPiUNCiAgYWRkX3RyYWNlKHggPSB+ZGYxJHQsIHkgPSB+cmVwKDEsIDUwMCksIHogPSB+ZGYxJHksIG5hbWUgPSAiQT0xLCBCPTAiKSAlPiUNCiAgYWRkX3RyYWNlKHggPSB+ZGYyJHQsIHkgPSB+cmVwKDAsIDUwMCksIHogPSB+ZGYyJHksIG5hbWUgPSAiQT0wLCBCPTEiKSAlPiUNCiAgYWRkX3RyYWNlKHggPSB+ZGYzJHQsIHkgPSB+cmVwKDAuNSwgNTAwKSwgeiA9IH5kZjMkeSwgbmFtZSA9ICJBPTEsIEI9MSIpICU+JQ0KICBsYXlvdXQoc2NlbmUgPSBsaXN0KHhheGlzPWxpc3QodGl0bGU9Ildha3R1ICh4KSIpLCANCiAgICAgICAgICAgICAgICAgICAgICB5YXhpcz1saXN0KHRpdGxlPSJQYXJhbWV0ZXIiKSwgDQogICAgICAgICAgICAgICAgICAgICAgemF4aXM9bGlzdCh0aXRsZT0iQW1wbGl0dWRvICh5KSIpKSkNCmBgYA0KDQoNCkRhbGFtIGJhaGFzYSBhbGphYmFyIGxpbmVhciwga2l0YSBrYXRha2FuIGJhaHdhIG9wZXJhdG9yIGRpZmVyZW5zaWFsICRMID0gXGZyYWN7ZF4yfXtkeF4yfSArIEkkIG1lbWlsaWtpIEtlcm5lbCAocnVhbmcgbm9sKSB5YW5nIGRpcmVudGFuZyAoc3Bhbm5lZCkgb2xlaCAkXHtcc2luIHgsIFxjb3MgeFx9JC4gVmlzdWFsaXNhc2kgM0QgaW5pIG1lbWJhbnR1IGtpdGEgbWVsaWhhdCBiYWh3YSBzZWx1cnVoICJwZXJtdWthYW4iIHNvbHVzaSBhZGFsYWggaGFzaWwgcmVudGFuZ2FuIGRhcmkgZHVhIHZla3RvciBiYXNpcyB0ZXJzZWJ1dC4NCg0KDQojIyAgTmlsYWkgZGFuIFZla3RvciBFaWdlbiANCg0KLSBSdW11cyBVdGFtYTogJEFcbWF0aGJme3Z9ID0gXGxhbWJkYVxtYXRoYmZ7dn0kIGF0YXUgJFxkZXQoQSAtIFxsYW1iZGEgSSkgPSAwJC4NCg0KLSBBcGxpa2FzaTogQW5hbGlzaXMgRnJla3VlbnNpIEFsYW1pIGRhbiBTdGFiaWxpdGFzIFN0cnVrdHVyLg0KDQotIFBlbmplbGFzYW4gTWF0ZW1hdGlzOiBOaWxhaSBlaWdlbiAoJFxsYW1iZGEkKSBzZXJpbmcgbWVyZXByZXNlbnRhc2lrYW4ga2FyYWt0ZXJpc3RpayBmaXNpayBzaXN0ZW0gKHNlcGVydGkgZnJla3VlbnNpKSwgZGFuIHZla3RvciBlaWdlbiAoJFxtYXRoYmZ7dn0kKSBtZXJlcHJlc2VudGFzaWthbiBiZW50dWsgYXRhdSBhcmFoIGdldGFyYW5ueWEuDQoNCi0gQ29udG9oIEthc3VzOiBNYXRyaWtzIGtla2FrdWFuIGplbWJhdGFuICRLID0gXGJlZ2lue2JtYXRyaXh9IDIgJiAtMSBcXCAtMSAmIDIgXGVuZHtibWF0cml4fSQuDQoNCkFrYXIga2FyYWt0ZXJpc3RpayBtZW1iZXJpa2FuICRcbGFtYmRhXzEgPSAzJCBkYW4gJFxsYW1iZGFfMiA9IDEkLiANCg0KRnJla3VlbnNpIGFsYW1pIHN0cnVrdHVyIGRpZGFwYXQgZGFyaSAkXG9tZWdhID0gXHNxcnR7XGxhbWJkYX0kLg0KDQpgYGB7cixlY2hvPUZBTFNFfQ0KbGlicmFyeShwbG90bHkpDQoNCiMgMS4gRGVmaW5pc2lrYW4gTWF0cmlrcyBLZWtha3VhbiBLDQpLIDwtIG1hdHJpeChjKDIsIC0xLCAtMSwgMiksIG5yb3cgPSAyKQ0KDQojIDIuIEJ1YXQgZ3JpZCBwZXJwaW5kYWhhbiAoZGlzcGxhY2VtZW50KSB4MSBkYW4geDINCngxIDwtIHNlcSgtMiwgMiwgbGVuZ3RoLm91dCA9IDUwKQ0KeDIgPC0gc2VxKC0yLCAyLCBsZW5ndGgub3V0ID0gNTApDQpncmlkIDwtIGV4cGFuZC5ncmlkKHgxID0geDEsIHgyID0geDIpDQoNCiMgMy4gSGl0dW5nIEVuZXJnaSBQb3RlbnNpYWwgViA9IDAuNSAqIHgnICogSyAqIHgNCiMgViA9IDAuNSAqICgyKngxXjIgLSAyKngxKngyICsgMip4Ml4yKQ0KZ3JpZCRWIDwtIDAuNSAqIChLWzEsMV0qZ3JpZCR4MV4yICsgKEtbMSwyXSArIEtbMiwxXSkqZ3JpZCR4MSpncmlkJHgyICsgS1syLDJdKmdyaWQkeDJeMikNCg0KIyA0LiBSZXNoYXBlIGRhdGEgdW50dWsgc3VyZmFjZSBwbG90DQp2X21hdHJpeCA8LSBtYXRyaXgoZ3JpZCRWLCBucm93ID0gNTAsIG5jb2wgPSA1MCkNCg0KIyA1LiBQbG90IDNEIFBlcm11a2FhbiBFbmVyZ2kNCnBsb3RfbHkoKSAlPiUNCiAgYWRkX3N1cmZhY2UoeCA9IH54MSwgeSA9IH54MiwgeiA9IH52X21hdHJpeCwNCiAgICAgICAgICAgICAgY29sb3JzY2FsZSA9ICJWaXJpZGlzIikgJT4lDQogIGxheW91dCgNCiAgICB0aXRsZSA9ICJQZXJtdWthYW4gRW5lcmdpIFBvdGVuc2lhbCBKZW1iYXRhbiAoUXVhZHJhdGljIEZvcm0pIiwNCiAgICBzY2VuZSA9IGxpc3QoDQogICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiRGlzcGxhY2VtZW50IHgxIiksDQogICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiRGlzcGxhY2VtZW50IHgyIiksDQogICAgICB6YXhpcyA9IGxpc3QodGl0bGUgPSAiRW5lcmdpIChWKSIpDQogICAgKQ0KICApDQpgYGANCg0KIyMjIEludGVycHJldGFzaSBHZW9tZXRyaXMgM0QNCg0KLSBCZW50dWsgTWFuZ2t1ayAoUGFyYWJvbG9pZCk6IFBlcm11a2FhbiBpbmkgbWVudW5qdWtrYW4gYmFod2EgdGl0aWsgJCgwLDApJCBhZGFsYWggcG9zaXNpIHNldGltYmFuZyBzdGFiaWwgKGVuZXJnaSBtaW5pbXVtKS4NCg0KLSBLZWxlbmdrdW5nYW4gKEN1cnZhdHVyZSk6IEppa2EgQW5kYSBwZXJoYXRpa2FuLCBwZXJtdWthYW4gaW5pIGxlYmloICJjdXJhbSIgZGkgc2F0dSBhcmFoIGRhbiBsZWJpaCAibGFuZGFpIiBkaSBhcmFoIGxhaW4uDQoNCkFyYWggeWFuZyBwYWxpbmcgY3VyYW0gYmVyaHVidW5nYW4gZGVuZ2FuICRcbGFtYmRhXzEgPSAzJCAobW9kZSBrYWt1KS4NCg0KQXJhaCB5YW5nIHBhbGluZyBsYW5kYWkgYmVyaHVidW5nYW4gZGVuZ2FuICRcbGFtYmRhXzIgPSAxJCAobW9kZSBmbGVrc2liZWwpLg0KDQotIEVsaXBzIEtvbnR1cjogSmlrYSBraXRhIG1lbW90b25nIHBlcm11a2FhbiBpbmkgc2VjYXJhIGhvcml6b250YWwsIGtpdGEgYWthbiBtZW5kYXBhdGthbiBlbGlwcy4gU3VtYnUgdXRhbWEgZWxpcHMgdGVyc2VidXQgYWRhbGFoIGFyYWggZGFyaSBWZWt0b3IgRWlnZW4uDQoNCmluaSBwZW50aW5nIGJhZ2kgSW5zaW55dXI6DQoNCkppa2EgZnJla3VlbnNpIGJlYmFuIGx1YXIgKHNlcGVydGkgYW5naW4gYXRhdSBsYW5na2FoIGtha2kgb3JhbmcpIHNhbWEgZGVuZ2FuIHNhbGFoIHNhdHUgZnJla3VlbnNpIGFsYW1pICgkXG9tZWdhID0gMSQgYXRhdSAkMS43MyQpLCBtYWthIGFrYW4gdGVyamFkaSBSZXNvbmFuc2kgeWFuZyBiaXNhIG1lcnVudHVoa2FuIGplbWJhdGFuLiBJbmlsYWggbWVuZ2FwYSBtZW5naGl0dW5nIG5pbGFpIGVpZ2VuIGRhcmkgbWF0cmlrcyBrZWtha3VhbiBhZGFsYWggbGFuZ2thaCB3YWppYiBkYWxhbSBkZXNhaW4gamVtYmF0YW4uDQoNCg0KIyMgIFJ1YW5nIEhhc2lsIEthbGkgRGFsYW0gKElubmVyIFByb2R1Y3QgU3BhY2UpDQoNCi0gUnVtdXMgVXRhbWE6ICRcbGFuZ2xlIFxtYXRoYmZ7Zn0sIFxtYXRoYmZ7Z30gXHJhbmdsZSA9IFxpbnRfe2F9XntifSBmKHgpZyh4KSBcLCBkeCQuDQoNCi0gQXBsaWthc2k6IFBlbXJvc2VzYW4gU2lueWFsIChEZXJldCBGb3VyaWVyKS4NCg0KUGVuamVsYXNhbiBNYXRlbWF0aXM6IERpZ3VuYWthbiB1bnR1ayBtZW5lbnR1a2FuIHNlYmVyYXBhIG1pcmlwIGR1YSBmdW5nc2kgKGtvcmVsYXNpKSBtZWxhbHVpIHByb3lla3NpIG9ydG9nb25hbC4NCg0KLSBDb250b2ggS2FzdXM6IE1lbmdhbWJpbCBmcmVrdWVuc2kgdGVydGVudHUgZGFyaSBzdWFyYSBtZW50YWggJGYoeCkkIGRlbmdhbiBtZW1wcm95ZWtzaWthbm55YSBrZSBiYXNpcyBzaW51cy9rb3NpbnVzOiRhX24gPSBcZnJhY3sxfXtccGl9IFxpbnRfey1ccGl9XntccGl9IGYoeCkgXGNvcyhueCkgXCwgZHgkLg0KDQpgYGB7cixlY2hvPUZBTFNFfQ0KbGlicmFyeShwbG90bHkpDQoNCiMgMS4gTWVtYnVhdCBTaW55YWwgU3VhcmEgTWVudGFoIGYoeCkNCiMgTWlzYWw6IEdhYnVuZ2FuIGR1YSBmcmVrdWVuc2kgKG49MiBkYW4gbj01KQ0KeCA8LSBzZXEoLXBpLCBwaSwgbGVuZ3RoLm91dCA9IDUwMCkNCmZfeCA8LSBzaW4oMip4KSArIDAuNSAqIGNvcyg1KngpDQoNCiMgMi4gTWVtYnVhdCBCYXNpcyB1bnR1ayBWaXN1YWxpc2FzaQ0Kbl9iYXNpcyA8LSAxOjYNCmdyaWQgPC0gZXhwYW5kLmdyaWQoeCA9IHgsIG4gPSBuX2Jhc2lzKQ0KDQojIDMuIE1lbmdoaXR1bmcgS29udHJpYnVzaSB0aWFwIEZyZWt1ZW5zaSAoUHJveWVrc2kpDQojIERhbGFtIHZpc3VhbGlzYXNpIGluaSBraXRhIHR1bmp1a2thbiBiYWdhaW1hbmEgc2lueWFsIGYoeCkgImJlcmdldGFyIiANCiMgcGFkYSBiZXJiYWdhaSBiYXNpcyBmcmVrdWVuc2kgbg0KZ3JpZCR6IDwtIGZfeCAqIGNvcyhncmlkJG4gKiBncmlkJHgpDQoNCiMgNC4gUGxvdCAzRCBtZW5nZ3VuYWthbiBQbG90bHkNCnBsb3RfbHkoZ3JpZCwgeCA9IH54LCB5ID0gfm4sIHogPSB+eiwgc3BsaXQgPSB+biwgDQogICAgICAgIHR5cGUgPSAnc2NhdHRlcjNkJywgbW9kZSA9ICdsaW5lcycsIA0KICAgICAgICBsaW5lID0gbGlzdCh3aWR0aCA9IDQpKSAlPiUNCiAgbGF5b3V0KA0KICAgIHRpdGxlID0gIkRla29tcG9zaXNpIEZvdXJpZXI6IFByb3lla3NpIFNpbnlhbCBrZSBCYXNpcyBGcmVrdWVuc2kiLA0KICAgIHNjZW5lID0gbGlzdCgNCiAgICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJXYWt0dSAoeCkiKSwNCiAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJGcmVrdWVuc2kgKG4pIiksDQogICAgICB6YXhpcyA9IGxpc3QodGl0bGUgPSAiQW1wbGl0dWRvIFByb3lla3NpIikNCiAgICApDQogICkNCmBgYA0KDQoNCiMjIyBJbnRlcnByZXRhc2kgR2VvbWV0cmlzIDNEDQoNCnNldGlhcCBnYXJpcyBwYWRhIHN1bWJ1ICRuJCBtZW51bmp1a2thbiBzZWJlcmFwYSBrdWF0IHNpbnlhbCBhc2xpIGJlcmVzb25hbnNpIGRlbmdhbiBmcmVrdWVuc2kgdGVyc2VidXQuIEppa2EgZ2FyaXNueWEgc2FuZ2F0IGJlcm9zaWxhc2kgbWVuamF1aCBkYXJpIG5vbCwgYmVyYXJ0aSBmcmVrdWVuc2kgdGVyc2VidXQgZG9taW5hbiBkYWxhbSBzdWFyYSBtZW50YWgga2l0YS4NCg0KDQojIyAgRGlhZ29uYWxpc2FzaSAmIEJlbnR1ayBLdWFkcmF0aWsNCg0KLSBSdW11cyBVdGFtYTogJFEoeCkgPSBcbWF0aGJme3h9XlQgQSBcbWF0aGJme3h9JC4NCg0KLSBBcGxpa2FzaTogS2xhc2lmaWthc2kgUGVuYW1wYW5nIEtlcnVjdXQgKEFzdHJvbm9taS9EZXNhaW4gQW50ZW5hKS4NCg0KLSBQZW5qZWxhc2FuIE1hdGVtYXRpczogRGlhZ29uYWxpc2FzaSBkaWd1bmFrYW4gdW50dWsgbWVueWVkZXJoYW5ha2FuIHBlcnNhbWFhbiBrdWFkcmF0IHJ1bWl0IGRlbmdhbiBtZW5naGlsYW5na2FuIHN1a3Ugc2lsYW5nICgkeHkkKS4NCg0KLSBDb250b2ggS2FzdXM6IFBlcnNhbWFhbiAkNXheMiArIDh4eSArIDV5XjIgPSA5JC4NCg0KTWVsYWx1aSB0cmFuc2Zvcm1hc2kga29vcmRpbmF0IChkaWFnb25hbGlzYXNpKSwgcGVyc2FtYWFuIGJlcnViYWggbWVuamFkaSAkOXgnXjIgKyAxeSdeMiA9IDkkLiANCg0KQmVudHVrIGluaSBzZWNhcmEgbWF0ZW1hdGlzIGRpa2VuYWxpIHNlYmFnYWkgRWxpcHMuDQoNCmBgYHtyLGVjaG89RkFMU0UsbWVzc2FnZT1GQUxTRSx3YXJuaW5nPUZBTFNFfQ0KbGlicmFyeShwbG90bHkpDQoNCiMgMS4gRGVmaW5pc2lrYW4gZnVuZ3NpIGYoeCwgeSkgPSA1eF4yICsgOHh5ICsgNXleMg0KeCA8LSBzZXEoLTIsIDIsIGxlbmd0aC5vdXQgPSAxMDApDQp5IDwtIHNlcSgtMiwgMiwgbGVuZ3RoLm91dCA9IDEwMCkNCmdyaWQgPC0gZXhwYW5kLmdyaWQoeCA9IHgsIHkgPSB5KQ0KDQojIEhpdHVuZyBuaWxhaSBaIChCZW50dWsgS3VhZHJhdGlrKQ0KZ3JpZCR6IDwtIDUqZ3JpZCR4XjIgKyA4KmdyaWQkeCpncmlkJHkgKyA1KmdyaWQkeV4yDQoNCiMgMi4gUmVzaGFwZSB1bnR1ayBQbG90bHkNCnpfbWF0cml4IDwtIG1hdHJpeChncmlkJHosIG5yb3cgPSAxMDAsIG5jb2wgPSAxMDApDQoNCiMgMy4gUGxvdCAzRA0KcGxvdF9seSgpICU+JQ0KICAjIFBlcm11a2FhbiBLdWFkcmF0aWsNCiAgYWRkX3N1cmZhY2UoeCA9IH54LCB5ID0gfnksIHogPSB+el9tYXRyaXgsIA0KICAgICAgICAgICAgICBjb2xvcnNjYWxlID0gIlZpcmlkaXMiLCBvcGFjaXR5ID0gMC44KSAlPiUNCiAgIyBCaWRhbmcgcGVtb3RvbmcgZGkgWiA9IDkgKHVudHVrIG1lbnVuanVra2FuIGVsaXBzKQ0KICBhZGRfc3VyZmFjZSh4ID0gfngsIHkgPSB+eSwgeiA9IG1hdHJpeCg5LCAxMDAsIDEwMCksIA0KICAgICAgICAgICAgICBzaG93c2NhbGUgPSBGQUxTRSwgb3BhY2l0eSA9IDAuMywgbmFtZSA9ICJaID0gOSIpICU+JQ0KICBsYXlvdXQoDQogICAgdGl0bGUgPSAiVmlzdWFsaXNhc2kgM0Q6IFJvdGFzaSBFbGlwcyBtZWxhbHVpIERpYWdvbmFsaXNhc2kiLA0KICAgIHNjZW5lID0gbGlzdCgNCiAgICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJYIiksDQogICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiWSIpLA0KICAgICAgemF4aXMgPSBsaXN0KHRpdGxlID0gImYoeCx5KSIpLA0KICAgICAgY2FtZXJhID0gbGlzdChleWUgPSBsaXN0KHggPSAxLjgsIHkgPSAxLjgsIHogPSAxLjIpKQ0KICAgICkNCiAgKQ0KYGBgDQoNCiMjIyBJbnRlcnByZXRhc2kgR2VvbWV0cmlzIDNEDQoNCi0gS2Vsb25qb25nYW4gTWFuZ2t1azogUGVyaGF0aWthbiBiYWh3YSBtYW5na3VrIHRlcnNlYnV0IHRpZGFrIHNpbWV0cmlzIHNlbXB1cm5hIHNlY2FyYSByYWRpYWwuIElhIGxlYmloICJ0YWphbSIga2Ugc2F0dSBhcmFoIGRhbiBsZWJpaCAibGViYXIiIGtlIGFyYWggbGFpbi4gQXJhaC1hcmFoIHV0YW1hIGluaSBkaXRlbnR1a2FuIG9sZWggVmVrdG9yIEVpZ2VuLg0KDQotIEVmZWsgRGlhZ29uYWxpc2FzaTogRGlhZ29uYWxpc2FzaSBwYWRhIGRhc2FybnlhIGFkYWxhaCBtZW11dGFyIGthbWVyYSBBbmRhIGF0YXUgbWVtdXRhciBncmFmaWsgdGVyc2VidXQgc2VoaW5nZ2Egc3VtYnUgdXRhbWFueWEgc2VqYWphciBkZW5nYW4gc3VtYnUgJFgkIGRhbiAkWSQuDQoNCi0gTmlsYWkgRWlnZW4gc2ViYWdhaSBTa2FsYTogKiAkXGxhbWJkYSA9IDkkIChzYW5nYXQgY3VyYW0pIG1lbWJ1YXQgc3VtYnUgZWxpcHMgbWVuamFkaSBwZW5kZWsgKCQxL1xzcXJ0ezl9ID0gMS8zJCkuJFxsYW1iZGEgPSAxJCAoa3VyYW5nIGN1cmFtKSBtZW1idWF0IHN1bWJ1IGVsaXBzIG1lbmphZGkgcGFuamFuZyAoJDEvXHNxcnR7MX0gPSAxJCkuDQoNCg0KIyMgIFRyYW5zZm9ybWFzaSBMaW5lYXIgDQoNCi0gUnVtdXMgVXRhbWE6ICRcbWF0aGJme3h9JyA9IE0gXG1hdGhiZnt4fSQuDQoNCi0gQXBsaWthc2k6IEFuaW1hc2kgS29tcHV0ZXIgZGFuIEdyYWZpa2EgM0QuDQoNCi0gUGVuamVsYXNhbiBNYXRlbWF0aXM6IE1lbWV0YWthbiB2ZWt0b3IgZGFyaSBydWFuZyBhc2FsIGtlIHJ1YW5nIHR1anVhbiBtZW5nZ3VuYWthbiBtYXRyaWtzIHRyYW5zZm9ybWFzaS4NCg0KLSBDb250b2ggS2FzdXM6IFJvdGFzaSB0aXRpayAkKDEsIDApJCBzZWJlc2FyICQ5MF5cY2lyYyQuDQoNCk1lbmdndW5ha2FuIG1hdHJpa3Mgcm90YXNpICRNID0gXGJlZ2lue2JtYXRyaXh9IDAgJiAtMSBcXCAxICYgMCBcZW5ke2JtYXRyaXh9JC4NCg0KSGFzaWw6ICRcYmVnaW57Ym1hdHJpeH0gMCAmIC0xIFxcIDEgJiAwIFxlbmR7Ym1hdHJpeH0gXGJlZ2lue2JtYXRyaXh9IDEgXFwgMCBcZW5ke2JtYXRyaXh9ID0gXGJlZ2lue2JtYXRyaXh9IDAgXFwgMSBcZW5ke2JtYXRyaXh9JC4NCg0KYGBge3IsZWNobz1GQUxTRSxtZXNzYWdlPUZBTFNFLHdhcm5pbmc9RkFMU0V9DQpsaWJyYXJ5KHBsb3RseSkNCg0KIyAxLiBEZWZpbmlzaWthbiBWZWt0b3IgQXdhbCBkYW4gSGFzaWwNCnZfYXdhbCA8LSBjKDEsIDAsIDApDQp2X2FraGlyIDwtIGMoMCwgMSwgMCkNCg0KIyAyLiBCdWF0IGxpbnRhc2FuIGJ1c3VyIChhcmMpIHVudHVrIG1lbnVuanVra2FuIHJvdGFzaQ0KdGhldGEgPC0gc2VxKDAsIHBpLzIsIGxlbmd0aC5vdXQgPSA1MCkNCmFyY194IDwtIGNvcyh0aGV0YSkNCmFyY195IDwtIHNpbih0aGV0YSkNCmFyY196IDwtIHJlcCgwLCA1MCkNCg0KIyAzLiBQbG90IG1lbmdndW5ha2FuIFBsb3RseQ0KcGxvdF9seSgpICU+JQ0KICAjIFZla3RvciBBd2FsIChNZXJhaCkNCiAgYWRkX3NlZ21lbnRzKHggPSAwLCB5ID0gMCwgeiA9IDAsIHhlbmQgPSB2X2F3YWxbMV0sIHllbmQgPSB2X2F3YWxbMl0sIHplbmQgPSB2X2F3YWxbM10sDQogICAgICAgICAgICAgICBsaW5lID0gbGlzdChjb2xvciA9ICJyZWQiLCB3aWR0aCA9IDYpLCBuYW1lID0gIkF3YWwgKDEsMCkiKSAlPiUNCiAgIyBWZWt0b3IgQWtoaXIgKEJpcnUpDQogIGFkZF9zZWdtZW50cyh4ID0gMCwgeSA9IDAsIHogPSAwLCB4ZW5kID0gdl9ha2hpclsxXSwgeWVuZCA9IHZfYWtoaXJbMl0sIHplbmQgPSB2X2FraGlyWzNdLA0KICAgICAgICAgICAgICAgbGluZSA9IGxpc3QoY29sb3IgPSAiYmx1ZSIsIHdpZHRoID0gNiksIG5hbWUgPSAiUm90YXNpIDkwwrAgKDAsMSkiKSAlPiUNCiAgIyBMaW50YXNhbiBSb3Rhc2kNCiAgYWRkX3BhdGhzKHggPSB+YXJjX3gsIHkgPSB+YXJjX3ksIHogPSB+YXJjX3osIA0KICAgICAgICAgICAgbGluZSA9IGxpc3QoY29sb3IgPSAiZ3JheSIsIGRhc2ggPSAiZGFzaCIpLCBuYW1lID0gIkxpbnRhc2FuIFJvdGFzaSIpICU+JQ0KICBsYXlvdXQoDQogICAgc2NlbmUgPSBsaXN0KA0KICAgICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIlgiLCByYW5nZSA9IGMoLTEuNSwgMS41KSksDQogICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiWSIsIHJhbmdlID0gYygtMS41LCAxLjUpKSwNCiAgICAgIHpheGlzID0gbGlzdCh0aXRsZSA9ICJaIiwgcmFuZ2UgPSBjKC0xLCAxKSksDQogICAgICBjYW1lcmEgPSBsaXN0KGV5ZSA9IGxpc3QoeCA9IDAsIHkgPSAwLCB6ID0gMi41KSkgIyBNZWxpaGF0IGRhcmkgYXRhcw0KICAgICksDQogICAgdGl0bGUgPSAiUm90YXNpIFZla3RvciA5MCBEZXJhamF0IChUcmFuc2Zvcm1hc2kgTGluZWFyKSINCiAgKQ0KYGBgDQoNCiMjIyAgSW50ZXJwcmV0YXNpDQoNCi0gUGVtZXRhYW4gQmFzaXM6IE1hdHJpa3MgJE0gPSBcYmVnaW57Ym1hdHJpeH0gXG1hdGhiZnt2fV8xICYgXG1hdGhiZnt2fV8yIFxlbmR7Ym1hdHJpeH0kIHNlYmVuYXJueWEgbWVtYmVyaXRhaHUga2l0YSBrZSBtYW5hIGFyYWggc3VtYnUgJHgkIGRhbiAkeSQgc2V0ZWxhaCB0cmFuc2Zvcm1hc2kuS29sb20gcGVydGFtYSAkWzAsIDFdXlQkIGFkYWxhaCBwb3Npc2kgYmFydSBkYXJpIHVuaXQgdmVrdG9yIHN1bWJ1ICR4JCAoJFxtYXRoYmZ7ZX1fMSQpLktvbG9tIGtlZHVhICRbLTEsIDBdXlQkIGFkYWxhaCBwb3Npc2kgYmFydSBkYXJpIHVuaXQgdmVrdG9yIHN1bWJ1ICR5JCAoJFxtYXRoYmZ7ZX1fMiQpLkRldGVybWluYW50OiBOaWxhaSAkXGRldChNKSA9ICgwIFxjZG90IDApIC0gKC0xIFxjZG90IDEpID0gMSQuIEthcmVuYSBkZXRlcm1pbmFubnlhICQxJCwgb3JpZW50YXNpIHJ1YW5nIHRldGFwIHRlcmphZ2EgZGFuIHRpZGFrIGFkYSBwZXJ1YmFoYW4gbHVhcyAodGlkYWsgYWRhIHBlbnl1c3V0YW4gYXRhdSBwZW11YWlhbikuDQoNCiMjIyBBcGxpa2FzaSBkaSBEdW5pYSBOeWF0YQ0KDQotIFJvYm90aWthOiBMZW5nYW4gcm9ib3QgbWVuZ2d1bmFrYW4gbWF0cmlrcyByb3Rhc2kgKHNlcmluZ2thbGkgZGFsYW0gZm9ybWF0IDNEIHlhbmcgZGlzZWJ1dCBFdWxlciBBbmdsZXMgYXRhdSBRdWF0ZXJuaW9ucykgdW50dWsgbWVuZW50dWthbiBwb3Npc2kgdGFuZ2FuIHJvYm90IGRpIHJ1YW5nIDNELg0KDQotIEdhbWUgRGV2ZWxvcG1lbnQ6IFNldGlhcCBrYWxpIEFuZGEgbWVtdXRhciBrYXJha3RlciBhdGF1IGthbWVyYSBkYWxhbSBnYW1lLCBrb21wdXRlciBzZWRhbmcgbWVuZ2FsaWthbiByaWJ1YW4ga29vcmRpbmF0IHRpdGlrICh2aWtpbmcsIG1vYmlsLCBhdGF1IHBvaG9uKSBkZW5nYW4gbWF0cmlrcyByb3Rhc2kgc2VwZXJ0aSBpbmkgc2VjYXJhIHJlYWwtdGltZS4NCg0KLSBQZW5nb2xhaGFuIENpdHJhOiBPcGVyYXNpICJSb3RhdGUgOTDCsCIgcGFkYSBhcGxpa2FzaSBlZGl0IGZvdG8gc2VjYXJhIG1hdGVtYXRpcyBtZWxha3VrYW4gcGVya2FsaWFuIG1hdHJpa3MgaW5pIHBhZGEgc2V0aWFwIGluZGVrcyBwaWtzZWwgZ2FtYmFyLg0KDQojIyBSVUpVS0FOOg0KDQpBbnRvbiwgSC4sICYgUm9ycmVzLCBDLiAoMjAxMykuIEVsZW1lbnRhcnkgTGluZWFyIEFsZ2VicmE6IEFwcGxpY2F0aW9ucyBWZXJzaW9uLiBKb2huIFdpbGV5ICYgU29ucy4NCg0KS3JleXppZywgRS4gKDIwMTEpLiBBZHZhbmNlZCBFbmdpbmVlcmluZyBNYXRoZW1hdGljcy4gSm9obiBXaWxleSAmIFNvbnMuTGF5LCBELiBDLiAoMjAxMikuIExpbmVhciBBbGdlYnJhIGFuZCBJdHMgQXBwbGljYXRpb25zLiBQZWFyc29uLg==