PROBLEM 1. ABOUT BOND VALUATION
You have to valuate a bond for 10 different coupon rates. Read
directions:
The characteristics of this bond are:
Time to maturity: 10 years;
Compounded monthly;
Face value (principal) is $8,000,000.
A specific annual interest rate (yield to maturity) of
15%
You have to valuate this bond for 16 coupon annual rates starting
from 1% up to 3%, jumping by 0.20%: CR = [1.00%, 1.20%, 1.40%, … ,
2.60%, 2.80%, 3.00%] You MUST write a function for the bond valuation,
and you MUST use a loop to get the 16 bond values for the different
coupon rates.
At the end, you have to:
Save (in some place like a matrix) the 16 different values of the
bond valuation, and the 16 coupon rates.
Do a plot to show how the value of the bond changes with the 16
different coupon rates
PROBLEM 1. ABOUT BOND VALUATION SOLUTION
WORKSHOP 2 PRESENTED A CHALLENGE WHERE WE SOLVED FOR BOND PRICE, THE
DIFERENCE BEING THAT WORKSHOP 2 HAD INTEREST AS THE INDEPENDENT VARIABLE
AND IN THIS CASE INTEREST WAS FIXED AND THE DEPENDENT VARIABLE WAS THE
COUPON RATE
THEREFORE, MY APROACH WAS TO WORK WITH VECTORS FOR CASH FLOWS,
CALCULATE THE PRESENT VALUES OF EACH CASH FLOW AND COUPON PERIODS, AND
THEN ILL OBTAIN THE BONDPRICE
FIRST I’M GOING TO ORGANIZE THE DATA PRESENTED IN THE PROBLEM
BOND PRINCIPAL: $8,000,000 Time to maturity: 10 years ANNUAL Rate
(YTM): 15% Compounded Monthly FROM 1% - 3%
THEN I WILL APPLY SOME LINES OF CODE THAT WILL HELP ME VALUE THE
BONDS
BOND 1
bondprice<-function(principal,ttm,couponrate,interestrate,periods) {
# periods is the # of periods in the year for the compounding of interests
# I calculate the coupon amount per period:
coupon=(couponrate/periods)*principal
# I create a vector for the cashflows. The last cashflow must be equal to
# the coupon plus the principal
cf<-c(rep(coupon,ttm*periods-1),coupon+principal)
# I used the rep function that repeats ttm*periods-1 times the coupon amount
# Then the vector cf will have all fixed coupon payments, and the end payment
# will be equal to the coupon plus the principal
# I create a vector for the exponents that I need to use for the discount factor:
# I use the seq function that creates sequential numbers from 1 to the last period
exponents<-seq(1,ttm*periods)
# I create a vector with the discount factors (1/(1+periodrate)^t)
discountfactors <- 1 / (1+interestrate/periods)^exponents
# I get the sum of all present values. The present values are equal to
# the cash flow times the corresponding discount factor:
presentvalue <- sum(cf*discountfactors)
# Since the output of this function is this value, then
# I return this present value as the bond price:
return(presentvalue)
}
# Once I have my function, I just call my function with the parameters specified
# in the problem.
# I run my function 16 times for the 16 coupon rates:
bond1 <- bondprice(8000000,10,0.01,0.15,12)
print("The bond price when coupon rate is 1% is ")
[1] "The bond price when coupon rate is 1% is "
sprintf("$ %3.2f", bond1)
[1] "$ 2214934.26"
BOND 2
# I run the bondprice function with the last parameter=12 since the problem specifies
# that the compounded is monthlyy, then periods in the year=12
bond2<- bondprice(8000000,10,0.012,0.15,12)
print("The bond price when coupon rate is 1.2% is ")
[1] "The bond price when coupon rate is 1.2% is "
sprintf("$ %3.2f", bond2)
[1] "$ 2297578.05"
BOND 3
bond3<- bondprice(8000000,10,0.014,0.15,12)
print("The bond price when the coupon rate is 1.4% is ")
[1] "The bond price when the coupon rate is 1.4% is "
sprintf("$ %3.2f", bond3 )
[1] "$ 2380221.85"
BOND 4
bond4<- bondprice(8000000,10,0.016,0.15,12)
print("The bond price when the coupon rate is 1.6% is ")
[1] "The bond price when the coupon rate is 1.6% is "
sprintf("$ %3.2f", bond4 )
[1] "$ 2462865.65"
BOND 5
bond5<- bondprice(8000000,10,0.018,0.15,12)
print("The bond price when the coupon rate is 1.8% is ")
[1] "The bond price when the coupon rate is 1.8% is "
sprintf("$ %3.2f", bond5 )
[1] "$ 2545509.44"
BOND 6
bond6<- bondprice(8000000,10,0.02,0.15,12)
print("The bond price when the coupon rate is 2% is ")
[1] "The bond price when the coupon rate is 2% is "
sprintf("$ %3.2f", bond6 )
[1] "$ 2628153.24"
BOND 7
bond7<- bondprice(8000000,10,0.022,0.15,12)
print("The bond price when the coupon rate is 2.2% is ")
[1] "The bond price when the coupon rate is 2.2% is "
sprintf("$ %3.2f", bond7 )
[1] "$ 2710797.03"
BOND 8
bond8<- bondprice(8000000,10,0.024,0.15,12)
print("The bond price when the coupon rate is 2.4% is ")
[1] "The bond price when the coupon rate is 2.4% is "
sprintf("$ %3.2f", bond8 )
[1] "$ 2793440.83"
BOND 9
bond9<- bondprice(8000000,10,0.026,0.15,12)
print("The bond price when the coupon rate is 2.6% is ")
[1] "The bond price when the coupon rate is 2.6% is "
sprintf("$ %3.2f", bond9 )
[1] "$ 2876084.63"
BOND 10
bond10<- bondprice(8000000,10,0.028,0.15,12)
print("The bond price when the coupon rate is 2.8% is ")
[1] "The bond price when the coupon rate is 2.8% is "
sprintf("$ %3.2f", bond10 )
[1] "$ 2958728.42"
BOND 11
bond11<- bondprice(8000000,10,0.03,0.15,12)
print("The bond price when the coupon rate is 3% is ")
[1] "The bond price when the coupon rate is 3% is "
sprintf("$ %3.2f", bond11 )
[1] "$ 3041372.22"
MATRIX
BVM<-matrix(c(bond1, bond2, bond3, bond4, bond5, bond6, bond7, bond8, bond9, bond10, bond11),nrow=1,ncol=11)
BVM
[,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,] 2214934 2297578 2380222 2462866 2545509 2628153 2710797
[,8] [,9] [,10] [,11]
[1,] 2793441 2876085 2958728 3041372
# I CREATE OBJECTS FOR ALL COUPON RATES
CR1 <- 1
CR2 <- 1.2
CR3 <- 1.4
CR4 <- 1.6
CR5 <- 1.8
CR6 <- 2
CR7 <- 2.2
CR8 <- 2.4
CR9 <- 2.6
CR10 <- 2.8
CR11 <- 3
# THEN I CREATE A MATRIX CONTAINING THE 11 DIFFERENT BOND COUPON RATES: BOND COUPON RATE MATRIX (BCRM)
BCRM<-matrix(c(CR1,CR2,CR3,CR4,CR5,CR6,CR7,CR8,CR9,CR10,CR11),nrow=1,ncol=11)
BCRM
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11]
[1,] 1 1.2 1.4 1.6 1.8 2 2.2 2.4 2.6 2.8 3
I then graph my bonds
plot(BCRM)

plot(BVM)

plot(bond1, CR1)

plot(bond2, CR2)

plot(bond3, CR3)

plot(bond4, CR4)

plot(bond5, CR5)

plot(bond6, CR6)

plot(bond7, CR7)

plot(bond8, CR8)

plot(bond9, CR9)

plot(bond10, CR10)

plot(bond11, CR11)

FINALLY I WANTED TO CREATE A GRAPH THAT HAD ALL THE BONDS AND COUPON
RATES COMPASSED IN ONE GRAPH, BUT WHEN TRYING TO DO THIS I COULD ONLY
GRAPH OBJECTS INDIVIDUALLY.
LS0tCnRpdGxlOiAiRXhhbSAxIFByYWN0aWNlIFBhcnQgdjUiCmF1dGhvcjogU3RlZmFuIFNjaHdlaXR6ZXIgLSBBMDEyMDk3NTUKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKIyMgUFJPQkxFTSAxLiBBQk9VVCBCT05EIFZBTFVBVElPTgoKWW91IGhhdmUgdG8gdmFsdWF0ZSBhIGJvbmQgZm9yIDEwIGRpZmZlcmVudCBjb3Vwb24gcmF0ZXMuICBSZWFkIGRpcmVjdGlvbnM6CgpUaGUgY2hhcmFjdGVyaXN0aWNzIG9mIHRoaXMgYm9uZCBhcmU6CgotIFRpbWUgdG8gbWF0dXJpdHk6IDEwIHllYXJzOwoKLSBDb21wb3VuZGVkIG1vbnRobHk7CgotIEZhY2UgdmFsdWUgKHByaW5jaXBhbCkgaXMgJDgsMDAwLDAwMC4KCi0gQSBzcGVjaWZpYyBhbm51YWwgaW50ZXJlc3QgcmF0ZSAoeWllbGQgdG8gbWF0dXJpdHkpIG9mIDE1JQoKWW91IGhhdmUgdG8gdmFsdWF0ZSB0aGlzIGJvbmQgZm9yIDE2IGNvdXBvbiBhbm51YWwgcmF0ZXMgc3RhcnRpbmcgZnJvbSAxJSB1cCB0byAzJSwganVtcGluZyBieSAwLjIwJTogIENSID0gWzEuMDAlLCAxLjIwJSwgMS40MCUsIC4uLiAsIDIuNjAlLCAyLjgwJSwgMy4wMCVdCllvdSBNVVNUIHdyaXRlIGEgZnVuY3Rpb24gZm9yIHRoZSBib25kIHZhbHVhdGlvbiwgYW5kIHlvdSBNVVNUIHVzZSBhIGxvb3AgdG8gZ2V0IHRoZSAxNiBib25kIHZhbHVlcyBmb3IgdGhlIGRpZmZlcmVudCBjb3Vwb24gcmF0ZXMuCgpBdCB0aGUgZW5kLCB5b3UgaGF2ZSB0bzoKCiAgYSkgU2F2ZSAoaW4gc29tZSBwbGFjZSBsaWtlIGEgbWF0cml4KSB0aGUgMTYgZGlmZmVyZW50IHZhbHVlcyBvZiB0aGUgYm9uZCB2YWx1YXRpb24sIGFuZCB0aGUgMTYgY291cG9uIHJhdGVzLiAKCiAgYikgRG8gYSBwbG90IHRvIHNob3cgaG93IHRoZSB2YWx1ZSBvZiB0aGUgYm9uZCBjaGFuZ2VzIHdpdGggdGhlIDE2IGRpZmZlcmVudCBjb3Vwb24gcmF0ZXMKICAKICAKIyMgUFJPQkxFTSAxLiBBQk9VVCBCT05EIFZBTFVBVElPTiBTT0xVVElPTgpXT1JLU0hPUCAyIFBSRVNFTlRFRCBBIENIQUxMRU5HRSBXSEVSRSBXRSBTT0xWRUQgRk9SIEJPTkQgUFJJQ0UsIFRIRSBESUZFUkVOQ0UgQkVJTkcgVEhBVCBXT1JLU0hPUCAyIEhBRCBJTlRFUkVTVCBBUyBUSEUgSU5ERVBFTkRFTlQgVkFSSUFCTEUgQU5EIElOIFRISVMgQ0FTRSBJTlRFUkVTVCBXQVMgRklYRUQgQU5EIFRIRSBERVBFTkRFTlQgVkFSSUFCTEUgV0FTIFRIRSBDT1VQT04gUkFURQoKVEhFUkVGT1JFLCBNWSBBUFJPQUNIIFdBUyBUTyBXT1JLIFdJVEggVkVDVE9SUyBGT1IgQ0FTSCBGTE9XUywgQ0FMQ1VMQVRFIFRIRSBQUkVTRU5UIFZBTFVFUyBPRiBFQUNIIENBU0ggRkxPVyBBTkQgQ09VUE9OIFBFUklPRFMsIEFORCBUSEVOIElMTCBPQlRBSU4gVEhFIEJPTkRQUklDRSAKCkZJUlNUIEknTSBHT0lORyBUTyBPUkdBTklaRSBUSEUgREFUQSBQUkVTRU5URUQgSU4gVEhFIFBST0JMRU0KCkJPTkQKUFJJTkNJUEFMOiAkOCwwMDAsMDAwClRpbWUgdG8gbWF0dXJpdHk6IDEwIHllYXJzCkFOTlVBTCBSYXRlIChZVE0pOiAxNSUKQ29tcG91bmRlZCBNb250aGx5CkZST00gMSUgLSAzJQoKVEhFTiBJIFdJTEwgQVBQTFkgU09NRSBMSU5FUyBPRiBDT0RFIFRIQVQgV0lMTCBIRUxQIE1FIFZBTFVFIFRIRSBCT05EUwoKIyBCT05EIDEKYGBge3J9CmJvbmRwcmljZTwtZnVuY3Rpb24ocHJpbmNpcGFsLHR0bSxjb3Vwb25yYXRlLGludGVyZXN0cmF0ZSxwZXJpb2RzKSB7CiAgIyBwZXJpb2RzIGlzIHRoZSAjIG9mIHBlcmlvZHMgaW4gdGhlIHllYXIgZm9yIHRoZSBjb21wb3VuZGluZyBvZiBpbnRlcmVzdHMKICAjIEkgY2FsY3VsYXRlIHRoZSBjb3Vwb24gYW1vdW50IHBlciBwZXJpb2Q6CiAgY291cG9uPShjb3Vwb25yYXRlL3BlcmlvZHMpKnByaW5jaXBhbAogICMgSSBjcmVhdGUgYSB2ZWN0b3IgZm9yIHRoZSBjYXNoZmxvd3MuIFRoZSBsYXN0IGNhc2hmbG93IG11c3QgYmUgZXF1YWwgdG8gCiAgIyAgIHRoZSBjb3Vwb24gcGx1cyB0aGUgcHJpbmNpcGFsCiAgY2Y8LWMocmVwKGNvdXBvbix0dG0qcGVyaW9kcy0xKSxjb3Vwb24rcHJpbmNpcGFsKQogICMgIEkgdXNlZCB0aGUgcmVwIGZ1bmN0aW9uIHRoYXQgcmVwZWF0cyB0dG0qcGVyaW9kcy0xIHRpbWVzIHRoZSBjb3Vwb24gYW1vdW50CiAgIyAgVGhlbiB0aGUgdmVjdG9yIGNmIHdpbGwgaGF2ZSBhbGwgZml4ZWQgY291cG9uIHBheW1lbnRzLCBhbmQgdGhlIGVuZCBwYXltZW50CiAgIyAgIHdpbGwgYmUgZXF1YWwgdG8gdGhlIGNvdXBvbiBwbHVzIHRoZSBwcmluY2lwYWwKICAKICAjIEkgY3JlYXRlIGEgdmVjdG9yIGZvciB0aGUgZXhwb25lbnRzIHRoYXQgSSBuZWVkIHRvIHVzZSBmb3IgdGhlIGRpc2NvdW50IGZhY3RvcjoKICAjIEkgdXNlIHRoZSBzZXEgZnVuY3Rpb24gdGhhdCBjcmVhdGVzIHNlcXVlbnRpYWwgbnVtYmVycyBmcm9tIDEgdG8gdGhlIGxhc3QgcGVyaW9kCiAgZXhwb25lbnRzPC1zZXEoMSx0dG0qcGVyaW9kcykKICAjIEkgY3JlYXRlIGEgdmVjdG9yIHdpdGggdGhlIGRpc2NvdW50IGZhY3RvcnMgKDEvKDErcGVyaW9kcmF0ZSledCkKICBkaXNjb3VudGZhY3RvcnMgPC0gMSAvICgxK2ludGVyZXN0cmF0ZS9wZXJpb2RzKV5leHBvbmVudHMKICAKICAjIEkgZ2V0IHRoZSBzdW0gb2YgYWxsIHByZXNlbnQgdmFsdWVzLiBUaGUgcHJlc2VudCB2YWx1ZXMgYXJlIGVxdWFsIHRvCiAgIyAgIHRoZSBjYXNoIGZsb3cgdGltZXMgdGhlIGNvcnJlc3BvbmRpbmcgZGlzY291bnQgZmFjdG9yOgogIHByZXNlbnR2YWx1ZSA8LSAgc3VtKGNmKmRpc2NvdW50ZmFjdG9ycykKICAjIFNpbmNlIHRoZSBvdXRwdXQgb2YgdGhpcyBmdW5jdGlvbiBpcyB0aGlzIHZhbHVlLCB0aGVuIAogICMgIEkgcmV0dXJuIHRoaXMgcHJlc2VudCB2YWx1ZSBhcyB0aGUgYm9uZCBwcmljZToKICByZXR1cm4ocHJlc2VudHZhbHVlKQp9CgojIE9uY2UgSSBoYXZlIG15IGZ1bmN0aW9uLCBJIGp1c3QgY2FsbCBteSBmdW5jdGlvbiB3aXRoIHRoZSBwYXJhbWV0ZXJzIHNwZWNpZmllZCAKIyAgaW4gdGhlIHByb2JsZW0uIAojIEkgcnVuIG15IGZ1bmN0aW9uIDE2IHRpbWVzIGZvciB0aGUgMTYgY291cG9uIHJhdGVzOiAKYm9uZDEgPC0gYm9uZHByaWNlKDgwMDAwMDAsMTAsMC4wMSwwLjE1LDEyKQpwcmludCgiVGhlIGJvbmQgcHJpY2Ugd2hlbiBjb3Vwb24gcmF0ZSBpcyAxJSBpcyAiKQpgYGAKYGBge3J9CnNwcmludGYoIiQgJTMuMmYiLCBib25kMSkKYGBgCgojIEJPTkQgMgpgYGB7cn0KIyBJIHJ1biB0aGUgYm9uZHByaWNlIGZ1bmN0aW9uIHdpdGggdGhlIGxhc3QgcGFyYW1ldGVyPTEyIHNpbmNlIHRoZSBwcm9ibGVtIHNwZWNpZmllcwojICAgdGhhdCB0aGUgY29tcG91bmRlZCBpcyBtb250aGx5eSwgdGhlbiBwZXJpb2RzIGluIHRoZSB5ZWFyPTEyCmJvbmQyPC0gYm9uZHByaWNlKDgwMDAwMDAsMTAsMC4wMTIsMC4xNSwxMikKcHJpbnQoIlRoZSBib25kIHByaWNlIHdoZW4gY291cG9uIHJhdGUgaXMgMS4yJSBpcyAiKQpgYGAKYGBge3J9CnNwcmludGYoIiQgJTMuMmYiLCBib25kMikKYGBgCgpCT05EIDMKYGBge3J9CmJvbmQzPC0gYm9uZHByaWNlKDgwMDAwMDAsMTAsMC4wMTQsMC4xNSwxMikKcHJpbnQoIlRoZSBib25kIHByaWNlIHdoZW4gdGhlIGNvdXBvbiByYXRlIGlzIDEuNCUgaXMgIikKYGBgCmBgYHtyfQpzcHJpbnRmKCIkICUzLjJmIiwgYm9uZDMgKQpgYGAKIyBCT05EIDQKCmBgYHtyfQpib25kNDwtIGJvbmRwcmljZSg4MDAwMDAwLDEwLDAuMDE2LDAuMTUsMTIpCnByaW50KCJUaGUgYm9uZCBwcmljZSB3aGVuIHRoZSBjb3Vwb24gcmF0ZSBpcyAxLjYlIGlzICIpCmBgYApgYGB7cn0Kc3ByaW50ZigiJCAlMy4yZiIsIGJvbmQ0ICkKYGBgCgojIEJPTkQgNQpgYGB7cn0KYm9uZDU8LSBib25kcHJpY2UoODAwMDAwMCwxMCwwLjAxOCwwLjE1LDEyKQpwcmludCgiVGhlIGJvbmQgcHJpY2Ugd2hlbiB0aGUgY291cG9uIHJhdGUgaXMgMS44JSBpcyAiKQpgYGAKYGBge3J9CnNwcmludGYoIiQgJTMuMmYiLCBib25kNSApCmBgYAoKIyBCT05EIDYKYGBge3J9CmJvbmQ2PC0gYm9uZHByaWNlKDgwMDAwMDAsMTAsMC4wMiwwLjE1LDEyKQpwcmludCgiVGhlIGJvbmQgcHJpY2Ugd2hlbiB0aGUgY291cG9uIHJhdGUgaXMgMiUgaXMgIikKYGBgCmBgYHtyfQpzcHJpbnRmKCIkICUzLjJmIiwgYm9uZDYgKQpgYGAKCiMgQk9ORCA3CmBgYHtyfQpib25kNzwtIGJvbmRwcmljZSg4MDAwMDAwLDEwLDAuMDIyLDAuMTUsMTIpCnByaW50KCJUaGUgYm9uZCBwcmljZSB3aGVuIHRoZSBjb3Vwb24gcmF0ZSBpcyAyLjIlIGlzICIpCmBgYApgYGB7cn0Kc3ByaW50ZigiJCAlMy4yZiIsIGJvbmQ3ICkKYGBgCiMgQk9ORCA4CmBgYHtyfQpib25kODwtIGJvbmRwcmljZSg4MDAwMDAwLDEwLDAuMDI0LDAuMTUsMTIpCnByaW50KCJUaGUgYm9uZCBwcmljZSB3aGVuIHRoZSBjb3Vwb24gcmF0ZSBpcyAyLjQlIGlzICIpCmBgYApgYGB7cn0Kc3ByaW50ZigiJCAlMy4yZiIsIGJvbmQ4ICkKYGBgCgojIEJPTkQgOQpgYGB7cn0KYm9uZDk8LSBib25kcHJpY2UoODAwMDAwMCwxMCwwLjAyNiwwLjE1LDEyKQpwcmludCgiVGhlIGJvbmQgcHJpY2Ugd2hlbiB0aGUgY291cG9uIHJhdGUgaXMgMi42JSBpcyAiKQpgYGAKYGBge3J9CnNwcmludGYoIiQgJTMuMmYiLCBib25kOSApCmBgYAoKIyBCT05EIDEwCmBgYHtyfQpib25kMTA8LSBib25kcHJpY2UoODAwMDAwMCwxMCwwLjAyOCwwLjE1LDEyKQpwcmludCgiVGhlIGJvbmQgcHJpY2Ugd2hlbiB0aGUgY291cG9uIHJhdGUgaXMgMi44JSBpcyAiKQpgYGAKYGBge3J9CnNwcmludGYoIiQgJTMuMmYiLCBib25kMTAgKQpgYGAKCiMgQk9ORCAxMQpgYGB7cn0KYm9uZDExPC0gYm9uZHByaWNlKDgwMDAwMDAsMTAsMC4wMywwLjE1LDEyKQpwcmludCgiVGhlIGJvbmQgcHJpY2Ugd2hlbiB0aGUgY291cG9uIHJhdGUgaXMgMyUgaXMgIikKYGBgCmBgYHtyfQpzcHJpbnRmKCIkICUzLjJmIiwgYm9uZDExICkKYGBgCgojIyBNQVRSSVgKYGBge3J9CiMgSSBDUkVBVEUgQSBNQVRSSVggQ09OVEFJTklORyBUSEUgMTEgRElGRkVSRU5UIEJPTkQgVkFMVUFUSU9OUzogQk9ORCBWQUxVQVRJT04gTUFUUklYIChCVk0pCkJWTTwtbWF0cml4KGMoYm9uZDEsIGJvbmQyLCBib25kMywgYm9uZDQsIGJvbmQ1LCBib25kNiwgYm9uZDcsIGJvbmQ4LCBib25kOSwgYm9uZDEwLCBib25kMTEpLG5yb3c9MSxuY29sPTExKQpCVk0KYGBgCmBgYHtyfQojIEkgQ1JFQVRFIE9CSkVDVFMgRk9SIEFMTCBDT1VQT04gUkFURVMKQ1IxIDwtIDEKQ1IyIDwtIDEuMgpDUjMgPC0gMS40CkNSNCA8LSAxLjYKQ1I1IDwtIDEuOApDUjYgPC0gMgpDUjcgPC0gMi4yCkNSOCA8LSAyLjQKQ1I5IDwtIDIuNgpDUjEwIDwtIDIuOApDUjExIDwtIDMKYGBgCgoKCmBgYHtyfQojIFRIRU4gSSBDUkVBVEUgQSBNQVRSSVggQ09OVEFJTklORyBUSEUgMTEgRElGRkVSRU5UIEJPTkQgQ09VUE9OIFJBVEVTOiBCT05EIENPVVBPTiBSQVRFIE1BVFJJWCAoQkNSTSkKQkNSTTwtbWF0cml4KGMoQ1IxLENSMixDUjMsQ1I0LENSNSxDUjYsQ1I3LENSOCxDUjksQ1IxMCxDUjExKSxucm93PTEsbmNvbD0xMSkKQkNSTQpgYGAKCiMgSSB0aGVuIGdyYXBoIG15IGJvbmRzCmBgYHtyfQpwbG90KEJDUk0pCnBsb3QoQlZNKQpgYGAKYGBge3J9CnBsb3QoYm9uZDEsIENSMSkKcGxvdChib25kMiwgQ1IyKQpwbG90KGJvbmQzLCBDUjMpCnBsb3QoYm9uZDQsIENSNCkKcGxvdChib25kNSwgQ1I1KQpwbG90KGJvbmQ2LCBDUjYpCnBsb3QoYm9uZDcsIENSNykKcGxvdChib25kOCwgQ1I4KQpwbG90KGJvbmQ5LCBDUjkpCnBsb3QoYm9uZDEwLCBDUjEwKQpwbG90KGJvbmQxMSwgQ1IxMSkKCmBgYApGSU5BTExZIEkgV0FOVEVEIFRPIENSRUFURSBBIEdSQVBIIFRIQVQgSEFEIEFMTCBUSEUgQk9ORFMgQU5EIENPVVBPTiBSQVRFUyBDT01QQVNTRUQgSU4gT05FIEdSQVBILCBCVVQgV0hFTiBUUllJTkcgVE8gRE8gVEhJUyBJIENPVUxEIE9OTFkgR1JBUEggT0JKRUNUUyBJTkRJVklEVUFMTFkuCgo=