Aggregate Loss Models
Chapter Description
This chapter introduces probability models for describing the aggregate (total) claims that arise from a portfolio of insurance contracts. We present two standard modeling approaches, the individual risk model and the collective risk model. Further, we discuss strategies for computing the distribution of the aggregate claims, including exact methods for special cases, recursion, and simulation. Finally, we examine the effects of individual policy modifications such as deductibles, coinsurance, and inflation, on the frequency and severity distributions, and thus on the aggregate loss distribution.
Introduction
In this section, we learn how to:
Record aggregate losses from an insurance system.
Identify actuarial applications of aggregate loss models.
Video: Introduction to Aggregate Loss Models
Overheads: Introduction to Aggregate Loss Models (Click Tab to View)
A. Basic Terminology
B. Goal
C. Models
D. Example
E. Applications
Hide
Hide
Hide
Hide
Hide
Individual Risk Model
In this section, we learn how to:
Build an individual risk model for a portfolio of insurance contracts.
Apply the individual risk model to life and nonlife insurance.
Compute the distribution of aggregate losses from an individual risk model.
Video: Individual Risk Model
Overheads: Individual Risk Model (Click Tab to View)
A. Individual Risk Model
B. Applications
C. Example
D. Aggregate Loss Distribution
E. R Example #1
F. R Example #2
Hide
Hide
Hide
Hide
Hide
Hide
Exercise. Simulating Claim Frequency
Assignment Text
In this assignment, we revisit Example 5.2.1 of Loss Data Analytics using simulation in R
. Even though we “officially” start to work with simulation beginning in Chapter 6 in Loss Data Analytics , this exercise provides you with an opportunity to taste a flavor of simulation.
Instructions
Use the function rbinom() to simulate the number of claims that follow binomial distribution. For reproducibility of results set the initial ‘seed’ as 1000
and then generate 10,000 observations of claim frequencies for each group of policies.
Specify the size and probability when you simulate the number of claims with binomial distribution in each group of policies.
eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiJzZXQuc2VlZCg/PykgICAgIFxuciAgPC0gPz8gICAgICAgICBcbnExIDwtIDAuMDUgICAgICAgICBcbnEyIDwtID8/ICAgICAgICAgXG5uMSA8LSA/PyAgICAgICAgIFxubjIgPC0gMjAwICAgICAgICAgIFxuXG5uMSA8LSByYmlub20ociwgc2l6ZT1uMSwgcHJvYj1xMSkgXG5uMiA8LSByYmlub20ociwgc2l6ZT0/PywgcHJvYj0/PykgIiwic29sdXRpb24iOiJzZXQuc2VlZCgxMDAwKSAgICAgIyBGb3IgcmVwcm9kdWNpYmlsaXR5IG9mIHJlc3VsdHNcbnIgIDwtIDEwMDAwICAgICAgICAjIE51bWJlciBvZiBvYnNlcnZhdGlvbnMgdG8gc2ltdWxhdGUgZm9yIGVhY2ggcG9saWN5XG5xMSA8LSAwLjA1ICAgICAgICAgIyBQcm9iYWJpbGl0eSBvZiBjbGFpbSBmcm9tIHBvbGljeSAxXG5xMiA8LSAwLjA2ICAgICAgICAgIyBQcm9iYWJpbGl0eSBvZiBjbGFpbSBmcm9tIHBvbGljeSAyXG5uMSA8LSAxMDAgICAgICAgICAgIyBOdW1iZXIgb2YgdHlwZSAxIHBvbGljaWVzXG5uMiA8LSAyMDAgICAgICAgICAgIyBOdW1iZXIgb2YgdHlwZSAyIHBvbGljaWVzXG5cbm4xIDwtIHJiaW5vbShyLCBzaXplPW4xLCBwcm9iPXExKSAjIEdlbmVyYXRlIHI9MTAwMDAgb2JzZXJ2YXRpb25zIG9mIE4xIGZyb20gQmlub21pYWxcbm4yIDwtIHJiaW5vbShyLCBzaXplPW4yLCBwcm9iPXEyKSAjIEdlbmVyYXRlIHI9MTAwMDAgb2JzZXJ2YXRpb25zIG9mIE4yIGZyb20gQmlub21pYWwiLCJzY3QiOiJuMW1zZyA8LSBcIkRpZCB5b3UgY29ycmVjdGx5IHNwZWNpZnkgdGhlIG9iamVjdCBgbjFgP1wiXG5leCgpICU+JSBjaGVja19vYmplY3QoXCJuMVwiLCB1bmRlZmluZWRfbXNnID0gXCJNYWtlIHN1cmUgdG8gbm90IHJlbW92ZSBgbjFgIVwiKSAlPiUgY2hlY2tfZXF1YWwoaW5jb3JyZWN0X21zZz1uMW1zZylcbm4ybXNnIDwtIFwiRGlkIHlvdSBjb3JyZWN0bHkgc3BlY2lmeSB0aGUgb2JqZWN0IGBuMmA/XCJcbmV4KCkgJT4lIGNoZWNrX29iamVjdChcIm4yXCIsIHVuZGVmaW5lZF9tc2cgPSBcIk1ha2Ugc3VyZSB0byBub3QgcmVtb3ZlIGBuMmAhXCIpICU+JSBjaGVja19lcXVhbChpbmNvcnJlY3RfbXNnPW4ybXNnKVxuc3VjY2Vzc19tc2coXCJHb29kIGpvYiEgSW4gQ2hhcHRlciAyLCB3ZSByZXZpZXdlZCBmcmVxdWVuY3kgbW9kZWxpbmcuIFRoaXMgdHV0b3JpYWwgaW50cm9kdWNlcyBzaW11bGF0aW9uIHRlY2huaXF1ZXMgdGhhdCBjb25zaWRlcmFibHkgZW5oYWNlIHRoZSBicmVhZHRoIG9mIGFjdHVhcmlhbCBhcHBsaWNhdGlvbnMuIEFzIG5vdGVkIGluIHRoZSBhc3NpZ25tZW50IHRleHQgb2YgdGhpcyB0dXRvcmlhbCwgeW91IGNhbiBjaGVjayBvdXQgQ2hhcHRlciA2IG9mIExvc3MgRGF0YSBBbmFseXRpY3MgZm9yIG1vcmUgYmFja2dyb3VuZCBvbiBzaW11bGF0aW9uIHRlY2huaXF1ZXMuXCIpIiwiaGludCI6Ik5vdGUgdGhhdCBudW1iZXIgb2YgcG9saWNpZXMgYW5kIHByb2JhYmlsaXR5IG9mIGNsYWltIHBlciBwb2xpY3kgY29ycmVzcG9uZCB0byB0aGUgc2l6ZSBhbmQgaW5jaWRlbmNlIHByb2JhYmlsaXR5IGluIGEgYmlub21pYWwgZGlzdHJpYnV0aW9uIGZvciBhIGNsYWltIGZyZXF1ZW5jeSByYW5kb20gdmFyaWFibGUuIn0=
Exercise. Individual Risk Model
Assignment Text
Continuing our work in Exercise 5.2.1 , we now reproduce the theoretical results for calculation of moments in individual risk models using simulation. We use the simulated frequencies for each group of policies from Exercise 5.2.1 and continue to simulate compound losses in an individual risk model as elaborated in Section 5.4.2 on Loss Data Analytics .
Instructions
Use the function runif() to claim amounts that follow uniform distribution for each group of policies.
Specify the parameters of uniform random variables, minimum and maximum values of claim amounts from each type of policies.
Initialize an empty vector of length \(R\) to store \(R\) observations of simulated \(S\) . In each simulation, calculate the \(j\) th simulated aggregate loss and store it in \(j\) th component of \(S\) for \(j=1, \ldots, R\) .
Compute the mean and variance of \(S\) by simulation using mean() and var() . Then, compare these values to their corresponding theoretical values, 2,800 and 600,467, respectively.
Produce a visual summary of the distribution of \(S\) using the histogram function, hist() .
eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6InNldC5zZWVkKDEwMDApICAgICAjIEZvciByZXByb2R1Y2liaWxpdHkgb2YgcmVzdWx0c1xuciAgPC0gMTAwMDAgICAgICAgICMgTnVtYmVyIG9mIG9ic2VydmF0aW9ucyB0byBzaW11bGF0ZSBmb3IgZWFjaCBwb2xpY3lcbnExIDwtIDAuMDUgICAgICAgICAjIFByb2JhYmlsaXR5IG9mIGNsYWltIGZyb20gcG9saWN5IDFcbnEyIDwtIDAuMDYgICAgICAgICAjIFByb2JhYmlsaXR5IG9mIGNsYWltIGZyb20gcG9saWN5IDJcbm4xIDwtIDEwMCAgICAgICAgICAjIE51bWJlciBvZiB0eXBlIDEgcG9saWNpZXNcbm4yIDwtIDIwMCAgICAgICAgICAjIE51bWJlciBvZiB0eXBlIDIgcG9saWNpZXNcblxubjEgPC0gcmJpbm9tKHIsIHNpemU9bjEsIHByb2I9cTEpICMgR2VuZXJhdGUgcj0xMDAwMCBvYnNlcnZhdGlvbnMgb2YgTjEgZnJvbSBCaW5vbWlhbFxubjIgPC0gcmJpbm9tKHIsIHNpemU9bjIsIHByb2I9cTIpICMgR2VuZXJhdGUgcj0xMDAwMCBvYnNlcnZhdGlvbnMgb2YgTjIgZnJvbSBCaW5vbWlhbCIsInNhbXBsZSI6InNldC5zZWVkKDEwMDApICAgICBcbnIgIDwtIDEwMDAwICAgICAgICBcbm0xIDwtIDA7ICBNMSA8LSA/PyBcbm0yIDwtID8/OyBNMiA8LSAzMDAgXG4jIG4xOiBHZW5lcmF0ZWQgMTAwMDAgb2JzZXJ2YXRpb25zIG9mIGNsYWltIGZyZXF1ZW5jeSBmcm9tIHRoZSBmaXJzdCAgZ3JvdXAgb2YgcG9saWNpZXMgd2l0aCBCaW5vbWlhbFxuIyBuMjogR2VuZXJhdGVkIDEwMDAwIG9ic2VydmF0aW9ucyBvZiBjbGFpbSBmcmVxdWVuY3kgZnJvbSB0aGUgc2Vjb25kIGdyb3VwIG9mIHBvbGljaWVzIHdpdGggQmlub21pYWxcblMgPC0gcmVwKD8/LCByKSBcblxuZm9yKGogaW4gMTpyKSB7IFxuICB4MV9qIDwtIHJ1bmlmKG4xW2pdLCBtaW49bTEsIG1heD0/PylcbiAgeDJfaiA8LSBydW5pZig/PywgbWluPT8/LCBtYXg9TTIpXG4gIFNbal0gPC0gc3VtKHgxX2opK3N1bSg/Pylcbn1cbj8/KFMpIFxudmFyKD8/KVxuPz8oUykiLCJzb2x1dGlvbiI6InNldC5zZWVkKDEwMDApICAgICAjIEZvciByZXByb2R1Y2liaWxpdHkgb2YgcmVzdWx0c1xuciAgPC0gMTAwMDAgICAgICAgICMgTnVtYmVyIG9mIG9ic2VydmF0aW9ucyB0byBzaW11bGF0ZSBmb3IgZWFjaCBwb2xpY3lcbm0xIDwtIDA7IE0xIDwtIDQwMCAjIFBhcmFtZXRlcnMgZm9yIHNldmVyaXR5IGRpc3RyaWJ1dGlvbiBYXzFcbm0yIDwtIDA7IE0yIDwtIDMwMCAjIFBhcmFtZXRlcnMgZm9yIHNldmVyaXR5IGRpc3RyaWJ1dGlvbiBYXzJcbiMgbjE6IEdlbmVyYXRlZCAxMDAwMCBvYnNlcnZhdGlvbnMgb2YgY2xhaW0gZnJlcXVlbmN5IGZyb20gdGhlIGZpcnN0ICBncm91cCBvZiBwb2xpY2llcyB3aXRoIEJpbm9taWFsXG4jIG4yOiBHZW5lcmF0ZWQgMTAwMDAgb2JzZXJ2YXRpb25zIG9mIGNsYWltIGZyZXF1ZW5jeSBmcm9tIHRoZSBzZWNvbmQgZ3JvdXAgb2YgcG9saWNpZXMgd2l0aCBCaW5vbWlhbFxuUyA8LSByZXAoTkEsIHIpICMgSW5pdGlhbGl6ZSBhbiBlbXB0eSB2ZWN0b3IgdG8gc3RvcmUgUyBvYnNlcnZhdGlvbnNcblxuZm9yKGogaW4gMTpyKSB7IFxuICB4MV9qIDwtIHJ1bmlmKG4xW2pdLCBtaW49bTEsIG1heD1NMSlcbiAgeDJfaiA8LSBydW5pZihuMltqXSwgbWluPW0yLCBtYXg9TTIpXG4gIFNbal0gIDwtIHN1bSh4MV9qKStzdW0oeDJfaikgIyBDYWxjdWxhdGUganRoIHNpbXVsYXRlZCBhZ2dyZWdhdGUgbG9zcyBhbmQgc3RvcmUgaXQgYXQgU1tqXVxufVxubWVhbihTKSAjIENvbXBhcmUgdG8gdGhlb3JldGljYWwgdmFsdWUgb2YgMiw4MDBcbnZhcihTKSAgIyBDb21wYXJlIHRvIHRoZW9yZXRpY2FsIHZhbHVlIG9mIDYwMCw0Njdcbmhpc3QoUykiLCJzY3QiOiJNMW1zZyA8LSBcIkRpZCB5b3UgY29ycmVjdGx5IHNwZWNpZnkgdGhlIG9iamVjdCBgTTFgP1wiXG5leCgpICU+JSBjaGVja19vYmplY3QoXCJNMVwiLCB1bmRlZmluZWRfbXNnID0gXCJNYWtlIHN1cmUgdG8gbm90IHJlbW92ZSBgTTFgIVwiKSAlPiUgY2hlY2tfZXF1YWwoaW5jb3JyZWN0X21zZz1NMW1zZylcbm4ybXNnIDwtIFwiRGlkIHlvdSBjb3JyZWN0bHkgc3BlY2lmeSB0aGUgb2JqZWN0IGBuMmA/XCJcbmV4KCkgJT4lIGNoZWNrX29iamVjdChcIm4yXCIsIHVuZGVmaW5lZF9tc2cgPSBcIk1ha2Ugc3VyZSB0byBub3QgcmVtb3ZlIGBuMmAhXCIpICU+JSBjaGVja19lcXVhbChpbmNvcnJlY3RfbXNnPW4ybXNnKVxuc3VjY2Vzc19tc2coXCJHb29kIGpvYiEgRGVzcGl0ZSB0aGUgc2VlbWluZyBzaW1wbGljaXR5IG9mIHRoaXMgZXhhbXBsZSAod2l0aCB1bmlmb3JtIHNpemUgZGlzdHJpYnV0aW9ucyksIGNvbXB1dGluZyB0aGUgZGlzdHJpYnV0aW9uIG9mIGNsYWltcyBTIGlzIGF0IGJlc3QgdGVkaW91cyB3aGVuIHVzaW5nIGV4YWN0IG1ldGhvZHMuIFlvdSBjYW4gdXNlIHNpbXVsYXRpb24gdG8gcXVpY2tseSBnZXQgYSBzZW5zZSBvZiB0aGUgZGlzdHJpYnV0aW9uIGFuZCB1c2UgdGhpcyBhcyBhIGJhc2UgYXMgeW91IGFkanVzdCB0aGUgbW9kZWwgdG8gbWFrZSBpdCBiZXR0ZXIgc3VpdGVkIHRvIGFwcHJveGltYXRlIGFuIGFjdHVhcmlhbCBhcHBsaWNhdGlvbiBvZiBpbnRlcmVzdC5cIikiLCJoaW50IjoiTm90ZSB0aGF0IHdlIG5lZWQgdG8gc2ltdWxhdGUgY2xhaW0gYW1vdW50cyB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBudW1iZXIgb2YgY2xhaW1zIHNvIHRoYXQgdGhlIHBhcmFtZXRlcnMgdXNlZCBpbiA8Y29kZT5ydW5pZigpPC9jb2RlPiBmdW5jdGlvbiBtYXkgZGVwZW5kIG9uIHRoZSBudW1iZXIgb2Ygc2ltdWxhdGVkIGNsYWltcy4ifQ==
Fitting a Collective Risk Model in Two Parts
In this section, we learn how to:
Build a collective risk model for a portfolio of insurance contracts.
Calculate the mean and variance of the aggregate loss.
Fit frequency and severity components in a collective risk model.
Video: Fitting a Two Part Collective Risk Model
Overheads: Fitting a Two Part Collective Risk Model (Click Tab to View)
A. Collective Risk Model
B. Compound Distribution
C. Moments
D. Model Fitting
E. Model Fitting - Property Fund
Hide
Hide
Hide
Hide
Hide
Exercise. Estimating the Frequency Component of the Collective Risk Model
Assignment Text
In this exercise and the next, you will use data to calibrate the frequency and severity components of the collective risk model. The basis for this is the LGPIF data, introduced in Section 1.3 and used in many exercises.
In this assignment, we fit a negative binomial distribution to the frequency component. You may wish to review Exercise 2.3.5 where we fit a negative binomial distribution to a small synthetic data set.
Instructions
Restrict the sample to the subset of towns and identify the claims counts as a global variable \(N\) .
Construct a function to determine the negative log-likelihood. Do this based on the probability mass function for the negative binomial distribution, dnbinom() . Note that we use the same parametrization as in the Section 2.2 of Loss Data Analytics so that \(\text{size}=r\) and \(\text{prob}=1/(1+\beta)\) .
Determine initial, or starting, values for the algorithm using the method of moments.
Use the function optim() to find the maximum likelihood estimates of the frequency distribution.
Provide a table to compare the empirical distribution to the fitted negative binomial distribution.
eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6Ikluc2FtcGxlIDwtIHJlYWQuY3N2KFwiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL09wZW5BY3RUZXh0cy9MREFDb3Vyc2UxL21haW4vRGF0YS9JbnNhbXBsZS5jc3ZcIiwgaGVhZGVyPVQsIG5hLnN0cmluZ3M9YyhcIi5cIiksIHN0cmluZ3NBc0ZhY3RvcnM9RkFMU0UpXG5saWJyYXJ5KGxtZTQpIiwic2FtcGxlIjoiSW5zYW1wbGVUb3duIDwtIHN1YnNldChJbnNhbXBsZSwgVHlwZVRvd249PTEpXG5OIDwtIEluc2FtcGxlVG93biRGcmVxXG4jIFRoZSBuZWdhdGl2ZSBMb2cgLSBsaWtlbGlob29kXG5mcmVxX2xpayA8LSBmdW5jdGlvbihwYXJtKSB7XG4gIHIgICAgPC0gcGFybVsxXVxuICBiZXRhIDwtIHBhcm1bMl1cbiAgbGlrICA8LSAtc3VtKGRuYmlub20oTiwgc2l6ZT0gPz8sIHByb2I9MS8oMSs/PyksIGxvZz1UUlVFKSlcbiAgcmV0dXJuKGxpaykgfVxuIyBpbml0aWFsIGVzdGltYXRlcyBieSBtZXRob2Qgb2YgbW9tZW50c1xuaW5pdC5wYXJtLmZyZXEgPC0gYyhtZWFuKE4pLyh2YXIoTikvbWVhbihOKS0xKSwgdmFyKE4pL21lYW4oTiktMSkgXG4jIE1heGltdW0gbGlrZWxpaG9vZCBlc3RpbWF0aW9uIGZvciB0aGUgZnJlcXVlbmN5IG1vZGVsXG5mcmVxX21vZCAgICAgICA8LSA/PyhwYXI9aW5pdC5wYXJtLmZyZXEsIGZuPT8/KSBcbnIuZXN0ICAgIDwtIGZyZXFfbW9kJHBhclsxXVxuYmV0YS5lc3QgPC0gZnJlcV9tb2QkcGFyWzJdXG4jIEVtcGlyaWNhbCBhbmQgZml0dGVkIGRpc3RyaWJ1dGlvbnMgb2Ygb2JzZXJ2ZWQgTlxuZnJlcV90YWJsZSA8LSBjYmluZCh0YWJsZShOKVsxOjRdL2xlbmd0aChOKSwgZG5iaW5vbSgwOjMsIHNpemU9Pz8sIHByb2I9MS8oMStiZXRhLmVzdCkpKVxuZnJlcV90YWJsZSA8LSByYmluZChmcmVxX3RhYmxlLCAxLWNvbFN1bXMoZnJlcV90YWJsZSkpICMgc28gcHJvYnMgc3VtIHRvIG9uZVxucm93bmFtZXMoZnJlcV90YWJsZSlbNV0gPC0gXCI0K1wiXG5jb2xuYW1lcyhmcmVxX3RhYmxlKSA8LSBjKFwiRW1waXJpY2FsXCIsIFwiRml0dGVkXCIpXG5yb3VuZChmcmVxX3RhYmxlLCBkaWdpdHMgPSA2KSIsInNvbHV0aW9uIjoiSW5zYW1wbGVUb3duIDwtIHN1YnNldChJbnNhbXBsZSwgVHlwZVRvd249PTEpXG5OIDwtIEluc2FtcGxlVG93biRGcmVxXG4jIFRoZSBuZWdhdGl2ZSBMb2cgLSBsaWtlbGlob29kXG5mcmVxX2xpayA8LSBmdW5jdGlvbihwYXJtKSB7XG4gIHIgICAgPC0gcGFybVsxXVxuICBiZXRhIDwtIHBhcm1bMl1cbiAgbGlrICA8LSAtc3VtKGRuYmlub20oTiwgc2l6ZT1yLCBwcm9iPTEvKDErYmV0YSksIGxvZz1UUlVFKSlcbiAgcmV0dXJuKGxpaykgfVxuIyBpbml0aWFsIGVzdGltYXRlcyBieSBtZXRob2Qgb2YgbW9tZW50c1xuaW5pdC5wYXJtLmZyZXEgPC0gYyhtZWFuKE4pLyh2YXIoTikvbWVhbihOKS0xKSwgdmFyKE4pL21lYW4oTiktMSkgXG4jIE1heGltdW0gbGlrZWxpaG9vZCBlc3RpbWF0aW9uIGZvciB0aGUgZnJlcXVlbmN5IG1vZGVsXG5mcmVxX21vZCAgICAgICA8LSBvcHRpbShwYXI9aW5pdC5wYXJtLmZyZXEsIGZuPWZyZXFfbGlrKSBcbnIuZXN0ICAgIDwtIGZyZXFfbW9kJHBhclsxXVxuYmV0YS5lc3QgPC0gZnJlcV9tb2QkcGFyWzJdXG4jIEVtcGlyaWNhbCBhbmQgZml0dGVkIGRpc3RyaWJ1dGlvbnMgb2Ygb2JzZXJ2ZWQgTlxuZnJlcV90YWJsZSA8LSBjYmluZCh0YWJsZShOKVsxOjRdL2xlbmd0aChOKSwgZG5iaW5vbSgwOjMsIHNpemU9ci5lc3QsIHByb2I9MS8oMStiZXRhLmVzdCkpKVxuZnJlcV90YWJsZSA8LSByYmluZChmcmVxX3RhYmxlLCAxLWNvbFN1bXMoZnJlcV90YWJsZSkpICMgc28gcHJvYnMgc3VtIHRvIG9uZVxucm93bmFtZXMoZnJlcV90YWJsZSlbNV0gPC0gXCI0K1wiXG5jb2xuYW1lcyhmcmVxX3RhYmxlKSA8LSBjKFwiRW1waXJpY2FsXCIsIFwiRml0dGVkXCIpXG5yb3VuZChmcmVxX3RhYmxlLCBkaWdpdHMgPSA2KSIsInNjdCI6Ik5tc2cgPC0gXCJEaWQgeW91IGNvcnJlY3RseSBzcGVjaWZ5IHRoZSBvYmplY3QgYE5gP1wiXG5leCgpICU+JSBjaGVja19vYmplY3QoXCJOXCIsIHVuZGVmaW5lZF9tc2cgPSBcIk1ha2Ugc3VyZSB0byBub3QgcmVtb3ZlIGBOYCFcIikgJT4lIGNoZWNrX2VxdWFsKGluY29ycmVjdF9tc2c9Tm1zZylcbmluaXRmcmVxbXNnIDwtIFwiRGlkIHlvdSBjb3JyZWN0bHkgc3BlY2lmeSB0aGUgb2JqZWN0IGBpbml0LnBhcm0uZnJlcWA/XCJcbmV4KCkgJT4lIGNoZWNrX29iamVjdChcImluaXQucGFybS5mcmVxXCIsIHVuZGVmaW5lZF9tc2cgPSBcIk1ha2Ugc3VyZSB0byBub3QgcmVtb3ZlIGBpbml0LnBhcm0uZnJlcWAhXCIpICU+JSBjaGVja19lcXVhbChpbmNvcnJlY3RfbXNnPWluaXRmcmVxbXNnKVxuZnJlcV9tb2Rtc2cgPC0gXCJEaWQgeW91IGNvcnJlY3RseSBzcGVjaWZ5IHRoZSBvYmplY3QgYGZyZXFfbW9kYD9cIlxuZXgoKSAlPiUgY2hlY2tfb2JqZWN0KFwiZnJlcV9tb2RcIiwgdW5kZWZpbmVkX21zZyA9IFwiTWFrZSBzdXJlIHRvIG5vdCByZW1vdmUgYGZyZXFfbW9kYCFcIikgJT4lIGNoZWNrX2VxdWFsKGluY29ycmVjdF9tc2c9ZnJlcV9tb2Rtc2cpXG5mcmVxX3RhYmxlbXNnIDwtIFwiRGlkIHlvdSBjb3JyZWN0bHkgc3BlY2lmeSB0aGUgb2JqZWN0IGBmcmVxX3RhYmxlYD9cIlxuZXgoKSAlPiUgY2hlY2tfb2JqZWN0KFwiZnJlcV90YWJsZVwiLCB1bmRlZmluZWRfbXNnID0gXCJNYWtlIHN1cmUgdG8gbm90IHJlbW92ZSBgZnJlcV90YWJsZWAhXCIpICU+JSBjaGVja19lcXVhbChpbmNvcnJlY3RfbXNnPWZyZXFfdGFibGVtc2cpXG5zdWNjZXNzX21zZyhcIkNoZWVycyEgVGhpcyBleGVyY2lzZSBwcm92aWRlcyBhIHF1aWNrIG92ZXJ2aWV3IG9mIHRoZSBpbXBvcnRhbnQgc3RlcHMgbmVlZGVkIGZvciBmcmVxdWVuY3kgbW9kZWxpbmcuIEluIGFjdHVhcmlhbCBwcmFjdGljZSwgaXQgaXMgY29tbW9uIHRvIGFkZCBjb3ZhcmlhdGVzIChyYXRpbmcgZmFjdG9ycykgZm9yIHJpc2sgY2xhc3NpZmljYXRpb24gcHVycG9zZXMuXCIpIiwiaGludCI6IlNpbmNlIDxlbT5vcHRpbTwvZW0+IG1pbmltaXplcyBnaXZlbiBmdW5jdGlvbiBieSBkZWZhdWx0LCB3ZSBwdXQgdGhlIG5lZ2F0aXZlIGxpa2VsaWhvb2QgYXMgYW4gb2JqZWN0aXZlIGZ1bmN0aW9uIHRvIGJlIG1pbmltaXplZC4ifQ==
Exercise. Estimating the Severity Component of the Collective Risk Model
Assignment Text
This is a continuation of Exercise 5.3.1 . In this assignment, we fit a Pareto distribution to the severity component. You may wish to review Exercise 3.5.1 where we fit a Pareto distribution to a different subset of the LGPIF data.
Instructions
Restrict the sample to the subset of towns and identify the average claim severity as a global variable \(Xbar\) .
Construct a function to determine the negative log-likelihood. Do this based on the probability density function dlomax() . Note that we use the same parametrization as in the Section 3.2 of Loss Data Analytics so that \(\text{shape}=\alpha\) and \(\text{scale}=\theta\) .
Determine initial, or starting, values for the algorithm using the method of moments.
Use the function optim() to find the maximum likelihood estimates of the severity distribution.
Provide a \(qq\) plots of the empirical versus fitted quantiles to assess the adequacy of the model fit.
eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6Ikluc2FtcGxlIDwtIHJlYWQuY3N2KFwiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL09wZW5BY3RUZXh0cy9MREFDb3Vyc2UxL21haW4vRGF0YS9JbnNhbXBsZS5jc3ZcIiwgaGVhZGVyPVQsIG5hLnN0cmluZ3M9YyhcIi5cIiksIHN0cmluZ3NBc0ZhY3RvcnM9RkFMU0UpXG5saWJyYXJ5KGxtZTQpXG5cbmRsb21heCA8LSBmdW5jdGlvbih4LCBzaGFwZT0xLCBzY2FsZT0xLCBsb2c9RkFMU0UpIHtcbiAgaWYgKGxvZz09RkFMU0UpIHJlc3VsdCA8LSBzaGFwZSpzY2FsZV5zaGFwZSAvIChzY2FsZSArIHgpXihzaGFwZSsxKVxuICBpZiAobG9nPT1UUlVFICkgcmVzdWx0IDwtIGxvZyhzaGFwZSkrc2hhcGUqbG9nKHNjYWxlKS0oc2hhcGUrMSkqbG9nKHNjYWxlICsgeClcbiAgcmV0dXJuKHJlc3VsdCkgfSIsInNhbXBsZSI6Ikluc2FtcGxlVG93biA8LSBzdWJzZXQoSW5zYW1wbGUsIFR5cGVUb3duPT0xKVxuWGJhciA8LSBJbnNhbXBsZVRvd24keUF2Z1t3aGljaChJbnNhbXBsZVRvd24kRnJlcT4wKV1cbiMgVGhlIG5lZ2F0aXZlIExvZyAtIGxpa2VsaWhvb2RcbnNldl9saWsgPC0gZnVuY3Rpb24ocGFybSkge1xuICBhbHBoYSA8LSAgcGFybVsxXVxuICB0aGV0YSA8LSAgcGFybVsyXVxuICBsaWsgICA8LSAtc3VtKGRsb21heChYYmFyLCBzaGFwZT0/Pywgc2NhbGU9Pz8sIGxvZz1UUlVFKSlcbiAgcmV0dXJuKGxpaylcbn1cbiMgaW5pdGlhbCBlc3RpbWF0ZXMgYnkgbWV0aG9kIG9mIG1vbWVudHNcbmluaXQucGFybS5zZXYgPC0gYyggMi8oMS1tZWFuKFhiYXIpXjIvdmFyKFhiYXIpKSAgLCBtZWFuKFhiYXIpKigyLygxLW1lYW4oWGJhcileMi92YXIoWGJhcikpLTEpICkgXG4jIE1heGltdW0gbGlrZWxpaG9vZCBlc3RpbWF0aW9uIGZvciB0aGUgc2V2ZXJpdHkgbW9kZWxcbnNldl9tb2QgICAgPC0gPz8ocGFyPT8/LCBmbj1zZXZfbGlrLCBtZXRob2Q9XCJMLUJGR1MtQlwiKSBcbmFscGhhLmVzdCAgPC0gc2V2X21vZCRwYXJbMV1cbnRoZXRhLmVzdCAgPC0gc2V2X21vZCRwYXJbMl1cbiMgRW1waXJpY2FsIGFuZCBmaXR0ZWQgZGlzdHJpYnV0aW9ucyBvZiBvYnNlcnZlZCBYYmFyXG5wbG90KDEtKHRoZXRhLmVzdC8odGhldGEuZXN0K3NvcnQoWGJhcikpKV5hbHBoYS5lc3QsIHJhbmsoc29ydChYYmFyKSkvKGxlbmd0aChYYmFyKSsxKSxcbiAgICAgeWxhYiA9IFwiRW1waXJpY2FsIFF1YW50aWxlc1wiLCB4bGFiID0gXCJGaXR0ZWQgUXVhbnRpbGVzXCIsXG4gICAgIG1haW4gPSBcIlNldmVyaXR5IE1vZGVsIFFRIFBsb3RcIikiLCJzb2x1dGlvbiI6Ikluc2FtcGxlVG93biA8LSBzdWJzZXQoSW5zYW1wbGUsIFR5cGVUb3duPT0xKVxuWGJhciA8LSBJbnNhbXBsZVRvd24keUF2Z1t3aGljaChJbnNhbXBsZVRvd24kRnJlcT4wKV1cbiMgVGhlIG5lZ2F0aXZlIExvZyAtIGxpa2VsaWhvb2RcbnNldl9saWsgPC0gZnVuY3Rpb24ocGFybSkge1xuICBhbHBoYSA8LSAgcGFybVsxXVxuICB0aGV0YSA8LSAgcGFybVsyXVxuICBsaWsgICA8LSAtc3VtKGRsb21heChYYmFyLCBzaGFwZT1hbHBoYSwgc2NhbGU9dGhldGEsIGxvZz1UUlVFKSlcbiAgcmV0dXJuKGxpaylcbn1cbiMgaW5pdGlhbCBlc3RpbWF0ZXMgYnkgbWV0aG9kIG9mIG1vbWVudHNcbmluaXQucGFybS5zZXYgPC0gYyggMi8oMS1tZWFuKFhiYXIpXjIvdmFyKFhiYXIpKSAgLCBtZWFuKFhiYXIpKigyLygxLW1lYW4oWGJhcileMi92YXIoWGJhcikpLTEpICkgXG4jIE1heGltdW0gbGlrZWxpaG9vZCBlc3RpbWF0aW9uIGZvciB0aGUgc2V2ZXJpdHkgbW9kZWxcbnNldl9tb2QgICAgICAgPC0gb3B0aW0ocGFyPWluaXQucGFybS5zZXYsIGZuPXNldl9saWssIG1ldGhvZD1cIkwtQkZHUy1CXCIpIFxuYWxwaGEuZXN0ICAgICA8LSBzZXZfbW9kJHBhclsxXVxudGhldGEuZXN0ICAgICA8LSBzZXZfbW9kJHBhclsyXVxuIyBFbXBpcmljYWwgYW5kIGZpdHRlZCBkaXN0cmlidXRpb25zIG9mIG9ic2VydmVkIFhiYXJcbnBsb3QoMS0odGhldGEuZXN0Lyh0aGV0YS5lc3Qrc29ydChYYmFyKSkpXmFscGhhLmVzdCwgcmFuayhzb3J0KFhiYXIpKS8obGVuZ3RoKFhiYXIpKzEpLFxuICAgICB5bGFiID0gXCJFbXBpcmljYWwgUXVhbnRpbGVzXCIsIHhsYWIgPSBcIkZpdHRlZCBRdWFudGlsZXNcIixcbiAgICAgbWFpbiA9IFwiU2V2ZXJpdHkgTW9kZWwgUVEgUGxvdFwiKSIsInNjdCI6IlhiYXJtc2cgPC0gXCJEaWQgeW91IGNvcnJlY3RseSBzcGVjaWZ5IHRoZSBvYmplY3QgYFhiYXJgP1wiXG5leCgpICU+JSBjaGVja19vYmplY3QoXCJYYmFyXCIsIHVuZGVmaW5lZF9tc2cgPSBcIk1ha2Ugc3VyZSB0byBub3QgcmVtb3ZlIGBYYmFyYCFcIikgJT4lIGNoZWNrX2VxdWFsKGluY29ycmVjdF9tc2c9WGJhcm1zZylcbmluaXRzZXZtc2cgPC0gXCJEaWQgeW91IGNvcnJlY3RseSBzcGVjaWZ5IHRoZSBvYmplY3QgYGluaXQucGFybS5zZXZgP1wiXG5leCgpICU+JSBjaGVja19vYmplY3QoXCJpbml0LnBhcm0uc2V2XCIsIHVuZGVmaW5lZF9tc2cgPSBcIk1ha2Ugc3VyZSB0byBub3QgcmVtb3ZlIGBpbml0LnBhcm0uc2V2YCFcIikgJT4lIGNoZWNrX2VxdWFsKGluY29ycmVjdF9tc2c9aW5pdHNldm1zZylcbnNldl9tb2Rtc2cgPC0gXCJEaWQgeW91IGNvcnJlY3RseSBzcGVjaWZ5IHRoZSBvYmplY3QgYHNldl9tb2RgP1wiXG5leCgpICU+JSBjaGVja19vYmplY3QoXCJzZXZfbW9kXCIsIHVuZGVmaW5lZF9tc2cgPSBcIk1ha2Ugc3VyZSB0byBub3QgcmVtb3ZlIGBzZXZfbW9kYCFcIikgJT4lIGNoZWNrX2VxdWFsKGluY29ycmVjdF9tc2c9c2V2X21vZG1zZylcbnN1Y2Nlc3NfbXNnKFwiQ2hlZXJzISBUaGlzIGV4ZXJjaXNlIHByb3ZpZGVzIGEgcXVpY2sgb3ZlcnZpZXcgb2YgdGhlIGltcG9ydGFudCBzdGVwcyBuZWVkZWQgZm9yIHNldmVyaXR5IG1vZGVsaW5nLiBOb3RlIHRoYXQgaXQgaXMgdXN1YWwgdG8gb2JzZXJ2ZSB0aGF0IGFuIGFjdHVhbCBjbGFpbXMgZGF0YXNldCBtYXkgY29tZSB3aXRoIHZlcnkgZmV3IHBvc2l0aXZlIGNsYWltcyBidXQgYWxzbyBoZWF2eSB0YWlsIGJlaGF2aW9yLlwiKSIsImhpbnQiOiJTaW5jZSA8ZW0+b3B0aW08L2VtPiBtaW5pbWl6ZXMgZ2l2ZW4gZnVuY3Rpb24gYnkgZGVmYXVsdCwgd2UgcHV0IHRoZSBuZWdhdGl2ZSBsaWtlbGlob29kIGFzIGFuIG9iamVjdGl2ZSBmdW5jdGlvbiB0byBiZSBtaW5pbWl6ZWQuIn0=
Computation Strategies for a Collective Risk Model
In this section, we learn how to:
Compute the aggregate loss distribution.
Implement numerical strategies in R
.
Video: Computing a Collective Risk Model Distribution
Overheads: Computing a Collective Risk Model Distribution (Click Tab to View)
A. Computing the Aggregate Loss Distribution
B. Direct Calculation
C. Direct Calculation - R Code
D. Recursive Method
E. Recursive Method - R Code
F. Monte Carlo Simulation
Hide
Hide
Hide
Hide
Hide
Hide
xx
### Exercise. Collective Risk Model II
Assignment Text
In this assignment, we analyze the aggregate loss distribution by combining fitted frequency and severity components. Because it is usually very hard to obtain a closed form expression for the distribution function of the compound loss in a collective risk model, we rely on simulations to compute the aggregate loss distribution. We use the fitted parameters from the exercises in Section 5.3 . Specifically, fitted shape and scale negative binomial parameters have already been recorded as the global variables r.est
and beta.est
, respectively. In the same way, fitted shape and scale Pareto parameters have already been recorded as the global variables alpha.est
and theta.est
, respectively.
Instructions
As an input to calculating the aggregate distribution, we need the expression function. This function allows to call functions without actually evaluating them.
Also, to generate random samples from the fitted frequency and severity models, we use rnbinom() and rlomax() . Note that these generated random samples are also used as inputs to compute the aggregate claim amount distribution.
We use aggregateDist() to simulate compound losses that match the observed data upon the fitted frequency and severity models.
With the aggregate distribution, plot its distribution function. For comparison, superimpose on this plot the empiricial (cumulative) distribution function, created using the ecdf() function.
eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6Ikluc2FtcGxlIDwtIHJlYWQuY3N2KFwiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL09wZW5BY3RUZXh0cy9MREFDb3Vyc2UxL21haW4vRGF0YS9JbnNhbXBsZS5jc3ZcIiwgaGVhZGVyPVQsIG5hLnN0cmluZ3M9YyhcIi5cIiksIHN0cmluZ3NBc0ZhY3RvcnM9RkFMU0UpXG5saWJyYXJ5KGxtZTQpXG5cbmFnZ3JlZ2F0ZS5wb3J0Zm9saW8gPC0gZnVuY3Rpb24oeCwgYnkgPSBuYW1lcyh4JG5vZGVzKSwgRlVOID0gc3VtLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc2lmaWNhdGlvbiA9IFRSVUUsIHByZWZpeCA9IE5VTEwsIC4uLilcbntcbiAgICBsZXZlbC5uYW1lcyA8LSBuYW1lcyh4JG5vZGVzKSAgICAgICAjIGxldmVsIG5hbWVzXG4gICAgbmxldmVscyA8LSBsZW5ndGgobGV2ZWwubmFtZXMpICAgICAgIyBudW1iZXIgb2YgbGV2ZWxzXG4gICAgeWVhcnMgPC0gbGV2ZWwubmFtZXNbbmxldmVsc10gICAgICAgIyBuYW1lIG9mIGxhc3QgbGV2ZWxcblxuICAgICMjIE1hdGNoIGxldmVsIG5hbWVzIGluICdieScgdG8gdGhvc2UgaW4gdGhlIG1vZGVsXG4gICAgYnkgPC0gbWF0Y2guYXJnKGJ5LCBsZXZlbC5uYW1lcywgc2V2ZXJhbC5vayA9IFRSVUUpXG5cbiAgICAjIyBWZXJzaW9uIG9mIEZVTiBhYmxlIHRvIHdvcmsgb24gbGlzdHNcbiAgICBmdW4gPC0gZnVuY3Rpb24oeCwgLi4uKSBGVU4odW5saXN0KHgpLCAuLi4pXG5cbiAgICAjIyBUaGUgbW9zdCBjb21tb24gY2FzZSBzaG91bGQgYmUgdG8gYWdncmVnYXRlIGNsYWltIGFtb3VudHMgYnlcbiAgICAjIyBub2RlLiBUaGlzIGNhc2UgYmVpbmcgdmVyeSBzaW1wbGUsIGl0IGlzIHRyZWF0ZWQgc2VwYXJhdGVseS5cbiAgICBpZiAoaWRlbnRpY2FsKGJ5LCBsZXZlbC5uYW1lcykpXG4gICAgICAgIHJldHVybihjYmluZChpZiAoY2xhc3NpZmljYXRpb24pIHgkY2xhc3NpZmljYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICBhcnJheShzYXBwbHkoeCRkYXRhLCBGVU4sIC4uLiksIGRpbSh4JGRhdGEpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgZGltbmFtZXMgPSBsaXN0KE5VTEwsIHBhc3RlKHByZWZpeCwgY29sbmFtZXMoeCRkYXRhKSwgc2VwID0gXCJcIikpKSkpXG5cbiAgICAjIyBTdW1tYXJpZXMgb25seSBieSBsYXN0IGxldmVsICh5ZWFycykgYXJlIGFsc28gc2ltcGxlIHRvIGhhbmRsZS5cbiAgICBpZiAoaWRlbnRpY2FsKGJ5LCB5ZWFycykpXG4gICAge1xuICAgICAgICByZXMgPC0gYXBwbHkoeCRkYXRhLCAyLCBmdW4sIC4uLilcbiAgICAgICAgbmFtZXMocmVzKSA8LSBwYXN0ZShwcmVmaXgsIGNvbG5hbWVzKHgkZGF0YSksIHNlcCA9IFwiXCIpXG4gICAgICAgIHJldHVybihyZXMpXG4gICAgfVxuXG4gICAgIyMgVGhlIG90aGVyIHBvc3NpYmlsaXRpZXMgcmVxdWlyZSB0byBzcGxpdCB0aGUgZGF0YSBpbiBncm91cHMgYXNcbiAgICAjIyBzcGVjaWZpZWQgaW4gYXJndW1lbnQgJ2J5Jy4gSWYgdGhlIGxhc3QgbGV2ZWwgKHllYXJzKSBpcyBpblxuICAgICMjICdieScsIHRoZW4gdGhlIG1hdHJpeCBzdHJ1Y3R1cmUgbXVzdCBiZSByZXRhaW5lZCB0byBtYWtlIHRoZVxuICAgICMjIHN1bW1hcmllcy4gT3RoZXJ3aXNlLCBpdCBjYW4ganVzdCBiZSBkcm9wcGVkIHNpbmNlIHN1bW1hcmllc1xuICAgICMjIHdpbGwgc3BhbiB0aGUgeWVhcnMgb2Ygb2JzZXJ2YXRpb24uXG4gICAgIyNcbiAgICAjIyBDb252ZXJ0IHRoZSBzZXF1ZW5jZSBvZiBzdWJzY3JpcHRzIGludG8gZmFjdG9ycyBieSBwYXN0aW5nIHRoZVxuICAgICMjIGRpZ2l0cyB0b2dldGhlci4gSXQgaXMgaW1wb3J0YW50ICpub3QqIHRvIHNvcnQgdGhlIGxldmVscyBpblxuICAgICMjIGNhc2UgdGhlIGxldmVscyBpbiAnYnknIGFyZSBub3QgaW4gdGhlIHNhbWUgb3JkZXIgYXMgaW5cbiAgICAjIyAnbGV2ZWwubmFtZXMnLlxuICAgIHJvd3MgPC0gc2V0ZGlmZihieSwgeWVhcnMpICAgICAgICAgICMgZ3JvdXBzIG90aGVyIHRoYW4geWVhcnNcbiAgICBzIDwtIHgkY2xhc3NpZmljYXRpb25bLCByb3dzLCBkcm9wID0gRkFMU0VdICMgc3Vic2NyaXB0c1xuICAgIGYgPC0gYXBwbHkocywgMSwgcGFzdGUsIGNvbGxhcHNlID0gXCJcIikgICAgICAjIGdyb3VwaW5nIElEc1xuICAgIGYgPC0gZmFjdG9yKGYsIGxldmVscyA9IHVuaXF1ZShmKSkgICAgICAgICAgIyBmYWN0b3JzXG4gICAgcyA8LSBzW21hdGNoKGxldmVscyhmKSwgZiksICwgZHJvcCA9IEZBTFNFXSAjIHVuaXF1ZSBzdWJzY3JpcHRzXG4gICAgeHggPC0gc3BsaXQoeCRkYXRhLCBmKSAgICAgICAgICAgICAgICAgICAgICAjIHNwbGl0IGRhdGFcblxuICAgICMjIE1ha2Ugc3VtbWFyaWVzXG4gICAgaWYgKHllYXJzICVpbiUgYnkpXG4gICAge1xuICAgICAgICB4eCA8LSBsYXBwbHkoeHgsIG1hdHJpeCwgbmNvbCA9IG5jb2woeCRkYXRhKSlcbiAgICAgICAgcmVzIDwtIHQoc2FwcGx5KHh4LCBmdW5jdGlvbih4LCAuLi4pIGFwcGx5KHgsIDIsIGZ1biwgLi4uKSwgLi4uKSlcbiAgICAgICAgY29scyA8LSBjb2xuYW1lcyh4JGRhdGEpXG4gICAgfVxuICAgIGVsc2VcbiAgICB7XG4gICAgICAgIHJlcyA8LSBzYXBwbHkoeHgsIGZ1biwgLi4uKVxuICAgICAgICBjb2xzIDwtIGRlcGFyc2Uoc3Vic3RpdHV0ZShGVU4pKVxuICAgIH1cblxuICAgICMjIFJldHVybiByZXN1bHRzIGFzIGEgbWF0cml4XG4gICAgc3RydWN0dXJlKGNiaW5kKGlmIChjbGFzc2lmaWNhdGlvbikgcywgcmVzKSxcbiAgICAgICAgICAgICAgZGltbmFtZXMgPSBsaXN0KE5VTEwsIGMoaWYgKGNsYXNzaWZpY2F0aW9uKSByb3dzLCBwYXN0ZShwcmVmaXgsIGNvbHMsIHNlcCA9IFwiXCIpKSkpXG59XG5cbnNpbVMgPC0gZnVuY3Rpb24obiwgbW9kZWwuZnJlcSwgbW9kZWwuc2V2KVxue1xuICBcbiAgICBuPTEwMDBcbiAgICBtb2RlbC5mcmVxID0gZnJlcVxuICAgIG1vZGVsLnNldiA9IHNldlxuICAgIFxuICAgICMjIFByZXBhcmUgdGhlIGNhbGwgdG8gc2ltdWwoKSBieSBidWlsZGluZyB1cCAnbm9kZXMnXG4gICAgbGV2ZWwubmFtZXMgPC0gbmFtZXMoaWYgKGlzLm51bGwobW9kZWwuZnJlcSkpIG1vZGVsLnNldiBlbHNlIG1vZGVsLmZyZXEpXG4gICAgbmxldmVscyA8LSBsZW5ndGgobGV2ZWwubmFtZXMpXG4gICAgbm9kZXMgPC0gYXMubGlzdChjKHJlcCgxLCBubGV2ZWxzIC0gMSksIG4pKVxuICAgIG5hbWVzKG5vZGVzKSA8LSBsZXZlbC5uYW1lc1xuXG4gICAgIyMgR2V0IHNhbXBsZVxuICAgIHggPC0gYWdncmVnYXRlKHNpbXVsKG5vZGVzID0gbm9kZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwuZnJlcSA9IG1vZGVsLmZyZXEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwuc2V2ID0gbW9kZWwuc2V2KSlbLTFdXG5cbiAgICAjIyBDb21wdXRlIHRoZSBlbXBpcmljYWwgY2RmIG9mIHRoZSBzYW1wbGUuIERvbmUgbWFudWFsbHkgaW5zdGVhZFxuICAgICMjIG9mIGNhbGxpbmcgc3RhdHM6OjplY2RmKCkgdG8ga2VlcCBhIGNvcHkgb2YgdGhlIGVtcGlyaWNhbCBwbWZcbiAgICAjIyBpbiB0aGUgZW52aXJvbm1lbnQgd2l0aG91dCBjb21wdXRpbmcgaXQgdHdpY2UuXG4gICAgeCA8LSBzb3J0KHgpXG4gICAgdmFscyA8LSB1bmlxdWUoeClcbiAgICBmcyA8LSB0YWJ1bGF0ZShtYXRjaCh4LCB2YWxzKSkvbGVuZ3RoKHgpXG4gICAgRlVOIDwtIGFwcHJveGZ1bih2YWxzLCBwbWluKGN1bXN1bShmcyksIDEpLCBtZXRob2QgPSBcImNvbnN0YW50XCIsXG4gICAgICAgICAgICAgICAgICAgICB5bGVmdCA9IDAsIHlyaWdodCA9IDEsIGYgPSAwLCB0aWVzID0gXCJvcmRlcmVkXCIpXG4gICAgY2xhc3MoRlVOKSA8LSBjKFwiZWNkZlwiLCBcInN0ZXBmdW5cIiwgY2xhc3MoRlVOKSlcbiAgICBhc3NpZ24oXCJmc1wiLCBmcywgZW52aXIgPSBlbnZpcm9ubWVudChGVU4pKVxuICAgIEZVTlxufVxuXG5hZ2dyZWdhdGVEaXN0IDwtXG4gICAgZnVuY3Rpb24obWV0aG9kID0gYyhcInJlY3Vyc2l2ZVwiLCBcImNvbnZvbHV0aW9uXCIsIFwibm9ybWFsXCIsIFwibnBvd2VyXCIsIFwic2ltdWxhdGlvblwiKSxcbiAgICAgICAgICAgICBtb2RlbC5mcmVxID0gTlVMTCwgbW9kZWwuc2V2ID0gTlVMTCwgcDAgPSBOVUxMLCB4LnNjYWxlID0gMSxcbiAgICAgICAgICAgICBjb252b2x2ZSA9IDAsIG1vbWVudHMsIG5iLnNpbXVsLCAuLi4sXG4gICAgICAgICAgICAgdG9sID0gMWUtMDYsIG1heGl0ID0gNTAwLCBlY2hvID0gRkFMU0UpXG57XG4gICAgQ2FsbCA8LSBtYXRjaC5jYWxsKClcblxuICAgICMjIFRoZSBtZXRob2QgdXNlZCBlc3NlbnRpYWxseSB0ZWxscyB3aGljaCBmdW5jdGlvbiBzaG91bGQgYmVcbiAgICAjIyBjYWxsZWQgZm9yIHRoZSBjYWxjdWxhdGlvbiBvZiB0aGUgYWdncmVnYXRlIGNsYWltc1xuICAgICMjIGRpc3RyaWJ1dGlvbi5cbiAgICBtZXRob2QgPC0gbWF0Y2guYXJnKG1ldGhvZClcblxuICAgIGlmIChtZXRob2QgPT0gXCJub3JtYWxcIilcbiAgICB7XG4gICAgICAgICMjIEFuIGVycm9yIG1lc3NhZ2UgaXMgaXNzdWVkIGlmIHRoZSBudW1iZXIgb2YgbW9tZW50cyBsaXN0ZWRcbiAgICAgICAgIyMgaXMgbm90IGFwcHJvcHJpYXRlIGZvciB0aGUgbWV0aG9kLiBIb3dldmVyIGl0IGlzIHRoZSB1c2VyJ3NcbiAgICAgICAgIyMgcmVzcG9uc2liaWxpdHkgdG8gbGlzdCB0aGUgbW9tZW50cyBpbiB0aGUgY29ycmVjdCBvcmRlclxuICAgICAgICAjIyBzaW5jZSB0aGUgdmVjdG9yIGlzIG5vdCByZXF1aXJlZCB0byBiZSBuYW1lZC5cbiAgICAgICAgaWYgKG1pc3NpbmcobW9tZW50cykgfHwgbGVuZ3RoKG1vbWVudHMpIDwgMilcbiAgICAgICAgICAgIHN0b3AoXCInbW9tZW50cycgbXVzdCBzdXBwbHkgdGhlIG1lYW4gYW5kIHZhcmlhbmNlIG9mIHRoZSBkaXN0cmlidXRpb25cIilcbiAgICAgICAgRlVOIDwtIG5vcm1hbChtb21lbnRzWzFdLCBtb21lbnRzWzJdKVxuICAgICAgICBjb21tZW50KEZVTikgPC0gXCJOb3JtYWwgYXBwcm94aW1hdGlvblwiXG4gICAgfVxuXG4gICAgZWxzZSBpZiAobWV0aG9kID09IFwibnBvd2VyXCIpXG4gICAge1xuICAgICAgICBpZiAobWlzc2luZyhtb21lbnRzKSB8fCBsZW5ndGgobW9tZW50cykgPCAzKVxuICAgICAgICAgICAgc3RvcChcIidtb21lbnRzJyBtdXN0IHN1cHBseSB0aGUgbWVhbiwgdmFyaWFuY2UgYW5kIHNrZXduZXNzIG9mIHRoZSBkaXN0cmlidXRpb25cIilcbiAgICAgICAgRlVOIDwtIG5wb3dlcihtb21lbnRzWzFdLCBtb21lbnRzWzJdLCBtb21lbnRzWzNdKVxuICAgICAgICBjb21tZW50KEZVTikgPC0gXCJOb3JtYWwgUG93ZXIgYXBwcm94aW1hdGlvblwiXG4gICAgfVxuICAgIGVsc2UgaWYgKG1ldGhvZCA9PSBcInNpbXVsYXRpb25cIilcbiAgICB7XG4gICAgICAgIGlmIChtaXNzaW5nKG5iLnNpbXVsKSlcbiAgICAgICAgICAgIHN0b3AoXCInbmIuc2ltdWwnIG11c3Qgc3VwcGx5IHRoZSBudW1iZXIgb2Ygc2ltdWxhdGlvbnNcIilcbiAgICAgICAgaWYgKGlzLm51bGwobmFtZXMobW9kZWwuZnJlcSkpICYmIGlzLm51bGwobmFtZXMobW9kZWwuc2V2KSkpXG4gICAgICAgICAgICBzdG9wKFwiZXhwcmVzc2lvbnMgaW4gJ21vZGVsLmZyZXEnIGFuZCAnbW9kZWwuc2V2JyBtdXN0IGJlIG5hbWVkXCIpXG4gICAgICAgIEZVTiA8LSBzaW1TKG5iLnNpbXVsLCBtb2RlbC5mcmVxID0gbW9kZWwuZnJlcSwgbW9kZWwuc2V2ID0gbW9kZWwuc2V2KVxuICAgICAgICBjb21tZW50KEZVTikgPC0gXCJBcHByb3hpbWF0aW9uIGJ5IHNpbXVsYXRpb25cIlxuICAgIH1cbiAgICBlbHNlXG4gICAge1xuICAgICAgICAjIyBcInJlY3Vyc2l2ZVwiIGFuZCBcImNvbnZvbHV0aW9uXCIgY2FzZXMuIEJvdGggcmVxdWlyZSBhXG4gICAgICAgICMjIGRpc2NyZXRlIGRpc3RyaWJ1dGlvbiBvZiBjbGFpbSBhbW91bnRzLCB0aGF0IGlzIGEgdmVjdG9yIG9mXG4gICAgICAgICMjIHByb2JhYmlsaXRpZXMgaW4gYXJndW1lbnQgJ21vZGVsLnNldicuXG4gICAgICAgIGlmICghaXMubnVtZXJpYyhtb2RlbC5zZXYpKVxuICAgICAgICAgICAgc3RvcChcIidtb2RlbC5zZXYnIG11c3QgYmUgYSB2ZWN0b3Igb2YgcHJvYmFiaWxpdGllc1wiKVxuXG4gICAgICAgICMjIFJlY3Vyc2l2ZSBtZXRob2QgdXNlcyBhIG1vZGVsIGZvciB0aGUgZnJlcXVlbmN5IGRpc3RyaWJ1dGlvbi5cbiAgICAgICAgaWYgKG1ldGhvZCA9PSBcInJlY3Vyc2l2ZVwiKVxuICAgICAgICB7XG4gICAgICAgICAgICBpZiAoaXMubnVsbChtb2RlbC5mcmVxKSB8fCAhaXMuY2hhcmFjdGVyKG1vZGVsLmZyZXEpKVxuICAgICAgICAgICAgICAgIHN0b3AoXCJmcmVxdWVuY3kgZGlzdHJpYnV0aW9uIG11c3QgYmUgc3VwcGxpZWQgYXMgYSBjaGFyYWN0ZXIgc3RyaW5nXCIpXG4gICAgICAgICAgICBkaXN0IDwtIG1hdGNoLmFyZyh0b2xvd2VyKG1vZGVsLmZyZXEpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyhcInBvaXNzb25cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJnZW9tZXRyaWNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuZWdhdGl2ZSBiaW5vbWlhbFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImJpbm9taWFsXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibG9nYXJpdGhtaWNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ6ZXJvLXRydW5jYXRlZCBwb2lzc29uXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiemVyby10cnVuY2F0ZWQgZ2VvbWV0cmljXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiemVyby10cnVuY2F0ZWQgbmVnYXRpdmUgYmlub21pYWxcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ6ZXJvLXRydW5jYXRlZCBiaW5vbWlhbFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInplcm8tbW9kaWZpZWQgbG9nYXJpdGhtaWNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ6ZXJvLW1vZGlmaWVkIHBvaXNzb25cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ6ZXJvLW1vZGlmaWVkIGdlb21ldHJpY1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInplcm8tbW9kaWZpZWQgbmVnYXRpdmUgYmlub21pYWxcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ6ZXJvLW1vZGlmaWVkIGJpbm9taWFsXCIpKVxuICAgICAgICAgICAgRlVOIDwtIHBhbmplcihmeCA9IG1vZGVsLnNldiwgZGlzdCA9IGRpc3QsIHAwID0gcDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHguc2NhbGUgPSB4LnNjYWxlLCAuLi4sIGNvbnZvbHZlID0gY29udm9sdmUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRvbCA9IHRvbCwgbWF4aXQgPSBtYXhpdCwgZWNobyA9IGVjaG8pXG4gICAgICAgICAgICBjb21tZW50KEZVTikgPC0gXCJSZWN1cnNpdmUgbWV0aG9kIGFwcHJveGltYXRpb25cIlxuICAgICAgICB9XG5cbiAgICAgICAgIyMgQ29udm9sdXRpb24gbWV0aG9kIHJlcXVpcmVzIGEgdmVjdG9yIG9mIHByb2JhYmlsaXRpZXMgaW5cbiAgICAgICAgIyMgYXJndW1lbnQgJ21vZGVsLmZyZXEnLlxuICAgICAgICBlbHNlIGlmIChtZXRob2QgPT0gXCJjb252b2x1dGlvblwiKVxuICAgICAgICB7XG4gICAgICAgICAgICBpZiAoIWlzLm51bWVyaWMobW9kZWwuZnJlcSkpXG4gICAgICAgICAgICAgICAgc3RvcChcIidtb2RlbC5mcmVxJyBtdXN0IGJlIGEgdmVjdG9yIG9mIHByb2JhYmlsaXRpZXNcIilcbiAgICAgICAgICAgIEZVTiA8LSBleGFjdChmeCA9IG1vZGVsLnNldiwgcG4gPSBtb2RlbC5mcmVxLCB4LnNjYWxlID0geC5zY2FsZSlcbiAgICAgICAgICAgIGNvbW1lbnQoRlVOKSA8LSBcIkV4YWN0IGNhbGN1bGF0aW9uIChjb252b2x1dGlvbnMpXCJcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICBzdG9wKFwiaW50ZXJuYWwgZXJyb3JcIilcbiAgICB9XG5cbiAgICAjIyBSZXR1cm4gY3VtdWxhdGl2ZSBkaXN0cmlidXRpb24gZnVuY3Rpb25cbiAgICBjbGFzcyhGVU4pIDwtIGMoXCJhZ2dyZWdhdGVEaXN0XCIsIGNsYXNzKEZVTikpXG4gICAgYXR0cihGVU4sIFwiY2FsbFwiKSA8LSBDYWxsXG4gICAgRlVOXG4gICAgfVxuXG5cbnBsb3QuYWdncmVnYXRlRGlzdCA8LSBmdW5jdGlvbih4LCB4bGltLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlsYWIgPSBleHByZXNzaW9uKEZbU10oeCkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1haW4gPSBcIkFnZ3JlZ2F0ZSBDbGFpbSBBbW91bnQgRGlzdHJpYnV0aW9uXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViID0gY29tbWVudCh4KSwgLi4uKVxue1xuICAgICMjIEZ1bmN0aW9uIHBsb3QoKSBpcyB1c2VkIGZvciB0aGUgc3RlcCBjZGZzIGFuZCBmdW5jdGlvbiBjdXJ2ZSgpXG4gICAgIyMgaW4gdGhlIGNvbnRpbnVvdXMgY2FzZXMuXG4gICAgaWYgKFwic3RlcGZ1blwiICVpbiUgY2xhc3MoeCkpXG4gICAge1xuICAgICAgICAjIyBNZXRob2QgZm9yIGNsYXNzICdlY2RmJyB3aWxsIG1vc3QgcHJvYmFibHkgYmUgdXNlZC5cbiAgICAgICAgTmV4dE1ldGhvZChtYWluID0gbWFpbiwgeWxhYiA9IHlsYWIsIC4uLilcbiAgICB9XG4gICAgZWxzZVxuICAgIHtcbiAgICAgICAgIyMgTGltaXRzIGZvciB0aGUgeC1heGlzIGFyZSBzdXBwbGllZCBpZiBub25lIGFyZSBnaXZlblxuICAgICAgICAjIyBpbiBhcmd1bWVudC5cbiAgICAgICAgaWYgKG1pc3NpbmcoeGxpbSkpXG4gICAgICAgIHtcbiAgICAgICAgICAgIG1lYW4gPC0gZ2V0KFwibWVhblwiLCBlbnZpciA9IGVudmlyb25tZW50KHgpKVxuICAgICAgICAgICAgc2QgPC0gc3FydChnZXQoXCJ2YXJpYW5jZVwiLCBlbnZpciA9IGVudmlyb25tZW50KHgpKSlcbiAgICAgICAgICAgIHhsaW0gPC0gYyhtZWFuIC0gMyAqIHNkLCBtZWFuICsgMyAqIHNkKVxuICAgICAgICB9XG4gICAgICAgIGN1cnZlKHgsIG1haW4gPSBtYWluLCB5bGFiID0geWxhYiwgeGxpbSA9IHhsaW0sIHlsaW0gPSBjKDAsIDEpLCAuLi4pXG4gICAgfVxuICAgIG10ZXh0KHN1YiwgbGluZSA9IDAuNSlcbn1cblxuc2ltdWwgPC0gZnVuY3Rpb24obm9kZXMsIG1vZGVsLmZyZXEgPSBOVUxMLCBtb2RlbC5zZXYgPSBOVUxMLCB3ZWlnaHRzID0gTlVMTClcbntcbiAgICAjIyBHZXQgbGV2ZWwgbmFtZXMuIEVhY2ggY291bGQgYmUgTlVMTC5cbiAgICBsZXZlbC5uYW1lcyA8LSBuYW1lcyhub2RlcylcbiAgICBmcmVxLm5hbWVzIDwtIG5hbWVzKG1vZGVsLmZyZXEpXG4gICAgc2V2Lm5hbWVzIDwtIG5hbWVzKG1vZGVsLnNldilcblxuICAgICMjICdub2RlcycgbXVzdCBiZSBhIG5hbWVkIGxpc3QuIE9uZSBleGNlcHRpb24gaXMgYWxsb3dlZDogdGhlcmVcbiAgICAjIyBpcyBvbmx5IG9uZSBsZXZlbC4gSW4gdGhpcyBjYXNlLCBhZGQgYSBwcmVkZXRlcm1pbmVkIG5hbWUgaWZcbiAgICAjIyB0aGVyZSBpc24ndCBvbmUgYWxyZWFkeSBhbmQgbWFrZSBzdXJlICdub2RlcycgaXMgYSBsaXN0LlxuICAgIGlmIChsZW5ndGgobm9kZXMpID09IDFMKVxuICAgIHtcbiAgICAgICAgaWYgKGlzLm51bGwobGV2ZWwubmFtZXMpKVxuICAgICAgICAgICAgbmFtZXMobm9kZXMpIDwtIFwiWFwiXG4gICAgICAgIG5vZGVzIDwtIGFzLmxpc3Qobm9kZXMpXG4gICAgfVxuICAgIGVsc2VcbiAgICB7XG4gICAgICAgIGlmICghaXMubGlzdChub2RlcykgfHwgaXMubnVsbChsZXZlbC5uYW1lcykpXG4gICAgICAgICAgICBzdG9wKFwiJ25vZGVzJyBtdXN0IGJlIGEgbmFtZWQgbGlzdFwiKVxuICAgIH1cblxuICAgICMjIERldGVybWluZSBpZiBmcmVxdWVuY3kgYW5kIHNldmVyaXR5IG1vZGVscyBhcmUgcHJlc2VudC4gS2VlcFxuICAgICMjIGZvciBmdXR1cmUgdXNlLlxuICAgIGhhcy5mcmVxIDwtICFhbGwoc2FwcGx5KG1vZGVsLmZyZXEsIGlzLm51bGwpKVxuICAgIGhhcy5zZXYgIDwtICFhbGwoc2FwcGx5KG1vZGVsLnNldiwgaXMubnVsbCkpXG5cbiAgICAjIyBDaGVjayB0aGF0IGF0IGxlYXN0IG9uZSBvZiAnbW9kZWwuZnJlcScgb3IgJ21vZGVsLnNldicgaXNcbiAgICAjIyBwcmVzZW50IGFuZCB0aGF0IHRoZSBsZXZlbCBuYW1lcyBtYXRjaCB3aXRoIHRob3NlIG9mICdub2RlcycuXG4gICAgIyMgUGVyaGFwcyBpcyB0aGVyZSBhIGZhbmNpZXIgd2F5IHRvIGRvIGFsbCB0aGVzZSB0ZXN0cywgYnV0IHRoZVxuICAgICMjIHZlcnNpb24gYmVsb3cgaXMgYXQgbGVhc3QgZWFzeSB0byBmb2xsb3cuXG4gICAgaWYgKGhhcy5mcmVxKVxuICAgIHtcbiAgICAgICAgaWYgKGhhcy5zZXYpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGlmICghIChpZGVudGljYWwobGV2ZWwubmFtZXMsIGZyZXEubmFtZXMpICYmXG4gICAgICAgICAgICAgICAgICAgaWRlbnRpY2FsKGxldmVsLm5hbWVzLCBzZXYubmFtZXMpKSlcbiAgICAgICAgICAgICAgICBzdG9wKFwibGV2ZWwgbmFtZXMgZGlmZmVyZW50IGluICdub2RlcycsICdtb2RlbC5mcmVxJyBhbmQgJ21vZGVsLnNldidcIilcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIGlmICghaWRlbnRpY2FsKGxldmVsLm5hbWVzLCBmcmVxLm5hbWVzKSlcbiAgICAgICAgICAgICAgICBzdG9wKFwibGV2ZWwgbmFtZXMgZGlmZmVyZW50IGluICdub2RlcycsICdtb2RlbC5mcmVxJyBhbmQgJ21vZGVsLnNldidcIilcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlXG4gICAge1xuICAgICAgICBpZiAoaGFzLnNldilcbiAgICAgICAge1xuICAgICAgICAgICAgaWYgKCFpZGVudGljYWwobGV2ZWwubmFtZXMsIHNldi5uYW1lcykpXG4gICAgICAgICAgICAgICAgc3RvcChcImxldmVsIG5hbWVzIGRpZmZlcmVudCBpbiAnbm9kZXMnLCAnbW9kZWwuZnJlcScgYW5kICdtb2RlbC5zZXYnXCIpXG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgc3RvcChcIm9uZSBvZiAnbW9kZWwuZnJlcScgb3IgJ21vZGVsLnNldicgbXVzdCBiZSBub24tTlVMTFwiKVxuICAgIH1cblxuICAgICMjIFRoZSBmdW5jdGlvbiBpcyB3cml0dGVuIGZvciBtb2RlbHMgd2l0aCBhdCBsZWFzdCB0d28gbGV2ZWxzXG4gICAgIyMgKGVudGl0eSBhbmQgeWVhcikuIElmIHRoZXJlIGlzIG9ubHkgb25lLCBhZGQgYSBkdW1teSBsZXZlbCB0b1xuICAgICMjIGF2b2lkIHNjYXR0ZXJpbmcgdGhlIGNvZGUgd2l0aCBjb25kaXRpb25zLlxuICAgIGlmIChsZW5ndGgobm9kZXMpIDwgMkwpXG4gICAge1xuICAgICAgICBub2RlcyA8LSBjKG5vZGUgPSAxLCBub2RlcylcbiAgICAgICAgbW9kZWwuZnJlcSA8LVxuICAgICAgICAgICAgaWYgKGhhcy5mcmVxKSBjKGV4cHJlc3Npb24obm9kZSA9IE5VTEwpLCBtb2RlbC5mcmVxKSBlbHNlIE5VTExcbiAgICAgICAgbW9kZWwuc2V2IDwtXG4gICAgICAgICAgICBpZiAoaGFzLnNldikgYyhleHByZXNzaW9uKG5vZGUgPSBOVUxMKSwgbW9kZWwuc2V2KSBlbHNlIE5VTExcbiAgICB9XG5cbiAgICAjIyBGcmVxdWVudGx5IHVzZWQgcXVhbnRpdGllc1xuICAgIGxldmVsLm5hbWVzIDwtIG5hbWVzKG5vZGVzKSAgICAgICAgICMgbmVlZCB0byByZXNldCFcbiAgICBubGV2ZWxzIDwtIGxlbmd0aChub2RlcykgICAgICAgICAgICAjIG51bWJlciBvZiBsZXZlbHNcblxuICAgICMjIFJlY3ljbGluZyBvZiB0aGUgbnVtYmVyIG9mIG5vZGVzIChpZiBuZWVkZWQpIG11c3QgYmUgZG9uZVxuICAgICMjIFwibWFudWFsbHlcIi4gV2UgZG8gaXQgaGVyZSBvbmNlIGFuZCBmb3IgYWxsIHNpbmNlIGluIGFueSBjYXNlXG4gICAgIyMgYmVsb3cgd2Ugd2lsbCBuZWVkIHRvIGtub3cgdGhlIHRvdGFsIG51bWJlciBvZiBub2RlcyBpbiB0aGVcbiAgICAjIyBwb3J0Zm9saW8uIEZ1cnRoZXJtb3JlLCB0aGUgcmVjeWNsZWQgbGlzdCAnbm9kZXMnIHdpbGwgYmVcbiAgICAjIyByZXR1cm5lZCBieSB0aGUgZnVuY3Rpb24uXG4gICAgZm9yIChpIGluIDJMOm5sZXZlbHMpICAgICAgICMgZmlyc3Qgbm9kZSBkb2Vzbid0IG5lZWQgcmVjeWNsaW5nXG4gICAgICAgIG5vZGVzW1tpXV0gPC0gcmVwKG5vZGVzW1tpXV0sIGxlbmd0aCA9IHN1bShub2Rlc1tbaSAtIDFMXV0pKVxuXG4gICAgIyMgU2ltdWxhdGlvbiBvZiB0aGUgZnJlcXVlbmN5IG1peGluZyBwYXJhbWV0ZXJzIGZvciBlYWNoIGxldmVsXG4gICAgIyMgKGUuZy4gY2xhc3MsIGNvbnRyYWN0KSBhbmQsIGF0IHRoZSBsYXN0IGxldmVsLCB0aGUgYWN0dWFsXG4gICAgIyMgZnJlcXVlbmNpZXMuIElmICdtb2RlbC5mcmVxJyBpcyBOVUxMLCB0aGlzIGlzIGVxdWl2YWxlbnQgdG9cbiAgICAjIyBoYXZpbmcgb25lIGNsYWltIHBlciBub2RlLlxuICAgIGlmIChoYXMuZnJlcSlcbiAgICB7XG4gICAgICAgICMjIE5vcm1hbGx5LCBvbmx5IHRoZSBpbW1lZGlhdGVseSBhYm92ZSBtaXhpbmcgcGFyYW1ldGVyIHdpbGxcbiAgICAgICAgIyMgYmUgdXNlZCBpbiB0aGUgbW9kZWwgZm9yIGEgbGV2ZWwsIGJ1dCB0aGUgY29kZSBoZXJlIGFsbG93c1xuICAgICAgICAjIyBmb3IgbW9yZSBnZW5lcmFsIHNjaGVtZXMuIEZvciB0aGlzIHRvIHdvcmssIGFsbCBtaXhpbmdcbiAgICAgICAgIyMgcGFyYW1ldGVycyBoYXZlIHRvIGJlIGNvcnJlY3RseSByZWN5Y2xlZCBhdCBlYWNoIGxldmVsXG4gICAgICAgICMjIHdoZXJlIHRoZXkgKmNvdWxkKiBiZSB1c2VkLiBTaW5jZSB0aGUgbW9kZWwgYXQgYW55IGxldmVsXG4gICAgICAgICMjIGNvdWxkIGJlIE5VTEwsICdwYXJhbXMnIHdpbGwga2VlcCB0cmFjayBvZiB0aGUgbWl4aW5nXG4gICAgICAgICMjIHBhcmFtZXRlcnMgdGhhdCB3ZXJlIHNpbXVsYXRlZCBpbiBwcmV2aW91cyBpdGVyYXRpb24gb2YgdGhlXG4gICAgICAgICMjIGZvcnRoY29taW5nIGxvb3AuXG4gICAgICAgIHBhcmFtcyA8LSBjaGFyYWN0ZXIoMClcblxuICAgICAgICBmb3IgKGkgaW4gc2VxX2xlbihubGV2ZWxzKSlcbiAgICAgICAge1xuICAgICAgICAgICAgIyMgTnVtYmVyIG9mIG5vZGVzIGF0IHRoZSBjdXJyZW50IGxldmVsXG4gICAgICAgICAgICBuLmN1cnJlbnQgPC0gbm9kZXNbW2ldXVxuXG4gICAgICAgICAgICAjIyBFeHRyYWN0IHNpbXVsYXRpb24gbW9kZWwgZm9yIHRoZSBsZXZlbC5cbiAgICAgICAgICAgIENhbGwgPC0gbW9kZWwuZnJlcVtbaV1dXG5cbiAgICAgICAgICAgICMjIFJlcGVhdCB0aGUgbWl4aW5nIHBhcmFtZXRlcnMgb2YgYWxsIGxldmVscyBhYm92ZSB0aGVcbiAgICAgICAgICAgICMjIGN1cnJlbnQgb25lIHRoYXQgd2VyZSBzaW11bGF0ZWQgaW4gdGhlIHBhc3QuXG4gICAgICAgICAgICBmb3IgKGogaW4gc2VxX2Fsb25nKHBhcmFtcykpXG4gICAgICAgICAgICAgICAgZXZhbChzdWJzdGl0dXRlKHggPC0gcmVwLmludCh4LCBuLmN1cnJlbnQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0KHggPSBhcy5uYW1lKHBhcmFtc1tbal1dKSkpKVxuXG4gICAgICAgICAgICAjIyBTaW11bGF0ZSBkYXRhIG9ubHkgaWYgdGhlcmUgaXMgYSBtb2RlbCBhdCB0aGUgY3VycmVudFxuICAgICAgICAgICAgIyMgbGV2ZWwuXG4gICAgICAgICAgICBpZiAoIWlzLm51bGwoQ2FsbCkpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgIyMgQWRkIHRoZSBudW1iZXIgb2YgdmFyaWF0ZXMgdG8gdGhlIGNhbGwuXG4gICAgICAgICAgICAgICAgQ2FsbCRuIDwtIHN1bShuLmN1cnJlbnQpXG5cbiAgICAgICAgICAgICAgICAjIyBTaW11bGF0aW9uIG9mIHRoZSBtaXhpbmcgcGFyYW1ldGVycyBvciB0aGUgZGF0YS4gSW5cbiAgICAgICAgICAgICAgICAjIyB0aGUgbGF0dGVyIGNhc2UsIHN0b3JlIHRoZSByZXN1bHRzIGluIGEgZml4ZWRcbiAgICAgICAgICAgICAgICAjIyB2YXJpYWJsZSBuYW1lLlxuICAgICAgICAgICAgICAgIGlmIChpIDwgbmxldmVscylcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGFzc2lnbihsZXZlbC5uYW1lc1tbaV1dLCBldmFsKENhbGwpKVxuICAgICAgICAgICAgICAgICAgICBwYXJhbXNbaV0gPC0gbGV2ZWwubmFtZXNbW2ldXSAjIHJlbWVtYmVyIHRoZSBwYXJhbWV0ZXJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBmcmVxdWVuY2llcyA8LSBldmFsKENhbGwpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZVxuICAgICAgICBmcmVxdWVuY2llcyA8LSByZXAuaW50KDEsIHN1bShub2Rlc1tbbmxldmVsc11dKSlcblxuICAgICMjIFNpbXVsYXRpb24gb2YgdGhlIGNsYWltIGFtb3VudHMuIElmICdtb2RlbC5zZXYnIGlzIE5VTEwsIHRoaXNcbiAgICAjIyBpcyBlcXVpdmFsZW50IHRvIHNpbXVsYXRpbmcgZnJlcXVlbmNpZXMgb25seS5cbiAgICBpZiAoaGFzLnNldilcbiAgICB7XG4gICAgICAgICMjIFJlcGVhdCB0aGUgc2FtZSBwcm9jZWR1cmUgYXMgZm9yIHRoZSBmcmVxdWVuY3kgbW9kZWwsIHdpdGhcbiAgICAgICAgIyMgb25lIGRpZmZlcmVuY2U6IHdoZW4gcmVhY2hpbmcgdGhlIGxhc3QgbGV2ZWwgKGNsYWltXG4gICAgICAgICMjIGFtb3VudHMpLCB0aGUgbnVtYmVyIG9mIHZhcmlhdGVzIHRvIHNpbXVsYXRlIGlzIG5vdCBnaXZlblxuICAgICAgICAjIyBieSB0aGUgbnVtYmVyIG9mIG5vZGVzIGJ1dCByYXRoZXIgYnkgdGhlIG51bWJlciBvZiBjbGFpbXNcbiAgICAgICAgIyMgYXMgZm91bmQgaW4gJ2ZyZXF1ZW5jaWVzJy5cbiAgICAgICAgcGFyYW1zIDwtIGNoYXJhY3RlcigwKVxuXG4gICAgICAgIGZvciAoaSBpbiBzZXFfbGVuKG5sZXZlbHMpKVxuICAgICAgICB7XG4gICAgICAgICAgICBuLmN1cnJlbnQgPC0gbm9kZXNbW2ldXVxuICAgICAgICAgICAgQ2FsbCA8LSBtb2RlbC5zZXZbW2ldXVxuXG4gICAgICAgICAgICBmb3IgKGogaW4gc2VxX2Fsb25nKHBhcmFtcykpXG4gICAgICAgICAgICAgICAgZXZhbChzdWJzdGl0dXRlKHggPC0gcmVwLmludCh4LCBuLmN1cnJlbnQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0KHggPSBhcy5uYW1lKHBhcmFtc1tbal1dKSkpKVxuXG4gICAgICAgICAgICBpZiAoIWlzLm51bGwoQ2FsbCkpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgIyMgVGhlIHJlc3Qgb2YgdGhlIHByb2NlZHVyZSBkaWZmZXJzIGRlcGVuZGluZyBpZiB3ZVxuICAgICAgICAgICAgICAgICMjIGFyZSBzdGlsbCBzaW11bGF0aW5nIG1peGluZyBwYXJhbWV0ZXJzIG9yIGNsYWltXG4gICAgICAgICAgICAgICAgIyMgYW1vdW50cy5cbiAgICAgICAgICAgICAgICBpZiAoaSA8IG5sZXZlbHMpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAjIyBTaW11bGF0aW9uIG9mIG1peGluZyBwYXJhbWV0ZXJzIGlzIGlkZW50aWNhbCB0byB0aGVcbiAgICAgICAgICAgICAgICAgICAgIyMgc2ltdWxhdGlvbiBvZiBmcmVxdWVuY2llcy5cbiAgICAgICAgICAgICAgICAgICAgQ2FsbCRuIDwtIHN1bShuLmN1cnJlbnQpXG4gICAgICAgICAgICAgICAgICAgIGFzc2lnbihsZXZlbC5uYW1lc1tbaV1dLCBldmFsKENhbGwpKVxuICAgICAgICAgICAgICAgICAgICBwYXJhbXNbaV0gPC0gbGV2ZWwubmFtZXNbW2ldXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAjIyBGb3IgdGhlIHNpbXVsYXRpb24gb2YgY2xhaW0gYW1vdW50cywgdGhlIG51bWJlclxuICAgICAgICAgICAgICAgICAgICAjIyBvZiB2YXJpYXRlcyBpcyByYXRoZXIgZ2l2ZW4gYnkgdGhlXG4gICAgICAgICAgICAgICAgICAgICMjICdmcmVxdWVuY2llcycgb2JqZWN0LiBGdXJ0aGVybW9yZSwgdGhlIG1peGluZ1xuICAgICAgICAgICAgICAgICAgICAjIyBwYXJhbWV0ZXJzIG11c3QgYmUgcmVjeWNsZWQgb25jZSBtb3JlIHRvIG1hdGNoXG4gICAgICAgICAgICAgICAgICAgICMjIHRoZSB2ZWN0b3Igb2YgZnJlcXVlbmNpZXMuXG4gICAgICAgICAgICAgICAgICAgIGZvciAocCBpbiBpbnRlcnNlY3QoYWxsLnZhcnMoQ2FsbCksIHBhcmFtcykpXG4gICAgICAgICAgICAgICAgICAgICAgICBldmFsKHN1YnN0aXR1dGUoeCA8LSByZXAuaW50KHgsIGZyZXF1ZW5jaWVzKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0KHggPSBhcy5uYW1lKHApKSkpXG4gICAgICAgICAgICAgICAgICAgIENhbGwkbiA8LSBzdW0oZnJlcXVlbmNpZXMpXG4gICAgICAgICAgICAgICAgICAgIHNldmVyaXRpZXMgPC1ldmFsKENhbGwpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2VcbiAgICAgICAgc2V2ZXJpdGllcyA8LSByZXAuaW50KDEsIHN1bShmcmVxdWVuY2llcykpXG5cbiAgICAjIyBXZSBtdXN0IG5vdyBkaXN0cmlidXRlIHRoZSBjbGFpbSBhbW91bnRzIGluIHZlY3RvciAnc2V2ZXJpdGllcydcbiAgICAjIyB0byB0aGUgYXBwcm9wcmlhdGUgbm9kZXMuIFRoaXMgaXMgY29tcGxpY2F0ZWQgYnkgdGhlXG4gICAgIyMgcG9zc2liaWxpdHkgdG8gaGF2ZSBkaWZmZXJlbnQgbnVtYmVyIG9mIG5vZGVzICh5ZWFycyBvZlxuICAgICMjIG9ic2VydmF0aW9uKSBmb3IgZWFjaCBlbnRpdHkuIFRoZSByZXN1bHQgbXVzdCBiZSBhIG1hdHJpeFxuICAgICMjIHdpdGggdGhlIG51bWJlciBvZiBjb2x1bW5zIGVxdWFsIHRvIHRoZSBtYXhpbXVtIG51bWJlciBvZiBsYXN0XG4gICAgIyMgbGV2ZWwgbm9kZXMuXG4gICAgIyNcbiAgICAjIyBUaGUgbnVtYmVyIG9mIG5vZGVzICh5ZWFycyBvZiBvYnNlcnZhdGlvbikgcGVyIGVudGl0eSBpc1xuICAgICMjIGdpdmVuIGJ5ICduLmN1cnJlbnQnIHNpbmNlIHdlIHJlYWNoZWQgdGhlIGxhc3QgbGV2ZWwgaW4gKGVpdGhlclxuICAgICMjIG9uZSBvZikgdGhlIGFib3ZlIGxvb3BzLlxuICAgICMjXG4gICAgIyMgQXNzaWduIGEgdW5pcXVlIElEIHRvIGVhY2ggbm9kZSwgbGVhdmluZyBnYXBzIGZvciBub2RlcyB3aXRob3V0XG4gICAgIyMgb2JzZXJ2YXRpb25zLlxuICAgIGluZCA8LSB1bmxpc3QobWFwcGx5KHNlcSxcbiAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tID0gc2VxKGJ5ID0gbWF4KG4uY3VycmVudCksIGFsb25nID0gbi5jdXJyZW50KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSBuLmN1cnJlbnQpKVxuXG4gICAgIyMgUmVwZWF0aW5nIHRoZSB2ZWN0b3Igb2YgSURzIGFjY29yZGluZyB0byB0aGUgZnJlcXVlbmNpZXNcbiAgICAjIyBlZmZlY3RpdmVseSBhc3NpZ25zIGEgbm9kZSBJRCB0byBlYWNoIGNsYWltIGFtb3VudC4gVGhlIHZlY3RvclxuICAgICMjIG9mIGNsYWltIGFtb3VudHMgaXMgdGhlbiBzcGxpdCBieSBub2RlLCB5aWVsZGluZyBhIGxpc3Qgd2hlcmVcbiAgICAjIyBlYWNoIGVsZW1lbnQgY29ycmVzcG9uZHMgdG8gYSBub2RlIHdpdGggY2xhaW1zLlxuICAgIGYgPC0gcmVwLmludChpbmQsIGZyZXF1ZW5jaWVzKVxuICAgIHNldmVyaXRpZXMgPC0gc3BsaXQoc2V2ZXJpdGllcywgZilcblxuICAgICMjIElkZW50aWZ5IG5vZGVzIHdpdGggZnJlcXVlbmN5IGVxdWFsIHRvIDAsIHdoaWNoIGlzIGRpZmZlcmVudFxuICAgICMjIGZyb20gaGF2aW5nIG5vIG9ic2VydmF0aW9uIChOQSkuXG4gICAgZnJlcTAgPC0gaW5kW3doaWNoKGZyZXF1ZW5jaWVzID09IDApXVxuXG4gICAgIyMgUmVhcnJhbmdlIHRoZSBsaXN0IG9mIGNsYWltIGFtb3VudHMgaW4gYSBtYXRyaXg7XG4gICAgIyNcbiAgICAjIyAgICAgIG51bWJlciBvZiByb3dzOiBudW1iZXIgb2Ygbm9kZXMgYXQgdGhlIHBlbnVsdGltYXRlIGxldmVsXG4gICAgIyMgICAgICAgICAgICAgICAgICAgICAgKG51bWJlciBvZiBlbnRpdGllcylcbiAgICAjIyAgIG51bWJlciBvZiBjb2x1bW5zOiBtYXhpbXVtIG51bWJlciBvZiBub2RlcyBhdCB0aGUgbGFzdCBsZXZlbFxuICAgICMjICAgICAgICAgICAgICAgICAgICAgIChudW1iZXIgb2YgeWVhcnMgb2Ygb2JzZXJ2YXRpb24pLlxuICAgICMjXG4gICAgIyMgTW9yZW92ZXIsIGFzc2lnbiBhIHZhbHVlIG9mICdudW1lcmljKDApJyB0byBub2RlcyB3aXRoIGFcbiAgICAjIyBmcmVxdWVuY3kgb2YgMC5cbiAgICBucm93IDwtIGxlbmd0aChuLmN1cnJlbnQpICAgICAgICAgICAjIG51bWJlciBvZiBlbnRpdGllc1xuICAgIG5jb2wgPC0gbWF4KG4uY3VycmVudCkgICAgICAgICAgICAgICMgbnVtYmVyIG9mIHllYXJzXG4gICAgcmVzIDwtIGFzLmxpc3QocmVwLmludChOQSwgbnJvdyAqIG5jb2wpKVxuICAgIHJlc1t1bmlxdWUoZildIDwtIHNldmVyaXRpZXNcbiAgICByZXNbZnJlcTBdIDwtIGxhcHBseShyZXAuaW50KDAsIGxlbmd0aChmcmVxMCkpLCBudW1lcmljKVxuICAgIHJlcyA8LSBtYXRyaXgocmVzLCBucm93LCBuY29sLCBieXJvdyA9IFRSVUUsXG4gICAgICAgICAgICAgICAgICBkaW1uYW1lcyA9IGxpc3QoTlVMTCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXN0ZShsZXZlbC5uYW1lc1tubGV2ZWxzXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXFfbGVuKG5jb2wpLCBzZXAgPSBcIi5cIikpKVxuXG4gICAgIyMgUmVzaGFwZSB3ZWlnaHRzIGFzIGEgbWF0cml4LCBpZiBuZWNlc3NhcnkuXG4gICAgd2VpZ2h0cyA8LSBpZiAoaXMubnVsbCh3ZWlnaHRzKSlcbiAgICAgICAgTlVMTFxuICAgIGVsc2VcbiAgICB7XG4gICAgICAgICMjIEludGVncmF0ZSBOQXMgaW50byB0aGUgd2VpZ2h0cyBtYXRyaXggYXMgYXBwcm9wcmlhdGUuXG4gICAgICAgIHcgPC0gcmVwLmludChOQSwgbnJvdyAqIG5jb2wpXG4gICAgICAgIHdbaW5kXSA8LSB3ZWlnaHRzXG4gICAgICAgIG1hdHJpeCh3LCBucm93ID0gbnJvdywgYnlyb3cgPSBUUlVFLCBkaW1uYW1lcyA9IGRpbW5hbWVzKHJlcykpXG4gICAgfVxuXG4gICAgIyMgRmluYWxseSwgY3JlYXRlIGEgbWF0cml4IHdoZXJlIGVhY2ggcm93IGNvbnRhaW5zIHRoZSBzZXJpZXMgb2ZcbiAgICAjIyBpZGVudGlmaWVycyBmb3IgYW4gZW50aXR5IGluIHRoZSBwb3J0Zm9saW8sIGUuZy4gaWYgdGhlIGRhdGFcbiAgICAjIyBpcyBkZW5vdGVkIFhfe2lqa3R9LCBvbmUgbGluZSBvZiB0aGUgbWF0cml4IHdpbGwgY29udGFpblxuICAgICMjIHN1YnNjcmlwdHMgaSwgaiBhbmQgay4gQXMgd2UgbW92ZSBmcm9tIHJpZ2h0IHRvIGxlZnQgaW4gdGhlXG4gICAgIyMgY29sdW1ucyBvZiAnbScsIHRoZSBzdWJzY3JpcHRzIGFyZSBpbmNyZWFzaW5nbHkgcmVwZWF0ZWQuXG4gICAgbmNvbCA8LSBubGV2ZWxzIC0gMUxcbiAgICBtIDwtIG1hdHJpeCgxLCBucm93LCBuY29sLFxuICAgICAgICAgICAgICAgIGRpbW5hbWVzID0gbGlzdChOVUxMLCBoZWFkKGxldmVsLm5hbWVzLCBuY29sKSkpXG4gICAgZm9yIChpIGluIHNlcV9sZW4obmNvbCAtIDFMKSkgICAgIyBhbGwgYnV0IHRoZSBsYXN0IGNvbHVtblxuICAgIHtcbiAgICAgICAgIyMgVmVjdG9yICd4JyB3aWxsIG9yaWdpbmFsbHkgY29udGFpbiBhbGwgc3Vic2NyaXB0cyBmb3Igb25lXG4gICAgICAgICMjIGxldmVsLiBUaGVzZSBzdWJzY3JpcHRzIGFyZSB0aGVuIHJlcGVhdGVkIGFzIG5lZWRlZCB0byBnaXZlXG4gICAgICAgICMjIHRoZSBkZXNpcmVkIHJlc3VsdC4gVG8gYXZvaWQgYW5vdGhlciBleHBsaWNpdCBsb29wLCBJIHVzZSBhXG4gICAgICAgICMjICdsYXBwbHknIHdpdGggYSBkaXJlY3QgYXNzaWdubWVudCBpbiB0aGUgY3VycmVudFxuICAgICAgICAjIyBmcmFtZS4gU29tZXdoYXQgdW51c3VhbCwgYnV0IHRoaXMgaXMgdGhlIHNpbXBsZXN0IHByb2NlZHVyZVxuICAgICAgICAjIyBJIG1hbmFnZWQgdG8gY29tZSB1cCB3aXRoLlxuICAgICAgICB4IDwtIHVubGlzdChsYXBwbHkobm9kZXNbW2ldXSwgc2VxKSlcbiAgICAgICAgbGFwcGx5KG5vZGVzWyhpICsgMUwpOihubGV2ZWxzIC0gMUwpXSxcbiAgICAgICAgICAgICAgIGZ1bmN0aW9uKHYpIGFzc2lnbihcInhcIiwgcmVwLmludCh4LCB2KSwgZW52aXIgPSBwYXJlbnQuZnJhbWUoMikpKVxuICAgICAgICBtWywgaV0gPC0geFxuICAgIH1cbiAgICBtWywgbmNvbF0gPC0gdW5saXN0KGxhcHBseShub2Rlc1tbbmNvbF1dLCBzZXEpKSAjIGxhc3QgY29sdW1uXG5cbiAgICAjIyBSZXR1cm4gb2JqZWN0IG9mIGNsYXNzICdwb3J0Zm9saW8nXG4gICAgc3RydWN0dXJlKGxpc3QoZGF0YSA9IHJlcyxcbiAgICAgICAgICAgICAgICAgICB3ZWlnaHRzID0gd2VpZ2h0cyxcbiAgICAgICAgICAgICAgICAgICBjbGFzc2lmaWNhdGlvbiA9IG0sXG4gICAgICAgICAgICAgICAgICAgbm9kZXMgPSBub2RlcyxcbiAgICAgICAgICAgICAgICAgICBtb2RlbC5mcmVxID0gbW9kZWwuZnJlcSxcbiAgICAgICAgICAgICAgICAgICBtb2RlbC5zZXYgPSBtb2RlbC5zZXYpLFxuICAgICAgICAgICAgICBjbGFzcyA9IFwicG9ydGZvbGlvXCIpXG59XG5cbmRsb21heCA8LSBmdW5jdGlvbih4LCBzaGFwZT0xLCBzY2FsZT0xLCBsb2c9RkFMU0UpIHtcbiAgaWYgKGxvZz09RkFMU0UpIHJlc3VsdCA8LSBzaGFwZSpzY2FsZV5zaGFwZSAvIChzY2FsZSArIHgpXihzaGFwZSsxKVxuICBpZiAobG9nPT1UUlVFICkgcmVzdWx0IDwtIGxvZyhzaGFwZSkrc2hhcGUqbG9nKHNjYWxlKS0oc2hhcGUrMSkqbG9nKHNjYWxlICsgeClcbiAgcmV0dXJuKHJlc3VsdCkgfVxuXG5ybG9tYXggPC0gZnVuY3Rpb24obiwgc2hhcGU9MSwgc2NhbGU9MSkge1xuICB1IDwtIHJ1bmlmKG4pXG4gIHJlc3VsdCA8LSBzY2FsZSooKDEgLSB1KV4oLTEvc2hhcGUpLTEpXG4gIHJldHVybihyZXN1bHQpIH1cblxuSW5zYW1wbGVUb3duIDwtIHN1YnNldChJbnNhbXBsZSwgVHlwZVRvd249PTEpXG5cbiMgVGhlIG5lZ2F0aXZlIGJpbm9taWFsIGZyZXF1ZW5jeSBtb2RlbDogTlxuTiA8LSBJbnNhbXBsZVRvd24kRnJlcVxuZnJlcV9saWsgPC0gZnVuY3Rpb24ocGFybSkge1xuICByICAgIDwtIHBhcm1bMV1cbiAgYmV0YSA8LSBwYXJtWzJdXG4gIGxpayAgPC0gLXN1bShkbmJpbm9tKE4sIHNpemU9ciwgcHJvYj0xLygxK2JldGEpLCBsb2c9VFJVRSkpXG4gIHJldHVybihsaWspXG59XG5pbml0LnBhcm0uZnJlcSA8LSBjKG1lYW4oTikvKHZhcihOKS9tZWFuKE4pLTEpLCB2YXIoTikvbWVhbihOKS0xKSAjIGluaXRpYWwgZXN0aW1hdGVzIGJ5IG1ldGhvZCBvZiBtb21lbnRzXG5mcmVxX21vZCAgICAgICA8LSBvcHRpbShwYXI9aW5pdC5wYXJtLmZyZXEsIGZuPWZyZXFfbGlrKSAjIE1heGltdW0gbGlrZWxpaG9vZCBlc3RpbWF0aW9uIGZvciB0aGUgZnJlcXVlbmN5IG1vZGVsXG5cbnIuZXN0ICAgIDwtIGZyZXFfbW9kJHBhclsxXVxuYmV0YS5lc3QgPC0gZnJlcV9tb2QkcGFyWzJdXG5cbiMgVGhlIFBhcmV0byBzZXZlcml0eSBtb2RlbDogWGJhclxuWGJhciA8LSBJbnNhbXBsZVRvd24keUF2Z1t3aGljaChJbnNhbXBsZVRvd24kRnJlcT4wKV1cbnNldl9saWsgPC0gZnVuY3Rpb24ocGFybSkge1xuICBhbHBoYSA8LSAgcGFybVsxXVxuICB0aGV0YSA8LSAgcGFybVsyXVxuICBsaWsgICA8LSAtc3VtKGRsb21heChYYmFyLCBzaGFwZT1hbHBoYSwgc2NhbGU9dGhldGEsIGxvZz1UUlVFKSlcbiAgcmV0dXJuKGxpaylcbn1cbmluaXQucGFybS5zZXYgPC0gYyggMi8oMS1tZWFuKFhiYXIpXjIvdmFyKFhiYXIpKSAgLCBtZWFuKFhiYXIpKigyLygxLW1lYW4oWGJhcileMi92YXIoWGJhcikpLTEpICkgIyBpbml0aWFsIGVzdGltYXRlcyBieSBtZXRob2Qgb2YgbW9tZW50c1xuc2V2X21vZCAgICAgICA8LSBvcHRpbShwYXI9aW5pdC5wYXJtLnNldiwgZm49c2V2X2xpaywgbWV0aG9kPVwiTC1CRkdTLUJcIikgIyBNYXhpbXVtIGxpa2VsaWhvb2QgZXN0aW1hdGlvbiBmb3IgdGhlIHNldmVyaXR5IG1vZGVsXG5hbHBoYS5lc3QgICAgIDwtIHNldl9tb2QkcGFyWzFdXG50aGV0YS5lc3QgICAgIDwtIHNldl9tb2QkcGFyWzJdIiwic2FtcGxlIjoiIyBQYXJhbWV0ZXIgZXN0aW1hdGVzIGZyb20gdGhlIGZyZXF1ZW5jeSBtb2RlbDogYWxwaGEuZXN0LCB0aGV0YS5lc3RcbiMgUGFyYW1ldGVyIGVzdGltYXRlcyBmcm9tIHRoZSBzZXZlcml0eSAgbW9kZWw6ICAgICByLmVzdCwgIGJldGEuZXN0XG5cbiMgUmFuZG9tIHNhbXBsZXMgZnJvbSBmaXR0ZWQgZnJlcXVlbmN5IGFuZCBzZXZlcml0eSBtb2RlbHNcbmZyZXEgPC0gZXhwcmVzc2lvbihkYXRhID0gID8/KHNpemU9Pz8sIHByb2I9MS8oMSs/PykpKVxuc2V2ICA8LSBleHByZXNzaW9uKGRhdGEgPSAgPz8oc2hhcGU9Pz8sIHNjYWxlPT8/KSlcbiMgVGhlIGFnZ3JlZ2F0ZSBkaXN0cmlidXRpb24gXG5GcyAgIDwtIGFnZ3JlZ2F0ZURpc3QoXCJzaW11bGF0aW9uXCIsIG5iLnNpbXVsID0gMTAwMCwgbW9kZWwuZnJlcSA9ID8/LCBtb2RlbC5zZXYgPSA/PylcbnBsb3QoRnMpXG5saW5lcyhlY2RmKEluc2FtcGxlVG93biR5KSwgIGNvbD1cImJsdWVcIilcbmxlZ2VuZChcImJvdHRvbXJpZ2h0XCIsIGxlZ2VuZCA9IGMoXCJTaW11bGF0aW9uXCIsIFwiRW1waXJpY2FsXCIpLCBjb2w9YyhcImJsYWNrXCIsXCJibHVlXCIpLCBsdHk9YygxLDIpLCBwY2g9YygxLCAxOSkpIiwic29sdXRpb24iOiIjIFBhcmFtZXRlciBlc3RpbWF0ZXMgZnJvbSB0aGUgZnJlcXVlbmN5IG1vZGVsOiBhbHBoYS5lc3QsIHRoZXRhLmVzdFxuIyBQYXJhbWV0ZXIgZXN0aW1hdGVzIGZyb20gdGhlIHNldmVyaXR5ICBtb2RlbDogICAgIHIuZXN0LCAgYmV0YS5lc3RcblxuIyBSYW5kb20gc2FtcGxlcyBmcm9tIGZpdHRlZCBmcmVxdWVuY3kgYW5kIHNldmVyaXR5IG1vZGVsc1xuZnJlcSA8LSBleHByZXNzaW9uKGRhdGEgPSAgcm5iaW5vbShzaXplPXIuZXN0LCBwcm9iPTEvKDErYmV0YS5lc3QpKSlcbnNldiAgPC0gZXhwcmVzc2lvbihkYXRhID0gIHJsb21heChzaGFwZT1hbHBoYS5lc3QsIHNjYWxlPXRoZXRhLmVzdCkpXG4jIFRoZSBhZ2dyZWdhdGUgZGlzdHJpYnV0aW9uIFxuRnMgICA8LSBhZ2dyZWdhdGVEaXN0KFwic2ltdWxhdGlvblwiLCBuYi5zaW11bCA9IDEwMDAsIG1vZGVsLmZyZXEgPSBmcmVxLCBtb2RlbC5zZXYgPSBzZXYpXG5wbG90KEZzKVxubGluZXMoZWNkZihJbnNhbXBsZVRvd24keSksICBjb2w9XCJibHVlXCIpXG5sZWdlbmQoXCJib3R0b21yaWdodFwiLCBsZWdlbmQgPSBjKFwiU2ltdWxhdGlvblwiLCBcIkVtcGlyaWNhbFwiKSwgY29sPWMoXCJibGFja1wiLFwiYmx1ZVwiKSwgbHR5PWMoMSwyKSwgcGNoPWMoMSwgMTkpKSIsInNjdCI6IkZzbXNnIDwtIFwiRGlkIHlvdSBjb3JyZWN0bHkgc3BlY2lmeSB0aGUgb2JqZWN0IGBGc2A/XCJcbmV4KCkgJT4lIGNoZWNrX29iamVjdChcIkZzXCIsIHVuZGVmaW5lZF9tc2cgPSBcIk1ha2Ugc3VyZSB0byBub3QgcmVtb3ZlIGBGc2AhXCIpICU+JSBjaGVja19lcXVhbChpbmNvcnJlY3RfbXNnPUZzbXNnKVxuZnJlcW1zZyA8LSBcIkRpZCB5b3UgY29ycmVjdGx5IHNwZWNpZnkgdGhlIG9iamVjdCBgZnJlcWA/XCJcbmV4KCkgJT4lIGNoZWNrX29iamVjdChcImZyZXFcIiwgdW5kZWZpbmVkX21zZyA9IFwiTWFrZSBzdXJlIHRvIG5vdCByZW1vdmUgYGZyZXFgIVwiKSAlPiUgY2hlY2tfZXF1YWwoaW5jb3JyZWN0X21zZz1mcmVxbXNnKVxuc2V2bXNnIDwtIFwiRGlkIHlvdSBjb3JyZWN0bHkgc3BlY2lmeSB0aGUgb2JqZWN0IGBzZXZgP1wiXG5leCgpICU+JSBjaGVja19vYmplY3QoXCJzZXZcIiwgdW5kZWZpbmVkX21zZyA9IFwiTWFrZSBzdXJlIHRvIG5vdCByZW1vdmUgYHNldmAhXCIpICU+JSBjaGVja19lcXVhbChpbmNvcnJlY3RfbXNnPXNldm1zZylcbnN1Y2Nlc3NfbXNnKFwiR29vZCBqb2IhIFRoaXMgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgaG93IHRvIHVzZSBzaW11bGF0aW9uIHRvIGNhbGN1bGF0ZSBhIGNvbXBsaWNhdGVkIChkaXN0cmlidXRpb24pIGZ1bmN0aW9uLiBJdCBpcyBhbiBpbXBvcnRhbnQgdGFzayBpbiBvcmRlciB0byB2aXN1YWxpemUgdGhlIGRpc3RyaWJ1dGlvbiBvZiBjb21wb3VuZCBsb3NzZXMgYW5kIG1ha2Ugc3Vic2VxdWVudCBkZWNpc2lvbnMuXCIpIiwiaGludCI6IldlIHNob3VsZCB1c2UgdGhlIGVzdGltYXRlZCBwYXJhbWV0ZXJzIGZyb20gdGhlIGZyZXF1ZW5jeSBhbmQgc2V2ZXJpdHkgZGlzdHJpYnV0aW9ucyBpbiBjYWxjdWxhdGlvbiBvZiB0aGUgYWdncmVnYXRlIGNsYWltIGFtb3VudCBkaXN0cmlidXRpb24uIn0=
Tweedie Distribution
In this section, we learn how to:
Construct the Tweedie distribution from a collective risk model.
Establish the Tweedie distribution as a member of the exponential family of distributions.
Fit Tweedie distribution as a generalized linear model.
Video: Tweedie Distribution
Overheads: Tweedie Distribution (Click Tab to View)
A. Tweedie Distribution
B. Tweedie Distribution with Exposure
C. Distribution Function for Tweedie Distribution
D. Example
E. Example - R Code
Hide
Hide
Hide
Hide
Hide
Exercise. Fitting a Tweedie Distribution
Assignment Text
In this assignment, we fit a Tweedie model for a collective risk model using observed compound losses in LGPIF data with R
. Unlike the previous tutorials that required separate model fitting for the frequency and severity components, use of the Tweedie distribution enables us to fit a collective risk model in a single step.
Instructions
Restrict the sample to the subset of towns and identify the total claim severity as a global variable \(S\) .
Construct a function to determine the negative log-likelihood. Do this based on the hybrid probability mass/density function dtweedie() . This is a built-in function from R
library tweedie .
From the fitted Tweedie model via optim() , extract the estimated mu
, phi
, and p
.
After estimating the parameters of the Tweedie model, plot the empirical quantiles against the quantiles from the fitted model. Note that we generate the fitted quantiles via qtweedie() and the estimated Tweedie parameters.
eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6Ikluc2FtcGxlIDwtIHJlYWQuY3N2KFwiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL09wZW5BY3RUZXh0cy9MREFDb3Vyc2UxL21haW4vRGF0YS9JbnNhbXBsZS5jc3ZcIiwgaGVhZGVyPVQsIG5hLnN0cmluZ3M9YyhcIi5cIiksIHN0cmluZ3NBc0ZhY3RvcnM9RkFMU0UpXG5saWJyYXJ5KGxtZTQpXG5cbnNvdXJjZShcImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9PcGVuQWN0VGV4dHMvTERBQ291cnNlMS9tYWluL1JDb2RlL1R3ZWVkaWVTb3VyY2VDb2RlLlJtZFwiKSIsInNhbXBsZSI6Ikluc2FtcGxlVG93biA8LSBzdWJzZXQoSW5zYW1wbGUsIFR5cGVUb3duPT0xKVxuUyA8LSA/PyR5XG4jIFRoZSBuZWdhdGl2ZSBMb2cgLSBsaWtlbGlob29kXG5jb21wbG9zc19saWsgPC0gZnVuY3Rpb24ocGFybSkge1xuICBtdSAgICA8LSBwYXJtWzFdXG4gIHBoaSAgIDwtIHBhcm1bMl1cbiAgcCAgICAgPC0gcGFybVszXVxuICBsaWsgIDwtIC1zdW0oIGxvZyhkdHdlZWRpZShTLCBtdT1tdSwgcGhpPXBoaSwgcG93ZXI9ID8/KSkgKVxuICByZXR1cm4obGlrKSB9XG5pbml0LnBhcm0uY29tcGxvc3MgPC0gYyggbWVhbihTKSwgMzAwLCAxLjUpICAgICMgaW5pdGlhbCBlc3RpbWF0ZXMgXG4jIE1heGltdW0gbGlrZWxpaG9vZCBlc3RpbWF0aW9uIGZvciB0aGUgY29tcG91bmQgbG9zcyBtb2RlbFxuY29tcGxvc3NfbW9kIDwtIG9wdGltKHBhcj0/PywgIGZuPT8/LCBtZXRob2Q9XCJMLUJGR1MtQlwiKSBcblxubXUuZXN0ICA8LSBjb21wbG9zc19tb2QkcGFyWzFdXG5waGkuZXN0IDwtIGNvbXBsb3NzX21vZCQ/P1xucC5lc3QgICA8LSBjb21wbG9zc19tb2QkPz9cblxucGN0IDwtIHNlcSgwLjAxLDAuOTksMC4wMSlcbnBsb3QocXR3ZWVkaWUocGN0LCBtdT0/PywgcGhpPT8/LCBwb3dlcj1wLmVzdCkgLHF1YW50aWxlKEluc2FtcGxlVG93biR5LCBwcm9icz1wY3QpLCB4bGFiPVwiRml0dGVkIFF1YW50aWxlXCIsIHlsYWI9XCJFbXBpcmljYWwgUXVhbnRpbGVcIiwgeGxpbT1jKDAsNTAwMDApLCB5bGltPWMoMCw1MDAwMCkpXG5hYmxpbmUoMCwxKSIsInNvbHV0aW9uIjoiSW5zYW1wbGVUb3duIDwtIHN1YnNldChJbnNhbXBsZSwgVHlwZVRvd249PTEpXG5TIDwtIEluc2FtcGxlVG93biR5XG4jIFRoZSBuZWdhdGl2ZSBMb2cgLSBsaWtlbGlob29kXG5jb21wbG9zc19saWsgPC0gZnVuY3Rpb24ocGFybSkge1xuICBtdSAgICA8LSBwYXJtWzFdXG4gIHBoaSAgIDwtIHBhcm1bMl1cbiAgcCAgICAgPC0gcGFybVszXVxuICBsaWsgIDwtIC1zdW0oIGxvZyhkdHdlZWRpZShTLCBtdT1tdSwgcGhpPXBoaSwgcG93ZXI9cCkpIClcbiAgcmV0dXJuKGxpaykgfVxuaW5pdC5wYXJtLmNvbXBsb3NzIDwtIGMoIG1lYW4oUyksIDMwMCwgMS41KSAgICAjIGluaXRpYWwgZXN0aW1hdGVzIFxuIyBNYXhpbXVtIGxpa2VsaWhvb2QgZXN0aW1hdGlvbiBmb3IgdGhlIGNvbXBvdW5kIGxvc3MgbW9kZWxcbmNvbXBsb3NzX21vZCA8LSBvcHRpbShwYXI9aW5pdC5wYXJtLmNvbXBsb3NzLCBmbj1jb21wbG9zc19saWssIG1ldGhvZD1cIkNHXCIpIFxubXUuZXN0ICA8LSBjb21wbG9zc19tb2QkcGFyWzFdXG5waGkuZXN0IDwtIGNvbXBsb3NzX21vZCRwYXJbMl1cbnAuZXN0ICAgPC0gY29tcGxvc3NfbW9kJHBhclszXVxuXG5wY3QgPC0gc2VxKDAuMDEsMC45OSwwLjAxKVxucGxvdChxdHdlZWRpZShwY3QsIG11PW11LmVzdCwgcGhpPXBoaS5lc3QsIHBvd2VyPXAuZXN0KSAscXVhbnRpbGUoSW5zYW1wbGVUb3duJHksIHByb2JzPXBjdCksIHhsYWI9XCJGaXR0ZWQgUXVhbnRpbGVcIiwgeWxhYj1cIkVtcGlyaWNhbCBRdWFudGlsZVwiLCB4bGltPWMoMCw1MDAwMCksIHlsaW09YygwLDUwMDAwKSlcbmFibGluZSgwLDEpIiwic2N0IjoiU21zZyA8LSBcIkRpZCB5b3UgY29ycmVjdGx5IHNwZWNpZnkgdGhlIG9iamVjdCBgU2A/XCJcbmV4KCkgJT4lIGNoZWNrX29iamVjdChcIlNcIiwgdW5kZWZpbmVkX21zZyA9IFwiTWFrZSBzdXJlIHRvIG5vdCByZW1vdmUgYFNgIVwiKSAlPiUgY2hlY2tfZXF1YWwoaW5jb3JyZWN0X21zZz1TbXNnKVxuY29tcGxvc3NfbW9kbXNnIDwtIFwiRGlkIHlvdSBjb3JyZWN0bHkgc3BlY2lmeSB0aGUgb2JqZWN0IGBjb21wbG9zc19tb2RgP1wiXG5leCgpICU+JSBjaGVja19vYmplY3QoXCJjb21wbG9zc19tb2RcIiwgdW5kZWZpbmVkX21zZyA9IFwiTWFrZSBzdXJlIHRvIG5vdCByZW1vdmUgYGNvbXBsb3NzX21vZGAhXCIpICU+JSBjaGVja19lcXVhbChpbmNvcnJlY3RfbXNnPWNvbXBsb3NzX21vZG1zZylcbnAuZXN0bXNnIDwtIFwiRGlkIHlvdSBjb3JyZWN0bHkgc3BlY2lmeSB0aGUgb2JqZWN0IGBwLmVzdGA/XCJcbmV4KCkgJT4lIGNoZWNrX29iamVjdChcInAuZXN0XCIsIHVuZGVmaW5lZF9tc2cgPSBcIk1ha2Ugc3VyZSB0byBub3QgcmVtb3ZlIGBwLmVzdGAhXCIpICU+JSBjaGVja19lcXVhbChpbmNvcnJlY3RfbXNnPXAuZXN0bXNnKVxuc3VjY2Vzc19tc2coXCJMYXN0IHR1dG9yaWFsIGV4ZXJjaXNlLiBXZWxsIGRvbmUhIENvbXBhcmUgdG8gdGhlIG1vZGVsIGNvbnN0cnVjdGVkIGluIHR3byBwYXJ0cywgdGhlIFR3ZWVkaWUgaGFzIGZldyBwYXJhbWV0ZXJzLiBUaGlzIG1lYW5zIGl0IG1heSBub3QgZml0IGFzIHdlbGwgZm9yIHNvbWUgZGF0YXNldHMsIGVzcGVjaWFsbHkgdGhvc2VzIHdpdGggbG9uZ2VyIHRhaWxzLiBIb3dldmVyLCB0aGUgZmV3IHBhcmFtZXRlcnMgbWVhbnMgdGhhdCBpdCBpcyBlYXNpZXIgdG8gaW50cmVwcmV0LiBGdXJ0aGVyLCB0aGlzIHNpbXBsaWNpdHkgb2YgcGFyYW1ldGVycyBjYW4gYmVjb21lIHZlcnkgaW1wb3J0YW50IHdoZW4gaW50cm9kdWNpbmcgY292YXJpYXRlcy9yYXRpbmcgZmFjdG9ycyBpbnRvIHRoZSBtb2RlbGluZyBwcm9jZXNzLlwiKSIsImhpbnQiOiJGb3IgVHdlZWRpZSBkaXN0cmlidXRpb24sIHdlIGVzdGltYXRlIHRocmVlIHBhcmFtZXRlcnMgKG11LCBwaGksIHApIHRoYXQgZXhwbGFpbiB0aGUgb3ZlcmFsIG1lYW4sIGRpc3BlcnNpb24sIGFuZCBzaGFwZSBvZiB0aGUgZGlzdHJpYnV0aW9uLiJ9
Effects of Coverage Modifications
In this section, we learn how to:
Examine the impact of aggregate deductible on the aggregate loss.
Examine the effect of per-occurrence deductible on frequency and severity components in the aggregate loss.
Video: Effects of Coverage Modifications
Overheads: Effects of Coverage Modifications (Click Tab to View)
A. Aggregate Deductible
B. Per-occurrence Deductible
C. Per-occurrence Deductible and Frequency
D. Example
E. Per-occurrence Deductible
Hide
Hide
Hide
Hide
Hide
Contributors
Authors . Himchan Jeong , Simon Fraser University, and Peng Shi , University of Wisconsin-Madison, are the principal authors of the initial version of this chapter.
Chapter Maintainers . Please contact Himchan himchan_jeong@sfu.ca and/or Jed at jfrees@bus.wisc.edu for chapter comments and suggested improvements.