

Email : naufal3433@gmail.com
RPubs : https://www.rpubs.com/muhammad_naufal/
Jurusan : Statistika Bisnis
Address : Jalan Gunung Galunggung 5 Blok E9, No.21
SINTAKS DATA
Suatu program R terdiri dari tiga hal mendasar : variabel, operan, dan komentar. Variabel digunakan untuk menyimpan suatu nilai, sedangkan komentar untuk meningkatkan pemahaman.
Penugasan Variabel
Penugasan program dalam R menggunakan suatu variabel yang dicadangkan sehingga dapat merekam jenis data sesuai dengan nama yang diberikan dan disimpan pada lokasi penyimpanan/memori. Dengan cara menotasikannya adalah :
==, digunakan untuk penugasan sederhana
<-, digunakan untuk penugasan dari sisi Kiri
->, digunakan untuk penugasan dari sisi Kanan
x=6
y<-8
10->z
print(c(x,y,z))
## [1] 6 8 10
Menambah 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.
x=15 # Mengganti nilai x yang sudah direkam (Komentar di akhir pernyataan)
z <- x + y # Mengganti nilai z yang sudah direkam (Komentar di akhir pernyataan)
x + y -> z # sama dengan di atas
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).
Aritmatika
Aritmatika dalam progam R dan Python adalah untuk mensimulasikan berbagai operasi matematika, seperti penambahan, pengurangan, perkalian, pembagian, dan modula.
operaot |
R |
penjumlahan |
+ |
pengurangan |
- |
perkalian |
* |
pembagian |
/ |
pemangkatan |
^ |
modulo |
%% |
|
|
PENERAPAN ARITMATIKA PADA R :
Penjumlahan pada R
x <- c(4,8,2) # memuat vektor x
y <- c(5,9,6) # memuat vektor y
x+y # hasil penjumlahan vektor x dan y
## [1] 9 17 8
Pengurangan pada R
print(x-y) # hasil pengurangan vektor x dan y
## [1] -1 -1 -4
Perkalian pada R
print(x*y) # hasil perkalian vektor x dan y
## [1] 20 72 12
Pembagian pada R
print(x/y) # hasil pembagian vektor x dan y
## [1] 0.8000000 0.8888889 0.3333333
Modulo pada R
print(x%%y) # hasil modulo vektor x dan y
## [1] 4 8 2
Perpangkatan pada R
print(x^y) # hasil pemangkatan vektor x dan y
## [1] 1024 134217728 64
Relasional
Operator relasional melakukan operasi perbandingan antara elemen yang bersesuaian pada setiap operan. Nilai TRUE selalu dianggap lebih besar dari nilai FALSE.
Operator |
R |
kurang dari |
< |
kurang dari sama dengan |
<= |
lebih besar dari |
> |
lebih besar dari sama dengan |
=> |
sama dengan |
== |
tidak sama dengan |
!= |
|
|
x <- c(4,8,2) # memuat vektor x
y <- c(5,9,6) # memuat vektor y
cat("Vektor x kurang dari Vektor y = ", x < y, "\n")
## Vektor x kurang dari Vektor y = TRUE TRUE TRUE
cat("Vektor x kurang dari sama dengan Vektor y = ", x <= y, "\n")
## Vektor x kurang dari sama dengan Vektor y = TRUE TRUE TRUE
cat("Vektor x Lebih besar dari Vektor y = ", x > y, "\n")
## Vektor x Lebih besar dari Vektor y = FALSE FALSE FALSE
cat("Vektor x Lebih besar dari sama dengan Vektor y = ", x >= y, "\n")
## Vektor x Lebih besar dari sama dengan Vektor y = FALSE FALSE FALSE
cat("Vektor x sama dengan Vektor y = ", x = y, "\n")
## Vektor x sama dengan Vektor y = 5 9 6
cat("Vektor x Tidak sama dengan Vektor y = ", x != y, "\n")
## Vektor x Tidak sama dengan Vektor y = TRUE TRUE TRUE
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.
operator |
R |
NOT |
! |
AND |
& |
OR |
$ |
XOR |
^ |
|
|
x=c(1,FALSE,TRUE) # Nilai vektor x
y=c(TRUE,5,4+5i) # Nilai Vektor y
cat("Logika Negasi (~) untuk vektor x :", !x, "\n")
## Logika Negasi (~) untuk vektor x : FALSE TRUE FALSE
cat("Logika Negasi (~) untuk vektor y :", !y, "\n")
## Logika Negasi (~) untuk vektor y : FALSE FALSE FALSE
cat("Logika Konjungsi (AND) :", x & y, "\n")
## Logika Konjungsi (AND) : TRUE FALSE TRUE
cat("Logika Disjungsi (OR) :", x | y, "\n")
## Logika Disjungsi (OR) : TRUE TRUE TRUE
cat("Logika Disjungsi Parsial :", x || y, "\n")
## Logika Disjungsi Parsial : TRUE
Lain-lain
Bentuk akar
x <- c(4,8,2) # memuat vektor x
y <- c(5,9,6) # memuat vektor y
sqrt(x*y) # bentuk akar
## [1] 4.472136 8.485281 3.464102
Logaritma
## [1] 1.3862944 2.0794415 0.6931472
Eksponen
## [1] 148.4132 8103.0839 403.4288
Tanda kurung
## [1] 5.800000 9.888889 6.333333
Tipe data
berikut adalah dasar tipe-tipe data yang paling mendasar :berikut adalah dasar tipe-tipe data yang paling mendasar :
operator |
R |
pyhton |
Double/flat |
5,6 |
5,6 |
integer |
5 |
5 |
bolean/logical |
true/false |
true/false |
string |
dscienlabs |
dscienlabs |
complex |
1+5j |
1+5j |
|
|
|
KODING R YANG DIGUNAKAN UNTUK MENETAPKAN TIPE DIATAS
a <- 5.8 # Tetapkan nilai desimal
b <- 4L # menetapkan nilai integer di R
c <- c(T,F) # Bolean/Logical
f <- c("d",'e', '222') #String/Character
g <- 4 + 8i #Complex
UNTUK MEMERIKSA TIPE DATA DALAM R
class(a) # cetak nama kelas variabel
## [1] "numeric"
typeof(c) # cetak tipe variabel x
## [1] "logical"
LS0tDQp0aXRsZTogIlR1Z2FzIDIiDQpzdWJ0aXRsZTogIkFsb2dhcml0bWEgZGFuIFN0cnVrdHVyIERhdGEiDQphdXRob3I6ICJNdWhhbW1hZCBOYXVmYWwgQXJkaWFuc3lhaCAoMjAyMDQ5MjAwMTcpIg0KZGF0ZTogImByIGZvcm1hdChTeXMuRGF0ZSgpLCAnJUIgJWQsICVZJylgIg0Kb3V0cHV0OiANCiAgaHRtbF9kb2N1bWVudDogDQogICAgaHRtbF9kb2N1bWVudDogbnVsbA0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIHRvYzogeWVzDQogICAgdG9jX2Zsb2F0Og0KICAgICAgY29sbGFwc2VkOiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIHRoZW1lOiBzYW5kc3RvbmUNCiAgICBjc3M6IHN0eWxlMS5jc3MNCiAgICBoaWdobGlnaHQ6IG1vbm9jaHJvbWUNCi0tLQ0KDQoNCjxpbWcgc3R5bGU9ImZsb2F0OiByaWdodDsgbWFyZ2luOiAwcHggMTAwcHggMHB4IDBweDsgd2lkdGg6MjUlIiBzcmM9Im5hdWZhbC5qcGVnIi8+IA0KDQpgYGB7ciBsb2dvLCBlY2hvPUZBTFNFLGZpZy5hbGlnbj0nY2VudGVyJywgb3V0LndpZHRoID0gJzMwJSd9DQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygibG9nby5wbmciKQ0KYGBgDQoNCkVtYWlsICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyZuYnNwOzogIG5hdWZhbDM0MzNAZ21haWwuY29tIDxicj4NClJQdWJzICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDs6IGh0dHBzOi8vd3d3LnJwdWJzLmNvbS9tdWhhbW1hZF9uYXVmYWwvIDxicj4NCkp1cnVzYW4gJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOzogW1N0YXRpc3Rpa2EgQmlzbmlzXShodHRwczovL21hdGFuYXVuaXZlcnNpdHkuYWMuaWQvP2x5PWFjYWRlbWljJmM9c2IpIDxicj4NCkFkZHJlc3MgICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyA6IEphbGFuIEd1bnVuZyBHYWx1bmdndW5nIDUgQmxvayBFOSwgTm8uMjENCg0KDQojIFNJTlRBS1MgREFUQSAjDQogIA0KICBTdWF0dSBwcm9ncmFtIFIgdGVyZGlyaSBkYXJpIHRpZ2EgaGFsIG1lbmRhc2FyIDogdmFyaWFiZWwsIG9wZXJhbiwgZGFuIGtvbWVudGFyLiBWYXJpYWJlbCBkaWd1bmFrYW4gdW50dWsgbWVueWltcGFuIHN1YXR1IG5pbGFpLCBzZWRhbmdrYW4ga29tZW50YXIgdW50dWsgbWVuaW5na2F0a2FuIHBlbWFoYW1hbi4gDQogIA0KIyMgUGVudWdhc2FuIFZhcmlhYmVsICMjDQoNClBlbnVnYXNhbiBwcm9ncmFtIGRhbGFtIFIgbWVuZ2d1bmFrYW4gc3VhdHUgdmFyaWFiZWwgeWFuZyBkaWNhZGFuZ2thbiBzZWhpbmdnYSBkYXBhdCBtZXJla2FtIGplbmlzIGRhdGEgc2VzdWFpIGRlbmdhbiBuYW1hIHlhbmcgZGliZXJpa2FuIGRhbiBkaXNpbXBhbiBwYWRhIGxva2FzaSBwZW55aW1wYW5hbi9tZW1vcmkuIERlbmdhbiBjYXJhIG1lbm90YXNpa2FubnlhIGFkYWxhaCA6DQoNCj09LCBkaWd1bmFrYW4gdW50dWsgcGVudWdhc2FuIHNlZGVyaGFuYQ0KDQo8LSwgZGlndW5ha2FuIHVudHVrIHBlbnVnYXNhbiBkYXJpIHNpc2kgS2lyaQ0KDQotPiwgZGlndW5ha2FuIHVudHVrIHBlbnVnYXNhbiBkYXJpIHNpc2kgS2FuYW4NCg0KYGBge3J9DQp4PTYNCnk8LTgNCjEwLT56DQpwcmludChjKHgseSx6KSkNCmBgYA0KDQoNCiMgTWVuYW1iYWggS29tZW50YXIgIw0KDQpNZW5hbWJhaGthbi9NZW1iZXJpa2FuIGtvbWVudGFyIGRhbGFtIHNrcmlwL2tvZGluZyBSIGRhbiBQeXRob24gYWRhbGFoIHVudHVrIG1lbXVkYWhrYW4gYW5kYSBtZW1haGFtaSBhcnRpL21ha25hIHBlbmdndW5hYW4gc3VhdHUgcGVyaW50YWgvcHJvZ3JhbS4gS29tZW50YXIgeWFuZyBkaXR1bGlzIGRhbGFtIHNlYnVhaCBwcm9ncmFtIHRlcnNlYnV0IGhhbnlhIGJlcnNpZmF0IHBlbmplbGFzYW4gdGVudGFuZyBhcGEgeWFuZyBkaWxha3VrYW5ueWEgYXRhdSBhcGEgeWFuZyBzZWhhcnVzbnlhIGRpbGFrdWthbiBvbGVoIHNlYnVhaCBza3JpcC9rb2RpbmcuDQoNCmBgYHtyfQ0KeD0xNSAgICAgICAgICMgTWVuZ2dhbnRpIG5pbGFpIHggeWFuZyBzdWRhaCBkaXJla2FtIChLb21lbnRhciBkaSBha2hpciBwZXJueWF0YWFuKQ0KeiA8LSB4ICsgeSAgICMgTWVuZ2dhbnRpIG5pbGFpIHogeWFuZyBzdWRhaCBkaXJla2FtIChLb21lbnRhciBkaSBha2hpciBwZXJueWF0YWFuKQ0KeCArIHkgLT4geiAgICMgc2FtYSBkZW5nYW4gZGkgYXRhcw0KYGBgDQoNCg0KIyBPcGVyYXRvciAjDQpPcGVyYXRvciBhZGFsYWggc2ltYm9sIHlhbmcgbWVuZ2FyYWhrYW4gY29tcGlsZXIgdW50dWsgbWVsYWt1a2FuIGJlcmJhZ2FpIG1hY2FtIG9wZXJhc2kgdGVyaGFkYXAgYmViZXJhcGEgcGVudWdhc2FuLiBPcGVyYXRvciBtZW5zaW11bGFzaWthbiBiZXJiYWdhaSBvcGVyYXNpIG1hdGVtYXRpcywgbG9naWthLCBkYW4ga2VwdXR1c2FuIHlhbmcgZGlsYWt1a2FuIHBhZGEgc2VrdW1wdWxhbiBCaWxhbmdhbiBLb21wbGVrcywgSW50ZWdlciwgZGFuIE51bWVyaWsgc2ViYWdhaSBwZW51Z2FzYW4gbWFzdWthbiAoaW5wdXQpLg0KDQojIyBBcml0bWF0aWthICMjDQoNCkFyaXRtYXRpa2EgZGFsYW0gcHJvZ2FtIFIgZGFuIFB5dGhvbiBhZGFsYWggdW50dWsgbWVuc2ltdWxhc2lrYW4gYmVyYmFnYWkgb3BlcmFzaSBtYXRlbWF0aWthLCBzZXBlcnRpIHBlbmFtYmFoYW4sIHBlbmd1cmFuZ2FuLCBwZXJrYWxpYW4sIHBlbWJhZ2lhbiwgZGFuIG1vZHVsYS4NCg0KDQp8fA0KfDotLS0tLTp8Oi0tLS0tOnwNCnwqKm9wZXJhb3QqKnwqKlIqKnwNCnxwZW5qdW1sYWhhbnwrfA0KfHBlbmd1cmFuZ2FufC18DQp8cGVya2FsaWFufCp8DQp8cGVtYmFnaWFufC98DQp8cGVtYW5na2F0YW58XnwNCnxtb2R1bG98JSV8DQp8fA0KDQpQRU5FUkFQQU4gQVJJVE1BVElLQSBQQURBIFIgOg0KDQoNClBlbmp1bWxhaGFuIHBhZGEgUg0KDQpgYGB7cn0NCnggPC0gYyg0LDgsMikgICAgICAjIG1lbXVhdCB2ZWt0b3IgeA0KeSA8LSBjKDUsOSw2KSAgICAgICMgbWVtdWF0IHZla3RvciB5DQp4K3kgICAgICAgICAgICAgICAgIyBoYXNpbCBwZW5qdW1sYWhhbiB2ZWt0b3IgeCBkYW4geQ0KYGBgDQoNCg0KUGVuZ3VyYW5nYW4gcGFkYSBSDQpgYGB7cn0NCnByaW50KHgteSkgICAgICAgICAjIGhhc2lsIHBlbmd1cmFuZ2FuIHZla3RvciB4IGRhbiB5DQpgYGANCg0KDQpQZXJrYWxpYW4gcGFkYSBSDQpgYGB7cn0NCnByaW50KHgqeSkgICAgICAgICAjIGhhc2lsIHBlcmthbGlhbiB2ZWt0b3IgeCBkYW4geQ0KYGBgDQoNCg0KUGVtYmFnaWFuIHBhZGEgUg0KYGBge3J9DQpwcmludCh4L3kpICAgICAgICAgIyBoYXNpbCBwZW1iYWdpYW4gdmVrdG9yIHggZGFuIHkNCmBgYA0KDQoNCk1vZHVsbyBwYWRhIFINCmBgYHtyfQ0KcHJpbnQoeCUleSkgICAgICAgICAjIGhhc2lsIG1vZHVsbyB2ZWt0b3IgeCBkYW4geQ0KYGBgDQoNCg0KUGVycGFuZ2thdGFuIHBhZGEgUg0KYGBge3J9DQpwcmludCh4XnkpICAgICAgICAgIyBoYXNpbCBwZW1hbmdrYXRhbiB2ZWt0b3IgeCBkYW4geQ0KYGBgDQoNCiMjIFJlbGFzaW9uYWwgIyMNCk9wZXJhdG9yIHJlbGFzaW9uYWwgbWVsYWt1a2FuIG9wZXJhc2kgcGVyYmFuZGluZ2FuIGFudGFyYSBlbGVtZW4geWFuZyBiZXJzZXN1YWlhbiBwYWRhIHNldGlhcCBvcGVyYW4uIE5pbGFpIFRSVUUgc2VsYWx1IGRpYW5nZ2FwIGxlYmloIGJlc2FyIGRhcmkgbmlsYWkgRkFMU0UuDQoNCg0KfHwNCnw6LS0tLS06fDotLS0tLTp8DQp8KipPcGVyYXRvcioqfCoqUioqfA0KfGt1cmFuZyBkYXJpfDx8DQp8a3VyYW5nIGRhcmkgc2FtYSBkZW5nYW58PD18DQp8bGViaWggYmVzYXIgZGFyaXw+fA0KfGxlYmloIGJlc2FyIGRhcmkgc2FtYSBkZW5nYW58PT58DQp8c2FtYSBkZW5nYW58PT18DQp8dGlkYWsgc2FtYSBkZW5nYW58IT18DQp8fA0KDQpgYGB7cn0NCnggPC0gYyg0LDgsMikgICAgICAjIG1lbXVhdCB2ZWt0b3IgeA0KeSA8LSBjKDUsOSw2KSAgICAgICMgbWVtdWF0IHZla3RvciB5DQpjYXQoIlZla3RvciB4IGt1cmFuZyBkYXJpIFZla3RvciB5ID0gIiwgeCA8IHksICJcbiIpDQpgYGANCg0KYGBge3J9DQpjYXQoIlZla3RvciB4IGt1cmFuZyBkYXJpIHNhbWEgZGVuZ2FuIFZla3RvciB5ID0gIiwgeCA8PSB5LCAiXG4iKQ0KYGBgDQoNCmBgYHtyfQ0KY2F0KCJWZWt0b3IgeCBMZWJpaCBiZXNhciBkYXJpIFZla3RvciB5ID0gIiwgeCA+IHksICJcbiIpDQpgYGANCg0KYGBge3J9DQpjYXQoIlZla3RvciB4IExlYmloIGJlc2FyIGRhcmkgc2FtYSBkZW5nYW4gVmVrdG9yIHkgPSAiLCB4ID49IHksICJcbiIpDQpgYGANCg0KYGBge3J9DQpjYXQoIlZla3RvciB4IHNhbWEgZGVuZ2FuIFZla3RvciB5ID0gIiwgeCA9IHksICJcbiIpDQpgYGANCg0KYGBge3J9DQpjYXQoIlZla3RvciB4IFRpZGFrIHNhbWEgZGVuZ2FuIFZla3RvciB5ID0gIiwgeCAhPSB5LCAiXG4iKQ0KYGBgDQoNCiMjIExvZ2lrYSAjIw0KT3BlcmF0b3IgbG9naXMgbWVuc2ltdWxhc2lrYW4gb3BlcmFzaSBrZXB1dHVzYW4sIGJlcmRhc2Fya2FuIG9wZXJhdG9yIHlhbmcgZGl0ZW50dWthbiBhbnRhcmEgb3BlcmFuLCB5YW5nIGtlbXVkaWFuIGRpZXZhbHVhc2kga2UgbmlsYWkgQm9vbGVhbiBCZW5hciBhdGF1IFNhbGFoLk5pbGFpIGJpbGFuZ2FuIGJ1bGF0IGJ1a2FuIG5vbCBkaWFuZ2dhcCBzZWJhZ2FpIG5pbGFpIEJFTkFSLg0KDQp8fA0KfDotLS0tLTp8Oi0tLS0tOnwNCnwqKm9wZXJhdG9yKip8KipSKip8DQp8Tk9UfCF8DQp8QU5EfCZ8DQp8T1J8JHwNCnxYT1J8XnwNCnx8DQoNCmBgYHtyfQ0KeD1jKDEsRkFMU0UsVFJVRSkgIyBOaWxhaSB2ZWt0b3IgeA0KeT1jKFRSVUUsNSw0KzVpKSAjIE5pbGFpIFZla3RvciB5DQpjYXQoIkxvZ2lrYSBOZWdhc2kgKH4pIHVudHVrIHZla3RvciB4IDoiLCAheCwgIlxuIikNCmBgYA0KDQpgYGB7cn0NCmNhdCgiTG9naWthIE5lZ2FzaSAofikgdW50dWsgdmVrdG9yIHkgOiIsICF5LCAiXG4iKQ0KYGBgDQoNCmBgYHtyfQ0KY2F0KCJMb2dpa2EgS29uanVuZ3NpIChBTkQpICA6IiwgeCAmIHksICJcbiIpDQpgYGANCg0KYGBge3J9DQpjYXQoIkxvZ2lrYSBEaXNqdW5nc2kgKE9SKSAgOiIsIHggfCB5LCAiXG4iKQ0KYGBgDQoNCmBgYHtyfQ0KY2F0KCJMb2dpa2EgRGlzanVuZ3NpIFBhcnNpYWwgIDoiLCB4IHx8IHksICJcbiIpDQpgYGANCg0KDQojIyBMYWluLWxhaW4gIyMNCkJlbnR1ayBha2FyDQpgYGB7cn0NCnggPC0gYyg0LDgsMikgICAgICAjIG1lbXVhdCB2ZWt0b3IgeA0KeSA8LSBjKDUsOSw2KSAgICAgICMgbWVtdWF0IHZla3RvciB5DQpzcXJ0KHgqeSkgICAgICAgICAgIyBiZW50dWsgYWthcg0KYGBgDQoNCkxvZ2FyaXRtYQ0KYGBge3J9DQpsb2coeCkgICAgICAgICAgICAgIyBMb2dhcml0bWENCmBgYA0KDQpFa3Nwb25lbg0KYGBge3J9DQpleHAoeSkgICAgICAgICAgICAgIyBFa3Nwb25lbg0KYGBgDQoNClRhbmRhIGt1cnVuZyANCmBgYHtyfQ0KKHgveSkgKyB5ICAgICAgICAgICMgVGFuZGEga3VydW5nDQpgYGANCg0KIyBUaXBlIGRhdGEgIw0KDQpiZXJpa3V0IGFkYWxhaCBkYXNhciB0aXBlLXRpcGUgZGF0YSB5YW5nIHBhbGluZyBtZW5kYXNhciA6YmVyaWt1dCBhZGFsYWggZGFzYXIgdGlwZS10aXBlIGRhdGEgeWFuZyBwYWxpbmcgbWVuZGFzYXIgOg0KDQp8fA0KfDotLS0tLTp8Oi0tLS0tOnw6LS0tLS06fA0KfCoqb3BlcmF0b3IqKnwqKlIqKnwqKnB5aHRvbioqfA0KfERvdWJsZS9mbGF0fDUsNnw1LDZ8DQp8aW50ZWdlcnw1fDV8DQp8Ym9sZWFuL2xvZ2ljYWx8dHJ1ZS9mYWxzZXx0cnVlL2ZhbHNlfA0KfHN0cmluZ3xgZHNjaWVubGFic2B8YGRzY2llbmxhYnNgfA0KfGNvbXBsZXh8MSs1anwxKzVqfA0KfHwNCg0KS09ESU5HIFIgWUFORyBESUdVTkFLQU4gVU5UVUsgTUVORVRBUEtBTiBUSVBFIERJQVRBUw0KDQpgYGB7cn0NCmEgPC0gNS44ICAgICAgICAgICAgICAgICMgVGV0YXBrYW4gbmlsYWkgZGVzaW1hbA0KYiA8LSA0TCAgICAgICAgICAgICAgICAgIyBtZW5ldGFwa2FuIG5pbGFpIGludGVnZXIgZGkgUg0KYyA8LSBjKFQsRikgICAgICAgICAgICAgIyBCb2xlYW4vTG9naWNhbA0KZiA8LSBjKCJkIiwnZScsICcyMjInKSAgI1N0cmluZy9DaGFyYWN0ZXINCmcgPC0gNCArIDhpICAgICAgICAgICAgICNDb21wbGV4DQpgYGANCg0KVU5UVUsgTUVNRVJJS1NBIFRJUEUgREFUQSBEQUxBTSBSDQpgYGB7cn0NCmNsYXNzKGEpICAgICAjIGNldGFrIG5hbWEga2VsYXMgdmFyaWFiZWwNCmBgYA0KDQpgYGB7cn0NCnR5cGVvZihjKSAgICAjIGNldGFrIHRpcGUgdmFyaWFiZWwgeA0KYGBgDQoNCiMgUmVmZXJlbnNpICMNCmh0dHBzOi8vcnB1YnMuY29tL2RzY2llbmNlbGFicy9hc2Qy