About

In this worksheet we look at different distribution functions, sampling methods, and probability calculations. Next we consider a calculation of a Europen option using Monte Carlo simulation, and compare results to calculation using Black-Scholes.

Setup

Remember to always set your working directory to the source file location. Go to ‘Session’, scroll down to ‘Set Working Directory’, and click ‘To Source File Location’. Read carefully the below and follow the instructions to complete the tasks and answer any questions. Submit your work to RPubs as detailed in previous notes.

Note

Always read carefully the instructions on Sakai. For clarity, tasks/questions to be completed/answered are highlighted in red color (visible in preview) and numbered according to their particular placement in the task section. Quite often you will need to add your own code chunk.

Execute all code chunks, preview, publish, and submit link on Sakai follwoing the naming convention. Make sure to add comments to your code where appropriate. Use own language!


Task 1: Distribution, Sampling & Probability

#Install package quantmod 
if(!require("quantmod",quietly = TRUE))
  install.packages("quantmod",dependencies = TRUE, repos = "https://cloud.r-project.org")
#Install package fOptions 
if(!require("fOptions",quietly = TRUE))
  install.packages("fOptions",dependencies = TRUE, repos = "https://cloud.r-project.org")

Consider the free cash flow example with an estimated range set by a minimum of -$25M and maximum $275M. We start by generating a sample random set. Following is an example to generate a random set of 10 data points from a uniform distribution with probability \(\frac{1}{b-a}\), a minimum of a, and a maximum of b.

ud = runif(10, min=5, max=15) # runif is in reference to uniform distribution

# Other R functions needed for this task are hist(), mean(), sd(), punif(), runif(),  pnorm(), and rnorm(). Check the Help command in R for more details about these functions.

##### 1A) Assuming a uniform probability distribution, generate a sample of 100 random observations (or deviates) representing the cash flows

ud100=runif(100,min=-25000000,max=275000000)

Next we plot a histogram to describe the generated sample data, and calculate the mean and standard deviation of the sample using the proper R-functions

##### 1B) Plot a histogram and calculate the mean and standard deviation of your sample. Compare the mean and standard deviation of the sample to the theoretical values obtained using the proper formulas.

hist(ud100,main = "Histogram of 100 Uniform Samples samples",xlab = "Cash Flow $")

print(mean(ud100))
[1] 132138230
print(sd(ud100))
[1] 84723825
print((275000000 - 25000000)/2)
[1] 1.25e+08
print(sqrt(((275000000 - -25000000)^2)/12))
[1] 86602540

The expected mean is 125000000 compared to the sample mean of 132138230. The expected standard deviation is 86602540 compared to the sample standard deviation of 84723825 The mean is 5.71% greater and the standard deviation is 2.17% smaller so both are fairly close to the expected.

##### 1C) Repeat 1A & 1B above by increasing the sample size to 1000. Share your insights.

#ud1000=runif(1000,min=-25000000,max=275000000)
hist(ud1000,main = "Histogram of 1000 Uniform Samples",xlab = "Cash Flow $")

mean(ud1000)
[1] 128682721
sd(ud1000)
[1] 85012920

The expected mean is 125000000 compared to the sample mean of 128682721. The expect standard deviation is 86602540 compared to the sample standard deviation of 85012920. By increasing the sample size from 100 to 1000, the data is becoming more representative of a uniform distribution and both the mean and standard deviation are getting closer to the theoretical values.

Given the characteristics of a probability distribution we should be able to compute various probability scenarios using the proper functions in R.

##### 1D) Calculate the probability that the free cash flow is negative

punif(0,min=-25000000,275000000)
[1] 0.08333333

We will now repeat the above exercises 1A, 1B, 1C using instead a normal distribution.

##### 1E) Repeat steps A-C for the case of a portfolio daily returns with normal probability distribution,a mean=1.2% and a standard deviation= 3.7%

norm100=rnorm(100,mean=.012,sd=.037)
hist(norm100,main = "Histogram of 100 Normal Samples",xlab = "Cash Flow $")

norm1000=rnorm(1000,mean=.012,sd=.037)
hist(norm1000,main = "Histogram of 1000 Normal Samples",xlab = "Cash Flow $")

print(mean(norm100))
[1] 0.0140233
print(mean(norm1000))
[1] 0.01307902
print(sd(norm100))
[1] 0.03906649
print(sd(norm1000))
[1] 0.03747569

Similar to the uniform distribution example, the mean and standard deviation become closer to approaching the theoretical values as the sample size increases from 100 to 1000.

Similarly we should be able to compute various probability senarios with our obtained normal distribution.

##### 1F) Calculate the probability that returns will be negative using the values for mean and standard deviation as in 1E

pnorm(0,mean=.012,sd=.037)
[1] 0.3728463

##### 1G) Repeat the calculation in 1F using instead the standard Z-value. Share insights.

\((0 - .012)/(.037) = -.32\) After rounding, the corresponding value on the Z table is .3745, which is close to the given standard deviation .37.
### Task 2: MC Simulation & European Option Pricing

Follow the Algorithm 5.2 example on p 167 (*) to calculate the price of a European option using a MC simulation. Note that the code in the book example is missing one detail and a correction. Those are left for your investigation.

##### 2A) Identify and explain the nature of the missing detail and the correction needed.

EulerMC = function(Type, S0, K, T, r, n, sigma, m, dt = T/n){
sum = 0;
for (i in 1 : m){
  S = S0;
  for(j in 1:n){
    E = rnorm(1, 0, 1);
    S = S + r * S * dt + sigma * S * sqrt(dt) * E; }
  if (Type == "c" ){payoff = max(S - K,0) }
  else if(Type =="p"){payoff = max(K - S,0)}
  else {payoff = max(S - K, 0) }
  sum = sum + payoff }
OptionValue=(sum*exp(-r*T))/m;
return(OptionValue)}

Line 4 E = rnorm(0,1) is missing an argument and needs to be changed to E = rnorm(1,0,1), otherwise it will return 0. The function currently doesn’t reset S when calculating different paths. Between the two for loops, there needs to be an addition of S = S0.

Given the MC simulation we should be able to price a European option. Note the introduction of user defined function in the book. Below is an example of a user defined function and usage. The function returns the squared value.

myfunction <- function(x=2){
  y=x^2
return(y)}

myfunction(x=5)

##### 2B) Use MC simulation to price a European Call option on a stock with initial price of $155, strike price $140, a time to expiration equal to six months, a risk-free interest rate of 2.5% and a volatility of 23%. Consider a number of periods n=100 and a number of simulations m=1000

EulerMC(Type = "c", S0 = 155, K = 140, T = 1/2, r = 0.025, n = 100, sigma = 0.23,m = 1000)
[1] 20.86856

##### 2C) Write the mathematical representation of the discrete pricing equation modeled in the MC simulation. Explain what each variable in the equation represents, and provide the associated numerical value.

\(S_{t+{\Delta}t} = S_t+r*S_t*{\Delta}t+{\sigma}*S_t*Rnd*\sqrt{{\Delta}t}\) \(S_t\) is the price of the previous period, initially \(S_0\) which is 155. \({\Delta}t\) is the step size T/n = .5/100 = .005. {} is the volatility .23. Rnd is a random number normally distributed with mean 0 and standard deviation 1.

##### 2D) Compare the price obtained from the MC simulation to the option price using the Black-Scholes function pricing GBSOption(). Share insights.

#EulerMC(Type = "c", S0 = 155, K = 140, T = 1/2, r = 0.025, n = 1, sigma = 0.23,m = 1000)
GBSOption(TypeFlag = "c", S = 155, X = 140, Time = 1/2, r = .025,b = .025, sigma = 0.23)

Title:
 Black Scholes Option Valuation 

Call:
 GBSOption(TypeFlag = "c", S = 155, X = 140, Time = 1/2, r = 0.025, 
     b = 0.025, sigma = 0.23)

Parameters:
          Value:
 TypeFlag c     
 S        155   
 X        140   
 Time     0.5   
 r        0.025 
 b        0.025 
 sigma    0.23  

Option Price:
 20.11899 

Description:
 Tue Jan 29 22:14:15 2019 

The price obtained from the MC simulation is 20.86856 compared to the Black-Scholes price of 20.11899. These values are close to each other, but for this small number of samples done for the MC simulation I imagine that the Black-Scholes would be more trustworthy. *http://computationalfinance.lsi.upc.edu

LS0tCnRpdGxlOiAiRklOQzYyMSBXaW50ZXIgMjAxOC0xOSBMYWIgV29ya3NoZWV0IDA2IgphdXRob3I6ICJEZWlvbiBGb3N0ZXIiCmRhdGU6ICIxLzMwLzIwMTkiCm91dHB1dDoKICBodG1sX25vdGVib29rOiBkZWZhdWx0CiAgaHRtbF9kb2N1bWVudDogZGVmYXVsdApzdWJ0aXRsZTogRGlzdHJpYnV0aW9ucywgU2FtcGxpbmcgTWV0aG9kcyAmIE1vbnRlIENhcmxvIFNpbXVsYXRpb24gIChmaW5jNjIxLWxhYjA2KQotLS0KCiMjIyBBYm91dAoKSW4gdGhpcyB3b3Jrc2hlZXQgd2UgbG9vayBhdCBkaWZmZXJlbnQgZGlzdHJpYnV0aW9uIGZ1bmN0aW9ucywgc2FtcGxpbmcgbWV0aG9kcywgYW5kIHByb2JhYmlsaXR5IGNhbGN1bGF0aW9ucy4gIE5leHQgd2UgY29uc2lkZXIgYSBjYWxjdWxhdGlvbiBvZiBhIEV1cm9wZW4gb3B0aW9uIHVzaW5nIE1vbnRlIENhcmxvIHNpbXVsYXRpb24sIGFuZCBjb21wYXJlIHJlc3VsdHMgdG8gY2FsY3VsYXRpb24gdXNpbmcgQmxhY2stU2Nob2xlcy4KCiMjIyBTZXR1cAoKUmVtZW1iZXIgdG8gYWx3YXlzIHNldCB5b3VyIHdvcmtpbmcgZGlyZWN0b3J5IHRvIHRoZSBzb3VyY2UgZmlsZSBsb2NhdGlvbi4gR28gdG8gJ1Nlc3Npb24nLCBzY3JvbGwgZG93biB0byAnU2V0IFdvcmtpbmcgRGlyZWN0b3J5JywgYW5kIGNsaWNrICdUbyBTb3VyY2UgRmlsZSBMb2NhdGlvbicuIFJlYWQgY2FyZWZ1bGx5IHRoZSBiZWxvdyBhbmQgZm9sbG93IHRoZSBpbnN0cnVjdGlvbnMgdG8gY29tcGxldGUgdGhlIHRhc2tzIGFuZCBhbnN3ZXIgYW55IHF1ZXN0aW9ucy4gIFN1Ym1pdCB5b3VyIHdvcmsgdG8gUlB1YnMgYXMgZGV0YWlsZWQgaW4gcHJldmlvdXMgbm90ZXMuIAoKIyMjIE5vdGUKCkFsd2F5cyByZWFkIGNhcmVmdWxseSB0aGUgaW5zdHJ1Y3Rpb25zIG9uIFNha2FpLiAgRm9yIGNsYXJpdHksIHRhc2tzL3F1ZXN0aW9ucyB0byBiZSBjb21wbGV0ZWQvYW5zd2VyZWQgYXJlIGhpZ2hsaWdodGVkIGluIHJlZCBjb2xvciAodmlzaWJsZSBpbiBwcmV2aWV3KSBhbmQgbnVtYmVyZWQgYWNjb3JkaW5nIHRvIHRoZWlyIHBhcnRpY3VsYXIgcGxhY2VtZW50IGluIHRoZSB0YXNrIHNlY3Rpb24uICBRdWl0ZSBvZnRlbiB5b3Ugd2lsbCBuZWVkIHRvIGFkZCB5b3VyIG93biBjb2RlIGNodW5rLgoKRXhlY3V0ZSBhbGwgY29kZSBjaHVua3MsIHByZXZpZXcsIHB1Ymxpc2gsIGFuZCBzdWJtaXQgbGluayBvbiBTYWthaSBmb2xsd29pbmcgdGhlIG5hbWluZyBjb252ZW50aW9uLiBNYWtlIHN1cmUgdG8gYWRkIGNvbW1lbnRzIHRvIHlvdXIgY29kZSB3aGVyZSBhcHByb3ByaWF0ZS4gVXNlIG93biBsYW5ndWFnZSEKCi0tLS0tLS0tLS0tLS0tCgojIyMgVGFzayAxOiBEaXN0cmlidXRpb24sIFNhbXBsaW5nICYgUHJvYmFiaWxpdHkKCgpgYGB7cn0KI0luc3RhbGwgcGFja2FnZSBxdWFudG1vZCAKaWYoIXJlcXVpcmUoInF1YW50bW9kIixxdWlldGx5ID0gVFJVRSkpCiAgaW5zdGFsbC5wYWNrYWdlcygicXVhbnRtb2QiLGRlcGVuZGVuY2llcyA9IFRSVUUsIHJlcG9zID0gImh0dHBzOi8vY2xvdWQuci1wcm9qZWN0Lm9yZyIpCmBgYApgYGB7cn0KI0luc3RhbGwgcGFja2FnZSBmT3B0aW9ucyAKaWYoIXJlcXVpcmUoImZPcHRpb25zIixxdWlldGx5ID0gVFJVRSkpCiAgaW5zdGFsbC5wYWNrYWdlcygiZk9wdGlvbnMiLGRlcGVuZGVuY2llcyA9IFRSVUUsIHJlcG9zID0gImh0dHBzOi8vY2xvdWQuci1wcm9qZWN0Lm9yZyIpCmBgYApDb25zaWRlciB0aGUgZnJlZSBjYXNoIGZsb3cgZXhhbXBsZSB3aXRoIGFuIGVzdGltYXRlZCByYW5nZSBzZXQgYnkgYSBtaW5pbXVtIG9mIC0kMjVNIGFuZCBtYXhpbXVtICQyNzVNLiBXZSBzdGFydCBieSBnZW5lcmF0aW5nIGEgc2FtcGxlIHJhbmRvbSBzZXQuIEZvbGxvd2luZyBpcyBhbiBleGFtcGxlIHRvIGdlbmVyYXRlIGEgcmFuZG9tIHNldCBvZiAxMCBkYXRhIHBvaW50cyBmcm9tIGEgdW5pZm9ybSBkaXN0cmlidXRpb24gd2l0aCBwcm9iYWJpbGl0eSAkXGZyYWN7MX17Yi1hfSQsIGEgbWluaW11bSBvZiBhLCBhbmQgYSBtYXhpbXVtIG9mIGIuCgoKCmBgYHtyfQp1ZCA9IHJ1bmlmKDEwLCBtaW49NSwgbWF4PTE1KSAjIHJ1bmlmIGlzIGluIHJlZmVyZW5jZSB0byB1bmlmb3JtIGRpc3RyaWJ1dGlvbgoKIyBPdGhlciBSIGZ1bmN0aW9ucyBuZWVkZWQgZm9yIHRoaXMgdGFzayBhcmUgaGlzdCgpLCBtZWFuKCksIHNkKCksIHB1bmlmKCksIHJ1bmlmKCksICBwbm9ybSgpLCBhbmQgcm5vcm0oKS4gQ2hlY2sgdGhlIEhlbHAgY29tbWFuZCBpbiBSIGZvciBtb3JlIGRldGFpbHMgYWJvdXQgdGhlc2UgZnVuY3Rpb25zLgpgYGAKCjxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPgojIyMjIyAxQSkgQXNzdW1pbmcgYSB1bmlmb3JtIHByb2JhYmlsaXR5IGRpc3RyaWJ1dGlvbiwgIGdlbmVyYXRlIGEgc2FtcGxlIG9mIDEwMCByYW5kb20gb2JzZXJ2YXRpb25zIChvciBkZXZpYXRlcykgcmVwcmVzZW50aW5nIHRoZSBjYXNoIGZsb3dzCjwvc3Bhbj4KCmBgYHtyfQp1ZDEwMD1ydW5pZigxMDAsbWluPS0yNTAwMDAwMCxtYXg9Mjc1MDAwMDAwKQpgYGAKTmV4dCB3ZSBwbG90IGEgaGlzdG9ncmFtIHRvIGRlc2NyaWJlIHRoZSBnZW5lcmF0ZWQgc2FtcGxlIGRhdGEsIGFuZCBjYWxjdWxhdGUgdGhlIG1lYW4gYW5kIHN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgc2FtcGxlIHVzaW5nIHRoZSBwcm9wZXIgUi1mdW5jdGlvbnMKCjxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPgojIyMjIyAxQikgUGxvdCBhIGhpc3RvZ3JhbSBhbmQgY2FsY3VsYXRlIHRoZSBtZWFuIGFuZCBzdGFuZGFyZCBkZXZpYXRpb24gb2YgeW91ciBzYW1wbGUuIENvbXBhcmUgdGhlIG1lYW4gYW5kIHN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgc2FtcGxlIHRvIHRoZSB0aGVvcmV0aWNhbCB2YWx1ZXMgb2J0YWluZWQgdXNpbmcgdGhlIHByb3BlciBmb3JtdWxhcy4gCjwvc3Bhbj4KYGBge3J9Cmhpc3QodWQxMDAsbWFpbiA9ICJIaXN0b2dyYW0gb2YgMTAwIFVuaWZvcm0gU2FtcGxlcyBzYW1wbGVzIix4bGFiID0gIkNhc2ggRmxvdyAkIikKcHJpbnQobWVhbih1ZDEwMCkpCnByaW50KHNkKHVkMTAwKSkKcHJpbnQoKDI3NTAwMDAwMCAtIDI1MDAwMDAwKS8yKQpwcmludChzcXJ0KCgoMjc1MDAwMDAwIC0gLTI1MDAwMDAwKV4yKS8xMikpCmBgYAo8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZSI+ClRoZSBleHBlY3RlZCBtZWFuIGlzIDEyNTAwMDAwMCBjb21wYXJlZCB0byB0aGUgc2FtcGxlIG1lYW4gb2YgMTMyMTM4MjMwLiBUaGUgZXhwZWN0ZWQgc3RhbmRhcmQgZGV2aWF0aW9uIGlzIDg2NjAyNTQwIGNvbXBhcmVkIHRvIHRoZSBzYW1wbGUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIDg0NzIzODI1IFRoZSBtZWFuIGlzIDUuNzElIGdyZWF0ZXIgYW5kIHRoZSBzdGFuZGFyZCBkZXZpYXRpb24gaXMgMi4xNyUgc21hbGxlciBzbyBib3RoIGFyZSBmYWlybHkgY2xvc2UgdG8gdGhlIGV4cGVjdGVkLgo8L3NwYW4+Cgo8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4KIyMjIyMgMUMpIFJlcGVhdCAxQSAmIDFCICBhYm92ZSBieSBpbmNyZWFzaW5nIHRoZSBzYW1wbGUgc2l6ZSB0byAxMDAwLiBTaGFyZSB5b3VyIGluc2lnaHRzLgo8L3NwYW4+CmBgYHtyfQp1ZDEwMDA9cnVuaWYoMTAwMCxtaW49LTI1MDAwMDAwLG1heD0yNzUwMDAwMDApCmhpc3QodWQxMDAwLG1haW4gPSAiSGlzdG9ncmFtIG9mIDEwMDAgVW5pZm9ybSBTYW1wbGVzIix4bGFiID0gIkNhc2ggRmxvdyAkIikKbWVhbih1ZDEwMDApCnNkKHVkMTAwMCkKYGBgCjxzcGFuIHN0eWxlPSJjb2xvcjpibHVlIj4KVGhlIGV4cGVjdGVkIG1lYW4gaXMgMTI1MDAwMDAwIGNvbXBhcmVkIHRvIHRoZSBzYW1wbGUgbWVhbiBvZiAxMjg2ODI3MjEuIFRoZSBleHBlY3Qgc3RhbmRhcmQgZGV2aWF0aW9uIGlzIDg2NjAyNTQwIGNvbXBhcmVkIHRvIHRoZSBzYW1wbGUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIDg1MDEyOTIwLiBCeSBpbmNyZWFzaW5nIHRoZSBzYW1wbGUgc2l6ZSBmcm9tIDEwMCB0byAxMDAwLCB0aGUgZGF0YSBpcyBiZWNvbWluZyBtb3JlIHJlcHJlc2VudGF0aXZlIG9mIGEgdW5pZm9ybSBkaXN0cmlidXRpb24gYW5kIGJvdGggdGhlIG1lYW4gYW5kIHN0YW5kYXJkIGRldmlhdGlvbiBhcmUgZ2V0dGluZyBjbG9zZXIgdG8gdGhlIHRoZW9yZXRpY2FsIHZhbHVlcy4gCjwvc3Bhbj4KCkdpdmVuIHRoZSBjaGFyYWN0ZXJpc3RpY3Mgb2YgYSBwcm9iYWJpbGl0eSBkaXN0cmlidXRpb24gd2Ugc2hvdWxkIGJlIGFibGUgdG8gY29tcHV0ZSB2YXJpb3VzIHByb2JhYmlsaXR5IHNjZW5hcmlvcyB1c2luZyB0aGUgcHJvcGVyIGZ1bmN0aW9ucyBpbiBSLgoKPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+CiMjIyMjIDFEKSBDYWxjdWxhdGUgdGhlIHByb2JhYmlsaXR5IHRoYXQgdGhlIGZyZWUgY2FzaCBmbG93IGlzIG5lZ2F0aXZlCjwvc3Bhbj4KYGBge3J9CnB1bmlmKDAsbWluPS0yNTAwMDAwMCwyNzUwMDAwMDApCmBgYApXZSB3aWxsIG5vdyByZXBlYXQgdGhlIGFib3ZlIGV4ZXJjaXNlcyAxQSwgMUIsIDFDIHVzaW5nIGluc3RlYWQgYSBub3JtYWwgZGlzdHJpYnV0aW9uLiAKCjxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPgojIyMjIyAxRSkgUmVwZWF0IHN0ZXBzIEEtQyBmb3IgdGhlIGNhc2Ugb2YgYSBwb3J0Zm9saW8gZGFpbHkgcmV0dXJucyB3aXRoIG5vcm1hbCBwcm9iYWJpbGl0eSBkaXN0cmlidXRpb24sYSBtZWFuPTEuMiUgYW5kIGEgc3RhbmRhcmQgZGV2aWF0aW9uPSAzLjclCjwvc3Bhbj4KYGBge3J9Cm5vcm0xMDA9cm5vcm0oMTAwLG1lYW49LjAxMixzZD0uMDM3KQpoaXN0KG5vcm0xMDAsbWFpbiA9ICJIaXN0b2dyYW0gb2YgMTAwIE5vcm1hbCBTYW1wbGVzIix4bGFiID0gIkNhc2ggRmxvdyAkIikKbm9ybTEwMDA9cm5vcm0oMTAwMCxtZWFuPS4wMTIsc2Q9LjAzNykKaGlzdChub3JtMTAwMCxtYWluID0gIkhpc3RvZ3JhbSBvZiAxMDAwIE5vcm1hbCBTYW1wbGVzIix4bGFiID0gIkNhc2ggRmxvdyAkIikKcHJpbnQobWVhbihub3JtMTAwKSkKcHJpbnQobWVhbihub3JtMTAwMCkpCnByaW50KHNkKG5vcm0xMDApKQpwcmludChzZChub3JtMTAwMCkpCmBgYAo8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZSI+ClNpbWlsYXIgdG8gdGhlIHVuaWZvcm0gZGlzdHJpYnV0aW9uIGV4YW1wbGUsIHRoZSBtZWFuIGFuZCBzdGFuZGFyZCBkZXZpYXRpb24gYmVjb21lIGNsb3NlciB0byBhcHByb2FjaGluZyB0aGUgdGhlb3JldGljYWwgdmFsdWVzIGFzIHRoZSBzYW1wbGUgc2l6ZSBpbmNyZWFzZXMgZnJvbSAxMDAgdG8gMTAwMC4KPC9zcGFuPgoKU2ltaWxhcmx5IHdlIHNob3VsZCBiZSBhYmxlIHRvIGNvbXB1dGUgdmFyaW91cyBwcm9iYWJpbGl0eSBzZW5hcmlvcyB3aXRoIG91ciBvYnRhaW5lZCBub3JtYWwgZGlzdHJpYnV0aW9uLgoKPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+CiMjIyMjIDFGKSBDYWxjdWxhdGUgdGhlIHByb2JhYmlsaXR5IHRoYXQgcmV0dXJucyB3aWxsIGJlIG5lZ2F0aXZlIHVzaW5nIHRoZSB2YWx1ZXMgZm9yIG1lYW4gYW5kIHN0YW5kYXJkIGRldmlhdGlvbiBhcyBpbiAxRQo8L3NwYW4+CmBgYHtyfQpwbm9ybSgwLG1lYW49LjAxMixzZD0uMDM3KQpgYGAKPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+CiMjIyMjIDFHKSBSZXBlYXQgdGhlIGNhbGN1bGF0aW9uIGluIDFGIHVzaW5nIGluc3RlYWQgdGhlIHN0YW5kYXJkIFotdmFsdWUuIFNoYXJlIGluc2lnaHRzLgo8L3NwYW4+CgokKDAgLSAuMDEyKS8oLjAzNykgPSAtLjMyJAo8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZSI+CkFmdGVyIHJvdW5kaW5nLCB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSBvbiB0aGUgWiB0YWJsZSBpcyAuMzc0NSwgd2hpY2ggaXMgY2xvc2UgdG8gdGhlIGdpdmVuIHN0YW5kYXJkIGRldmlhdGlvbiAuMzcuICAKPC9zcGFuPgojIyMgVGFzayAyOiBNQyBTaW11bGF0aW9uICYgRXVyb3BlYW4gT3B0aW9uIFByaWNpbmcKCkZvbGxvdyB0aGUgYCBBbGdvcml0aG0gNS4yIGV4YW1wbGUgb24gcCAxNjcgKCopYCB0byBjYWxjdWxhdGUgdGhlIHByaWNlIG9mIGEgRXVyb3BlYW4gb3B0aW9uIHVzaW5nIGEgTUMgc2ltdWxhdGlvbi4gTm90ZSB0aGF0IHRoZSBjb2RlIGluIHRoZSBib29rIGV4YW1wbGUgaXMgbWlzc2luZyBvbmUgZGV0YWlsIGFuZCBhIGNvcnJlY3Rpb24uIFRob3NlIGFyZSBsZWZ0IGZvciB5b3VyIGludmVzdGlnYXRpb24uIAoKPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+CiMjIyMjIDJBKSBJZGVudGlmeSBhbmQgZXhwbGFpbiB0aGUgbmF0dXJlIG9mIHRoZSBtaXNzaW5nIGRldGFpbCBhbmQgdGhlIGNvcnJlY3Rpb24gbmVlZGVkLiAgICAgIAo8L3NwYW4+CmBgYHtyfQpFdWxlck1DID0gZnVuY3Rpb24oVHlwZSwgUzAsIEssIFQsIHIsIG4sIHNpZ21hLCBtLCBkdCA9IFQvbil7CnN1bSA9IDA7CmZvciAoaSBpbiAxIDogbSl7CiAgUyA9IFMwOwogIGZvcihqIGluIDE6bil7CiAgICBFID0gcm5vcm0oMSwgMCwgMSk7CiAgICBTID0gUyArIHIgKiBTICogZHQgKyBzaWdtYSAqIFMgKiBzcXJ0KGR0KSAqIEU7IH0KICBpZiAoVHlwZSA9PSAiYyIgKXtwYXlvZmYgPSBtYXgoUyAtIEssMCkgfQogIGVsc2UgaWYoVHlwZSA9PSJwIil7cGF5b2ZmID0gbWF4KEsgLSBTLDApfQogIGVsc2Uge3BheW9mZiA9IG1heChTIC0gSywgMCkgfQogIHN1bSA9IHN1bSArIHBheW9mZiB9Ck9wdGlvblZhbHVlPShzdW0qZXhwKC1yKlQpKS9tOwpyZXR1cm4oT3B0aW9uVmFsdWUpfQpgYGAKPHNwYW4gc3R5bGU9ImNvbG9yOmJsdWUiPgpMaW5lIDQgRSA9IHJub3JtKDAsMSkgaXMgbWlzc2luZyBhbiBhcmd1bWVudCBhbmQgbmVlZHMgdG8gYmUgY2hhbmdlZCB0byBFID0gcm5vcm0oMSwwLDEpLCBvdGhlcndpc2UgaXQgd2lsbCByZXR1cm4gMC4KVGhlIGZ1bmN0aW9uIGN1cnJlbnRseSBkb2Vzbid0IHJlc2V0IFMgd2hlbiBjYWxjdWxhdGluZyBkaWZmZXJlbnQgcGF0aHMuIEJldHdlZW4gdGhlIHR3byBmb3IgbG9vcHMsIHRoZXJlIG5lZWRzIHRvIGJlIGFuIGFkZGl0aW9uIG9mIFMgPSBTMC4KPC9zcGFuPgoKR2l2ZW4gdGhlIE1DIHNpbXVsYXRpb24gd2Ugc2hvdWxkIGJlIGFibGUgdG8gcHJpY2UgYSBFdXJvcGVhbiBvcHRpb24uICBOb3RlIHRoZSBpbnRyb2R1Y3Rpb24gb2YgdXNlciBkZWZpbmVkIGZ1bmN0aW9uIGluIHRoZSBib29rLgpCZWxvdyBpcyBhbiBleGFtcGxlIG9mIGEgdXNlciBkZWZpbmVkIGZ1bmN0aW9uIGFuZCB1c2FnZS4gIFRoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBzcXVhcmVkIHZhbHVlLgoKYGBge3J9Cm15ZnVuY3Rpb24gPC0gZnVuY3Rpb24oeD0yKXsKICB5PXheMgpyZXR1cm4oeSl9CgpteWZ1bmN0aW9uKHg9NSkKYGBgCgoKPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+CiMjIyMjIDJCKSBVc2UgTUMgc2ltdWxhdGlvbiB0byBwcmljZSBhIEV1cm9wZWFuIENhbGwgb3B0aW9uIG9uIGEgc3RvY2sgd2l0aCBpbml0aWFsIHByaWNlIG9mICQxNTUsIHN0cmlrZSBwcmljZSAkMTQwLCBhIHRpbWUgdG8gZXhwaXJhdGlvbiBlcXVhbCB0byBzaXggbW9udGhzLCBhIHJpc2stZnJlZSBpbnRlcmVzdCByYXRlIG9mIDIuNSUgYW5kIGEgdm9sYXRpbGl0eSBvZiAyMyUuIENvbnNpZGVyIGEgbnVtYmVyIG9mIHBlcmlvZHMgbj0xMDAgYW5kIGEgbnVtYmVyIG9mIHNpbXVsYXRpb25zIG09MTAwMAo8L3NwYW4+CmBgYHtyfQpFdWxlck1DKFR5cGUgPSAiYyIsIFMwID0gMTU1LCBLID0gMTQwLCBUID0gMS8yLCByID0gMC4wMjUsIG4gPSAxMDAsIHNpZ21hID0gMC4yMyxtID0gMTAwMCkKYGBgCjxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPgojIyMjIyAyQykgV3JpdGUgdGhlIG1hdGhlbWF0aWNhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgZGlzY3JldGUgcHJpY2luZyBlcXVhdGlvbiBtb2RlbGVkIGluIHRoZSBNQyBzaW11bGF0aW9uLiBFeHBsYWluIHdoYXQgZWFjaCB2YXJpYWJsZSBpbiB0aGUgZXF1YXRpb24gcmVwcmVzZW50cywgYW5kIHByb3ZpZGUgdGhlIGFzc29jaWF0ZWQgbnVtZXJpY2FsIHZhbHVlLgo8L3NwYW4+CgokU197dCt7XERlbHRhfXR9ID0gU190K3IqU190KntcRGVsdGF9dCt7XHNpZ21hfSpTX3QqUm5kKlxzcXJ0e3tcRGVsdGF9dH0kCjxzcGFuIHN0eWxlPSJjb2xvcjpibHVlIj4KJFNfdCQgaXMgdGhlIHByaWNlIG9mIHRoZSBwcmV2aW91cyBwZXJpb2QsIGluaXRpYWxseSAkU18wJCB3aGljaCBpcyAxNTUuICR7XERlbHRhfXQkIGlzIHRoZSBzdGVwIHNpemUgVC9uID0gLjUvMTAwID0gLjAwNS4ge1xzaWdtYX0gaXMgdGhlIHZvbGF0aWxpdHkgLjIzLiBSbmQgaXMgYSByYW5kb20gbnVtYmVyIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIHdpdGggbWVhbiAwIGFuZCBzdGFuZGFyZCBkZXZpYXRpb24gMS4KPC9zcGFuPgoKPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+CiMjIyMjIDJEKSBDb21wYXJlIHRoZSBwcmljZSBvYnRhaW5lZCBmcm9tIHRoZSBNQyBzaW11bGF0aW9uIHRvIHRoZSBvcHRpb24gcHJpY2UgdXNpbmcgdGhlIEJsYWNrLVNjaG9sZXMgZnVuY3Rpb24gcHJpY2luZyBHQlNPcHRpb24oKS4gU2hhcmUgaW5zaWdodHMuCjwvc3Bhbj4KCmBgYHtyfQpHQlNPcHRpb24oVHlwZUZsYWcgPSAiYyIsIFMgPSAxNTUsIFggPSAxNDAsIFRpbWUgPSAxLzIsIHIgPSAuMDI1LGIgPSAuMDI1LCBzaWdtYSA9IDAuMjMpCmBgYAo8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZSI+ClRoZSBwcmljZSBvYnRhaW5lZCBmcm9tIHRoZSBNQyBzaW11bGF0aW9uIGlzIDIwLjg2ODU2IGNvbXBhcmVkIHRvIHRoZSBCbGFjay1TY2hvbGVzIHByaWNlIG9mIDIwLjExODk5LiBUaGVzZSB2YWx1ZXMgYXJlIGNsb3NlIHRvIGVhY2ggb3RoZXIsIGJ1dCBmb3IgdGhpcyBzbWFsbCBudW1iZXIgb2Ygc2FtcGxlcyBkb25lIGZvciB0aGUgTUMgc2ltdWxhdGlvbiBJIGltYWdpbmUgdGhhdCB0aGUgQmxhY2stU2Nob2xlcyB3b3VsZCBiZSBtb3JlIHRydXN0d29ydGh5Lgo8L3NwYW4+CipbaHR0cDovL2NvbXB1dGF0aW9uYWxmaW5hbmNlLmxzaS51cGMuZWR1IF0oaHR0cDovL2NvbXB1dGF0aW9uYWxmaW5hbmNlLmxzaS51cGMuZWR1KQo=