Tentang
Pada lab ini kita akan fokus pada analisis sensitivitas dan simulasi Monte Carlo.
Analisis sensitivitas adalah studi tentang bagaimana ketidakpastian dalam keluaran model atau sistem matematika (numerik atau lainnya) dapat dibagi ke berbagai sumber ketidakpastian dalam masukannya. Kami akan menggunakan paket R lpSolveAPI seperti yang dilakukan di lab sebelumnya.
Simulasi Monte Carlo menggunakan pengambilan sampel acak berulang dari alam semesta atau populasi tertentu untuk mendapatkan hasil tertentu. Jenis simulasi ini dikenal sebagai simulasi probabilistik, bukan simulasi deterministik.
Contoh simulasi Monte Carlo adalah yang diterapkan untuk memperkirakan nilai pi. Simulasi ini didasarkan pada menghasilkan titik-titik acak di dalam persegi satuan dan melihat berapa banyak titik yang berada dalam lingkaran yang dikelilingi oleh persegi satuan (ditandai dengan warna merah). Semakin tinggi jumlah titik sampel, semakin dekat hasilnya dengan hasil sebenarnya. Setelah memilih 30.000 titik acak, perkiraan untuk pi jauh lebih dekat dengan nilai sebenarnya dalam ketelitian empat titik desimal

Di lab ini, kita akan mempelajari cara membuat sampel acak dengan berbagai simulasi dan cara menjalankan analisis sensitivitas pada kasus penggunaan pemasaran yang dibahas sejauh ini.
Pengaturan
Ingatlah untuk selalu mengatur direktori kerja Anda ke lokasi file sumber. Pergi ke ‘Session’, scroll ke bawah ke ‘Set Working Directory’, dan klik ‘To Source File Location’. Bacalah dengan seksama di bawah ini dan ikuti instruksi untuk menyelesaikan tugas dan menjawab pertanyaan apa pun. Kirimkan pekerjaan Anda ke RPubs seperti yang dijelaskan di catatan sebelumnya.
Catatan
Untuk tugas Anda, Anda mungkin menggunakan kumpulan data yang berbeda dari yang disertakan di sini. Selalu baca dengan seksama instruksi di Sakai. Tugas / pertanyaan yang harus diselesaikan / dijawab ditandai dengan huruf tebal yang lebih besar dan diberi nomor sesuai dengan penempatannya di bagian tugas.
BAGIAN A: ANALISIS SENSITIVITAS
Untuk melakukan analisis sensitivitas, kamu perlu mengunduh lagi paket lpSolveAPI kecuali Anda sudah menginstalnya di program R Anda
## Warning: package 'lpSolveAPI' was built under R version 3.6.3
Kita akan meninjau kembali dan menyelesaikan lagi kasus pemasaran yang dibahas di kelas (juga bagian dari lab sebelumnya).
# Kita mulai dengan variabel `0` batasan dan` 2`. Nama objek `lpmark` adalah pilihan.
lpmark2 = make.lp(0, 2)
# Tentukan jenis pengoptimalan sebagai maksimum dan buang keluaran layar ke dalam variabel `dummy`
dummy = lp.control(lpmark2, sense="max")
# Tetapkan koefisien fungsi tujuan
set.objfn(lpmark2, c(275.691, 48.341))
# Tambahkan semua batasan ke model
add.constraint(lpmark2, c(1, 1), "<=", 350001)
add.constraint(lpmark2, c(1, 0), ">=", 15000)
add.constraint(lpmark2, c(0, 1), ">=", 75000)
add.constraint(lpmark2, c(2, -1), "=", 1)
add.constraint(lpmark2, c(1, 0), ">=", 0)
add.constraint(lpmark2, c(0, 1), ">=", 0)
# Tunjukkan setting masalah ke dalam bentuk tabel / matriks. Ini berguna untuk melihat apakah batasan Anda telah disetel dengan benar.
lpmark2
## Model name:
## C1 C2
## Maximize 275.691 48.341
## R1 1 1 <= 350001
## R2 1 0 >= 15000
## R3 0 1 >= 75000
## R4 2 -1 = 1
## R5 1 0 >= 0
## R6 0 1 >= 0
## Kind Std Std
## Type Real Real
## Upper Inf Inf
## Lower 0 0
## [1] 0
## [1] 43443717
## [1] 116667.3 233333.7
Untuk bagian sensitivitas kita akan menambahkan dua bagian kode baru untuk mendapatkan hasilnya.
## $objfrom
## [1] -96.6820 -137.8455
##
## $objtill
## [1] 1e+30 1e+30
TUGAS 1:
Hasil penelitian memiliki dua bagian yaitu: keluaran berlabel objfrom menunjukkan batas bawah koefisien sedangkan keluaran berlabel objtill menunjukkan batas atas. Jelaskan secara bersamaan apa yang diwakili oleh hasil sensitivitas dengan mengacu pada model pemasaran.
JAWABAN TUGAS 1:
Objfrom menunjukkan berapa angka terendah dari setiap varibale agar dari persamaan dapat dipenuhi tanpa perlu dioptimalkan dan objtill adalah adalah angka infiniti yang sangat besar.
## $duals
## [1] 124.12433 0.00000 0.00000 75.78333 0.00000 0.00000 0.00000
## [8] 0.00000
##
## $dualsfrom
## [1] 1.125005e+05 -1.000000e+30 -1.000000e+30 -3.050010e+05 -1.000000e+30
## [6] -1.000000e+30 -1.000000e+30 -1.000000e+30
##
## $dualstill
## [1] 1.00000e+30 1.00000e+30 1.00000e+30 4.75002e+05 1.00000e+30 1.00000e+30
## [7] 1.00000e+30 1.00000e+30
TUGAS 2:
Untuk latihan ini kami hanya tertarik pada bagian pertama dari keluaran yang diberi label duals. Jelaskan secara bersamaan apa yang diwakili oleh dua hasil sensitivitas bukan nol. Dalam jawaban Anda, bedakan antara batasan yang mengikat dan tidak mengikat, dan sertakan penjelasan tentang kelebihan / kekurangan, dan nilai-nilai marjinal.
JAWABAN TUGAS 2:
hasil bukan nol mewakili kendala yang tidak mengikat yang berarti bahwa saat varibale meningkat, solusi optimal tidak terpengaruh. dengan kata lain, ia memiliki kelonggaran untuk “bergerak” sementara batasan pengikatan terbatas dan akan mempengaruhi solusi optimal jika ditingkatkan. ini juga berarti bahwa ada nilai marjinal jika terikat dan oleh karena itu dipengaruhi oleh perubahan tersebut
Untuk memperdalam pemahaman yang lebih lagi tentang hasil sensitivitas, dan untuk memastikan integritas kalkulasi, uji independen dapat dilakukan.
TUGAS 3:
Jalankan lagi program linier mulai dari awal, dengan menentukan objek model baru lpmark1. Semua dianggap sama, ubah batasan anggaran hanya dengan 1 dollar dan selesaikan. Secara spesifik, semua sama, ubah batasan pertama \(X1 + X2 <= 350000\) hanya dengan 1 dollar sehingga batasan baru akan menjadi \(X1 + X2 <= 350001\) . Catat nilai optimal untuk penjualan seperti yang diberikan oleh fungsi tujuan. 43443641
TUGAS 4:
Hitung perubahan diferensial dalam penjualan. Bagikan pengamatan Anda.
JAWABAN TUGAS 4:
Saya tidak melihat perubahan dalam penjualan
TUGAS 5:
Menjalankan program linier lagi mulai dari awal, dengan menentukan objek model baru lpmark2. Semua dianggap sama, ubah batasan keempat \(2X1 - X2 = 0\) dengan hanya 1 dollar dan selesaikan. Batasan baru akan menjadi \(2X1 - X2 = 1\) . Catat nilai optimal untuk penjualan seperti yang diberikan oleh fungsi tujuan.
TUGAS 6:
Hitung perubahan diferensial dalam penjualan. Bagikan pengamatan Anda.
JAWABAN TUGAS 6:
Perbedaan meningkat antara lpmark1 dan proses ini
BAGIAN B: SIMULASI MONTE CARLO
Untuk tugas ini kita akan menjalankan simulasi Monte Carlo untuk menghitung probabilitas bahwa pengembalian harian dari S&P akan \(> 5%\). Kami akan mengasumsikan bahwa laba harian S&P historis mengikuti distribusi normal dengan pengembalian harian rata-rata 0,03 (%) dan deviasi standar 0,97 (%).
Untuk memulai, kami akan menghasilkan 100 sampel acak dari distribusi normal. Untuk sampel tersebut kita akan menghitung mean, standar deviasi, dan probabilitas kejadian dimana hasil simulasi lebih besar dari \(5%\).
Untuk menghasilkan sampel acak dari distribusi normal kita akan menggunakan fungsi rnorm() di R. Dalam contoh di bawah ini kita menetapkan jumlah proses (atau sampel) menjadi 100.
## [1] 0.03618039
## [1] 0.9851129
## [1] 0.494
TUGAS 7:
Ulangi perhitungan di atas untuk kasus di mana jumlah simulasi / sampel sama dengan 1000. catat mean, deviasi standar, dan probabilitas. Beri nama semua variabel yang diperlukan sebagai run1, sims1, average1, std1, dan prob1.
#TUGAS 8: Ulangi kalkulasi di atas untuk kasus dimana jumlah simulasi / sampel sama dengan 10000. catat mean, deviasi standar, dan probabilitas. Beri nama semua variabel yang diperlukan sebagai run2, sims2, average2, std2, dan prob2.
TUGAS 9:
Buat daftar dalam bentuk tabel nilai mean, deviasi standar, dan probabilitas untuk ketiga kasus: simulasi 100, 1000, dan 10000.mean -.0205 .02989 .02195 sd .995 .9843 .9624 prob .457 .491 .4855
TUGAS 10:
Jelaskan bagaimana nilai berubah / berperilaku saat jumlah simulasi bertambah. Apa taruhan terbaik Anda untuk kemungkinan terjadinya lebih besar dari 5% dan mengapa? Bagaimana ini mirip dengan kasus penggunaan gambar untuk menghitung pi yang disajikan di paragraf pengantar?
JAWABAN TUGAS 10:
Secara umum, dengan semakin banyak simulasi, semakin akurat prediksinya sehingga standar deviasi menjadi lebih ketat dan probabilitasnya meningkat seiring waktu. sekitar separuh waktu pengembalian lebih besar dari 5%. Ini serupa dalam arti bahwa semakin banyak variabel ditambahkan, semakin akurat predisinya dan semakin representatif angkanya di dunia nyata.
LS0tDQp0aXRsZTogIk1vbnRlIENhcmxvIg0KYXV0aG9yOiAiTmljaG9sYXMgQW5kcmlhbiINCmRhdGU6ICJgciBmb3JtYXQoU3lzLkRhdGUoKSwgJyVCICVkLCAlWScpYCINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICBoaWdobGlnaHQ6IG1vbm9jaHJvbWUNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIHRoZW1lOiBzcGFjZWxhYg0KICAgIHRvYzogeWVzDQogICAgdG9jX2Zsb2F0OiB5ZXMNCiAgcGRmX2RvY3VtZW50Og0KICAgIHRvYzogeWVzDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQpgYGANCg0KIyBUZW50YW5nIA0KDQpQYWRhIGxhYiBpbmkga2l0YSBha2FuIGZva3VzIHBhZGEgYW5hbGlzaXMgc2Vuc2l0aXZpdGFzIGRhbiBzaW11bGFzaSBNb250ZSBDYXJsby4NCg0KQW5hbGlzaXMgc2Vuc2l0aXZpdGFzIGFkYWxhaCBzdHVkaSB0ZW50YW5nIGJhZ2FpbWFuYSBrZXRpZGFrcGFzdGlhbiBkYWxhbSBrZWx1YXJhbiBtb2RlbCBhdGF1IHNpc3RlbSBtYXRlbWF0aWthIChudW1lcmlrIGF0YXUgbGFpbm55YSkgZGFwYXQgZGliYWdpIGtlIGJlcmJhZ2FpIHN1bWJlciBrZXRpZGFrcGFzdGlhbiBkYWxhbSBtYXN1a2FubnlhLiBLYW1pIGFrYW4gbWVuZ2d1bmFrYW4gcGFrZXQgUiBscFNvbHZlQVBJIHNlcGVydGkgeWFuZyBkaWxha3VrYW4gZGkgbGFiIHNlYmVsdW1ueWEuDQoNClNpbXVsYXNpIE1vbnRlIENhcmxvIG1lbmdndW5ha2FuIHBlbmdhbWJpbGFuIHNhbXBlbCBhY2FrIGJlcnVsYW5nIGRhcmkgYWxhbSBzZW1lc3RhIGF0YXUgcG9wdWxhc2kgdGVydGVudHUgdW50dWsgbWVuZGFwYXRrYW4gaGFzaWwgdGVydGVudHUuIEplbmlzIHNpbXVsYXNpIGluaSBkaWtlbmFsIHNlYmFnYWkgc2ltdWxhc2kgcHJvYmFiaWxpc3RpaywgYnVrYW4gc2ltdWxhc2kgZGV0ZXJtaW5pc3Rpay4NCg0KQ29udG9oIHNpbXVsYXNpIE1vbnRlIENhcmxvIGFkYWxhaCB5YW5nIGRpdGVyYXBrYW4gdW50dWsgbWVtcGVya2lyYWthbiBuaWxhaSBwaS4gU2ltdWxhc2kgaW5pIGRpZGFzYXJrYW4gcGFkYSBtZW5naGFzaWxrYW4gdGl0aWstdGl0aWsgYWNhayBkaSBkYWxhbSBwZXJzZWdpIHNhdHVhbiBkYW4gbWVsaWhhdCBiZXJhcGEgYmFueWFrIHRpdGlrIHlhbmcgYmVyYWRhIGRhbGFtIGxpbmdrYXJhbiB5YW5nIGRpa2VsaWxpbmdpIG9sZWggcGVyc2VnaSBzYXR1YW4gKGRpdGFuZGFpIGRlbmdhbiB3YXJuYSBtZXJhaCkuIFNlbWFraW4gdGluZ2dpIGp1bWxhaCB0aXRpayBzYW1wZWwsIHNlbWFraW4gZGVrYXQgaGFzaWxueWEgZGVuZ2FuIGhhc2lsIHNlYmVuYXJueWEuIFNldGVsYWggbWVtaWxpaCAzMC4wMDAgdGl0aWsgYWNhaywgcGVya2lyYWFuIHVudHVrIHBpIGphdWggbGViaWggZGVrYXQgZGVuZ2FuIG5pbGFpIHNlYmVuYXJueWEgZGFsYW0ga2V0ZWxpdGlhbiBlbXBhdCB0aXRpayBkZXNpbWFsDQoNCmBgYHtyLGVjaG89RkFMU0V9DQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygiaW5kZXguZ2lmIikNCmBgYA0KDQpEaSBsYWIgaW5pLCBraXRhIGFrYW4gbWVtcGVsYWphcmkgY2FyYSBtZW1idWF0IHNhbXBlbCBhY2FrIGRlbmdhbiBiZXJiYWdhaSBzaW11bGFzaSBkYW4gY2FyYSBtZW5qYWxhbmthbiBhbmFsaXNpcyBzZW5zaXRpdml0YXMgcGFkYSBrYXN1cyBwZW5nZ3VuYWFuIHBlbWFzYXJhbiB5YW5nIGRpYmFoYXMgc2VqYXVoIGluaS4NCg0KUGVuZ2F0dXJhbg0KDQpJbmdhdGxhaCB1bnR1ayBzZWxhbHUgbWVuZ2F0dXIgZGlyZWt0b3JpIGtlcmphIEFuZGEga2UgbG9rYXNpIGZpbGUgc3VtYmVyLiBQZXJnaSBrZSAnU2Vzc2lvbicsIHNjcm9sbCBrZSBiYXdhaCBrZSAnU2V0IFdvcmtpbmcgRGlyZWN0b3J5JywgZGFuIGtsaWsgJ1RvIFNvdXJjZSBGaWxlIExvY2F0aW9uJy4gQmFjYWxhaCBkZW5nYW4gc2Vrc2FtYSBkaSBiYXdhaCBpbmkgZGFuIGlrdXRpIGluc3RydWtzaSB1bnR1ayBtZW55ZWxlc2Fpa2FuIHR1Z2FzIGRhbiBtZW5qYXdhYiBwZXJ0YW55YWFuIGFwYSBwdW4uIEtpcmlta2FuIHBla2VyamFhbiBBbmRhIGtlIFJQdWJzIHNlcGVydGkgeWFuZyBkaWplbGFza2FuIGRpIGNhdGF0YW4gc2ViZWx1bW55YS4NCg0KQ2F0YXRhbg0KDQpVbnR1ayB0dWdhcyBBbmRhLCBBbmRhIG11bmdraW4gbWVuZ2d1bmFrYW4ga3VtcHVsYW4gZGF0YSB5YW5nIGJlcmJlZGEgZGFyaSB5YW5nIGRpc2VydGFrYW4gZGkgc2luaS4gU2VsYWx1IGJhY2EgZGVuZ2FuIHNla3NhbWEgaW5zdHJ1a3NpIGRpIFNha2FpLiBUdWdhcyAvIHBlcnRhbnlhYW4geWFuZyBoYXJ1cyBkaXNlbGVzYWlrYW4gLyBkaWphd2FiIGRpdGFuZGFpIGRlbmdhbiBodXJ1ZiB0ZWJhbCB5YW5nIGxlYmloIGJlc2FyIGRhbiBkaWJlcmkgbm9tb3Igc2VzdWFpIGRlbmdhbiBwZW5lbXBhdGFubnlhIGRpIGJhZ2lhbiB0dWdhcy4NCg0KIyBCQUdJQU4gQTogQU5BTElTSVMgU0VOU0lUSVZJVEFTDQoNClVudHVrIG1lbGFrdWthbiBhbmFsaXNpcyBzZW5zaXRpdml0YXMsIGthbXUgcGVybHUgbWVuZ3VuZHVoIGxhZ2kgcGFrZXQgbHBTb2x2ZUFQSSBrZWN1YWxpIEFuZGEgc3VkYWggbWVuZ2luc3RhbG55YSBkaSBwcm9ncmFtIFIgQW5kYQ0KDQpgYGB7cn0NCiMgUmVxdWlyZSBha2FuIG1lbXVhdCBwYWtldCBoYW55YSBqaWthIHRpZGFrIGRpaW5zdGFsDQojIERlcGVuZGVuY2llcyA9IFRSVUUgbWVtYXN0aWthbiBiYWh3YSBkZXBlbmRlbnNpIHN1ZGFoIGRpaW5zdGFsDQppZighcmVxdWlyZSgibHBTb2x2ZUFQSSIscXVpZXRseSA9IFRSVUUpKQ0KICBpbnN0YWxsLnBhY2thZ2VzKCJscFNvbHZlQVBJIixkZXBlbmRlbmNpZXMgPSBUUlVFLCByZXBvcyA9ICJodHRwczovL2Nsb3VkLnItcHJvamVjdC5vcmciKQ0KYGBgDQoNCktpdGEgYWthbiBtZW5pbmphdSBrZW1iYWxpIGRhbiBtZW55ZWxlc2Fpa2FuIGxhZ2kga2FzdXMgcGVtYXNhcmFuIHlhbmcgZGliYWhhcyBkaSBrZWxhcyAoanVnYSBiYWdpYW4gZGFyaSBsYWIgc2ViZWx1bW55YSkuDQoNCmBgYHtyfQ0KIyBLaXRhIG11bGFpIGRlbmdhbiB2YXJpYWJlbCBgMGAgYmF0YXNhbiBkYW5gIDJgLiBOYW1hIG9iamVrIGBscG1hcmtgIGFkYWxhaCBwaWxpaGFuLg0KbHBtYXJrMiA9IG1ha2UubHAoMCwgMikNCg0KIyBUZW50dWthbiBqZW5pcyBwZW5nb3B0aW1hbGFuIHNlYmFnYWkgbWFrc2ltdW0gZGFuIGJ1YW5nIGtlbHVhcmFuIGxheWFyIGtlIGRhbGFtIHZhcmlhYmVsIGBkdW1teWANCmR1bW15ID0gbHAuY29udHJvbChscG1hcmsyLCBzZW5zZT0ibWF4IikgDQoNCiMgVGV0YXBrYW4ga29lZmlzaWVuIGZ1bmdzaSB0dWp1YW4NCnNldC5vYmpmbihscG1hcmsyLCBjKDI3NS42OTEsIDQ4LjM0MSkpDQoNCiMgVGFtYmFoa2FuIHNlbXVhIGJhdGFzYW4ga2UgbW9kZWwNCmFkZC5jb25zdHJhaW50KGxwbWFyazIsIGMoMSwgMSksICI8PSIsIDM1MDAwMSkNCmFkZC5jb25zdHJhaW50KGxwbWFyazIsIGMoMSwgMCksICI+PSIsIDE1MDAwKQ0KYWRkLmNvbnN0cmFpbnQobHBtYXJrMiwgYygwLCAxKSwgIj49IiwgNzUwMDApDQphZGQuY29uc3RyYWludChscG1hcmsyLCBjKDIsIC0xKSwgIj0iLCAxKQ0KYWRkLmNvbnN0cmFpbnQobHBtYXJrMiwgYygxLCAwKSwgIj49IiwgMCkNCmFkZC5jb25zdHJhaW50KGxwbWFyazIsIGMoMCwgMSksICI+PSIsIDApDQoNCiMgVHVuanVra2FuIHNldHRpbmcgbWFzYWxhaCBrZSBkYWxhbSBiZW50dWsgdGFiZWwgLyBtYXRyaWtzLiBJbmkgYmVyZ3VuYSB1bnR1ayBtZWxpaGF0IGFwYWthaCBiYXRhc2FuIEFuZGEgdGVsYWggZGlzZXRlbCBkZW5nYW4gYmVuYXIuDQpscG1hcmsyDQpgYGANCg0KYGBge3J9DQojIE1lbnllbGVzYWlrYW4gbWFzYWxhaCBwZW1yb2dyYW1hbiBsaW5pZXINCnNvbHZlKGxwbWFyazIpDQpgYGANCg0KYGBge3J9DQojIER1YSBiYXJpcyBrb2RlIGJlcmlrdXRueWEgYWthbiBtZW51bmp1a2thbiBoYXNpbCB5YW5nIG9wdGltYWwuLg0KIyBQZXJ0YW1hOiBNZW5hbXBpbGthbiBuaWxhaSBvcHRpbWFsIGZ1bmdzaSB0dWp1YW4sIHlhaXR1IG5pbGFpIHBlbmp1YWxhbiBvcHRpbWFsLg0KZ2V0Lm9iamVjdGl2ZShscG1hcmsyKQ0KYGBgDQoNCmBgYHtyfQ0KI0tlZHVhOiBNZW5hbXBpbGthbiBuaWxhaSBvcHRpbXVtIHZhcmlhYmVsIGtlcHV0dXNhbiB5YWl0dSBuaWxhaSBvcHRpbXVtIHVudHVrIGlrbGFuIHJhZGlvIGRhbiB0di4NCmdldC52YXJpYWJsZXMobHBtYXJrMikgDQpgYGANCg0KVW50dWsgYmFnaWFuIHNlbnNpdGl2aXRhcyBraXRhIGFrYW4gbWVuYW1iYWhrYW4gZHVhIGJhZ2lhbiBrb2RlIGJhcnUgdW50dWsgbWVuZGFwYXRrYW4gaGFzaWxueWEuDQoNCmBgYHtyfQ0KI01lbmFtcGlsa2FuIGtlcGVrYWFuIHRlcmhhZGFwIGtvZWZpc2llbiBmdW5nc2kgdHVqdWFuLg0KZ2V0LnNlbnNpdGl2aXR5Lm9iaihscG1hcmsyKQ0KYGBgDQoNCiMgVFVHQVMgMTogDQpIYXNpbCBwZW5lbGl0aWFuIG1lbWlsaWtpIGR1YSBiYWdpYW4geWFpdHU6IGtlbHVhcmFuIGJlcmxhYmVsIG9iamZyb20gbWVudW5qdWtrYW4gYmF0YXMgYmF3YWgga29lZmlzaWVuIHNlZGFuZ2thbiBrZWx1YXJhbiBiZXJsYWJlbCBvYmp0aWxsIG1lbnVuanVra2FuIGJhdGFzIGF0YXMuIEplbGFza2FuIHNlY2FyYSBiZXJzYW1hYW4gYXBhIHlhbmcgZGl3YWtpbGkgb2xlaCBoYXNpbCBzZW5zaXRpdml0YXMgZGVuZ2FuIG1lbmdhY3UgcGFkYSBtb2RlbCBwZW1hc2FyYW4uDQoNCiMgSkFXQUJBTiBUVUdBUyAxOiANCk9iamZyb20gbWVudW5qdWtrYW4gYmVyYXBhIGFuZ2thIHRlcmVuZGFoIGRhcmkgc2V0aWFwIHZhcmliYWxlIGFnYXIgZGFyaSBwZXJzYW1hYW4gZGFwYXQgZGlwZW51aGkgdGFucGEgcGVybHUgZGlvcHRpbWFsa2FuIGRhbiBvYmp0aWxsIGFkYWxhaCBhZGFsYWggYW5na2EgaW5maW5pdGkgeWFuZyBzYW5nYXQgYmVzYXIuDQoNCmBgYHtyfQ0KI1RhbXBpbGFuIFNlbnNpdGl2aXRhcyBrZSBDT05TVFJBSU5UUyAoYXRhdSBuaWxhaSBzaXNpIGthbmFuKS4gDQojQWthbiBhZGEgdG90YWwgbmlsYWkgbSArIG4gZGltYW5hIG0gYWRhbGFoIGp1bWxhaCBiYXRhc2FuIGRhbiBuIGFkYWxhaCBqdW1sYWggdmFyaWFiZWwga2VwdXR1c2FuDQpnZXQuc2Vuc2l0aXZpdHkucmhzKGxwbWFyazIpIA0KYGBgDQoNCiMgVFVHQVMgMjogDQpVbnR1ayBsYXRpaGFuIGluaSBrYW1pIGhhbnlhIHRlcnRhcmlrIHBhZGEgYmFnaWFuIHBlcnRhbWEgZGFyaSBrZWx1YXJhbiB5YW5nIGRpYmVyaSBsYWJlbCBkdWFscy4gSmVsYXNrYW4gc2VjYXJhIGJlcnNhbWFhbiBhcGEgeWFuZyBkaXdha2lsaSBvbGVoIGR1YSBoYXNpbCBzZW5zaXRpdml0YXMgYnVrYW4gbm9sLiBEYWxhbSBqYXdhYmFuIEFuZGEsIGJlZGFrYW4gYW50YXJhIGJhdGFzYW4geWFuZyBtZW5naWthdCBkYW4gdGlkYWsgbWVuZ2lrYXQsIGRhbiBzZXJ0YWthbiBwZW5qZWxhc2FuIHRlbnRhbmcga2VsZWJpaGFuIC8ga2VrdXJhbmdhbiwgZGFuIG5pbGFpLW5pbGFpIG1hcmppbmFsLg0KDQojIEpBV0FCQU4gVFVHQVMgMjoNCmhhc2lsIGJ1a2FuIG5vbCBtZXdha2lsaSBrZW5kYWxhIHlhbmcgdGlkYWsgbWVuZ2lrYXQgeWFuZyBiZXJhcnRpIGJhaHdhIHNhYXQgdmFyaWJhbGUgbWVuaW5na2F0LCBzb2x1c2kgb3B0aW1hbCB0aWRhayB0ZXJwZW5nYXJ1aC4gZGVuZ2FuIGthdGEgbGFpbiwgaWEgbWVtaWxpa2kga2Vsb25nZ2FyYW4gdW50dWsgImJlcmdlcmFrIiBzZW1lbnRhcmEgYmF0YXNhbiBwZW5naWthdGFuIHRlcmJhdGFzIGRhbiBha2FuIG1lbXBlbmdhcnVoaSBzb2x1c2kgb3B0aW1hbCBqaWthIGRpdGluZ2thdGthbi4gaW5pIGp1Z2EgYmVyYXJ0aSBiYWh3YSBhZGEgbmlsYWkgbWFyamluYWwgamlrYSB0ZXJpa2F0IGRhbiBvbGVoIGthcmVuYSBpdHUgZGlwZW5nYXJ1aGkgb2xlaCBwZXJ1YmFoYW4gdGVyc2VidXQNCg0KVW50dWsgbWVtcGVyZGFsYW0gcGVtYWhhbWFuIHlhbmcgbGViaWggbGFnaSB0ZW50YW5nIGhhc2lsIHNlbnNpdGl2aXRhcywgZGFuIHVudHVrIG1lbWFzdGlrYW4gaW50ZWdyaXRhcyBrYWxrdWxhc2ksIHVqaSBpbmRlcGVuZGVuIGRhcGF0IGRpbGFrdWthbi4NCg0KIyBUVUdBUyAzOiANCkphbGFua2FuIGxhZ2kgcHJvZ3JhbSBsaW5pZXIgbXVsYWkgZGFyaSBhd2FsLCBkZW5nYW4gbWVuZW50dWthbiBvYmplayBtb2RlbCBiYXJ1IGxwbWFyazEuIFNlbXVhIGRpYW5nZ2FwIHNhbWEsIHViYWggYmF0YXNhbiBhbmdnYXJhbiBoYW55YSBkZW5nYW4gMSBkb2xsYXIgZGFuIHNlbGVzYWlrYW4uIFNlY2FyYSBzcGVzaWZpaywgc2VtdWEgc2FtYSwgdWJhaCBiYXRhc2FuIHBlcnRhbWEgJFgxICsgWDIgPD0gMzUwMDAwJCBoYW55YSBkZW5nYW4gMSBkb2xsYXIgc2VoaW5nZ2EgYmF0YXNhbiBiYXJ1IGFrYW4gbWVuamFkaSAkWDEgKyBYMiA8PSAzNTAwMDEkIC4gQ2F0YXQgbmlsYWkgb3B0aW1hbCB1bnR1ayBwZW5qdWFsYW4gc2VwZXJ0aSB5YW5nIGRpYmVyaWthbiBvbGVoIGZ1bmdzaSB0dWp1YW4uIDQzNDQzNjQxDQoNCmBgYHtyfQ0KIyBidWF0IG1vZGVsIG9iamVjdCBiYXJ1IGJlcm5hbWEgbHBtYXJrMQ0KbHBtYXJrMSA9IG1ha2UubHAoMCwgMikNCiMgVWxhbmdpIHBlcmludGFoIGxhaW5ueWEgZGVuZ2FuIHNhdHUgcGVydWJhaGFuIGJhdGFzYW4gdW50dWsgYW5nZ2FyYW4uIHBlY2Foa2FuIGRhbiB0YW1waWxrYW4gbmlsYWkgb3B0aW1hbCBmdW5nc2kgdHVqdWFuDQpgYGANCg0KIyBUVUdBUyA0OiANCkhpdHVuZyBwZXJ1YmFoYW4gZGlmZXJlbnNpYWwgZGFsYW0gcGVuanVhbGFuLiBCYWdpa2FuIHBlbmdhbWF0YW4gQW5kYS4NCg0KIyBKQVdBQkFOIFRVR0FTIDQ6DQpTYXlhIHRpZGFrIG1lbGloYXQgcGVydWJhaGFuIGRhbGFtIHBlbmp1YWxhbg0KDQojIFRVR0FTIDU6IA0KTWVuamFsYW5rYW4gcHJvZ3JhbSBsaW5pZXIgbGFnaSBtdWxhaSBkYXJpIGF3YWwsIGRlbmdhbiBtZW5lbnR1a2FuIG9iamVrIG1vZGVsIGJhcnUgbHBtYXJrMi4gU2VtdWEgZGlhbmdnYXAgc2FtYSwgdWJhaCBiYXRhc2FuIGtlZW1wYXQgJDJYMSAtIFgyID0gMCQgZGVuZ2FuIGhhbnlhIDEgZG9sbGFyIGRhbiBzZWxlc2Fpa2FuLiBCYXRhc2FuIGJhcnUgYWthbiBtZW5qYWRpICQyWDEgLSBYMiA9IDEkIC4gQ2F0YXQgbmlsYWkgb3B0aW1hbCB1bnR1ayBwZW5qdWFsYW4gc2VwZXJ0aSB5YW5nIGRpYmVyaWthbiBvbGVoIGZ1bmdzaSB0dWp1YW4uDQoNCmBgYHtyfQ0KIyBidWF0IG1vZGVsIG9iamVjdCBiYXJ1IGJlcm5hbWEgbHBtYXJrMg0KbHBtYXJrMiA9IG1ha2UubHAoMCwgMikNCiMgVWxhbmdpIHBlcmludGFoIGxhaW5ueWEgZGVuZ2FuIHBlcnViYWhhbiBiYXRhc2FuIGRpIGF0YXMuIHBlY2Foa2FuIGRhbiB0YW1waWxrYW4gbmlsYWkgb3B0aW1hbCBmdW5nc2kgdHVqdWFuDQpgYGANCg0KIyBUVUdBUyA2OiANCkhpdHVuZyBwZXJ1YmFoYW4gZGlmZXJlbnNpYWwgZGFsYW0gcGVuanVhbGFuLiBCYWdpa2FuIHBlbmdhbWF0YW4gQW5kYS4NCg0KIyBKQVdBQkFOIFRVR0FTIDY6DQpQZXJiZWRhYW4gbWVuaW5na2F0IGFudGFyYSBscG1hcmsxIGRhbiBwcm9zZXMgaW5pDQoNCg0KIyBCQUdJQU4gQjogU0lNVUxBU0kgTU9OVEUgQ0FSTE8NCg0KVW50dWsgdHVnYXMgaW5pIGtpdGEgYWthbiBtZW5qYWxhbmthbiBzaW11bGFzaSBNb250ZSBDYXJsbyB1bnR1ayBtZW5naGl0dW5nIHByb2JhYmlsaXRhcyBiYWh3YSBwZW5nZW1iYWxpYW4gaGFyaWFuIGRhcmkgUyZQIGFrYW4gJD4gNSUkLiBLYW1pIGFrYW4gbWVuZ2FzdW1zaWthbiBiYWh3YSBsYWJhIGhhcmlhbiBTJlAgaGlzdG9yaXMgbWVuZ2lrdXRpIGRpc3RyaWJ1c2kgbm9ybWFsIGRlbmdhbiBwZW5nZW1iYWxpYW4gaGFyaWFuIHJhdGEtcmF0YSAwLDAzICglKSBkYW4gZGV2aWFzaSBzdGFuZGFyIDAsOTcgKCUpLg0KDQpVbnR1ayBtZW11bGFpLCBrYW1pIGFrYW4gbWVuZ2hhc2lsa2FuIDEwMCBzYW1wZWwgYWNhayBkYXJpIGRpc3RyaWJ1c2kgbm9ybWFsLiBVbnR1ayBzYW1wZWwgdGVyc2VidXQga2l0YSBha2FuIG1lbmdoaXR1bmcgbWVhbiwgc3RhbmRhciBkZXZpYXNpLCBkYW4gcHJvYmFiaWxpdGFzIGtlamFkaWFuIGRpbWFuYSBoYXNpbCBzaW11bGFzaSBsZWJpaCBiZXNhciBkYXJpICQ1JSQuDQoNClVudHVrIG1lbmdoYXNpbGthbiBzYW1wZWwgYWNhayBkYXJpIGRpc3RyaWJ1c2kgbm9ybWFsIGtpdGEgYWthbiBtZW5nZ3VuYWthbiBmdW5nc2kgcm5vcm0oKSBkaSBSLiBEYWxhbSBjb250b2ggZGkgYmF3YWggaW5pIGtpdGEgbWVuZXRhcGthbiBqdW1sYWggcHJvc2VzIChhdGF1IHNhbXBlbCkgbWVuamFkaSAxMDAuDQoNCmBgYHtyfQ0KIyBiYW55YWtueWEgc2ltdWxhc2kvc2FtcGVsDQpydW5zMiA9IDEwMDAwDQojIGdlbmVyYXRvciBub21vciBhY2FrIHBlciBkaXN0cmlidXNpIG5vcm1hbCB5YW5nIGRpdGVudHVrYW4gZGVuZ2FuIG1lYW4gZGFuIGRldmlhc2kgc3RhbmRhciB5YW5nIGRpYmVyaWthbg0Kc2ltczIgPSAgcm5vcm0ocnVuczIsbWVhbj0wLjAzLHNkPTAuOTcpDQpgYGANCg0KYGBge3J9DQojIHJhdGEgcmF0YSBkaWhpdHVuZyBkYXJpIGRpc3RyaWJ1c2kgc2FtcGVsIHNlY2FyYSBhY2FrDQphdmVyYWdlMiA9IG1lYW4oc2ltczIpDQphdmVyYWdlMg0KYGBgDQoNCmBgYHtyfQ0KIyBTVEQgZGloaXR1bmcgZGFyaSBkaXN0cmlidXNpIHNhbXBlbCBzZWNhcmEgYWNhaw0Kc3RkMiA9IHNkKHNpbXMyKSANCnN0ZDINCmBgYA0KDQpgYGB7cn0NCiMgcHJvYmFiaWxpdGFzIGtlamFkaWFuIHBhZGEgaGFyaSB0ZXJ0ZW50dSBiZXJkYXNhcmthbiBzYW1wZWwgYWthbiBzYW1hIGRlbmdhbiBoaXR1bmdhbiAoYXRhdSBqdW1sYWgpIGRpIG1hbmEgaGFzaWwgc2FtcGVsIGxlYmloIGJlc2FyIGRhcmkgNSUgZGliYWdpIGRlbmdhbiBqdW1sYWggc2FtcGVsLg0KcHJvYjIgPSBzdW0oc2ltczIgPj0wLjA1KS9ydW5zMg0KcHJvYjINCmBgYA0KDQojIFRVR0FTIDc6IA0KVWxhbmdpIHBlcmhpdHVuZ2FuIGRpIGF0YXMgdW50dWsga2FzdXMgZGkgbWFuYSBqdW1sYWggc2ltdWxhc2kgLyBzYW1wZWwgc2FtYSBkZW5nYW4gMTAwMC4gY2F0YXQgbWVhbiwgZGV2aWFzaSBzdGFuZGFyLCBkYW4gcHJvYmFiaWxpdGFzLiBCZXJpIG5hbWEgc2VtdWEgdmFyaWFiZWwgeWFuZyBkaXBlcmx1a2FuIHNlYmFnYWkgcnVuMSwgc2ltczEsIGF2ZXJhZ2UxLCBzdGQxLCBkYW4gcHJvYjEuDQoNCmBgYHtyfQ0KIyB1bGFuZ2kga2Fsa3VsYXNpIHRlcnNlYnV0DQpydW5zMT0xMDAwDQphdmVyYWdlMT0wLjAyMTk1MzExDQpzdGQxPTAuOTUxMzE2Nw0KcHJvYjE9MC41MDUNCmBgYA0KDQojVFVHQVMgODogDQpVbGFuZ2kga2Fsa3VsYXNpIGRpIGF0YXMgdW50dWsga2FzdXMgZGltYW5hIGp1bWxhaCBzaW11bGFzaSAvIHNhbXBlbCBzYW1hIGRlbmdhbiAxMDAwMC4gY2F0YXQgbWVhbiwgZGV2aWFzaSBzdGFuZGFyLCBkYW4gcHJvYmFiaWxpdGFzLiBCZXJpIG5hbWEgc2VtdWEgdmFyaWFiZWwgeWFuZyBkaXBlcmx1a2FuIHNlYmFnYWkgcnVuMiwgc2ltczIsIGF2ZXJhZ2UyLCBzdGQyLCBkYW4gcHJvYjIuDQoNCmBgYHtyfQ0KIyB1bGFuZ2kga2Fsa3VsYXNpIHRlcnNlYnV0DQpydW5zMj0xMDAwMA0KYXZlcmFnZTI9MC4wMjkyODA0Mg0Kc3RkMj0wLjk2MzY1NjENCnByb2IyPTAuNDg5MQ0KYGBgDQoNCiMgVFVHQVMgOToNCkJ1YXQgZGFmdGFyIGRhbGFtIGJlbnR1ayB0YWJlbCBuaWxhaSBtZWFuLCBkZXZpYXNpIHN0YW5kYXIsIGRhbiBwcm9iYWJpbGl0YXMgdW50dWsga2V0aWdhIGthc3VzOiBzaW11bGFzaSAxMDAsDQoxMDAwLCBkYW4gMTAwMDAubWVhbiAtLjAyMDUgLjAyOTg5IC4wMjE5NSBzZCAuOTk1IC45ODQzIC45NjI0IHByb2IgLjQ1NyAuNDkxIC40ODU1DQoNCiMgVFVHQVMgMTA6IA0KSmVsYXNrYW4gYmFnYWltYW5hIG5pbGFpIGJlcnViYWggLyBiZXJwZXJpbGFrdSBzYWF0IGp1bWxhaCBzaW11bGFzaSBiZXJ0YW1iYWguIEFwYSB0YXJ1aGFuIHRlcmJhaWsgQW5kYSB1bnR1ayBrZW11bmdraW5hbiB0ZXJqYWRpbnlhIGxlYmloIGJlc2FyIGRhcmkgNSUgZGFuIG1lbmdhcGE/IEJhZ2FpbWFuYSBpbmkgbWlyaXAgZGVuZ2FuIGthc3VzIHBlbmdndW5hYW4gZ2FtYmFyIHVudHVrIG1lbmdoaXR1bmcgcGkgeWFuZyBkaXNhamlrYW4gZGkgcGFyYWdyYWYgcGVuZ2FudGFyPw0KDQojIEpBV0FCQU4gVFVHQVMgMTA6IA0KU2VjYXJhIHVtdW0sIGRlbmdhbiBzZW1ha2luIGJhbnlhayBzaW11bGFzaSwgc2VtYWtpbiBha3VyYXQgcHJlZGlrc2lueWEgc2VoaW5nZ2Egc3RhbmRhciBkZXZpYXNpIG1lbmphZGkgbGViaWgga2V0YXQgZGFuIHByb2JhYmlsaXRhc255YSBtZW5pbmdrYXQgc2VpcmluZyB3YWt0dS4gc2VraXRhciBzZXBhcnVoIHdha3R1IHBlbmdlbWJhbGlhbiBsZWJpaCBiZXNhciBkYXJpIDUlLiBJbmkgc2VydXBhIGRhbGFtIGFydGkgYmFod2Egc2VtYWtpbiBiYW55YWsgdmFyaWFiZWwgZGl0YW1iYWhrYW4sIHNlbWFraW4gYWt1cmF0IHByZWRpc2lueWEgZGFuIHNlbWFraW4gcmVwcmVzZW50YXRpZiBhbmdrYW55YSBkaSBkdW5pYSBueWF0YS4NCg0KDQo=