About

This worksheet looks at simulating, both arithmetics and geometric, Brownian motion for stock prices, pricing options, and calculating Greeks using numerical differentiation.

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: Simulating Brownian Motion

This task follows the two examples in the book R Example 5.1/p 148 for simulating an arithmetic Brownian motion and R Example 5.2/p152 for simulating a geometric motion. Two new packages will be required for this worksheet. They are included in the code chunk below.

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

useing type=s to replace type=1??

#Install package fOptions for pricing and evaluating basic options
if(!require("fOptions",quietly = TRUE))
  install.packages("fOptions",dependencies = TRUE, repos = "https://cloud.r-project.org")

##### 1A) Follow example in book to simulate and plot example of an arithmetic Brownian motion. Consider three values for n (number of points): \(2^2, 2^5, 2^{12}\). Explain behavior as n increases.

alpha=0
sigma=1
T=1
n=2^(12)
X0=0.1
dt=T/n
t=seq(0,T,by=dt)
x=c(X0,alpha*dt+sigma*sqrt(dt)*rnorm(n,mean = 0,sd=1))
xt=cumsum(x)
plot(t,xt,type="l",xlab="time")

When \(n=2^2\),\(T/n=0.25\);when\(n=2^5\),\(T/n=0.0312\);when \(n=2^{13}\),\(T/n=0.00012\).As n increases, the time steps T/n becomes smallar, and it improve the quality of the approximate sample path to a true Brownian path.

##### 1B) Write the mathematical equation representing the values along the y-axis in the above plot. Separately express what the value of each variable in the equation is.

y-axis:\(X_i=X_{i-1}+a*T/n+\sigma*\varepsilon_i*(T/n)^{0.5}\) in the equation above,\(X_{i-1}=X0\) in begining,as time n value increases, \(X_{i-1}= previous X value\). \(a=0\)and T=1,\(n=2^{12}\);\(\sigma=1\);\(\varepsilon_i\)~N(0,1) normalised white noise, whihc is random nubmer.

##### 1C) Follow example in book to simulate a geometric Brownian motion.

mu=0.16
sigma=0.2
p0=40
T=1/12
nt=50
n=2^(8)
dt=T/n
t=seq(0,T,by=dt)
x=matrix(rep(0,length(t)*nt),nrow = nt)
for (i in 1:nt) {x[i,]=GBM(x=p0,r=mu,sigma = sigma,T=T,N=n)
  
}
ymax=max(x)
ymin=min(x)
plot(t,x[i,],t='l',ylim=c(ymin,ymax),col=1,ylab="price p(t)",xlab="time t")
for (i in 2:nt) {lines(t,x[i,],t='l',ylim=c(ymin,ymax),col=i)
  
}

##### 1D) Write the mathematical equation representing the values along the y-axis in the above plot. Separately express what the value of each variable in the equation is.

\(P_T=P_0 exp((u-1/2\sigma^{2})T+\sigma\varepsilon_t\Delta t^{0.5})\) In the equation abover,\(P0=40\),\(\sigma=0.2\),\(T=1/12\),\(u=0.16\),\(\Delta t=T/n=0.00032552\),\(\varepsilon_i\)~N(0,1) normalised white noise, whihc is random number.

##### 1E) How is the geometric Brownian simulation different from the arithmetic simulation? Elaborate. In the arithmetic Brownian, x value may be a negative number, but all of x value is positive numbers in geometric Brownian. The difference between two Brownian simulations is caused by \(\Delta x\) in geometric Brownian simulation. \(\Delta x\) represents \(lnP_{t+\Delta t}-lnP_t\).

Task 2: Option Pricing, Greeks, and Numerical Differentiation

Follows the example in the book R Example 5.3/p 156 and R Example 5.5/p 157

##### 2A) Calculate the Call and Put price of the given European Option. Explain what the variables r and b in the function call GBSOption represent.

GBSOption(TypeFlag="c",S=60,X=65,Time=1/4,r=0.08,b=0.08,sigma=0.30)

Title:
 Black Scholes Option Valuation 

Call:
 GBSOption(TypeFlag = "c", S = 60, X = 65, Time = 1/4, r = 0.08, 
     b = 0.08, sigma = 0.3)

Parameters:
          Value:
 TypeFlag c     
 S        60    
 X        65    
 Time     0.25  
 r        0.08  
 b        0.08  
 sigma    0.3   

Option Price:
 2.133372 

Description:
 Sun Dec  9 20:08:18 2018 

The r in function represents the risk-free interest rate; the b represents the annualized cost-of-carry rate.

##### 2B) Calculate the particular Greeks Delta, Gamma, and Vega for the above corresponding Call option.

GBSGreeks(Selection = "delta",TypeFlag="c",S=60,X=65,Time=1/4,r=0.08,b=0.08,sigma=0.30)
[1] 0.3724829
GBSGreeks(Selection = "Gamma",TypeFlag="c",S=60,X=65,Time=1/4,r=0.08,b=0.08,sigma=0.30)
[1] 0.04204276
GBSGreeks(Selection = "vega",TypeFlag="c",S=60,X=65,Time=1/4,r=0.08,b=0.08,sigma=0.30)
[1] 11.35154

##### 2C) Calculate the Delta, Gamma, and Vega for same option using instead numerical differentiation. Write the mathematical equations corresponding to each numerical differentiation. The formula \(f(x)=p_t\phi(d_1)-Ke^{-r(T-t)}\phi(d_2)\) is call option valuation function. using numerical differentiation \(f(x_0+\Delta x)=f(x_0)+\int_{}^{n}\Delta x^n/n!+R_n(x)\) and \(f(x_0-\Delta x)=f(x_0)+(-1)^n\int_{}^{n}\Delta x^n/n+R_n(x)\),the first order derivative is \(f'(x_0)~(f(x_0+\Delta x)-f(x_0-\Delta x))/2\Delta x + R(x)\),and second odrder derivative is \(f''(x_0)~(f(x_0+\Delta x)+f(x_0-\Delta x)-2f(x_0))/\Delta x ^2 + R(x)\).

when \(p_0=60 and \Delta p=1\),Delta\(\Delta\)=\(f'(p_0)\)=\((f(p_0+\Delta p)-f(p_0-\Delta p))/2\Delta p + R(x)\)=(2.5270-1.7817)/2=0.3726.

When \(p_0=60 and \Delta p=1\),Gamma\(\Gamma\)=\(f''(p_0)~(f(p_0+\Delta p)+f(p_0-\Delta p)-2f(p_0))/\Delta p ^2+ R(p)=((2.5270+1.7817)-2.1334*2)/2=0.0419\).

When \(\sigma_0=0.3 and \Delta \sigma=0.01\),Vega\(v\)=\(f'(\sigma_0)\)=\((f(\sigma_0+\Delta \sigma)-f(\sigma_0-\Delta \sigma))/2\Delta \sigma + R(\sigma)\)=(2.2472-2.0202)/0.02=11.35.

##### 2D) Compare results from 2B and 2C. Share observations.

Compared results in 2B,Delta\(\Delta\) is larger,Gamma\(\Gamma\) is smaller and Vega\(v\) is smaller. The difference between two group’s results is caused by \(R(x)\),whihc is error.

*http://computationalfinance.lsi.upc.edu

LS0tCnRpdGxlOiAiRklOQzYyMSBXaW50ZXIgMjAxOC0xOSBMYWIgV29ya3NoZWV0IDA0IgphdXRob3I6ICJZdSBKaWEiCmRhdGU6ICIxMi83LzIwMTgiCm91dHB1dDoKICBodG1sX25vdGVib29rOiBkZWZhdWx0CiAgaHRtbF9kb2N1bWVudDogZGVmYXVsdApzdWJ0aXRsZTogU3RvY2hhc3RpYyBNb2RlbGluZyAmIE51bWVyaWNhbCBEaWZmZXJlbnRpYXRpb24gKGZpbmM2MjEtbGFiMDQpCi0tLQoKIyMjIEFib3V0CgpUaGlzIHdvcmtzaGVldCBsb29rcyBhdCBzaW11bGF0aW5nLCBib3RoIGFyaXRobWV0aWNzIGFuZCBnZW9tZXRyaWMsIEJyb3duaWFuIG1vdGlvbiBmb3Igc3RvY2sgcHJpY2VzLCBwcmljaW5nIG9wdGlvbnMsIGFuZCBjYWxjdWxhdGluZyBHcmVla3MgdXNpbmcgbnVtZXJpY2FsIGRpZmZlcmVudGlhdGlvbi4gIAoKIyMjIFNldHVwCgpSZW1lbWJlciB0byBhbHdheXMgc2V0IHlvdXIgd29ya2luZyBkaXJlY3RvcnkgdG8gdGhlIHNvdXJjZSBmaWxlIGxvY2F0aW9uLiBHbyB0byAnU2Vzc2lvbicsIHNjcm9sbCBkb3duIHRvICdTZXQgV29ya2luZyBEaXJlY3RvcnknLCBhbmQgY2xpY2sgJ1RvIFNvdXJjZSBGaWxlIExvY2F0aW9uJy4gUmVhZCBjYXJlZnVsbHkgdGhlIGJlbG93IGFuZCBmb2xsb3cgdGhlIGluc3RydWN0aW9ucyB0byBjb21wbGV0ZSB0aGUgdGFza3MgYW5kIGFuc3dlciBhbnkgcXVlc3Rpb25zLiAgU3VibWl0IHlvdXIgd29yayB0byBSUHVicyBhcyBkZXRhaWxlZCBpbiBwcmV2aW91cyBub3Rlcy4gCgojIyMgTm90ZQoKQWx3YXlzIHJlYWQgY2FyZWZ1bGx5IHRoZSBpbnN0cnVjdGlvbnMgb24gU2FrYWkuICBGb3IgY2xhcml0eSwgdGFza3MvcXVlc3Rpb25zIHRvIGJlIGNvbXBsZXRlZC9hbnN3ZXJlZCBhcmUgaGlnaGxpZ2h0ZWQgaW4gcmVkIGNvbG9yICh2aXNpYmxlIGluIHByZXZpZXcpIGFuZCBudW1iZXJlZCBhY2NvcmRpbmcgdG8gdGhlaXIgcGFydGljdWxhciBwbGFjZW1lbnQgaW4gdGhlIHRhc2sgc2VjdGlvbi4gIFF1aXRlIG9mdGVuIHlvdSB3aWxsIG5lZWQgdG8gYWRkIHlvdXIgb3duIGNvZGUgY2h1bmsuCgpFeGVjdXRlIGFsbCBjb2RlIGNodW5rcywgcHJldmlldywgcHVibGlzaCwgYW5kIHN1Ym1pdCBsaW5rIG9uIFNha2FpIGZvbGx3b2luZyB0aGUgbmFtaW5nIGNvbnZlbnRpb24uIE1ha2Ugc3VyZSB0byBhZGQgY29tbWVudHMgdG8geW91ciBjb2RlIHdoZXJlIGFwcHJvcHJpYXRlLiBVc2Ugb3duIGxhbmd1YWdlIQoKLS0tLS0tLS0tLS0tLS0KCiMjIyBUYXNrIDE6IFNpbXVsYXRpbmcgQnJvd25pYW4gTW90aW9uCgpUaGlzIHRhc2sgZm9sbG93cyB0aGUgdHdvIGV4YW1wbGVzIGluIHRoZSBib29rIGBSIEV4YW1wbGUgNS4xL3AgMTQ4YCBmb3Igc2ltdWxhdGluZyBhbiBhcml0aG1ldGljIEJyb3duaWFuIG1vdGlvbiBhbmQgYFIgRXhhbXBsZSA1LjIvcDE1MmAgZm9yIHNpbXVsYXRpbmcgYSBnZW9tZXRyaWMgbW90aW9uLiBUd28gbmV3IHBhY2thZ2VzIHdpbGwgYmUgcmVxdWlyZWQgZm9yIHRoaXMgd29ya3NoZWV0LiAgVGhleSBhcmUgaW5jbHVkZWQgaW4gdGhlIGNvZGUgY2h1bmsgYmVsb3cuCgpgYGB7cn0KI0luc3RhbGwgcGFja2FnZSBxdWFudG1vZCAKaWYoIXJlcXVpcmUoInF1YW50bW9kIixxdWlldGx5ID0gVFJVRSkpCiAgaW5zdGFsbC5wYWNrYWdlcygicXVhbnRtb2QiLGRlcGVuZGVuY2llcyA9IFRSVUUsIHJlcG9zID0gImh0dHBzOi8vY2xvdWQuci1wcm9qZWN0Lm9yZyIpCgpgYGAKCmBgYHtyfQojSW5zdGFsbCBwYWNrYWdlIHNkZSBmb3IgU3RvY2hhc3RpYyBEaWZmZXJlbnRpYWwgRXF1YXRpb24KaWYoIXJlcXVpcmUoInNkZSIscXVpZXRseSA9IFRSVUUpKQogIGluc3RhbGwucGFja2FnZXMoInNkZSIsZGVwZW5kZW5jaWVzID0gVFJVRSwgcmVwb3MgPSAiaHR0cHM6Ly9jbG91ZC5yLXByb2plY3Qub3JnIikKCgpgYGAKCnVzZWluZyB0eXBlPXMgdG8gcmVwbGFjZSB0eXBlPTE/PwoKCmBgYHtyfQojSW5zdGFsbCBwYWNrYWdlIGZPcHRpb25zIGZvciBwcmljaW5nIGFuZCBldmFsdWF0aW5nIGJhc2ljIG9wdGlvbnMKaWYoIXJlcXVpcmUoImZPcHRpb25zIixxdWlldGx5ID0gVFJVRSkpCiAgaW5zdGFsbC5wYWNrYWdlcygiZk9wdGlvbnMiLGRlcGVuZGVuY2llcyA9IFRSVUUsIHJlcG9zID0gImh0dHBzOi8vY2xvdWQuci1wcm9qZWN0Lm9yZyIpCmBgYAoKCjxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPgojIyMjIyAxQSkgRm9sbG93IGV4YW1wbGUgaW4gYm9vayB0byBzaW11bGF0ZSBhbmQgcGxvdCBleGFtcGxlIG9mIGFuIGFyaXRobWV0aWMgQnJvd25pYW4gbW90aW9uLiBDb25zaWRlciB0aHJlZSB2YWx1ZXMgZm9yIG4gKG51bWJlciBvZiBwb2ludHMpOiAkMl4yLCAyXjUsIDJeezEyfSQuIEV4cGxhaW4gYmVoYXZpb3IgYXMgbiBpbmNyZWFzZXMuCjwvc3Bhbj4KCmBgYHtyfQphbHBoYT0wCnNpZ21hPTEKVD0xCm49Ml4oMTIpClgwPTAuMQpkdD1UL24KdD1zZXEoMCxULGJ5PWR0KQp4PWMoWDAsYWxwaGEqZHQrc2lnbWEqc3FydChkdCkqcm5vcm0obixtZWFuID0gMCxzZD0xKSkKeHQ9Y3Vtc3VtKHgpCnBsb3QodCx4dCx0eXBlPSJsIix4bGFiPSJ0aW1lIikKYGBgCldoZW4gJG49Ml4yJCwkVC9uPTAuMjUkO3doZW4kbj0yXjUkLCRUL249MC4wMzEyJDt3aGVuICRuPTJeezEzfSQsJFQvbj0wLjAwMDEyJC5BcyBuIGluY3JlYXNlcywgdGhlIHRpbWUgc3RlcHMgVC9uIGJlY29tZXMgc21hbGxhciwgYW5kIGl0IGltcHJvdmUgdGhlIHF1YWxpdHkgb2YgdGhlIGFwcHJveGltYXRlIHNhbXBsZSBwYXRoIHRvIGEgdHJ1ZSBCcm93bmlhbiBwYXRoLgoKPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+CiMjIyMjIDFCKSBXcml0ZSB0aGUgbWF0aGVtYXRpY2FsIGVxdWF0aW9uIHJlcHJlc2VudGluZyB0aGUgdmFsdWVzIGFsb25nIHRoZSB5LWF4aXMgaW4gdGhlIGFib3ZlIHBsb3QuIFNlcGFyYXRlbHkgZXhwcmVzcyB3aGF0IHRoZSB2YWx1ZSBvZiBlYWNoIHZhcmlhYmxlIGluIHRoZSBlcXVhdGlvbiBpcy4KPC9zcGFuPgoKeS1heGlzOiRYX2k9WF97aS0xfSthKlQvbitcc2lnbWEqXHZhcmVwc2lsb25faSooVC9uKV57MC41fSQKaW4gdGhlIGVxdWF0aW9uIGFib3ZlLCRYX3tpLTF9PVgwJCBpbiBiZWdpbmluZyxhcyB0aW1lIG4gdmFsdWUgaW5jcmVhc2VzLCAkWF97aS0xfT0gcHJldmlvdXMgWCB2YWx1ZSQuCiRhPTAkYW5kIFQ9MSwkbj0yXnsxMn0kOyRcc2lnbWE9MSQ7JFx2YXJlcHNpbG9uX2kkfk4oMCwxKSBub3JtYWxpc2VkIHdoaXRlIG5vaXNlLCB3aGloYyBpcyByYW5kb20gbnVibWVyLgoKPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+CiMjIyMjIDFDKSBGb2xsb3cgZXhhbXBsZSBpbiBib29rIHRvIHNpbXVsYXRlIGEgZ2VvbWV0cmljIEJyb3duaWFuIG1vdGlvbi4gCjwvc3Bhbj4KCmBgYHtyfQptdT0wLjE2CnNpZ21hPTAuMgpwMD00MApUPTEvMTIKbnQ9NTAKbj0yXig4KQoKZHQ9VC9uCnQ9c2VxKDAsVCxieT1kdCkKeD1tYXRyaXgocmVwKDAsbGVuZ3RoKHQpKm50KSxucm93ID0gbnQpIApmb3IgKGkgaW4gMTpudCkge3hbaSxdPUdCTSh4PXAwLHI9bXUsc2lnbWEgPSBzaWdtYSxUPVQsTj1uKQogIAp9CnltYXg9bWF4KHgpCnltaW49bWluKHgpCnBsb3QodCx4W2ksXSx0PSdsJyx5bGltPWMoeW1pbix5bWF4KSxjb2w9MSx5bGFiPSJwcmljZSBwKHQpIix4bGFiPSJ0aW1lIHQiKQpmb3IgKGkgaW4gMjpudCkge2xpbmVzKHQseFtpLF0sdD0nbCcseWxpbT1jKHltaW4seW1heCksY29sPWkpCiAgCn0KYGBgCgoKPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+CiMjIyMjIDFEKSBXcml0ZSB0aGUgbWF0aGVtYXRpY2FsIGVxdWF0aW9uIHJlcHJlc2VudGluZyB0aGUgdmFsdWVzIGFsb25nIHRoZSB5LWF4aXMgaW4gdGhlIGFib3ZlIHBsb3QuIFNlcGFyYXRlbHkgZXhwcmVzcyB3aGF0IHRoZSB2YWx1ZSBvZiBlYWNoIHZhcmlhYmxlIGluIHRoZSBlcXVhdGlvbiBpcy4KPC9zcGFuPgoKJFBfVD1QXzAgZXhwKCh1LTEvMlxzaWdtYV57Mn0pVCtcc2lnbWFcdmFyZXBzaWxvbl90XERlbHRhIHReezAuNX0pJApJbiB0aGUgZXF1YXRpb24gYWJvdmVyLCRQMD00MCQsJFxzaWdtYT0wLjIkLCRUPTEvMTIkLCR1PTAuMTYkLCRcRGVsdGEgdD1UL249MC4wMDAzMjU1MiQsJFx2YXJlcHNpbG9uX2kkfk4oMCwxKSBub3JtYWxpc2VkIHdoaXRlIG5vaXNlLCB3aGloYyBpcyByYW5kb20gbnVtYmVyLgoKPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+CiMjIyMjIDFFKSBIb3cgaXMgdGhlIGdlb21ldHJpYyBCcm93bmlhbiBzaW11bGF0aW9uIGRpZmZlcmVudCBmcm9tIHRoZSBhcml0aG1ldGljIHNpbXVsYXRpb24/IEVsYWJvcmF0ZS4KPC9zcGFuPgpJbiB0aGUgYXJpdGhtZXRpYyBCcm93bmlhbiwgeCB2YWx1ZSBtYXkgYmUgYSBuZWdhdGl2ZSBudW1iZXIsIGJ1dCBhbGwgb2YgeCB2YWx1ZSBpcyBwb3NpdGl2ZSBudW1iZXJzIGluIGdlb21ldHJpYyBCcm93bmlhbi4gVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0d28gQnJvd25pYW4gc2ltdWxhdGlvbnMgaXMgY2F1c2VkIGJ5ICRcRGVsdGEgeCQgaW4gZ2VvbWV0cmljIEJyb3duaWFuIHNpbXVsYXRpb24uICRcRGVsdGEgeCQgcmVwcmVzZW50cyAkbG5QX3t0K1xEZWx0YSB0fS1sblBfdCQuCgojIyMgVGFzayAyOiBPcHRpb24gUHJpY2luZywgR3JlZWtzLCBhbmQgTnVtZXJpY2FsIERpZmZlcmVudGlhdGlvbgoKRm9sbG93cyB0aGUgZXhhbXBsZSBpbiB0aGUgYm9vayAgYFIgRXhhbXBsZSA1LjMvcCAxNTYgYCBhbmQgYFIgRXhhbXBsZSA1LjUvcCAxNTdgCgo8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4KIyMjIyMgMkEpIENhbGN1bGF0ZSB0aGUgQ2FsbCBhbmQgUHV0IHByaWNlIG9mIHRoZSBnaXZlbiBFdXJvcGVhbiBPcHRpb24uICBFeHBsYWluIHdoYXQgdGhlIHZhcmlhYmxlcyBgcmAgYW5kIGBiYCBpbiB0aGUgZnVuY3Rpb24gY2FsbCBgR0JTT3B0aW9uYCByZXByZXNlbnQuICAgIAo8L3NwYW4+CgpgYGB7cn0KR0JTT3B0aW9uKFR5cGVGbGFnPSJjIixTPTYwLFg9NjUsVGltZT0xLzQscj0wLjA4LGI9MC4wOCxzaWdtYT0wLjMwKQpgYGAKVGhlIHIgaW4gZnVuY3Rpb24gcmVwcmVzZW50cyB0aGUgcmlzay1mcmVlIGludGVyZXN0IHJhdGU7IHRoZSBiIHJlcHJlc2VudHMgdGhlIGFubnVhbGl6ZWQgY29zdC1vZi1jYXJyeSByYXRlLgoKPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+CiMjIyMjIDJCKSBDYWxjdWxhdGUgdGhlIHBhcnRpY3VsYXIgR3JlZWtzIERlbHRhLCBHYW1tYSwgYW5kIFZlZ2EgZm9yIHRoZSBhYm92ZSBjb3JyZXNwb25kaW5nIENhbGwgb3B0aW9uLgo8L3NwYW4+CgpgYGB7cn0KR0JTR3JlZWtzKFNlbGVjdGlvbiA9ICJkZWx0YSIsVHlwZUZsYWc9ImMiLFM9NjAsWD02NSxUaW1lPTEvNCxyPTAuMDgsYj0wLjA4LHNpZ21hPTAuMzApCkdCU0dyZWVrcyhTZWxlY3Rpb24gPSAiR2FtbWEiLFR5cGVGbGFnPSJjIixTPTYwLFg9NjUsVGltZT0xLzQscj0wLjA4LGI9MC4wOCxzaWdtYT0wLjMwKQpHQlNHcmVla3MoU2VsZWN0aW9uID0gInZlZ2EiLFR5cGVGbGFnPSJjIixTPTYwLFg9NjUsVGltZT0xLzQscj0wLjA4LGI9MC4wOCxzaWdtYT0wLjMwKQoKYGBgCgo8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4KIyMjIyMgMkMpIENhbGN1bGF0ZSB0aGUgRGVsdGEsIEdhbW1hLCBhbmQgVmVnYSBmb3Igc2FtZSBvcHRpb24gdXNpbmcgaW5zdGVhZCBudW1lcmljYWwgZGlmZmVyZW50aWF0aW9uLiBXcml0ZSB0aGUgbWF0aGVtYXRpY2FsIGVxdWF0aW9ucyBjb3JyZXNwb25kaW5nIHRvIGVhY2ggbnVtZXJpY2FsIGRpZmZlcmVudGlhdGlvbi4KPC9zcGFuPgpUaGUgZm9ybXVsYSAkZih4KT1wX3RccGhpKGRfMSktS2Veey1yKFQtdCl9XHBoaShkXzIpJCBpcyBjYWxsIG9wdGlvbiB2YWx1YXRpb24gZnVuY3Rpb24uIHVzaW5nIG51bWVyaWNhbCBkaWZmZXJlbnRpYXRpb24gJGYoeF8wK1xEZWx0YSB4KT1mKHhfMCkrXGludF97fV57bn1cRGVsdGEgeF5uL24hK1Jfbih4KSQgYW5kICRmKHhfMC1cRGVsdGEgeCk9Zih4XzApKygtMSleblxpbnRfe31ee259XERlbHRhIHhebi9uK1Jfbih4KSQsdGhlIGZpcnN0IG9yZGVyIGRlcml2YXRpdmUgaXMgJGYnKHhfMCl+KGYoeF8wK1xEZWx0YSB4KS1mKHhfMC1cRGVsdGEgeCkpLzJcRGVsdGEgeCArIFIoeCkkLGFuZCBzZWNvbmQgb2RyZGVyIGRlcml2YXRpdmUgaXMgJGYnJyh4XzApfihmKHhfMCtcRGVsdGEgeCkrZih4XzAtXERlbHRhIHgpLTJmKHhfMCkpL1xEZWx0YSB4IF4yICsgUih4KSQuCgp3aGVuICRwXzA9NjAgYW5kIFxEZWx0YSBwPTEkLERlbHRhJFxEZWx0YSQ9JGYnKHBfMCkkPSQoZihwXzArXERlbHRhIHApLWYocF8wLVxEZWx0YSBwKSkvMlxEZWx0YSBwICsgUih4KSQ9KDIuNTI3MC0xLjc4MTcpLzI9MC4zNzI2LgoKV2hlbiAkcF8wPTYwIGFuZCBcRGVsdGEgcD0xJCxHYW1tYSRcR2FtbWEkPSRmJycocF8wKX4oZihwXzArXERlbHRhIHApK2YocF8wLVxEZWx0YSBwKS0yZihwXzApKS9cRGVsdGEgcCBeMisgUihwKT0oKDIuNTI3MCsxLjc4MTcpLTIuMTMzNCoyKS8yPTAuMDQxOSQuCgpXaGVuICRcc2lnbWFfMD0wLjMgYW5kIFxEZWx0YSBcc2lnbWE9MC4wMSQsVmVnYSR2JD0kZicoXHNpZ21hXzApJD0kKGYoXHNpZ21hXzArXERlbHRhIFxzaWdtYSktZihcc2lnbWFfMC1cRGVsdGEgXHNpZ21hKSkvMlxEZWx0YSBcc2lnbWEgKyBSKFxzaWdtYSkkPSgyLjI0NzItMi4wMjAyKS8wLjAyPTExLjM1LgoKPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+CiMjIyMjIDJEKSBDb21wYXJlIHJlc3VsdHMgZnJvbSAyQiBhbmQgMkMuIFNoYXJlIG9ic2VydmF0aW9ucy4KCkNvbXBhcmVkIHJlc3VsdHMgaW4gMkIsRGVsdGEkXERlbHRhJCBpcyBsYXJnZXIsR2FtbWEkXEdhbW1hJCBpcyBzbWFsbGVyIGFuZCBWZWdhJHYkIGlzIHNtYWxsZXIuIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIGdyb3VwJ3MgcmVzdWx0cyBpcyBjYXVzZWQgYnkgJFIoeCkkLHdoaWhjIGlzIGVycm9yLgoKKltodHRwOi8vY29tcHV0YXRpb25hbGZpbmFuY2UubHNpLnVwYy5lZHUgXShodHRwOi8vY29tcHV0YXRpb25hbGZpbmFuY2UubHNpLnVwYy5lZHUpCg==