Activity Number: 181 - Contributed Poster Presentations: Section on Statistical Education

Type: Contributed

Date/Time: Monday, July 30, 2018 : 10:30 AM to 12:20 PM

Sponsor: Section on Statistical Education

Title: Classroom Demonstration: Deep Learning for Classification and Prediction, Introduction to GPU Computing

Author(s): Eric Suess*

Companies: CSU East Bay

Keywords: Artificial Neural Networks ; Deep Learning ; Classification ; Prediction ; parallel processing ; GPU computing

Abstract: We present examples of the use of basic Artificial Neural Networks (ANNs) for introductory Statistics classes at the undergraduate, major and first year graduate classes. Because of the available packages in R, ANNs are easily included in the discussion of Statistics classes as alternative methods to logistic regression and linear regression.

With the increases in computational power (parallel computation on CPUs, parallel computation on GPUs, TPUs, and NPUs, and with increases in RAM) Deep Learning has become possible. With the newer packages in R to connect to h2O, tensorflow, and keras, implementing Deep Learning is possible.

We present examples for running ANNs and Deep Learning in Statistics classes with discussion of the similarities and differences between traditional Statistical Methods and Deep Learning.

Outline:

  1. Introduction to Prediction in Statistics

In Statistics the idea of Prediction is primarily discussed with linear models and predictions are estimated by plugging specific values of the input variables where a prediction of \(Y\) is to be made. Confidence Intervals are computed for the mean prediction or and Prediction Intervals are computed for a future value.

Intro Statistics: Prediction is the estimation of an output variable from an input variable or variables.

The variables are both numeric and usually continuous, but many examples use discrete values and ignor this fact.

\[Y = \beta_0 + \beta_1 X \]

Statistics Majors: Prediction is the estimation of the dependent variable \(Y\), call it \(\hat{Y}\), from the independent variables \(X_1, X_2, ... , X_p\).

\[\hat{Y} =\hat{\beta}_0 + \hat{\beta}_1 X_1 + \hat{\beta}_2 X_2 + ... + \hat{\beta}_p X_p\]

The variables are all assumed to numeric and usually continuous or discrete. The use of indicator variables are introduced for the inclusion of categorical variables as independent variables.

The linear model that is estimated is

\[\hat{Y} =\beta_0 + \beta_1 X_1 + \beta_2 X_2 + ... + \beta_p X_p + \epsilon\]

where \(\epsilon \sim N(0,\sigma_\epsilon)\).

First Year Graduate Students: Prediction is the estimation of the dependent variable \(Y\) from the independent variables \(X_1, X_2, ... , X_p\)

\[\hat{Y} = \hat{f}( X_1, X_2, ... ,X_p)\]

At this level, linear and non-linear functions of the data are considered or transformations of the \(Y\) variable, as in Generalized Linear Models (GLMs).

The variables used in linear models are assumed to be numeric and usually continuous or discrete. Indicator variables are used for categorical independent variables. Functions of the independent variables are introduced for nonlinearities and interaction terms. Link functions are used for GLMs.

  1. Introduction to Classification in Statistics

In Statistics the idea of Classification is presented is discussed with categorical variables.

Intro Statistics: Which subgroup in a two-by-two table has the highest probability?

Statistics Majors: Which conditional subgroup in a two-by-two table has the highest conditional probability? Maybe Logistic Regression is introduced.

First Year Graduate Students: Logistic Regression is introduced and predicted probabilities are used to make predictions of a binary dependent variable \(Y = 0\) or \(Y=1\). Maybe Multinomial Regression and/or Poisson Regression is introduced in a course on Categorical Variables.

  1. Introduction to Prediction and Classification in Machine Learning

In Machine Learning prediction and classification are discussed in terms of the algorithms used and presented using the Holdout Method, using Training, Validation, and Testing datasets. So thinking in terms of measuring how well the model will perform on future data.

Prediction algorithms: Linear Regression, Decision Tree, Random Forests, SVMs

Prediction evaluation: MSE, MAE, \(R^2\), adjusted \(R^2\)

Classification algorithms: kNN, Naive Bayes, Logistic Regression, Decision Trees, Random Forests, SVMs

Classification evaluation: Accuracy, Sensitivity, Specificity, ROC, Recall, Precision, F1

  1. Connections between the use of Linear Regression in Statistics and Prediction in Machine Learning

At all levels of Classical Statistics instruction, Linear Regression is the primary example that is discussed when prediction is presented. Prediction is mostly discussed in terms of Prediction Intervals. The estimation of a new observation within the range of the data, otherwise, Forecasting is discussed.

In Bayesian Statistics Prediction is discussed in terms of Predictive Distributions and the associated credible intervals.

In Machine Learning numeric prediction is performed using Decision Trees and Random Forests, Support Vector Machines (SVMs). Closeness of the predicted values to the holdout values is evaluated using a Loss Function such as MSE.

  1. Connections between Logistic Regression in Statistics and Classification in Machine Learning

Logistic Regression is usually not discussed in Introductory Statistics. This is unfortunate because of the results of applying logistic regression might be better appreciated by those students than hypothesis testing for proportions.

  1. What is an Artificial Neural Network?

How to explain aNNs for the students in different levels of Statistics Education?

First, it is important for students of Statistics to be aware of and be able to use aNNs. The reason is because so many of their devices (cell phones, computers, smart speakers) now use these methods. From facial recognition to translation to voice recognition.

Second, it should be pointed out that aNNs can be used to perform similar tasks as they are learning in Statistics for prediction and classification.

The idea or prediction is well presented in Statistics Education, but classification is not so well presented. And it is classification that is one of the main uses of Neural Networks. Topics including spam filtering and digit classification could become examples in Introductory Statistics courses though major courses and Graduate classes. These are modern extensions of the classification of Fisher’s iris data.

Intro Statistics: Modern Machine Learning technique. A black-box

Statistics Majors: Feed-Forward Neural Network

First Year Graduate Students: Feed-Forward Neural Network, Convolutional Neural Networks, and beyond. The discussion of the methods for estimating the weights on the network connections between the neurons can be discussed, including back propagation and dropout.

  1. What is Deep Learning?

There is a lot of discussion about Deep Learning these days from companies like Google. It was Google’s Chief Economist Hal Varian who has said, I keep saying the sexy job in the next ten years will be statisticians. People think I’m joking, but who would’ve guessed that computer engineers would’ve been the sexy job of the 1990s? Our ten years are about up and we have not added some of these new examples from computer science. We should to keep students interested. Don’t forget that Fisher what working on Biology problems and Tukey had a background in Chemistry. Many of the advances in our field have come from people working in other areas.

  1. Packages in R: neuralnet and nnet, h2o, tensorflow, keras

There are packages written in R that can be used, these are the neuralnet and nnet packages.

There is a package that can be installed to use h2o and others for tensorflow and keras. The advantage of these are that the software that R is connecting to are parallelized for use on multicore computers or clusters and they can be used with GPUs.

  1. With increased Ram (32 gigabytes, 64 gigabytes, 128 gigabytes) larger datasets can been run.

Getting more Ram can really help when trying to run bigger Deep Learning models.

  1. With GPUs the processing of deep learning models is much fast.

Figuring out how to use a nVidia GPU can be much faster on the same computer than using a CPU.

  1. New TPU’s from Google and NPU’s are allow the running of very large Deep Learning models.

Finally, cloud computing can be used to access GPUs and Google TPU’s. Google has introduced Python Notebooks with GPUs in it’s [colab] which lets you save your Python notebooks to Google Docs.

  1. Conclusions:

Should be introduce Neural Networks in the Statistics curriculum?

I would say yes and I would encourage they be introduced in Introductory books. The value of linear regression and logistic regression as first steps toward working with Big Data and Deep Learning is high. As students realize that linear regression and logistic regression can do the same things overall interest in Statistics will continue to grow.

References:

LS0tCnRpdGxlOiAiSlNNIDIwMTggUG9zdGVyIgpvdXRwdXQ6CiAgcGRmX2RvY3VtZW50OiBkZWZhdWx0CiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdAotLS0KCioqQWN0aXZpdHkgTnVtYmVyOioqCSoqMTgxKiogLSBDb250cmlidXRlZCBQb3N0ZXIgUHJlc2VudGF0aW9uczogU2VjdGlvbiBvbiBTdGF0aXN0aWNhbCBFZHVjYXRpb24KCioqVHlwZToqKglDb250cmlidXRlZAoKKipEYXRlL1RpbWU6KioJTW9uZGF5LCBKdWx5IDMwLCAyMDE4IDogMTA6MzAgQU0gdG8gMTI6MjAgUE0KCioqU3BvbnNvcjoqKglTZWN0aW9uIG9uIFN0YXRpc3RpY2FsIEVkdWNhdGlvbgoKKipUaXRsZToqKgkqKkNsYXNzcm9vbSBEZW1vbnN0cmF0aW9uOiBEZWVwIExlYXJuaW5nIGZvciBDbGFzc2lmaWNhdGlvbiBhbmQgUHJlZGljdGlvbiwgSW50cm9kdWN0aW9uIHRvIEdQVSBDb21wdXRpbmcqKgoKKipBdXRob3Iocyk6KioJRXJpYyBTdWVzcyoKCioqQ29tcGFuaWVzOioqCUNTVSBFYXN0IEJheQoKKipLZXl3b3JkczoqKglBcnRpZmljaWFsIE5ldXJhbCBOZXR3b3JrcyA7IERlZXAgTGVhcm5pbmcgOyBDbGFzc2lmaWNhdGlvbiA7IFByZWRpY3Rpb24gOyBwYXJhbGxlbCBwcm9jZXNzaW5nIDsgR1BVIGNvbXB1dGluZwoKKipBYnN0cmFjdDoqKgpXZSBwcmVzZW50IGV4YW1wbGVzIG9mIHRoZSB1c2Ugb2YgYmFzaWMgQXJ0aWZpY2lhbCBOZXVyYWwgTmV0d29ya3MgKEFOTnMpIGZvciBpbnRyb2R1Y3RvcnkgU3RhdGlzdGljcyBjbGFzc2VzIGF0IHRoZSB1bmRlcmdyYWR1YXRlLCBtYWpvciBhbmQgZmlyc3QgeWVhciBncmFkdWF0ZSBjbGFzc2VzLiBCZWNhdXNlIG9mIHRoZSBhdmFpbGFibGUgcGFja2FnZXMgaW4gUiwgQU5OcyBhcmUgZWFzaWx5IGluY2x1ZGVkIGluIHRoZSBkaXNjdXNzaW9uIG9mIFN0YXRpc3RpY3MgY2xhc3NlcyBhcyBhbHRlcm5hdGl2ZSBtZXRob2RzIHRvIGxvZ2lzdGljIHJlZ3Jlc3Npb24gYW5kIGxpbmVhciByZWdyZXNzaW9uLgoKV2l0aCB0aGUgaW5jcmVhc2VzIGluIGNvbXB1dGF0aW9uYWwgcG93ZXIgKHBhcmFsbGVsIGNvbXB1dGF0aW9uIG9uIENQVXMsIHBhcmFsbGVsIGNvbXB1dGF0aW9uIG9uIEdQVXMsIFRQVXMsIGFuZCBOUFVzLCBhbmQgd2l0aCBpbmNyZWFzZXMgaW4gUkFNKSBEZWVwIExlYXJuaW5nIGhhcyBiZWNvbWUgcG9zc2libGUuIFdpdGggdGhlIG5ld2VyIHBhY2thZ2VzIGluIFIgdG8gY29ubmVjdCB0byBoMk8sIHRlbnNvcmZsb3csIGFuZCBrZXJhcywgaW1wbGVtZW50aW5nIERlZXAgTGVhcm5pbmcgaXMgcG9zc2libGUuCgpXZSBwcmVzZW50IGV4YW1wbGVzIGZvciBydW5uaW5nIEFOTnMgYW5kIERlZXAgTGVhcm5pbmcgaW4gU3RhdGlzdGljcyBjbGFzc2VzIHdpdGggZGlzY3Vzc2lvbiBvZiB0aGUgc2ltaWxhcml0aWVzIGFuZCBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRyYWRpdGlvbmFsIFN0YXRpc3RpY2FsIE1ldGhvZHMgYW5kIERlZXAgTGVhcm5pbmcuCgojIE91dGxpbmU6CgojLiAgSW50cm9kdWN0aW9uIHRvIFByZWRpY3Rpb24gaW4gU3RhdGlzdGljcwoKSW4gU3RhdGlzdGljcyB0aGUgaWRlYSBvZiBQcmVkaWN0aW9uIGlzIHByaW1hcmlseSBkaXNjdXNzZWQgd2l0aCBsaW5lYXIgbW9kZWxzIGFuZCBwcmVkaWN0aW9ucyBhcmUgZXN0aW1hdGVkIGJ5IHBsdWdnaW5nIHNwZWNpZmljIHZhbHVlcyBvZiB0aGUgaW5wdXQgdmFyaWFibGVzIHdoZXJlIGEgcHJlZGljdGlvbiBvZiAkWSQgaXMgdG8gYmUgbWFkZS4gIENvbmZpZGVuY2UgSW50ZXJ2YWxzIGFyZSBjb21wdXRlZCBmb3IgdGhlIG1lYW4gcHJlZGljdGlvbiBvciBhbmQgUHJlZGljdGlvbiBJbnRlcnZhbHMgYXJlIGNvbXB1dGVkIGZvciBhIGZ1dHVyZSB2YWx1ZS4KCioqSW50cm8gU3RhdGlzdGljczoqKiBQcmVkaWN0aW9uIGlzIHRoZSBlc3RpbWF0aW9uIG9mIGFuIG91dHB1dCB2YXJpYWJsZSBmcm9tIGFuIGlucHV0IHZhcmlhYmxlIG9yIHZhcmlhYmxlcy4gIAoKVGhlIHZhcmlhYmxlcyBhcmUgYm90aCAqbnVtZXJpYyogYW5kIHVzdWFsbHkgKmNvbnRpbnVvdXMqLCBidXQgbWFueSBleGFtcGxlcyB1c2UgKmRpc2NyZXRlKiB2YWx1ZXMgYW5kIGlnbm9yIHRoaXMgZmFjdC4KCiQkWSA9IFxiZXRhXzAgKyBcYmV0YV8xIFggJCQKCgoqKlN0YXRpc3RpY3MgTWFqb3JzOioqIFByZWRpY3Rpb24gaXMgdGhlIGVzdGltYXRpb24gb2YgdGhlIGRlcGVuZGVudCB2YXJpYWJsZSAkWSQsIGNhbGwgaXQgJFxoYXR7WX0kLCBmcm9tIHRoZSBpbmRlcGVuZGVudCB2YXJpYWJsZXMgJFhfMSwgWF8yLCAuLi4gLCBYX3AkLgoKJCRcaGF0e1l9ID1caGF0e1xiZXRhfV8wICsgXGhhdHtcYmV0YX1fMSBYXzEgKyBcaGF0e1xiZXRhfV8yIFhfMiArIC4uLiArIFxoYXR7XGJldGF9X3AgWF9wJCQKClRoZSB2YXJpYWJsZXMgYXJlIGFsbCBhc3N1bWVkIHRvICpudW1lcmljKiBhbmQgdXN1YWxseSAqY29udGludW91cyogb3IgKmRpc2NyZXRlKi4gIFRoZSB1c2Ugb2YgaW5kaWNhdG9yIHZhcmlhYmxlcyBhcmUgaW50cm9kdWNlZCBmb3IgdGhlIGluY2x1c2lvbiBvZiBjYXRlZ29yaWNhbCB2YXJpYWJsZXMgYXMgaW5kZXBlbmRlbnQgdmFyaWFibGVzLgoKVGhlIGxpbmVhciBtb2RlbCB0aGF0IGlzIGVzdGltYXRlZCBpcyAKCiQkXGhhdHtZfSA9XGJldGFfMCArIFxiZXRhXzEgWF8xICsgXGJldGFfMiBYXzIgKyAuLi4gKyBcYmV0YV9wIFhfcCArIFxlcHNpbG9uJCQKCndoZXJlICRcZXBzaWxvbiBcc2ltIE4oMCxcc2lnbWFfXGVwc2lsb24pJC4KCioqRmlyc3QgWWVhciBHcmFkdWF0ZSBTdHVkZW50czoqKiBQcmVkaWN0aW9uIGlzIHRoZSBlc3RpbWF0aW9uIG9mIHRoZSBkZXBlbmRlbnQgdmFyaWFibGUgJFkkIGZyb20gdGhlIGluZGVwZW5kZW50IHZhcmlhYmxlcyAkWF8xLCBYXzIsIC4uLiAsIFhfcCQKCiQkXGhhdHtZfSA9IFxoYXR7Zn0oIFhfMSwgWF8yLCAuLi4gLFhfcCkkJAoKQXQgdGhpcyBsZXZlbCwgbGluZWFyIGFuZCBub24tbGluZWFyIGZ1bmN0aW9ucyBvZiB0aGUgZGF0YSBhcmUgY29uc2lkZXJlZCBvciB0cmFuc2Zvcm1hdGlvbnMgb2YgdGhlICRZJCB2YXJpYWJsZSwgYXMgaW4gR2VuZXJhbGl6ZWQgTGluZWFyIE1vZGVscyAoR0xNcykuCgpUaGUgdmFyaWFibGVzIHVzZWQgaW4gbGluZWFyIG1vZGVscyBhcmUgYXNzdW1lZCB0byBiZSAqbnVtZXJpYyogYW5kIHVzdWFsbHkgKmNvbnRpbnVvdXMqIG9yICpkaXNjcmV0ZSouICBJbmRpY2F0b3IgdmFyaWFibGVzIGFyZSB1c2VkIGZvciBjYXRlZ29yaWNhbCBpbmRlcGVuZGVudCB2YXJpYWJsZXMuICBGdW5jdGlvbnMgb2YgdGhlIGluZGVwZW5kZW50IHZhcmlhYmxlcyBhcmUgaW50cm9kdWNlZCBmb3Igbm9ubGluZWFyaXRpZXMgYW5kIGludGVyYWN0aW9uIHRlcm1zLiAgTGluayBmdW5jdGlvbnMgYXJlIHVzZWQgZm9yIEdMTXMuCgotIEV4YW1wbGUKICAgICAjLiBIb3VzZSBQcmljZXMKICAgICAKIy4gIEludHJvZHVjdGlvbiB0byBDbGFzc2lmaWNhdGlvbiBpbiBTdGF0aXN0aWNzCgpJbiBTdGF0aXN0aWNzIHRoZSBpZGVhIG9mIENsYXNzaWZpY2F0aW9uIGlzIHByZXNlbnRlZCBpcyBkaXNjdXNzZWQgd2l0aCBjYXRlZ29yaWNhbCB2YXJpYWJsZXMuCgoqKkludHJvIFN0YXRpc3RpY3M6KiogV2hpY2ggc3ViZ3JvdXAgaW4gYSB0d28tYnktdHdvIHRhYmxlIGhhcyB0aGUgaGlnaGVzdCBwcm9iYWJpbGl0eT8KCioqU3RhdGlzdGljcyBNYWpvcnM6KiogV2hpY2ggY29uZGl0aW9uYWwgc3ViZ3JvdXAgaW4gYSB0d28tYnktdHdvIHRhYmxlIGhhcyB0aGUgaGlnaGVzdCBjb25kaXRpb25hbCBwcm9iYWJpbGl0eT8gIE1heWJlIExvZ2lzdGljIFJlZ3Jlc3Npb24gaXMgaW50cm9kdWNlZC4KCioqRmlyc3QgWWVhciBHcmFkdWF0ZSBTdHVkZW50czoqKiAgTG9naXN0aWMgUmVncmVzc2lvbiBpcyBpbnRyb2R1Y2VkIGFuZCBwcmVkaWN0ZWQgcHJvYmFiaWxpdGllcyBhcmUgdXNlZCB0byBtYWtlIHByZWRpY3Rpb25zIG9mIGEgYmluYXJ5IGRlcGVuZGVudCB2YXJpYWJsZSAkWSA9IDAkIG9yICRZPTEkLiAgTWF5YmUgTXVsdGlub21pYWwgUmVncmVzc2lvbiBhbmQvb3IgUG9pc3NvbiBSZWdyZXNzaW9uIGlzIGludHJvZHVjZWQgaW4gYSBjb3Vyc2Ugb24gQ2F0ZWdvcmljYWwgVmFyaWFibGVzLgoKLSBFeGFtcGxlczogCiAgICAgIy4gSXJpcyBEYXRhIAogICAgICMuIFRpdGFuaWMKICAgICAKIy4gSW50cm9kdWN0aW9uIHRvIFByZWRpY3Rpb24gYW5kIENsYXNzaWZpY2F0aW9uIGluIE1hY2hpbmUgTGVhcm5pbmcKCkluIE1hY2hpbmUgTGVhcm5pbmcgcHJlZGljdGlvbiBhbmQgY2xhc3NpZmljYXRpb24gYXJlIGRpc2N1c3NlZCBpbiB0ZXJtcyBvZiB0aGUgYWxnb3JpdGhtcyB1c2VkIGFuZCBwcmVzZW50ZWQgdXNpbmcgdGhlIEhvbGRvdXQgTWV0aG9kLCB1c2luZyBUcmFpbmluZywgVmFsaWRhdGlvbiwgYW5kIFRlc3RpbmcgZGF0YXNldHMuICBTbyB0aGlua2luZyBpbiB0ZXJtcyBvZiBtZWFzdXJpbmcgaG93IHdlbGwgdGhlIG1vZGVsIHdpbGwgcGVyZm9ybSBvbiBmdXR1cmUgZGF0YS4KClByZWRpY3Rpb24gYWxnb3JpdGhtczogTGluZWFyIFJlZ3Jlc3Npb24sIERlY2lzaW9uIFRyZWUsIFJhbmRvbSBGb3Jlc3RzLCBTVk1zCgpQcmVkaWN0aW9uIGV2YWx1YXRpb246IE1TRSwgTUFFLCAkUl4yJCwgYWRqdXN0ZWQgJFJeMiQKCkNsYXNzaWZpY2F0aW9uIGFsZ29yaXRobXM6IGtOTiwgTmFpdmUgQmF5ZXMsIExvZ2lzdGljIFJlZ3Jlc3Npb24sIERlY2lzaW9uIFRyZWVzLCBSYW5kb20gRm9yZXN0cywgU1ZNcwoKQ2xhc3NpZmljYXRpb24gZXZhbHVhdGlvbjogQWNjdXJhY3ksIFNlbnNpdGl2aXR5LCBTcGVjaWZpY2l0eSwgUk9DLCBSZWNhbGwsIFByZWNpc2lvbiwgRjEKCiMuIENvbm5lY3Rpb25zIGJldHdlZW4gdGhlIHVzZSBvZiBMaW5lYXIgUmVncmVzc2lvbiBpbiBTdGF0aXN0aWNzIGFuZCBQcmVkaWN0aW9uIGluIE1hY2hpbmUgTGVhcm5pbmcKCkF0IGFsbCBsZXZlbHMgb2YgQ2xhc3NpY2FsIFN0YXRpc3RpY3MgaW5zdHJ1Y3Rpb24sIExpbmVhciBSZWdyZXNzaW9uIGlzIHRoZSBwcmltYXJ5IGV4YW1wbGUgdGhhdCBpcyBkaXNjdXNzZWQgd2hlbiBwcmVkaWN0aW9uIGlzIHByZXNlbnRlZC4gIFByZWRpY3Rpb24gaXMgbW9zdGx5IGRpc2N1c3NlZCBpbiB0ZXJtcyBvZiBQcmVkaWN0aW9uIEludGVydmFscy4gIFRoZSBlc3RpbWF0aW9uIG9mIGEgbmV3IG9ic2VydmF0aW9uIHdpdGhpbiB0aGUgcmFuZ2Ugb2YgdGhlIGRhdGEsIG90aGVyd2lzZSwgRm9yZWNhc3RpbmcgaXMgZGlzY3Vzc2VkLgoKSW4gQmF5ZXNpYW4gU3RhdGlzdGljcyBQcmVkaWN0aW9uIGlzIGRpc2N1c3NlZCBpbiB0ZXJtcyBvZiBQcmVkaWN0aXZlIERpc3RyaWJ1dGlvbnMgYW5kIHRoZSBhc3NvY2lhdGVkIGNyZWRpYmxlIGludGVydmFscy4KCkluIE1hY2hpbmUgTGVhcm5pbmcgbnVtZXJpYyBwcmVkaWN0aW9uIGlzIHBlcmZvcm1lZCB1c2luZyBEZWNpc2lvbiBUcmVlcyBhbmQgUmFuZG9tIEZvcmVzdHMsIFN1cHBvcnQgVmVjdG9yIE1hY2hpbmVzIChTVk1zKS4gIENsb3NlbmVzcyBvZiB0aGUgcHJlZGljdGVkIHZhbHVlcyB0byB0aGUgaG9sZG91dCB2YWx1ZXMgaXMgZXZhbHVhdGVkIHVzaW5nIGEgTG9zcyBGdW5jdGlvbiBzdWNoIGFzIE1TRS4KCiMuIENvbm5lY3Rpb25zIGJldHdlZW4gTG9naXN0aWMgUmVncmVzc2lvbiBpbiBTdGF0aXN0aWNzIGFuZCBDbGFzc2lmaWNhdGlvbiBpbiBNYWNoaW5lIExlYXJuaW5nCgpMb2dpc3RpYyBSZWdyZXNzaW9uIGlzIHVzdWFsbHkgbm90IGRpc2N1c3NlZCBpbiBJbnRyb2R1Y3RvcnkgU3RhdGlzdGljcy4gIFRoaXMgaXMgdW5mb3J0dW5hdGUgYmVjYXVzZSBvZiB0aGUgcmVzdWx0cyBvZiBhcHBseWluZyBsb2dpc3RpYyByZWdyZXNzaW9uIG1pZ2h0IGJlIGJldHRlciBhcHByZWNpYXRlZCBieSB0aG9zZSBzdHVkZW50cyB0aGFuIGh5cG90aGVzaXMgdGVzdGluZyBmb3IgcHJvcG9ydGlvbnMuCgojLiBXaGF0IGlzIGFuIEFydGlmaWNpYWwgTmV1cmFsIE5ldHdvcms/ICAKCkhvdyB0byBleHBsYWluIGFOTnMgZm9yIHRoZSBzdHVkZW50cyBpbiBkaWZmZXJlbnQgbGV2ZWxzIG9mIFN0YXRpc3RpY3MgRWR1Y2F0aW9uPyAgCgpGaXJzdCwgaXQgaXMgaW1wb3J0YW50IGZvciBzdHVkZW50cyBvZiBTdGF0aXN0aWNzIHRvIGJlIGF3YXJlIG9mIGFuZCBiZSBhYmxlIHRvIHVzZSBhTk5zLiAgVGhlIHJlYXNvbiBpcyBiZWNhdXNlIHNvIG1hbnkgb2YgdGhlaXIgZGV2aWNlcyAoY2VsbCBwaG9uZXMsIGNvbXB1dGVycywgc21hcnQgc3BlYWtlcnMpIG5vdyB1c2UgdGhlc2UgbWV0aG9kcy4gIEZyb20gZmFjaWFsIHJlY29nbml0aW9uIHRvIHRyYW5zbGF0aW9uIHRvIHZvaWNlIHJlY29nbml0aW9uLgoKU2Vjb25kLCBpdCBzaG91bGQgYmUgcG9pbnRlZCBvdXQgdGhhdCBhTk5zIGNhbiBiZSB1c2VkIHRvIHBlcmZvcm0gc2ltaWxhciB0YXNrcyBhcyB0aGV5IGFyZSBsZWFybmluZyBpbiBTdGF0aXN0aWNzIGZvciBwcmVkaWN0aW9uIGFuZCBjbGFzc2lmaWNhdGlvbi4KClRoZSBpZGVhIG9yIHByZWRpY3Rpb24gaXMgd2VsbCBwcmVzZW50ZWQgaW4gU3RhdGlzdGljcyBFZHVjYXRpb24sIGJ1dCBjbGFzc2lmaWNhdGlvbiBpcyBub3Qgc28gd2VsbCBwcmVzZW50ZWQuICBBbmQgaXQgaXMgY2xhc3NpZmljYXRpb24gdGhhdCBpcyBvbmUgb2YgdGhlIG1haW4gdXNlcyBvZiBOZXVyYWwgTmV0d29ya3MuICBUb3BpY3MgaW5jbHVkaW5nIHNwYW0gZmlsdGVyaW5nIGFuZCBkaWdpdCBjbGFzc2lmaWNhdGlvbiBjb3VsZCBiZWNvbWUgZXhhbXBsZXMgaW4gSW50cm9kdWN0b3J5IFN0YXRpc3RpY3MgY291cnNlcyB0aG91Z2ggbWFqb3IgY291cnNlcyBhbmQgR3JhZHVhdGUgY2xhc3Nlcy4gIFRoZXNlIGFyZSBtb2Rlcm4gZXh0ZW5zaW9ucyBvZiB0aGUgY2xhc3NpZmljYXRpb24gb2YgRmlzaGVyJ3MgaXJpcyBkYXRhLgoKKipJbnRybyBTdGF0aXN0aWNzOioqIE1vZGVybiBNYWNoaW5lIExlYXJuaW5nIHRlY2huaXF1ZS4gIEEgYmxhY2stYm94CgoqKlN0YXRpc3RpY3MgTWFqb3JzOioqIEZlZWQtRm9yd2FyZCBOZXVyYWwgTmV0d29yayAgCgoqKkZpcnN0IFllYXIgR3JhZHVhdGUgU3R1ZGVudHM6KiogRmVlZC1Gb3J3YXJkIE5ldXJhbCBOZXR3b3JrLCBDb252b2x1dGlvbmFsIE5ldXJhbCBOZXR3b3JrcywgYW5kIGJleW9uZC4gIFRoZSBkaXNjdXNzaW9uIG9mIHRoZSBtZXRob2RzIGZvciBlc3RpbWF0aW5nIHRoZSB3ZWlnaHRzIG9uIHRoZSBuZXR3b3JrIGNvbm5lY3Rpb25zIGJldHdlZW4gdGhlIG5ldXJvbnMgY2FuIGJlIGRpc2N1c3NlZCwgaW5jbHVkaW5nIGJhY2sgcHJvcGFnYXRpb24gYW5kIGRyb3BvdXQuCgojLiBXaGF0IGlzIERlZXAgTGVhcm5pbmc/CgpUaGVyZSBpcyBhIGxvdCBvZiBkaXNjdXNzaW9uIGFib3V0IERlZXAgTGVhcm5pbmcgdGhlc2UgZGF5cyBmcm9tIGNvbXBhbmllcyBsaWtlIEdvb2dsZS4gIEl0IHdhcyBHb29nbGXigJlzIENoaWVmIEVjb25vbWlzdCBIYWwgVmFyaWFuIHdobyBoYXMgc2FpZCwgYGBJIGtlZXAgc2F5aW5nIHRoZSBzZXh5IGpvYiBpbiB0aGUgbmV4dCB0ZW4geWVhcnMgd2lsbCBiZSBzdGF0aXN0aWNpYW5zLiBQZW9wbGUgdGhpbmsgSeKAmW0gam9raW5nLCBidXQgd2hvIHdvdWxk4oCZdmUgZ3Vlc3NlZCB0aGF0IGNvbXB1dGVyIGVuZ2luZWVycyB3b3VsZOKAmXZlIGJlZW4gdGhlIHNleHkgam9iIG9mIHRoZSAxOTkwcz9gYCAgT3VyIHRlbiB5ZWFycyBhcmUgYWJvdXQgdXAgYW5kIHdlIGhhdmUgbm90IGFkZGVkIHNvbWUgb2YgdGhlc2UgbmV3IGV4YW1wbGVzIGZyb20gY29tcHV0ZXIgc2NpZW5jZS4gIFdlIHNob3VsZCB0byBrZWVwIHN0dWRlbnRzIGludGVyZXN0ZWQuICBEb24ndCBmb3JnZXQgdGhhdCBGaXNoZXIgd2hhdCB3b3JraW5nIG9uIEJpb2xvZ3kgcHJvYmxlbXMgYW5kIFR1a2V5IGhhZCBhIGJhY2tncm91bmQgaW4gQ2hlbWlzdHJ5LiAgTWFueSBvZiB0aGUgYWR2YW5jZXMgaW4gb3VyIGZpZWxkIGhhdmUgY29tZSBmcm9tIHBlb3BsZSB3b3JraW5nIGluIG90aGVyIGFyZWFzLgoKIy4gUGFja2FnZXMgaW4gUjogbmV1cmFsbmV0IGFuZCBubmV0LCBoMm8sIHRlbnNvcmZsb3csIGtlcmFzCgpUaGVyZSBhcmUgcGFja2FnZXMgd3JpdHRlbiBpbiBSIHRoYXQgY2FuIGJlIHVzZWQsIHRoZXNlIGFyZSB0aGUgbmV1cmFsbmV0IGFuZCBubmV0IHBhY2thZ2VzLiAgCgpUaGVyZSBpcyBhIHBhY2thZ2UgdGhhdCBjYW4gYmUgaW5zdGFsbGVkIHRvIHVzZSBoMm8gYW5kIG90aGVycyBmb3IgdGVuc29yZmxvdyBhbmQga2VyYXMuICBUaGUgYWR2YW50YWdlIG9mIHRoZXNlIGFyZSB0aGF0IHRoZSBzb2Z0d2FyZSB0aGF0IFIgaXMgY29ubmVjdGluZyB0byBhcmUgcGFyYWxsZWxpemVkIGZvciB1c2Ugb24gbXVsdGljb3JlIGNvbXB1dGVycyBvciBjbHVzdGVycyBhbmQgdGhleSBjYW4gYmUgdXNlZCB3aXRoIEdQVXMuCgotIEV4YW1wbGVzOgogICAgICMuIElyaXMgRGF0YSB1c2luZyBrZXJhcyBhbmQgdGVuc29yZmxvdwogICAgICMuIFRpdGFuaWMKICAgICAjLiBjYXRzIGFuZCBkb2dzCgojLiAgV2l0aCBpbmNyZWFzZWQgUmFtICgzMiBnaWdhYnl0ZXMsIDY0IGdpZ2FieXRlcywgMTI4IGdpZ2FieXRlcykgbGFyZ2VyIGRhdGFzZXRzIGNhbiBiZWVuIHJ1bi4KCkdldHRpbmcgbW9yZSBSYW0gY2FuIHJlYWxseSBoZWxwIHdoZW4gdHJ5aW5nIHRvIHJ1biBiaWdnZXIgRGVlcCBMZWFybmluZyBtb2RlbHMuCgojLiAgV2l0aCBHUFVzIHRoZSBwcm9jZXNzaW5nIG9mIGRlZXAgbGVhcm5pbmcgbW9kZWxzIGlzIG11Y2ggZmFzdC4KCkZpZ3VyaW5nIG91dCBob3cgdG8gdXNlIGEgblZpZGlhIEdQVSBjYW4gYmUgbXVjaCBmYXN0ZXIgb24gdGhlIHNhbWUgY29tcHV0ZXIgdGhhbiB1c2luZyBhIENQVS4KCiMuICBOZXcgVFBVJ3MgZnJvbSBHb29nbGUgYW5kIE5QVSdzIGFyZSBhbGxvdyB0aGUgcnVubmluZyBvZiB2ZXJ5IGxhcmdlIERlZXAgTGVhcm5pbmcgbW9kZWxzLgoKRmluYWxseSwgY2xvdWQgY29tcHV0aW5nIGNhbiBiZSB1c2VkIHRvIGFjY2VzcyBHUFVzIGFuZCBHb29nbGUgVFBVJ3MuICBHb29nbGUgaGFzIGludHJvZHVjZWQgUHl0aG9uIE5vdGVib29rcyB3aXRoIEdQVXMgaW4gaXQncyBbY29sYWJdIHdoaWNoIGxldHMgeW91IHNhdmUgeW91ciBQeXRob24gbm90ZWJvb2tzIHRvIEdvb2dsZSBEb2NzLgoKIy4gQ29uY2x1c2lvbnM6CgpTaG91bGQgYmUgaW50cm9kdWNlIE5ldXJhbCBOZXR3b3JrcyBpbiB0aGUgU3RhdGlzdGljcyBjdXJyaWN1bHVtPwoKSSB3b3VsZCBzYXkgeWVzIGFuZCBJIHdvdWxkIGVuY291cmFnZSB0aGV5IGJlIGludHJvZHVjZWQgaW4gSW50cm9kdWN0b3J5IGJvb2tzLiAgVGhlIHZhbHVlIG9mIGxpbmVhciByZWdyZXNzaW9uIGFuZCBsb2dpc3RpYyByZWdyZXNzaW9uIGFzIGZpcnN0IHN0ZXBzIHRvd2FyZCB3b3JraW5nIHdpdGggQmlnIERhdGEgYW5kIERlZXAgTGVhcm5pbmcgaXMgaGlnaC4gIEFzIHN0dWRlbnRzIHJlYWxpemUgdGhhdCBsaW5lYXIgcmVncmVzc2lvbiBhbmQgbG9naXN0aWMgcmVncmVzc2lvbiBjYW4gZG8gdGhlIHNhbWUgdGhpbmdzIG92ZXJhbGwgaW50ZXJlc3QgaW4gU3RhdGlzdGljcyB3aWxsIGNvbnRpbnVlIHRvIGdyb3cuCgojIFJlZmVyZW5jZXM6CgotIFtBbWVyaWNhbiBTdGF0aXN0aWNpYW5dKGh0dHBzOi8vd3d3LnRhbmRmb25saW5lLmNvbS90b2MvdXRhczIwL2N1cnJlbnQpIFtQcmVkaWN0aW9uIExpbWl0cyBmb3IgYSBVbml2YXJpYXRlIE5vcm1hbCBPYnNlcnZhdGlvbl0oaHR0cHM6Ly9wZGZzLnNlbWFudGljc2Nob2xhci5vcmcvMmYwZi84Mzc3ODY0ZTAzNDI4Y2E4MjMzODc1NTgxYWI5MGQ0ZGNiNzMucGRmKSBieSBHLiBBLiBXaGl0bW9yZQotIFtSIEpvdXJuYWxdKCkgW25ldXJhbG5ldDogVHJhaW5pbmcgYSBOZXVyYWwgTmV0d29ya3NdKGh0dHBzOi8vam91cm5hbC5yLXByb2plY3Qub3JnL2FyY2hpdmUvMjAxMC9SSi0yMDEwLTAwNi9SSi0yMDEwLTAwNi5wZGYpIGJ5IEZyYXVrZSBHw7xudGhlciBhbmQgU3RlZmFuIEZyaXRzY2gKLSBbRGVlcCBMZWFybmluZyB3aXRoIFJdKGh0dHBzOi8vd3d3Lm1hbm5pbmcuY29tL2Jvb2tzL2RlZXAtbGVhcm5pbmctd2l0aC1yKSBieSBGcmFuY29pcyBDaG9sbGV0LCBKLiBKLiBBbGxhaXJlCi0gW0RlZXAgTGVhcm5pbmcgd2l0aCBQeXRob25dKGh0dHBzOi8vd3d3Lm1hbm5pbmcuY29tL2Jvb2tzL2RlZXAtbGVhcm5pbmctd2l0aC1weXRob24pIGJ5IEZyYW7Dp29pcyBDaG9sbGV0Cgo=