Email             :
RPubs            : https://rpubs.com/jeremyheriyandi23/

Jurusan          : Statistika
Address         : ARA Center, Matana University Tower
                         Jl. CBD Barat Kav, RT.1, Curug Sangereng, Kelapa Dua, Tangerang, Banten 15810.


1 R VS PYTHON

R dan Python adalah bahasa pemrograman yang sangat populer, dinamis, digunakan secara luas dalam komunitas data science. R lebih banyak digunakan dalam analisis statistik sementara Python menyediakan pendekatan yang lebih umum mengenai sains data (sehingga dianggap lebih mudah untuk digunakan oleh pemula). Mempelajari kedua bahasa pemrograman ini adalah solusi yang lebih bijak karena keduanya mempunyai kelebihan dan kekurangan masing-masing. R dan Python membutuhkan investasi waktu,

2 SINTASK DASAR

Suatu program di R dan Phyton terdiri atas tiga hal mendasar dari variabel,operan(nilai) dan komentar.variabel digunakan untuk menyimpan suatu nilai sedangkan komentar di Pakai untuk meningkatkan pemahaman pengguna mengenai skrip dan koding

3 PENUGASAN VARIABEL (R)

Dalam R,penugasan suatu program biasa mengunakan satu variabel yang dicadangkan untuk merekam berbagai jenis data sesuai nama yang di berikan ke lokasi penyimpanan/memori,perintah penugasan variabel ini,dapat di notasikan dengan tiga cara:

=,di gunakan untuk penugasan <-,di gunakan untuk penugasan dari sisi kiri -> ,di gunakan untukpenugasan dari sisi kanan

 x=2
 y <- 3
 5-> z
 print(c(x,y,z))
## [1] 2 3 5

4 MENAMBAHKAN KOMENTAR

Menambahkan/Memberikan komentar dalam skrip/koding R dan Python adalah untuk memudahkan anda memahami arti/makna penggunaan suatu perintah/program Komentar yang ditulis dalam sebuah program tersebut hanya bersifat penjelasan tentang apa yang dilakukannya atau apa yang seharusnya dilakukan oleh sebuah skrip/koding. Perlu dicatat bahwa komentar yang bersifatinformasi tidak ada hubungannya dengan logika pemrogaram yang sedang anda gunakan. Merekabenar-benar diabaikan oleh kompiler dan dengan demikian tidak pernah tercermin pada input

# Mengganti nilai x yang sudah direkam (komentar di awal pernyataan)
x=12
z <- x + y        # Mengganti nilai yang sudah direkam (Komentar yang ada di akhir pernyataan)
x + y -> z       # sama dengan yang ada diatas

5 OPERATOR

Operator adalah simbol yang mengarahkan compiler untuk melakukan berbagai macam operasi terhadap beberapa penugasan. Operator mensimulasikan berbagai operasi matematis, logika, dan keputusan yang dilakukan pada sekumpulan Bilangan Kompleks, Integer, dan Numerik sebagai penugasan masukan (input). R dan Python mendukung sebagian besar empat jenis operator biner antara satu set penugasan. Dalam ini, kita akan melihat berbagai jenis operator yang tersedia di R dan Python dan penggunaannya.

6 ARITMATIKA

Penggunaan operator aritmatika dalam program R dan Python adalah untuk mensimulasikan berbagai operasi matematika, seperti penambahan, pengurangan, perkalian, pembagian, dan modulo. Operator aritmatika yang dilakukan bisa saja berupa nilai skalar, bilangan kompleks, atau vektor

Untuk pemahaman lebih lanjutnya,Perhatikan cuplikan R berikut:

x <- c(4,7,5)      # memuat vektor x
y <- c(4,9,6)      # memuat vektor y
x + y              # hasil penjumahan vektor x dan y
## [1]  8 16 11
print (x-y) # hasil pengurangan dari vektor > dan y
## [1]  0 -2 -1
print(x*y)
## [1] 16 63 30
print(x/y)
## [1] 1.0000000 0.7777778 0.8333333
print(x^y)
## [1]      256 40353607    15625
print(x%%y)
## [1] 0 7 5

Adakalanya anda perlu menampilkan keterangan/komentar yang juga melekat pada hasil perhitungan R itu sendiri. Maka anda dapat melakukannya dengan cara berikut: Hide

cat("Penjumlahan  vektor x dan y :", x + y, "\n")
## Penjumlahan  vektor x dan y : 8 16 11
cat("Pengurangan  vektor x dan y :", x,
y, "\n")
## Pengurangan  vektor x dan y : 4 7 5 4 9 6
cat("Perkalian vektor x dan y :",x * y, "\n")
## Perkalian vektor x dan y : 16 63 30
cat("vektor x dibagi dengan vektor y :", x/y , "\n")
## vektor x dibagi dengan vektor y : 1 0.7777778 0.8333333
cat("vektor x dipangkat vektor y :", x^y , "\n")
## vektor x dipangkat vektor y : 256 40353607 15625
cat("modulo vektor x dan y :", x%%y , "\n")
## modulo vektor x dan y : 0 7 5

7 RELASIONAL

Operator relasional melakukan operasi perbandingan antara elemen yang bersesuaian pada setiap operan. Mengembalikan nilai Boolean TRUE jika operan pertama memenuhi relasi dibandingkan dengan operan kedua. Nilai TRUE selalu dianggap lebih besar dari FALSE Python Keterangan

x = c(4,9,6)  # membentuk vektor x
y = c(7,2,5)  # membentuk vektor y
cat("vektor x dikurang dari y :", x<y,"\n")
## vektor x dikurang dari y : TRUE FALSE FALSE
cat("vektor x dikurang dari sama dengan y :", x<=y,"\n")
## vektor x dikurang dari sama dengan y : TRUE FALSE FALSE
cat("vektor x dilebihkan dari y :", x>y,"\n")
## vektor x dilebihkan dari y : FALSE TRUE TRUE
cat("vektor x dilebihkan dari sama dengan dari y :", x>=y,"\n")
## vektor x dilebihkan dari sama dengan dari y : FALSE TRUE TRUE
cat("vektor x sama dengan dari y :", x==y,"\n")
## vektor x sama dengan dari y : FALSE FALSE FALSE
cat("vektor x tidak sama dengan bentuk y :", x!=y,"\n")
## vektor x tidak sama dengan bentuk y : TRUE TRUE TRUE

8 LOGIKA

Operator logis mensimulasikan operasi keputusan, berdasarkan operator yang ditentukan antara operan, yang kemudian dievaluasi ke nilai Boolean Benar atau Salah. Nilai bilangan bulat bukan nol dianggap sebagai nilai BENAR, baik itu bilangan kompleks atau bilangan real.

x <- c(0,TRUE, FALSE)
y <- c(TRUE, 0.1,4+3i)
# Melakukan operasi logika pada peran
cat("Logika Negasi (~) untuk vektor x:", !x, "\n")
## Logika Negasi (~) untuk vektor x: TRUE FALSE TRUE
cat("Logika Negasi (~) untuk vektor y :", !y, "\n")
## Logika Negasi (~) untuk vektor y : FALSE FALSE FALSE
cat ("Logika Konjungsi (Dan) :", x & y, "\n")
## Logika Konjungsi (Dan) : FALSE TRUE FALSE
cat ("Logika Disjungsi (Atau) :", x | y, "\n")
## Logika Disjungsi (Atau) : TRUE TRUE TRUE
cat("Logika Disjungsi Parsial :", x || y)
## Logika Disjungsi Parsial : TRUE

9 LAIN-LAINNYA

Berikut ini juga ada beberapa oprator yang kemungkinan besar juga akan anda perlukan pada saat mengunakan R.

x <- c(7,3,5)    # Menyimpan vektor x
y <- c(3,6,8)    # Menyimpan vektor y
sqrt(x*y)        # Bentuk akar
## [1] 4.582576 4.242641 6.324555
log(x)           # Logaritma
## [1] 1.945910 1.098612 1.609438
exp(y)           # Eksponen
## [1]   20.08554  403.42879 2980.95799
(x/y)+y          # Tanda kurung
## [1] 5.333333 6.500000 8.625000

10 TIPE DATA

Dalam pemrograman seperti R dan Python,tipe data merupakan konsep penting keduany dapat menggunakan variabel untuk menyimpan tipe yang berbeda-beda,berikut adalah tipe data paling dasar yang harus di ketahui

Berikut ini adalah koding R yang dapat digunakan untuk menetapkan kelima tipe data di atas:

d1= 5.6                  # Tetapkan nilai desimal
d2= as.integer(5)        # Tetapkan nilai integer
d2= 5L                   # Cara lain memuat nilai integer di R
d3= c(TRUE,FALSE)        # Bloen/Logical
d3= as.logical(c(0,1))   # Cara lain untuk memuat bloean/Logical
d4= c("a",'b','12')      # String/character
d5= 1 + 5i               # Complex

Untuk memeriksa data dalam R:

class(d1)     # Cetak nama kelas variabel
## [1] "numeric"
typeof(d1)    # Cetak tipe variabel x
## [1] "double"

11 BANTUAN

Salah satu bagian penting dalam bekerja dengan bahasa R adalah bagaimana mencari bantuan.R memiliki be-berapa fasilitas in-line,selain beberapa daya sumber bantuan di ekosistem R.Anda dapat mengunakan bantuan untuk fungsi tertentu

help.start()         # Menu di mana Anda dapat menavigasi bantuan lokal berbasis web
## starting httpd help server ... done
## If the browser launched by 'xdg-open' is already running, it is *not*
##     restarted, and you must switch to its window.
## Otherwise, be patient ...
?help                # menu di mana Anda dapat menavigasi bantuan lokal berbasis web
? class              # mendapatkan bantuan untuk fungsi class
help(class)          # mendapatkan bantuan untuk fungsi class
??class              # jika Anda tidak tahu nama fungsi yang Anda cari
help.search('class') # jika Anda tidak tahu nama fungsi yang Anda cari
LS0tCnRpdGxlOiAiVHVnYXMgMiIKc3VidGl0bGU6ICJQZW5nZW5hbGFuIGRhc2FyIFIgZGFuIFB5dGhvbiIKYXV0aG9yOiAiSmVyZW1pIGhlcml5YW5kaSBzYXVkaSAoMjAyMTQ5MjAwMDgpIgpkYXRlOiAiYHIgZm9ybWF0KFN5cy5EYXRlKCksICclQiAlZCwgJVknKWAiCm91dHB1dDogCiAgaHRtbF9kb2N1bWVudDogCiAgICBodG1sX2RvY3VtZW50OiBudWxsCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUKICAgIHRvYzogeWVzCiAgICB0b2NfZmxvYXQ6CiAgICAgIGNvbGxhcHNlZDogeWVzCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcwogICAgY29kZV9kb3dubG9hZDogeWVzCiAgICB0aGVtZTogc2FuZHN0b25lCiAgICBjc3M6IHN0eWxlMS5jc3MKICAgIGhpZ2hsaWdodDogbW9ub2Nocm9tZQotLS0KCgo8aW1nIHN0eWxlPSJmbG9hdDogcmlnaHQ7IG1hcmdpbjogMHB4IDEwMHB4IDBweCAwcHg7IHdpZHRoOjI1JSIgc3JjPSJmb3RvZGlyaS5qcGciLz4gCgpgYGB7ciBsb2dvLCBlY2hvPUZBTFNFLGZpZy5hbGlnbj0nY2VudGVyJywgb3V0LndpZHRoID0gJzMwJSd9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCJsb2dvbWF0YW5hLnBuZyIpCmBgYAoKRW1haWwgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7Jm5ic3A7OiAgZTdpbHNhdWRpQGdtYWlsLmNvbSA8YnI+ClJQdWJzICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDs6IGh0dHBzOi8vcnB1YnMuY29tL2plcmVteWhlcml5YW5kaTIzLyA8YnI+CgpKdXJ1c2FuICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDs6IFtTdGF0aXN0aWthXShodHRwczovL21hdGFuYXVuaXZlcnNpdHkuYWMuaWQvP2x5PWFjYWRlbWljJmM9c2IpIDxicj4KQWRkcmVzcyAgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7IDogQVJBIENlbnRlciwgTWF0YW5hIFVuaXZlcnNpdHkgVG93ZXIgPGJyPgombmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyZuYnNwOyBKbC4gQ0JEIEJhcmF0IEthdiwgUlQuMSwgQ3VydWcgU2FuZ2VyZW5nLCBLZWxhcGEgRHVhLCBUYW5nZXJhbmcsIEJhbnRlbiAxNTgxMC4KCioqKioKCiMgUiBWUyBQWVRIT04KCiBSIGRhbiBQeXRob24gYWRhbGFoIGJhaGFzYSBwZW1yb2dyYW1hbiB5YW5nIHNhbmdhdCBwb3B1bGVyLCBkaW5hbWlzLCBkaWd1bmFrYW4gc2VjYXJhIGx1YXMgZGFsYW0ga29tdW5pdGFzIGRhdGEgc2NpZW5jZS4gUiBsZWJpaCBiYW55YWsgZGlndW5ha2FuIGRhbGFtIGFuYWxpc2lzIHN0YXRpc3RpayBzZW1lbnRhcmEgUHl0aG9uIG1lbnllZGlha2FuIHBlbmRla2F0YW4geWFuZyBsZWJpaCB1bXVtIG1lbmdlbmFpIHNhaW5zIGRhdGEgKHNlaGluZ2dhIGRpYW5nZ2FwIGxlYmloIG11ZGFoIHVudHVrIGRpZ3VuYWthbiBvbGVoIHBlbXVsYSkuIE1lbXBlbGFqYXJpIGtlZHVhIGJhaGFzYSBwZW1yb2dyYW1hbiBpbmkgYWRhbGFoIHNvbHVzaSB5YW5nIGxlYmloIGJpamFrIGthcmVuYSBrZWR1YW55YSBtZW1wdW55YWkga2VsZWJpaGFuIGRhbiBrZWt1cmFuZ2FuIG1hc2luZy1tYXNpbmcuIFIgZGFuIFB5dGhvbiBtZW1idXR1aGthbiBpbnZlc3Rhc2kgd2FrdHUsCgoKCiMgU0lOVEFTSyBEQVNBUgogU3VhdHUgcHJvZ3JhbSBkaSBSIGRhbiBQaHl0b24gdGVyZGlyaSBhdGFzIHRpZ2EgaGFsIG1lbmRhc2FyIGRhcmkgdmFyaWFiZWwsb3BlcmFuKG5pbGFpKSBkYW4ga29tZW50YXIudmFyaWFiZWwgZGlndW5ha2FuIHVudHVrIG1lbnlpbXBhbiBzdWF0dSBuaWxhaSBzZWRhbmdrYW4ga29tZW50YXIgZGkgUGFrYWkgdW50dWsgbWVuaW5na2F0a2FuIHBlbWFoYW1hbiBwZW5nZ3VuYSBtZW5nZW5haSBza3JpcCBkYW4ga29kaW5nCgojIFBFTlVHQVNBTiBWQVJJQUJFTCAoUikKIERhbGFtIFIscGVudWdhc2FuIHN1YXR1IHByb2dyYW0gYmlhc2EgbWVuZ3VuYWthbiBzYXR1IHZhcmlhYmVsIHlhbmcgZGljYWRhbmdrYW4gdW50dWsgbWVyZWthbSBiZXJiYWdhaSBqZW5pcyBkYXRhIHNlc3VhaSBuYW1hIHlhbmcgZGkgYmVyaWthbiBrZSBsb2thc2kgcGVueWltcGFuYW4vbWVtb3JpLHBlcmludGFoIHBlbnVnYXNhbiB2YXJpYWJlbCBpbmksZGFwYXQgZGkgbm90YXNpa2FuIGRlbmdhbiB0aWdhIGNhcmE6CgoKICA9LGRpIGd1bmFrYW4gdW50dWsgcGVudWdhc2FuCiAgPC0sZGkgZ3VuYWthbiB1bnR1ayBwZW51Z2FzYW4gZGFyaSBzaXNpIGtpcmkKICAtPiAsZGkgZ3VuYWthbiB1bnR1a3BlbnVnYXNhbiBkYXJpIHNpc2kga2FuYW4KICAKIAogCmBgYHtyfQogeD0yCiB5IDwtIDMKIDUtPiB6CiBwcmludChjKHgseSx6KSkKYGBgCiMgTUVOQU1CQUhLQU4gS09NRU5UQVIKIAogTWVuYW1iYWhrYW4vTWVtYmVyaWthbiBrb21lbnRhciBkYWxhbSBza3JpcC9rb2RpbmcgUiBkYW4gUHl0aG9uIGFkYWxhaCB1bnR1ayBtZW11ZGFoa2FuIGFuZGEgbWVtYWhhbWkgYXJ0aS9tYWtuYSBwZW5nZ3VuYWFuIHN1YXR1IHBlcmludGFoL3Byb2dyYW0gS29tZW50YXIgeWFuZyBkaXR1bGlzIGRhbGFtIHNlYnVhaCBwcm9ncmFtIHRlcnNlYnV0IGhhbnlhIGJlcnNpZmF0IHBlbmplbGFzYW4gdGVudGFuZyBhcGEgeWFuZyBkaWxha3VrYW5ueWEgYXRhdSBhcGEgeWFuZyBzZWhhcnVzbnlhIGRpbGFrdWthbiBvbGVoIHNlYnVhaCBza3JpcC9rb2RpbmcuIFBlcmx1IGRpY2F0YXQgYmFod2Ega29tZW50YXIgeWFuZyBiZXJzaWZhdGluZm9ybWFzaSB0aWRhayBhZGEgaHVidW5nYW5ueWEgZGVuZ2FuIGxvZ2lrYSBwZW1yb2dhcmFtIHlhbmcgc2VkYW5nIGFuZGEgZ3VuYWthbi4gTWVyZWthYmVuYXItYmVuYXIgZGlhYmFpa2FuIG9sZWgga29tcGlsZXIgZGFuIGRlbmdhbiBkZW1pa2lhbiB0aWRhayBwZXJuYWggdGVyY2VybWluIHBhZGEgaW5wdXQKIAoKYGBge3J9CiMgTWVuZ2dhbnRpIG5pbGFpIHggeWFuZyBzdWRhaCBkaXJla2FtIChrb21lbnRhciBkaSBhd2FsIHBlcm55YXRhYW4pCng9MTIKeiA8LSB4ICsgeSAgICAgICAgIyBNZW5nZ2FudGkgbmlsYWkgeWFuZyBzdWRhaCBkaXJla2FtIChLb21lbnRhciB5YW5nIGFkYSBkaSBha2hpciBwZXJueWF0YWFuKQp4ICsgeSAtPiB6ICAgICAgICMgc2FtYSBkZW5nYW4geWFuZyBhZGEgZGlhdGFzCgpgYGAKCiMgT1BFUkFUT1IKICAgT3BlcmF0b3IgYWRhbGFoIHNpbWJvbCB5YW5nIG1lbmdhcmFoa2FuIGNvbXBpbGVyIHVudHVrIG1lbGFrdWthbiBiZXJiYWdhaSBtYWNhbSBvcGVyYXNpCnRlcmhhZGFwIGJlYmVyYXBhIHBlbnVnYXNhbi4gT3BlcmF0b3IgbWVuc2ltdWxhc2lrYW4gYmVyYmFnYWkgb3BlcmFzaSBtYXRlbWF0aXMsIGxvZ2lrYSwgZGFuCmtlcHV0dXNhbiB5YW5nIGRpbGFrdWthbiBwYWRhIHNla3VtcHVsYW4gQmlsYW5nYW4gS29tcGxla3MsIEludGVnZXIsIGRhbiBOdW1lcmlrIHNlYmFnYWkKcGVudWdhc2FuIG1hc3VrYW4gKGlucHV0KS4gUiBkYW4gUHl0aG9uIG1lbmR1a3VuZyBzZWJhZ2lhbiBiZXNhciBlbXBhdCBqZW5pcyBvcGVyYXRvciBiaW5lcgphbnRhcmEgc2F0dSBzZXQgcGVudWdhc2FuLiBEYWxhbSBpbmksIGtpdGEgYWthbiBtZWxpaGF0IGJlcmJhZ2FpIGplbmlzIG9wZXJhdG9yIHlhbmcgdGVyc2VkaWEgZGkgUiBkYW4KUHl0aG9uIGRhbiBwZW5nZ3VuYWFubnlhLgoKIyBBUklUTUFUSUtBCiBQZW5nZ3VuYWFuIG9wZXJhdG9yIGFyaXRtYXRpa2EgZGFsYW0gcHJvZ3JhbSBSIGRhbiBQeXRob24gYWRhbGFoIHVudHVrIG1lbnNpbXVsYXNpa2FuCmJlcmJhZ2FpIG9wZXJhc2kgbWF0ZW1hdGlrYSwgc2VwZXJ0aSBwZW5hbWJhaGFuLCBwZW5ndXJhbmdhbiwgcGVya2FsaWFuLCBwZW1iYWdpYW4sIGRhbiBtb2R1bG8uCk9wZXJhdG9yIGFyaXRtYXRpa2EgeWFuZyBkaWxha3VrYW4gYmlzYSBzYWphIGJlcnVwYSBuaWxhaSBza2FsYXIsIGJpbGFuZ2FuIGtvbXBsZWtzLCBhdGF1IHZla3RvcgoKVW50dWsgcGVtYWhhbWFuIGxlYmloIGxhbmp1dG55YSxQZXJoYXRpa2FuIGN1cGxpa2FuIFIgYmVyaWt1dDoKCjxpbWcgc3R5bGU9ICJmbG9hdDogbGVmdDsgd2lkdGg6IDcwJSIgc3JjPSJhcml0bWF0aWthLnBuZyIgLz4KCgpgYGB7cn0KeCA8LSBjKDQsNyw1KSAgICAgICMgbWVtdWF0IHZla3RvciB4CnkgPC0gYyg0LDksNikgICAgICAjIG1lbXVhdCB2ZWt0b3IgeQp4ICsgeSAgICAgICAgICAgICAgIyBoYXNpbCBwZW5qdW1haGFuIHZla3RvciB4IGRhbiB5CgpgYGAKYGBge3J9CnByaW50ICh4LXkpICMgaGFzaWwgcGVuZ3VyYW5nYW4gZGFyaSB2ZWt0b3IgPiBkYW4geQoKcHJpbnQoeCp5KQoKcHJpbnQoeC95KQoKcHJpbnQoeF55KQoKcHJpbnQoeCUleSkKYGBgCkFkYWthbGFueWEgYW5kYSBwZXJsdSBtZW5hbXBpbGthbiBrZXRlcmFuZ2FuL2tvbWVudGFyIHlhbmcganVnYSBtZWxla2F0IHBhZGEgaGFzaWwgcGVyaGl0dW5nYW4KUiBpdHUgc2VuZGlyaS4gTWFrYSBhbmRhIGRhcGF0IG1lbGFrdWthbm55YSBkZW5nYW4gY2FyYSBiZXJpa3V0OgogKkhpZGUqCgpgYGB7cn0KY2F0KCJQZW5qdW1sYWhhbiAgdmVrdG9yIHggZGFuIHkgOiIsIHggKyB5LCAiXG4iKQoKY2F0KCJQZW5ndXJhbmdhbiAgdmVrdG9yIHggZGFuIHkgOiIsIHgsCnksICJcbiIpCgpjYXQoIlBlcmthbGlhbiB2ZWt0b3IgeCBkYW4geSA6Iix4ICogeSwgIlxuIikKCmNhdCgidmVrdG9yIHggZGliYWdpIGRlbmdhbiB2ZWt0b3IgeSA6IiwgeC95ICwgIlxuIikKCmNhdCgidmVrdG9yIHggZGlwYW5na2F0IHZla3RvciB5IDoiLCB4XnkgLCAiXG4iKQoKY2F0KCJtb2R1bG8gdmVrdG9yIHggZGFuIHkgOiIsIHglJXkgLCAiXG4iKQpgYGAKCiMgUkVMQVNJT05BTAogIE9wZXJhdG9yIHJlbGFzaW9uYWwgbWVsYWt1a2FuIG9wZXJhc2kgcGVyYmFuZGluZ2FuIGFudGFyYSBlbGVtZW4geWFuZyBiZXJzZXN1YWlhbiBwYWRhIHNldGlhcApvcGVyYW4uIE1lbmdlbWJhbGlrYW4gbmlsYWkgQm9vbGVhbiBUUlVFIGppa2Egb3BlcmFuIHBlcnRhbWEgbWVtZW51aGkgcmVsYXNpIGRpYmFuZGluZ2thbgpkZW5nYW4gb3BlcmFuIGtlZHVhLiBOaWxhaSBUUlVFIHNlbGFsdSBkaWFuZ2dhcCBsZWJpaCBiZXNhciBkYXJpIEZBTFNFClB5dGhvbgpLZXRlcmFuZ2FuCgpgYGB7cn0KeCA9IGMoNCw5LDYpICAjIG1lbWJlbnR1ayB2ZWt0b3IgeAp5ID0gYyg3LDIsNSkgICMgbWVtYmVudHVrIHZla3RvciB5CmNhdCgidmVrdG9yIHggZGlrdXJhbmcgZGFyaSB5IDoiLCB4PHksIlxuIikKCmNhdCgidmVrdG9yIHggZGlrdXJhbmcgZGFyaSBzYW1hIGRlbmdhbiB5IDoiLCB4PD15LCJcbiIpCgpjYXQoInZla3RvciB4IGRpbGViaWhrYW4gZGFyaSB5IDoiLCB4PnksIlxuIikKCmNhdCgidmVrdG9yIHggZGlsZWJpaGthbiBkYXJpIHNhbWEgZGVuZ2FuIGRhcmkgeSA6IiwgeD49eSwiXG4iKQoKY2F0KCJ2ZWt0b3IgeCBzYW1hIGRlbmdhbiBkYXJpIHkgOiIsIHg9PXksIlxuIikKCmNhdCgidmVrdG9yIHggdGlkYWsgc2FtYSBkZW5nYW4gYmVudHVrIHkgOiIsIHghPXksIlxuIikKYGBgCgojIExPR0lLQQogICBPcGVyYXRvciBsb2dpcyBtZW5zaW11bGFzaWthbiBvcGVyYXNpIGtlcHV0dXNhbiwgYmVyZGFzYXJrYW4gb3BlcmF0b3IgeWFuZyBkaXRlbnR1a2FuIGFudGFyYQpvcGVyYW4sIHlhbmcga2VtdWRpYW4gZGlldmFsdWFzaSBrZSBuaWxhaSBCb29sZWFuIEJlbmFyIGF0YXUgU2FsYWguIE5pbGFpIGJpbGFuZ2FuIGJ1bGF0IGJ1a2FuIG5vbApkaWFuZ2dhcCBzZWJhZ2FpIG5pbGFpIEJFTkFSLCBiYWlrIGl0dSBiaWxhbmdhbiBrb21wbGVrcyBhdGF1IGJpbGFuZ2FuIHJlYWwuCgo8aW1nIHN0eWxlPSAiZmxvYXQ6IGxlZnQ7IHdpZHRoOiA4MCUiIHNyYz0ibG9naWthICgyKS5wbmciIC8+CgpgYGB7cn0KeCA8LSBjKDAsVFJVRSwgRkFMU0UpCnkgPC0gYyhUUlVFLCAwLjEsNCszaSkKIyBNZWxha3VrYW4gb3BlcmFzaSBsb2dpa2EgcGFkYSBwZXJhbgpjYXQoIkxvZ2lrYSBOZWdhc2kgKH4pIHVudHVrIHZla3RvciB4OiIsICF4LCAiXG4iKQoKYGBgCmBgYHtyfQpjYXQoIkxvZ2lrYSBOZWdhc2kgKH4pIHVudHVrIHZla3RvciB5IDoiLCAheSwgIlxuIikKCmNhdCAoIkxvZ2lrYSBLb25qdW5nc2kgKERhbikgOiIsIHggJiB5LCAiXG4iKQoKY2F0ICgiTG9naWthIERpc2p1bmdzaSAoQXRhdSkgOiIsIHggfCB5LCAiXG4iKQoKY2F0KCJMb2dpa2EgRGlzanVuZ3NpIFBhcnNpYWwgOiIsIHggfHwgeSkKCgpgYGAKIyBMQUlOLUxBSU5OWUEKCkJlcmlrdXQgaW5pIGp1Z2EgYWRhIGJlYmVyYXBhIG9wcmF0b3IgeWFuZyBrZW11bmdraW5hbiBiZXNhciBqdWdhIGFrYW4gYW5kYSBwZXJsdWthbiBwYWRhIHNhYXQgbWVuZ3VuYWthbiBSLgoKYGBge3J9CnggPC0gYyg3LDMsNSkgICAgIyBNZW55aW1wYW4gdmVrdG9yIHgKeSA8LSBjKDMsNiw4KSAgICAjIE1lbnlpbXBhbiB2ZWt0b3IgeQpzcXJ0KHgqeSkgICAgICAgICMgQmVudHVrIGFrYXIKbG9nKHgpICAgICAgICAgICAjIExvZ2FyaXRtYQpleHAoeSkgICAgICAgICAgICMgRWtzcG9uZW4KKHgveSkreSAgICAgICAgICAjIFRhbmRhIGt1cnVuZwpgYGAKIyBUSVBFIERBVEEgCgogRGFsYW0gcGVtcm9ncmFtYW4gc2VwZXJ0aSBSIGRhbiBQeXRob24sdGlwZSBkYXRhIG1lcnVwYWthbiBrb25zZXAgcGVudGluZwprZWR1YW55IGRhcGF0IG1lbmdndW5ha2FuIHZhcmlhYmVsIHVudHVrIG1lbnlpbXBhbiB0aXBlIHlhbmcgYmVyYmVkYS1iZWRhLGJlcmlrdXQgYWRhbGFoIHRpcGUgZGF0YSBwYWxpbmcgZGFzYXIgeWFuZyBoYXJ1cyBkaSBrZXRhaHVpCgo8aW1nIHN0eWxlPSAiZmxvYXQ6IGxlZnQ7IHdpZHRoOiAxMDAlIiBzcmM9ImRhdGEuanBnLnBuZyIgLz4KCkJlcmlrdXQgaW5pIGFkYWxhaCBrb2RpbmcgUiB5YW5nIGRhcGF0IGRpZ3VuYWthbiB1bnR1ayBtZW5ldGFwa2FuIGtlbGltYSB0aXBlIGRhdGEgZGkgYXRhczoKCmBgYHtyfQpkMT0gNS42ICAgICAgICAgICAgICAgICAgIyBUZXRhcGthbiBuaWxhaSBkZXNpbWFsCmQyPSBhcy5pbnRlZ2VyKDUpICAgICAgICAjIFRldGFwa2FuIG5pbGFpIGludGVnZXIKZDI9IDVMICAgICAgICAgICAgICAgICAgICMgQ2FyYSBsYWluIG1lbXVhdCBuaWxhaSBpbnRlZ2VyIGRpIFIKZDM9IGMoVFJVRSxGQUxTRSkgICAgICAgICMgQmxvZW4vTG9naWNhbApkMz0gYXMubG9naWNhbChjKDAsMSkpICAgIyBDYXJhIGxhaW4gdW50dWsgbWVtdWF0IGJsb2Vhbi9Mb2dpY2FsCmQ0PSBjKCJhIiwnYicsJzEyJykgICAgICAjIFN0cmluZy9jaGFyYWN0ZXIKZDU9IDEgKyA1aSAgICAgICAgICAgICAgICMgQ29tcGxleApgYGAKCgpVbnR1ayBtZW1lcmlrc2EgZGF0YSBkYWxhbSBSOgoKYGBge3J9CmNsYXNzKGQxKSAgICAgIyBDZXRhayBuYW1hIGtlbGFzIHZhcmlhYmVsCgp0eXBlb2YoZDEpICAgICMgQ2V0YWsgdGlwZSB2YXJpYWJlbCB4CmBgYAoKIyBCQU5UVUFOCiBTYWxhaCBzYXR1IGJhZ2lhbiBwZW50aW5nIGRhbGFtIGJla2VyamEgZGVuZ2FuIGJhaGFzYSBSIGFkYWxhaCBiYWdhaW1hbmEgbWVuY2FyaSBiYW50dWFuLlIgbWVtaWxpa2kgYmUtYmVyYXBhIGZhc2lsaXRhcyBpbi1saW5lLHNlbGFpbiBiZWJlcmFwYSBkYXlhIHN1bWJlciBiYW50dWFuIGRpIGVrb3Npc3RlbSBSLkFuZGEgZGFwYXQgbWVuZ3VuYWthbiBiYW50dWFuIHVudHVrIGZ1bmdzaSB0ZXJ0ZW50dQogCmBgYHtyfQpoZWxwLnN0YXJ0KCkgICAgICAgICAjIE1lbnUgZGkgbWFuYSBBbmRhIGRhcGF0IG1lbmF2aWdhc2kgYmFudHVhbiBsb2thbCBiZXJiYXNpcyB3ZWIKP2hlbHAgICAgICAgICAgICAgICAgIyBtZW51IGRpIG1hbmEgQW5kYSBkYXBhdCBtZW5hdmlnYXNpIGJhbnR1YW4gbG9rYWwgYmVyYmFzaXMgd2ViCj8gY2xhc3MgICAgICAgICAgICAgICMgbWVuZGFwYXRrYW4gYmFudHVhbiB1bnR1ayBmdW5nc2kgY2xhc3MKaGVscChjbGFzcykgICAgICAgICAgIyBtZW5kYXBhdGthbiBiYW50dWFuIHVudHVrIGZ1bmdzaSBjbGFzcwo/P2NsYXNzICAgICAgICAgICAgICAjIGppa2EgQW5kYSB0aWRhayB0YWh1IG5hbWEgZnVuZ3NpIHlhbmcgQW5kYSBjYXJpCmhlbHAuc2VhcmNoKCdjbGFzcycpICMgamlrYSBBbmRhIHRpZGFrIHRhaHUgbmFtYSBmdW5nc2kgeWFuZyBBbmRhIGNhcmkKCgpgYGAKCgojIFJFRlJFTlNJCmh0dHBzOi8vcnB1YnMuY29tL2RzY2llbmNlbGFicy8KCgoKCgogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg==