Introduction

The dataset use in this project describes the minimum daily temperature over 10 years (19981 and 1990) in Melbourne, Australia. The units are in degree celsius and there are 3650 observations. The source of the data was created by Australian Bureau of meteorology. We will analyze this dataset to capture the trend, applied transformation on the data where required, plot the ACF & PACF’s and coefficient tests on suitable models, and forecast for the next five years.

Require packages

# loading relevant packages into rstudio 
library(readr)
library(dplyr)
library(tidyr)
library(TSA)
library(MTS)
library(tseries)
library(lmtest)
library(forecast)
library(fUnitRoots)
library(FitAR)
library(astsa)
library(urca)

Import Dataset Convert To Time Series

# reading the dataset  into R

Mel_Min_temp <- read.csv("Minimum Daily Temperature.csv", header = TRUE)


head(Mel_Min_temp,5)
# converting the dataframe to time series object

min_TempTS <- ts(Mel_Min_temp$Minimum.Daily.Temperature.Degree..Degree.C..,
start=c(1981, 1), end=c(1990, 365), frequency = 365)

#checking the class of the dataset 
class(min_TempTS)
[1] "ts"

1 Descriptive Analysis

#plotting time Series data 

plot(min_TempTS , col=c("blue"), ylab='Min temperature', xlab='Time', type='o',
main = "Time series plot of minimum temperature in Melbourne.")

NA
NA

Figure 1: shows the changes in daily minimum temperature in melbourne from 1981 to 1990. We can conclude the plot as well as some strong cyclic behaviour. there is no apparent trend in the data over this period.


#converting daily minimum temperature to a monthly mean teamperature to better see seasonality 

monthlyMinTemp <- aggregate(Mel_Min_temp$Minimum.Daily.Temperature.Degree..Degree.C..~Month+Mel_Min_temp$ï..Year,
Mel_Min_temp, mean )

head(monthlyMinTemp,5)
NA
# converting monthly temperature data  into times series  data

monthlyMinTempTS <- ts(monthlyMinTemp$`Mel_Min_temp$Minimum.Daily.Temperature.Degree..Degree.C..`,
start=c(1981, 1), end=c(1990, 12), frequency = 12)

monthlyMinTempTS
           Jan       Feb       Mar       Apr       May       Jun       Jul
1981 17.712903 17.678571 13.500000 12.356667  9.490323  7.306667  7.577419
1982 16.567742 15.921429 14.935484 11.470000  9.583871  5.606667  4.641935
1983 13.180645 16.807143 15.777419 10.596667 10.116129  6.600000  6.890323
1984 14.309677 14.944828 12.867742 10.750000  8.112903  7.730000  5.987097
1985 14.219355 14.032143 15.877419 12.976667  9.419355  7.073333  6.135484
1986 13.825806 14.196429 14.690323 11.653333 10.274194  7.526667  6.961290
1987 13.235484 13.889286 12.619355 12.250000  9.806452  8.273333  5.983871
1988 16.493548 14.524138 14.748387 12.833333 11.387097  8.386667  8.232258
1989 15.180645 16.371429 15.803226 12.563333 10.725806  6.560000  6.332258
1990 15.577419 15.417857 14.835484 13.433333  9.748387  7.720000  8.183871
           Aug       Sep       Oct       Nov       Dec
1981  7.238710 10.143333 10.087097 11.890000 13.680645
1982  7.903226  7.280000  9.545161 12.486667 13.754839
1983  8.706452  9.210000 10.312903 11.993333 14.396774
1984  8.696774  8.046667 10.632258 12.623333 12.643333
1985  7.635484  8.803333 10.490323 13.073333 14.109677
1986  7.387097  8.933333  9.683871 11.793333 12.935484
1987  8.022581  9.810000 10.238710 13.150000 13.254839
1988  8.725806  9.883333 10.890323 12.253333 15.436667
1989  6.770968  8.486667  9.867742 12.876667 13.951613
1990  7.825806  9.166667 11.345161 12.656667 14.367742

plot(monthlyMinTempTS, col=c("blue"), ylab='Min temperature', xlab='Time', type='o',
main = "Time series plot of monthly minimum temperature in Melbourne.")

After converting the daily minimum temperature to a monthly mean max temperature, we can clearly see a strong seasonality pattern. Further Analysis will need to be performed.

# scatterPlot to Check correlations of changes in minimum daily temperature 

y = min_TempTS # read the daily min temp series into y 

x = zlag(min_TempTS) # generate first lag of the min temp series

head(y)
Time Series:
Start = c(1981, 1) 
End = c(1981, 6) 
Frequency = 365 
[1] 20.7 17.9 18.8 14.6 15.8 15.8
head(x)
[1]   NA 20.7 17.9 18.8 14.6 15.8
 index = 2:length(x) # Create an index to get rid of the first NA value in x

cor(y[index],x[index]) # Calculate correlation between numerical values in x and y
[1] 0.7748702

plot(y[index],x[index],ylab='Min temperature series', xlab='The first lag of min temperature series', main = 'Scatter plot of min temperature series and its first lag')

NA
NA

As Scatter plot shows, the correlation value 0.774 proved that there is strong positive linear relationship between previous day’s min temperature on the next day’s min temperature

Investigating correlation of MonthlyMinTempTS

we observe a high correlation between temperatures of succeeding months

bb = monthlyMinTempTS
aa = zlag(monthlyMinTempTS)
index = 2: length(aa)
cor(bb[index], aa[index])
[1] 0.8020674

Scatter plot of average temperature in consecutive months

We can see an upward trend and high correlation

plot(y = monthlyMinTempTS, x = zlag(monthlyMinTempTS), ylab = 'Min temp', xlab = 'Previous Month temp')

Trend analysis using regression approach

Model specification

Plot the Time series data of Monthly minimum temperatures first


plot(monthlyMinTempTS, col=c("blue"), ylab='Min temperature', xlab='Time', type='o',
main = "Time series plot of monthly minimum temperature in Melbourne.")

We only see a seasonal trend and there is no other trend associated with the data

#Plotting ACF with max 36 lags Because we have strong correlation at lags 12,24,36 and so on we consider the existence of seasonal auto correlation relationship.There is also a substantial correlation that needs to be considered.

par(mfrow=c(1,2))
acf(monthlyMinTempTS,lag.max=36) 

PACF

Pacf(monthlyMinTempTS,lag.max=36) 

ADF test

adf.test(monthlyMinTempTS, alternative = c("stationary"))
p-value smaller than printed p-value

    Augmented Dickey-Fuller Test

data:  monthlyMinTempTS
Dickey-Fuller = -10.105, Lag order = 4, p-value = 0.01
alternative hypothesis: stationary

Plot after taking seasonal differencing Since we have a seasonal effect pattern in time series plot, we take a seasonal difference

plot(diff(monthlyMinTempTS,lag=12),xlab='Time',ylab='First and Seasonal Difference of CO2',main= "Figure 11. Time series plot of the seasonal differences of Monthly temp levels.")

ACF of the first and seasonal differences of monthly Temperature levels

acf(as.vector(diff(monthlyMinTempTS,lag=12)),lag.max=36,ci.type='ma',main="Fig-ACF of seasonal differences of monthly temp levels")

PACF of the seasonal differences of monthly Temperature levels

pacf(as.vector(diff(monthlyMinTempTS,lag=12)),lag.max=36,ci.type='ma',main="Fig-PACF of seasonal differences of monthly temp levels")

##Residuals approach

###Specification of seasonal component When D=1 ###Fit m1 = SARIMA(0,0,0)x(0,1,0)12 model and display time series plots of the residuals

m1.monthlyMinTempTS = arima(monthlyMinTempTS,order=c(0,0,0),seasonal=list(order=c(0,1,0), period=12))
res.m1 = residuals(m1.monthlyMinTempTS); 
plot(res.m1,xlab='Time',ylab='Residuals',main="m1-Time series plot of the residuals")

###ACF and PACF of residuals-m1

par(mfrow=c(1,2))
acf(res.m1, lag.max = 36, main = "m1-ACF of residuals")

PACF

pacf(res.m1, lag.max = 36, main = "m1-PACF")

From the above plots, there is no pattern implying the existence of a seasonal trend .But We still have one significant correlation at the first seasonal lag in both ACF and PACF.The significant spike at lag 12 in the ACF suggests a seasonal MA(1) component. So we start with SARMA(0,1) and see if we get rid of the effect of the seasonal component on the residuals

**m2-(0,0,0)*(0,1,1)** Now, we will fit SARIMA(0,0,0)x(0,1,1)12 model and try to see if we get rid of the effect of the seasonal component on the residuals

m2.monthlyMinTempTS = arima(monthlyMinTempTS,order=c(0,0,0),seasonal=list(order=c(0,1,1), period=12))
res.m2 = residuals(m2.monthlyMinTempTS); 
plot(res.m2,xlab='Time',ylab='Residuals',main="m2-Time series plot of the residuals")

###ACF and PACF of residuals-m3

par(mfrow=c(1,2))
acf(res.m2, lag.max = 36, main = "m2-ACF of residuals")
pacf(res.m2, lag.max = 36, main = "m2-PACF of residuals")

At the seasonal lags, especially at the first seasonal lag in ACF, the autocorrelations became insignificant or slightly significant after adding the seasonal component. We will use the resulting ACF and PACF plots to specify the orders of ARMA component as there is no highly significant correlation at the lags s,2s,3s,….

The last ACF-PACF pair has significant pikes at the first lags implying an ARMA(1,1) model or due to the (insignificant) decrease of correlations in PACF, we would specify ARMA(0,1) for the residuals.

So we are settled with (0,1,1) for seasonal component as (P,D,Q).

The data may follow an ARIMA(p ,d ,0) model if the ACF and PACF plots of the differenced data show the following patterns:

  • the ACF is exponentially decaying or sinusoidal;
  • there is a significant spike at lag p in the PACF, but none beyond lag p .

(For the non seasoning component)Also ,there is a significant spike at lag 2 in the PACF, but none beyond lag 2 which suggests a (2,d,0) model.The pattern in the first two spikes is what we would expect from an ARIMA(2,0,0), as the PACF tends to decrease. So in this case, the ACF and PACF lead us to think an ARIMA(2,0,0) model might be appropriate

By getting p as 2 , we can add MA component upto order 1 maximum

Check stationarity by doing ADF test to identify if we need ordinary differencing or not

adf.test(monthlyMinTempTS, alternative = c("stationary"))
p-value smaller than printed p-value

    Augmented Dickey-Fuller Test

data:  monthlyMinTempTS
Dickey-Fuller = -10.105, Lag order = 4, p-value = 0.01
alternative hypothesis: stationary

The ADF unit root test shows a p-value of less than 0.05 which means the null hypothesis of non stationarity is now rejected and the data is proved to be stationary .Therefore we do not need differencing and fix d as 0 d=0 IS FIXED

Now we set out to specify models for non seasonal ARIMA component We begin with (2,0,1) as mentioned earlier

**m3-(2,0,1)*(0,1,1)**

m3.monthlyMinTempTS = arima(monthlyMinTempTS,order=c(2,0,1),seasonal=list(order=c(0,1,1), period=12))
res.m3 = residuals(m3.monthlyMinTempTS); 
plot(res.m3,xlab='Time',ylab='Residuals',main="m3-Time series plot of the residuals")

###ACF and PACF of residuals-m4

par(mfrow=c(1,2))
acf(res.m3, lag.max = 36, main = "m3-ACF of residuals")
pacf(res.m3, lag.max = 36, main = "m3-PACF of residuals")

Looks almost like a white noise series from the above plots, but we cannot confirm it until we check for (2,0,0) as well since MA component can be upto order 1. It can be 0 as well

**m4-(2,0,0)*(0,1,1)

m4.monthlyMinTempTS = arima(monthlyMinTempTS,order=c(2,0,0),seasonal=list(order=c(0,1,1), period=12))
res.m4 = residuals(m4.monthlyMinTempTS); 
plot(res.m4,xlab='Time',ylab='Residuals',main="m4-Time series plot of the residuals")

###ACF and PACF of residuals-m5

par(mfrow=c(1,2))
acf(res.m4, lag.max = 36, main = "m4-ACF of residuals")
pacf(res.m4, lag.max = 36, main = "m4-PACF of residuals")

**We can clearly see that even though m3 and m4 looks closer, the residuals of m4-> SARIMA(2,0,0)*(0,1,1)s=12 are closer to the white noise .So we can pretty much conclude with the orders p=2,d=0,q=0,P=0,D=1,Q=1,and s=12**

EACF of the previous model The EACF suggests (0,1) and (1,1) as well for the non seasonal component

eacf(res.m4)
AR/MA
  0 1 2 3 4 5 6 7 8 9 10 11 12 13
0 o o o o o o o o o o o  o  o  o 
1 x o o o o o o o o o o  o  o  o 
2 x x o o o o o o o o o  o  o  o 
3 o o x o o o o o o o o  o  o  o 
4 x o o o o o o o o o o  o  o  o 
5 o o o x o o o o o o o  o  o  o 
6 x o o x o o o o o o o  o  o  o 
7 x x x x x o o o o o o  o  o  o 

So our estimated models are - (0,0,1)(0,1,1)s=12 - (1,0,1)(0,1,1)s=12 - (2,0,1)(0,1,1)s=12 - (2,0,0)(0,1,1)s=12. Next we will fit these models

MODEL FITTING

PARAMETER ESTIMATION

  • Our final candidates for parameter estimation are
  • (0,0,1)*(0,1,1)s=12
  • (1,0,1)*(0,1,1)s=12
  • (2,0,1)*(0,1,1)s=12
  • (2,0,0)*(0,1,1)s=12

###**Fitting the SARIMA(0,0,1)*(0,1,1)S=12 model using ML method**

mf_001_ml = arima(monthlyMinTempTS,order=c(0,0,1),seasonal=list(order=c(0,1,1),
                                      period=12),method = "ML")
coeftest(mf_001_ml)

z test of coefficients:

      Estimate Std. Error z value  Pr(>|z|)    
ma1   0.169651   0.085367  1.9873   0.04689 *  
sma1 -0.802720   0.150343 -5.3393 9.332e-08 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

###**Fitting the SARIMA(1,0,1)*(0,1,1)S=12 model**

mf_101_ml = arima(monthlyMinTempTS,order=c(1,0,1),seasonal=list(order=c(0,1,1),
                                      period=12),method = "ML")
coeftest(mf_101_ml)

z test of coefficients:

     Estimate Std. Error z value  Pr(>|z|)    
ar1   0.79671    0.16339  4.8760 1.082e-06 ***
ma1  -0.58510    0.21173 -2.7634  0.005721 ** 
sma1 -0.80772    0.15120 -5.3420 9.192e-08 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

###**Fitting the SARIMA(2,0,1)*(0,1,1)S=12 model**

mf_201_ml = arima(monthlyMinTempTS,order=c(2,0,1),seasonal=list(order=c(0,1,1),
                                      period=12),method = "ML")
coeftest(mf_201_ml)

z test of coefficients:

     Estimate Std. Error z value  Pr(>|z|)    
ar1   0.41314    0.38629  1.0695    0.2848    
ar2   0.17411    0.14834  1.1737    0.2405    
ma1  -0.23140    0.39513 -0.5856    0.5581    
sma1 -0.78151    0.14788 -5.2848 1.258e-07 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

###**Fitting the SARIMA(2,0,0)*(0,1,1)S=12 model**

mf_200_ml = arima(monthlyMinTempTS,order=c(2,0,0),seasonal=list(order=c(0,1,1),
                                      period=12),method = "ML")
coeftest(mf_200_ml)

z test of coefficients:

      Estimate Std. Error z value  Pr(>|z|)    
ar1   0.197848   0.099944  1.9796   0.04775 *  
ar2   0.225413   0.098794  2.2817   0.02251 *  
sma1 -0.791129   0.150271 -5.2647 1.404e-07 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

sc.AIC=AIC(mf_001_ml, mf_101_ml, mf_201_ml, mf_200_ml)
sc.BIC=AIC(mf_001_ml, mf_101_ml, mf_201_ml, mf_200_ml, k = length(monthlyMinTempTS))

###AIC values comparison The SARIMA model (2,0,0)*(0,1,1) has the least AIC value and hence is considered to be the best model fit

sort.score(sc.AIC, score = "aic")

###BIC values comparison The saSARIMA model (0,0,1) * (0,1,1) has the lease BIC value closely followed by (2,0,0)*(0,1,1)

sort.score(sc.BIC, score = "aic")
  • **Because the standard error estimates for the SARIMA (2,0,0)*(0,1,1)s=12 model are relatively smaller than the corresponding parameter estimates, we think that the coefficient estimates are all highly significant**
  • **Because the SARIMA (2,0,0)*(0,1,1)s=12 model has the least AIC values, we declare this model as best fit model and to be used for forecasting**

**Over-parameterizations: SARIMA(3,0,0)x(1,1,1)_12**

DIAGNOSTIC CHECKING

plot(window(rstandard(mf_200_ml),start=c(1981,1)), ylab='Standardized Residuals',type='o', main="Residuals from the ARIMA(2,0,0)x(0,1,1)_12 model.")
abline(h=0)

Since we have some strange behaviour near 1983 , we will have to investigate this best model further for outliers

**plot the ACF of standardised residuals of our best model(0,1,1)*(0,1,1)s=12**

acf(as.vector(window(rstandard(mf_201_ml),start=c(1981,1))),lag.max=36,main="ACF of residuals from the ARIMA(2,0,0)x(0,1,1)_12 model.")

Except for the slightly significant autocorrelation at lag 25, there is not any sign of violation of the independence of residuals.

Function for residual analysis


residual.analysis <- function(model, std = TRUE){
  library(TSA)
  library(FitAR)
  if (std == TRUE){
    res.model = rstandard(model)
  }else{
    res.model = residuals(model)
  }
  par(mfrow=c(3,2))
  plot(res.model,type='o',ylab='Standardized residuals', main="Time series plot of standardized residuals")
  abline(h=0)
  hist(res.model,main="Histogram of standardized residuals")
  qqnorm(res.model,main="QQ plot of standardized residuals")
  qqline(res.model, col = 2)
  acf(res.model,main="ACF of standardized residuals")
  print(shapiro.test(res.model))
  k=0
  LBQPlot(res.model, lag.max = length(model$residuals)-1 , StartLag = k + 1, k = 0, SquaredQ = FALSE)
}

Please perform Box test,hist,qqnorm,qqline,shapiro-wilk test for all 3 models given below

**Residual Diagnostics - (0,0,1)*(0,1,1)s=12 Use this model name from above -> mf_001_ml**

residual.analysis(model=mf_001_ml)

    Shapiro-Wilk normality test

data:  res.model
W = 0.97776, p-value = 0.04413

SARIMA(0,0,1)x(0,1,1)_12 1. Time Series plots does not have any trend except for some intervention. 2. Histogram shows residuals slightly skewed to the right. 3. QQplot is normally distributed with 1 or 2 outliers. 4. ACF plot highlights the white noise presence. 5. Ljung Box test shows the presence of residuals.

**Residual Diagnostics - SARIMA(1,0,1)x(0,1,1)_12 ****Use this model name from above -> mf_101_ml**

residual.analysis(model=mf_101_ml)

    Shapiro-Wilk normality test

data:  res.model
W = 0.98339, p-value = 0.1467

SARIMA(1,0,1)x(0,1,1)_12 1. Time Series plots does not have any trend except for some intervention. 2. Histogram is slightly skewed to the right. 3. QQplot is normally distributed except for some points not lying on the line. 4. ACF plot highlights the white noise presence. 5. Ljung Box test shows the presence of good amount of residuals.

**Residual Diagnostics - SARIMA(2,0,1)x(0,1,1)_12 Use this model name from above -> mf_201_ml

residual.analysis(model=mf_201_ml)

    Shapiro-Wilk normality test

data:  res.model
W = 0.98111, p-value = 0.09036

SARIMA(2,0,1)x(0,1,1)_12 1. Time Series plots does not have any trend except for some intervention. 2. Histogram looks to be very slightly skewed to the right. 3. QQplot is normally distributed except for one or two outliers. 4. ACF plot highlights the white noise presence. 5. Ljung Box test shows the presence of residuals.

**Residual Diagnostics - SARIMA(2,0,0)x(0,1,1)_12 Use this model name from above -> mf_200_ml

residual.analysis(model=mf_200_ml)

    Shapiro-Wilk normality test

data:  res.model
W = 0.98135, p-value = 0.09516

SARIMA(2,0,0)x(0,1,1)_12 1. Time Series plots does not have any trend except for some intervention. 2. Histogram looks to be very slightly skewed to the right. 3. QQplot is normally distributed except for one or two outliers. 4. ACF plot highlights the white noise presence. 5. Ljung Box test shows the presence of residuals.

FORECAST

With SARIMA(2,0,0) * (0,1,1) being the best model with the S is equal to 12, below is the forcast for next 10 years.

sarima.for(monthlyMinTempTS,120,2,0,0,0,1,1,12)
$pred
           Jan       Feb       Mar       Apr       May       Jun       Jul
1991 15.248472 15.486091 14.845551 12.556087 10.210343  7.579259  7.102069
1992 15.258478 15.474305 14.868050 12.580553 10.242439  7.613236  7.138020
1993 15.296362 15.512218 14.905981 12.618493 10.280385  7.651184  7.175971
1994 15.334314 15.550171 14.943933 12.656446 10.318337  7.689137  7.213923
1995 15.372267 15.588124 14.981886 12.694399 10.356290  7.727090  7.251876
1996 15.410220 15.626076 15.019839 12.732351 10.394243  7.765042  7.289829
1997 15.448173 15.664029 15.057791 12.770304 10.432196  7.802995  7.327781
1998 15.486125 15.701982 15.095744 12.808257 10.470148  7.840948  7.365734
1999 15.524078 15.739935 15.133697 12.846209 10.508101  7.878900  7.403687
2000 15.562031 15.777887 15.171649 12.884162 10.546054  7.916853  7.441639
           Aug       Sep       Oct       Nov       Dec
1991  7.992644  9.220982 10.615139 12.752758 14.195904
1992  8.029371  9.258276 10.652706 12.790498 14.233734
1993  8.067323  9.296228 10.690659 12.828450 14.271687
1994  8.105275  9.334181 10.728611 12.866403 14.309640
1995  8.143228  9.372134 10.766564 12.904356 14.347592
1996  8.181181  9.410086 10.804517 12.942308 14.385545
1997  8.219133  9.448039 10.842469 12.980261 14.423498
1998  8.257086  9.485992 10.880422 13.018214 14.461450
1999  8.295039  9.523944 10.918375 13.056166 14.499403
2000  8.332991  9.561897 10.956327 13.094119 14.537356

$se
           Jan       Feb       Mar       Apr       May       Jun       Jul
1991 0.9893561 1.0073505 1.0368022 1.0404600 1.0427207 1.0431994 1.0434020
1992 1.0604507 1.0611095 1.0622007 1.0623390 1.0624243 1.0624424 1.0624497
1993 1.0790274 1.0796649 1.0807299 1.0808644 1.0809477 1.0809652 1.0809724
1994 1.0972701 1.0978970 1.0989444 1.0990766 1.0991585 1.0991758 1.0991828
1995 1.1152144 1.1158312 1.1168618 1.1169919 1.1170725 1.1170895 1.1170964
1996 1.1328745 1.1334817 1.1344963 1.1346244 1.1347037 1.1347204 1.1347272
1997 1.1502635 1.1508616 1.1518608 1.1519870 1.1520651 1.1520816 1.1520883
1998 1.1673936 1.1679828 1.1689674 1.1690917 1.1691687 1.1691849 1.1691916
1999 1.1842758 1.1848567 1.1858273 1.1859498 1.1860257 1.1860417 1.1860482
2000 1.2009208 1.2014936 1.2024508 1.2025716 1.2026464 1.2026622 1.2026687
           Aug       Sep       Oct       Nov       Dec
1991 1.0434553 1.0434710 1.0434704 1.0434219 1.0433923
1992 1.0624510 1.0624478 1.0624418 1.0623923 1.0623627
1993 1.0809736 1.0809705 1.0809645 1.0809159 1.0808868
1994 1.0991840 1.0991809 1.0991751 1.0991273 1.0990987
1995 1.1170975 1.1170945 1.1170888 1.1170418 1.1170136
1996 1.1347283 1.1347254 1.1347197 1.1346734 1.1346457
1997 1.1520894 1.1520865 1.1520809 1.1520353 1.1520080
1998 1.1691927 1.1691898 1.1691843 1.1691394 1.1691125
1999 1.1860493 1.1860465 1.1860411 1.1859968 1.1859703
2000 1.2026697 1.2026670 1.2026616 1.2026179 1.2025918

###Using auto.arima function To automatically fit the data we have and check the best model that could be fitted for our data using auto.arima function The auto.arima() function uses nsdiffs() to determine
D (the number of seasonal differences to use), and ndiffs() to determine
d (the number of ordinary differences to use). The selection of the other model parameters (p,q,P and Q ) are all determined by minimizing the AICc, as with non-seasonal ARIMA models. This result also comes as SARIMA(2,0,0)*(0,1,1)S=12

autoArimaModel = auto.arima(monthlyMinTempTS)
autoArimaModel
Series: monthlyMinTempTS 
ARIMA(2,0,0)(0,1,1)[12] 

Coefficients:
         ar1     ar2     sma1
      0.1978  0.2254  -0.7911
s.e.  0.0999  0.0988   0.1503

sigma^2 estimated as 1.013:  log likelihood=-158.37
AIC=324.74   AICc=325.13   BIC=335.47
LS0tDQp0aXRsZTogIlByZWRpY3RpbmcgbWVsYm91cm5lIG1pbmltdW0gZGFpbHkgdGVtcGVyYXR1cmUgIGJhc2VkIG9uIGl0cyB0aW1lLXNlcmllcyBkYXRhIGZyb20gMTk4MS0xOTkwICINCmF1dGhvcjogIllvdW5nIERhdSBTMzgwNjg0NCINCnN1YnRpdGxlOiBNQVRIMTMxOCBTZW1lc3RlciAxLDIwMjEgQXNzaWdubWVudCAyDQpkYXRlOiAxMHRoIE1heSAyMDIxDQpvdXRwdXQ6DQogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQNCiAgaHRtbF9kb2N1bWVudDogZGVmYXVsdA0KLS0tDQoNCiMjIEludHJvZHVjdGlvbiANCg0KVGhlIGRhdGFzZXQgdXNlIGluIHRoaXMgcHJvamVjdCBkZXNjcmliZXMgdGhlIG1pbmltdW0gZGFpbHkgdGVtcGVyYXR1cmUgb3ZlciAxMCB5ZWFycyAoMTk5ODEgYW5kIDE5OTApIGluIE1lbGJvdXJuZSwgQXVzdHJhbGlhLiBUaGUgdW5pdHMgYXJlIGluIGRlZ3JlZSBjZWxzaXVzIGFuZCB0aGVyZSBhcmUgMzY1MCBvYnNlcnZhdGlvbnMuIFRoZSBzb3VyY2Ugb2YgdGhlIGRhdGEgd2FzIGNyZWF0ZWQgYnkgIEF1c3RyYWxpYW4gQnVyZWF1IG9mIG1ldGVvcm9sb2d5LiBXZSB3aWxsIGFuYWx5emUgdGhpcyBkYXRhc2V0IHRvIGNhcHR1cmUgdGhlIHRyZW5kLCBhcHBsaWVkIHRyYW5zZm9ybWF0aW9uIG9uIHRoZSBkYXRhIHdoZXJlIHJlcXVpcmVkLCBwbG90IHRoZSBBQ0YgJiBQQUNGJ3MgIGFuZCBjb2VmZmljaWVudCB0ZXN0cyBvbiBzdWl0YWJsZSAgbW9kZWxzLCBhbmQgZm9yZWNhc3QgZm9yIHRoZSBuZXh0IGZpdmUgeWVhcnMuIA0KDQoNCiMjIFJlcXVpcmUgcGFja2FnZXMgDQoNCg0KYGBge3IgIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UgfQ0KIyBsb2FkaW5nIHJlbGV2YW50IHBhY2thZ2VzIGludG8gcnN0dWRpbyANCmxpYnJhcnkocmVhZHIpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeSh0aWR5cikNCmxpYnJhcnkoVFNBKQ0KbGlicmFyeShNVFMpDQpsaWJyYXJ5KHRzZXJpZXMpDQpsaWJyYXJ5KGxtdGVzdCkNCmxpYnJhcnkoZm9yZWNhc3QpDQpsaWJyYXJ5KGZVbml0Um9vdHMpDQpsaWJyYXJ5KEZpdEFSKQ0KbGlicmFyeShhc3RzYSkNCmxpYnJhcnkodXJjYSkNCmBgYA0KDQoNCiMjIEltcG9ydCBEYXRhc2V0IENvbnZlcnQgVG8gVGltZSBTZXJpZXMgDQoNCg0KYGBge3J9DQojIHJlYWRpbmcgdGhlIGRhdGFzZXQgIGludG8gUg0KDQpNZWxfTWluX3RlbXAgPC0gcmVhZC5jc3YoIk1pbmltdW0gRGFpbHkgVGVtcGVyYXR1cmUuY3N2IiwgaGVhZGVyID0gVFJVRSkNCg0KDQpoZWFkKE1lbF9NaW5fdGVtcCw1KQ0KYGBgDQoNCg0KYGBge3J9DQojIGNvbnZlcnRpbmcgdGhlIGRhdGFmcmFtZSB0byB0aW1lIHNlcmllcyBvYmplY3QNCg0KbWluX1RlbXBUUyA8LSB0cyhNZWxfTWluX3RlbXAkTWluaW11bS5EYWlseS5UZW1wZXJhdHVyZS5EZWdyZWUuLkRlZ3JlZS5DLi4sDQpzdGFydD1jKDE5ODEsIDEpLCBlbmQ9YygxOTkwLCAzNjUpLCBmcmVxdWVuY3kgPSAzNjUpDQoNCiNjaGVja2luZyB0aGUgY2xhc3Mgb2YgdGhlIGRhdGFzZXQgDQpjbGFzcyhtaW5fVGVtcFRTKQ0KDQpgYGANCg0KDQoNCg0KIyMgMSBEZXNjcmlwdGl2ZSBBbmFseXNpcyANCg0KYGBge3J9DQojcGxvdHRpbmcgdGltZSBTZXJpZXMgZGF0YSANCg0KcGxvdChtaW5fVGVtcFRTICwgY29sPWMoImJsdWUiKSwgeWxhYj0nTWluIHRlbXBlcmF0dXJlJywgeGxhYj0nVGltZScsIHR5cGU9J28nLA0KbWFpbiA9ICJUaW1lIHNlcmllcyBwbG90IG9mIG1pbmltdW0gdGVtcGVyYXR1cmUgaW4gTWVsYm91cm5lLiIpDQoNCg0KYGBgDQoNCkZpZ3VyZSAxOiBzaG93cyB0aGUgY2hhbmdlcyBpbiBkYWlseSBtaW5pbXVtIHRlbXBlcmF0dXJlIGluIG1lbGJvdXJuZSBmcm9tIDE5ODEgdG8gMTk5MC4gICBXZSBjYW4gY29uY2x1ZGUgIHRoZSBwbG90IGFzIHdlbGwgYXMgc29tZSBzdHJvbmcgY3ljbGljIGJlaGF2aW91ci4gdGhlcmUgaXMgbm8gYXBwYXJlbnQgdHJlbmQgaW4gdGhlIGRhdGEgb3ZlciB0aGlzIHBlcmlvZC4gDQoNCg0KDQpgYGB7cn0NCg0KI2NvbnZlcnRpbmcgZGFpbHkgbWluaW11bSB0ZW1wZXJhdHVyZSB0byBhIG1vbnRobHkgbWVhbiB0ZWFtcGVyYXR1cmUgdG8gYmV0dGVyIHNlZSBzZWFzb25hbGl0eSANCg0KbW9udGhseU1pblRlbXAgPC0gYWdncmVnYXRlKE1lbF9NaW5fdGVtcCRNaW5pbXVtLkRhaWx5LlRlbXBlcmF0dXJlLkRlZ3JlZS4uRGVncmVlLkMuLn5Nb250aCtNZWxfTWluX3RlbXAkw68uLlllYXIsDQpNZWxfTWluX3RlbXAsIG1lYW4gKQ0KDQpoZWFkKG1vbnRobHlNaW5UZW1wLDUpDQoNCmBgYA0KDQpgYGB7cn0NCiMgY29udmVydGluZyBtb250aGx5IHRlbXBlcmF0dXJlIGRhdGEgIGludG8gdGltZXMgc2VyaWVzICBkYXRhDQoNCm1vbnRobHlNaW5UZW1wVFMgPC0gdHMobW9udGhseU1pblRlbXAkYE1lbF9NaW5fdGVtcCRNaW5pbXVtLkRhaWx5LlRlbXBlcmF0dXJlLkRlZ3JlZS4uRGVncmVlLkMuLmAsDQpzdGFydD1jKDE5ODEsIDEpLCBlbmQ9YygxOTkwLCAxMiksIGZyZXF1ZW5jeSA9IDEyKQ0KDQptb250aGx5TWluVGVtcFRTDQoNCg0KYGBgDQoNCg0KYGBge3J9DQoNCnBsb3QobW9udGhseU1pblRlbXBUUywgY29sPWMoImJsdWUiKSwgeWxhYj0nTWluIHRlbXBlcmF0dXJlJywgeGxhYj0nVGltZScsIHR5cGU9J28nLA0KbWFpbiA9ICJUaW1lIHNlcmllcyBwbG90IG9mIG1vbnRobHkgbWluaW11bSB0ZW1wZXJhdHVyZSBpbiBNZWxib3VybmUuIikNCg0KYGBgDQoNCkFmdGVyIGNvbnZlcnRpbmcgdGhlIGRhaWx5IG1pbmltdW0gdGVtcGVyYXR1cmUgdG8gYSBtb250aGx5IG1lYW4gbWF4IHRlbXBlcmF0dXJlLCB3ZSBjYW4gY2xlYXJseSBzZWUgYSBzdHJvbmcgc2Vhc29uYWxpdHkgcGF0dGVybi4gRnVydGhlciBBbmFseXNpcyB3aWxsIG5lZWQgdG8gYmUgcGVyZm9ybWVkLg0KDQpgYGB7cn0NCiMgc2NhdHRlclBsb3QgdG8gQ2hlY2sgY29ycmVsYXRpb25zIG9mIGNoYW5nZXMgaW4gbWluaW11bSBkYWlseSB0ZW1wZXJhdHVyZSANCg0KeSA9IG1pbl9UZW1wVFMgIyByZWFkIHRoZSBkYWlseSBtaW4gdGVtcCBzZXJpZXMgaW50byB5IA0KDQp4ID0gemxhZyhtaW5fVGVtcFRTKSAjIGdlbmVyYXRlIGZpcnN0IGxhZyBvZiB0aGUgbWluIHRlbXAgc2VyaWVzDQoNCmhlYWQoeSkNCg0KYGBgDQoNCmBgYHtyfQ0KaGVhZCh4KQ0KDQpgYGANCg0KYGBge3J9DQogaW5kZXggPSAyOmxlbmd0aCh4KSAjIENyZWF0ZSBhbiBpbmRleCB0byBnZXQgcmlkIG9mIHRoZSBmaXJzdCBOQSB2YWx1ZSBpbiB4DQoNCmNvcih5W2luZGV4XSx4W2luZGV4XSkgIyBDYWxjdWxhdGUgY29ycmVsYXRpb24gYmV0d2VlbiBudW1lcmljYWwgdmFsdWVzIGluIHggYW5kIHkNCg0KYGBgDQoNCmBgYHtyfQ0KDQpwbG90KHlbaW5kZXhdLHhbaW5kZXhdLHlsYWI9J01pbiB0ZW1wZXJhdHVyZSBzZXJpZXMnLCB4bGFiPSdUaGUgZmlyc3QgbGFnIG9mIG1pbiB0ZW1wZXJhdHVyZSBzZXJpZXMnLCBtYWluID0gJ1NjYXR0ZXIgcGxvdCBvZiBtaW4gdGVtcGVyYXR1cmUgc2VyaWVzIGFuZCBpdHMgZmlyc3QgbGFnJykNCg0KDQpgYGANCg0KQXMgU2NhdHRlciBwbG90IHNob3dzLCB0aGUgY29ycmVsYXRpb24gdmFsdWUgMC43NzQgcHJvdmVkICB0aGF0IHRoZXJlIGlzIHN0cm9uZyBwb3NpdGl2ZSBsaW5lYXIgcmVsYXRpb25zaGlwIGJldHdlZW4gIHByZXZpb3VzIGRheeKAmXMgbWluIHRlbXBlcmF0dXJlIG9uIHRoZSBuZXh0IGRheeKAmXMgbWluIHRlbXBlcmF0dXJlDQoNCiMjIEludmVzdGlnYXRpbmcgY29ycmVsYXRpb24gb2YgTW9udGhseU1pblRlbXBUUw0Kd2Ugb2JzZXJ2ZSBhIGhpZ2ggY29ycmVsYXRpb24gYmV0d2VlbiB0ZW1wZXJhdHVyZXMgb2Ygc3VjY2VlZGluZyBtb250aHMNCmBgYHtyfQ0KYmIgPSBtb250aGx5TWluVGVtcFRTDQphYSA9IHpsYWcobW9udGhseU1pblRlbXBUUykNCmluZGV4ID0gMjogbGVuZ3RoKGFhKQ0KY29yKGJiW2luZGV4XSwgYWFbaW5kZXhdKQ0KYGBgDQojIyBTY2F0dGVyIHBsb3Qgb2YgYXZlcmFnZSB0ZW1wZXJhdHVyZSBpbiBjb25zZWN1dGl2ZSBtb250aHMNCldlIGNhbiBzZWUgYW4gdXB3YXJkIHRyZW5kIGFuZCBoaWdoIGNvcnJlbGF0aW9uDQpgYGB7cn0NCnBsb3QoeSA9IG1vbnRobHlNaW5UZW1wVFMsIHggPSB6bGFnKG1vbnRobHlNaW5UZW1wVFMpLCB5bGFiID0gJ01pbiB0ZW1wJywgeGxhYiA9ICdQcmV2aW91cyBNb250aCB0ZW1wJykNCmBgYA0KDQojIyBUcmVuZCBhbmFseXNpcyB1c2luZyByZWdyZXNzaW9uIGFwcHJvYWNoDQojIyMgRml0IGN5Y2xpYyBvciBzZWFzb25hbCB0cmVuZHMgdXNpbmcgTGluZWFyIFJlZ3Jlc3Npb24gTW9kZWwNCg0KKipEYWlseSBkYXRhKioNCmBgYHtyfQ0KDQpkYXkuPSBzZWFzb24obWluX1RlbXBUUykgDQptb2RlbDFfRGFpbHkgPSBsbShtaW5fVGVtcFRTfmRheS4pIA0Kc3VtbWFyeShtb2RlbDFfRGFpbHkpDQoNCiNvdXRwdXQgaGlkZGVuIGR1ZSB0byBsYXJnZSBvdXRwdXQgDQpgYGANCg0KYGBge3J9DQoNCg0KbW9udGguPXNlYXNvbihtb250aGx5TWluVGVtcFRTKSAjIHBlcmlvZCBhZGRlZCB0byBpbXByb3ZlIHRhYmxlIGRpc3BsYXkgYW5kIHRoaXMgbGluZSBzZXRzIHVwIGluZGljYXRvcnMNCm1vZGVsMj1sbShtb250aGx5TWluVGVtcFRTfm1vbnRoLi0xKSAjIC0xIHJlbW92ZXMgdGhlIGludGVyY2VwdCB0ZXJtDQpzdW1tYXJ5KG1vZGVsMikNCg0KYGBgDQpBbGwgb2YgdGhlIHBhcmFtZXRlcnMgY29ycmVzcG9uZGluZyB0byBtb250aHMgYXJlIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgYXQgNSUgbGV2ZWwNCg0KKipJbmNsdWRpbmcgaW50ZXJjZXB0IHBhcmFtZXRlcioqDQoNCmBgYHtyfQ0KDQptb2RlbDM9bG0obW9udGhseU1pblRlbXBUU35tb250aC4pICMgcmVtb3ZlIC0xIHRvIGluY2x1ZGUgdGhlIGludGVyY2VwdCB0ZXJtIGluIHRoZSBtb2RlbA0Kc3VtbWFyeShtb2RlbDMpDQoNCmBgYA0KKiphbGwgb2YgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gSmFudWFyeSBhbmQgdGhlIG90aGVyIG1vbnRocyBhcmUgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBhdCA1JSBsZXZlbCBpbiBib3RoIG1vZGVscyBtb2RlbDIgYW5kIG1vZGVsMyoqDQoNCiMgKipNb2RlbCBzcGVjaWZpY2F0aW9uKioNCg0KKipQbG90IHRoZSBUaW1lIHNlcmllcyBkYXRhIG9mIE1vbnRobHkgbWluaW11bSB0ZW1wZXJhdHVyZXMgZmlyc3QqKg0KYGBge3J9DQoNCnBsb3QobW9udGhseU1pblRlbXBUUywgY29sPWMoImJsdWUiKSwgeWxhYj0nTWluIHRlbXBlcmF0dXJlJywgeGxhYj0nVGltZScsIHR5cGU9J28nLA0KbWFpbiA9ICJUaW1lIHNlcmllcyBwbG90IG9mIG1vbnRobHkgbWluaW11bSB0ZW1wZXJhdHVyZSBpbiBNZWxib3VybmUuIikNCg0KYGBgDQpXZSBvbmx5IHNlZSBhIHNlYXNvbmFsIHRyZW5kIGFuZCB0aGVyZSBpcyBubyBvdGhlciB0cmVuZCBhc3NvY2lhdGVkIHdpdGggdGhlIGRhdGEgDQoNCg0KI1Bsb3R0aW5nIEFDRiB3aXRoIG1heCAzNiBsYWdzDQpCZWNhdXNlIHdlIGhhdmUgc3Ryb25nIGNvcnJlbGF0aW9uIGF0IGxhZ3MgMTIsMjQsMzYgYW5kIHNvIG9uIHdlIGNvbnNpZGVyIHRoZSBleGlzdGVuY2Ugb2Ygc2Vhc29uYWwgYXV0byBjb3JyZWxhdGlvbiByZWxhdGlvbnNoaXAuVGhlcmUgaXMgYWxzbyBhIHN1YnN0YW50aWFsIGNvcnJlbGF0aW9uIHRoYXQgbmVlZHMgdG8gYmUgY29uc2lkZXJlZC4NCmBgYHtyfQ0KcGFyKG1mcm93PWMoMSwyKSkNCmFjZihtb250aGx5TWluVGVtcFRTLGxhZy5tYXg9MzYpIA0KDQpgYGANCioqUEFDRioqDQoNCg0KYGBge3J9DQpQYWNmKG1vbnRobHlNaW5UZW1wVFMsbGFnLm1heD0zNikgDQpgYGANCg0KIyMgQURGIHRlc3QNCg0KYGBge3J9DQphZGYudGVzdChtb250aGx5TWluVGVtcFRTLCBhbHRlcm5hdGl2ZSA9IGMoInN0YXRpb25hcnkiKSkNCmBgYA0KDQoNCioqUGxvdCBhZnRlciB0YWtpbmcgc2Vhc29uYWwgZGlmZmVyZW5jaW5nKioNClNpbmNlIHdlIGhhdmUgYSBzZWFzb25hbCBlZmZlY3QgcGF0dGVybiBpbiB0aW1lIHNlcmllcyBwbG90LCB3ZSB0YWtlIGEgc2Vhc29uYWwgZGlmZmVyZW5jZSANCg0KYGBge3J9DQpwbG90KGRpZmYobW9udGhseU1pblRlbXBUUyxsYWc9MTIpLHhsYWI9J1RpbWUnLHlsYWI9J0ZpcnN0IGFuZCBTZWFzb25hbCBEaWZmZXJlbmNlIG9mIENPMicsbWFpbj0gIkZpZ3VyZSAxMS4gVGltZSBzZXJpZXMgcGxvdCBvZiB0aGUgc2Vhc29uYWwgZGlmZmVyZW5jZXMgb2YgTW9udGhseSB0ZW1wIGxldmVscy4iKQ0KYGBgDQoNCioqQUNGIG9mIHRoZSBmaXJzdCBhbmQgc2Vhc29uYWwgZGlmZmVyZW5jZXMgb2YgbW9udGhseSBUZW1wZXJhdHVyZSBsZXZlbHMqKg0KDQpgYGB7cn0NCmFjZihhcy52ZWN0b3IoZGlmZihtb250aGx5TWluVGVtcFRTLGxhZz0xMikpLGxhZy5tYXg9MzYsY2kudHlwZT0nbWEnLG1haW49IkZpZy1BQ0Ygb2Ygc2Vhc29uYWwgZGlmZmVyZW5jZXMgb2YgbW9udGhseSB0ZW1wIGxldmVscyIpDQpgYGANCg0KKipQQUNGIG9mIHRoZSBzZWFzb25hbCBkaWZmZXJlbmNlcyBvZiBtb250aGx5IFRlbXBlcmF0dXJlIGxldmVscyoqDQoNCmBgYHtyfQ0KcGFjZihhcy52ZWN0b3IoZGlmZihtb250aGx5TWluVGVtcFRTLGxhZz0xMikpLGxhZy5tYXg9MzYsY2kudHlwZT0nbWEnLG1haW49IkZpZy1QQUNGIG9mIHNlYXNvbmFsIGRpZmZlcmVuY2VzIG9mIG1vbnRobHkgdGVtcCBsZXZlbHMiKQ0KYGBgDQoNCiMjKipSZXNpZHVhbHMgYXBwcm9hY2gqKg0KDQojIyMqKlNwZWNpZmljYXRpb24gb2Ygc2Vhc29uYWwgY29tcG9uZW50IFdoZW4gRD0xKioNCiMjIyoqRml0IG0xID0gU0FSSU1BKDAsMCwwKXgoMCwxLDApMTIgbW9kZWwgYW5kIGRpc3BsYXkgdGltZSBzZXJpZXMgcGxvdHMgb2YgdGhlIHJlc2lkdWFscyoqDQpgYGB7cn0NCm0xLm1vbnRobHlNaW5UZW1wVFMgPSBhcmltYShtb250aGx5TWluVGVtcFRTLG9yZGVyPWMoMCwwLDApLHNlYXNvbmFsPWxpc3Qob3JkZXI9YygwLDEsMCksIHBlcmlvZD0xMikpDQpyZXMubTEgPSByZXNpZHVhbHMobTEubW9udGhseU1pblRlbXBUUyk7IA0KcGxvdChyZXMubTEseGxhYj0nVGltZScseWxhYj0nUmVzaWR1YWxzJyxtYWluPSJtMS1UaW1lIHNlcmllcyBwbG90IG9mIHRoZSByZXNpZHVhbHMiKQ0KYGBgDQoNCiMjIyoqQUNGIGFuZCBQQUNGIG9mIHJlc2lkdWFscy1tMSoqDQpgYGB7cn0NCnBhcihtZnJvdz1jKDEsMikpDQphY2YocmVzLm0xLCBsYWcubWF4ID0gMzYsIG1haW4gPSAibTEtQUNGIG9mIHJlc2lkdWFscyIpDQoNCmBgYA0KDQoqKlBBQ0YqKg0KDQpgYGB7cn0NCnBhY2YocmVzLm0xLCBsYWcubWF4ID0gMzYsIG1haW4gPSAibTEtUEFDRiIpDQoNCmBgYA0KDQoNCkZyb20gdGhlIGFib3ZlIHBsb3RzLCB0aGVyZSBpcyBubyBwYXR0ZXJuIGltcGx5aW5nIHRoZSBleGlzdGVuY2Ugb2YgYSBzZWFzb25hbCB0cmVuZCAuQnV0IFdlIHN0aWxsIGhhdmUgb25lIHNpZ25pZmljYW50IGNvcnJlbGF0aW9uIGF0IHRoZSBmaXJzdCBzZWFzb25hbCBsYWcgaW4gYm90aCBBQ0YgYW5kIFBBQ0YuVGhlIHNpZ25pZmljYW50IHNwaWtlIGF0IGxhZyAxMiBpbiB0aGUgQUNGIHN1Z2dlc3RzIGEgc2Vhc29uYWwgTUEoMSkgY29tcG9uZW50LiAqKlNvIHdlIHN0YXJ0IHdpdGggU0FSTUEoMCwxKSoqIGFuZCBzZWUgaWYgd2UgZ2V0IHJpZCBvZiB0aGUgZWZmZWN0IG9mIHRoZSBzZWFzb25hbCBjb21wb25lbnQgb24gdGhlIHJlc2lkdWFscw0KDQoNCg0KDQojIyMgKiptMi0oMCwwLDApKigwLDEsMSkqKg0KTm93LCB3ZSB3aWxsIGZpdCBTQVJJTUEoMCwwLDApeCgwLDEsMSkxMiBtb2RlbCBhbmQgdHJ5IHRvIHNlZSBpZiB3ZSBnZXQgcmlkIG9mIHRoZSBlZmZlY3Qgb2YgdGhlIHNlYXNvbmFsIGNvbXBvbmVudCBvbiB0aGUgcmVzaWR1YWxzDQpgYGB7cn0NCm0yLm1vbnRobHlNaW5UZW1wVFMgPSBhcmltYShtb250aGx5TWluVGVtcFRTLG9yZGVyPWMoMCwwLDApLHNlYXNvbmFsPWxpc3Qob3JkZXI9YygwLDEsMSksIHBlcmlvZD0xMikpDQpyZXMubTIgPSByZXNpZHVhbHMobTIubW9udGhseU1pblRlbXBUUyk7IA0KcGxvdChyZXMubTIseGxhYj0nVGltZScseWxhYj0nUmVzaWR1YWxzJyxtYWluPSJtMi1UaW1lIHNlcmllcyBwbG90IG9mIHRoZSByZXNpZHVhbHMiKQ0KYGBgDQoNCiMjIyoqQUNGIGFuZCBQQUNGIG9mIHJlc2lkdWFscy1tMyoqDQpgYGB7cn0NCnBhcihtZnJvdz1jKDEsMikpDQphY2YocmVzLm0yLCBsYWcubWF4ID0gMzYsIG1haW4gPSAibTItQUNGIG9mIHJlc2lkdWFscyIpDQpwYWNmKHJlcy5tMiwgbGFnLm1heCA9IDM2LCBtYWluID0gIm0yLVBBQ0Ygb2YgcmVzaWR1YWxzIikNCmBgYA0KDQpBdCB0aGUgc2Vhc29uYWwgbGFncywgZXNwZWNpYWxseSBhdCB0aGUgZmlyc3Qgc2Vhc29uYWwgbGFnIGluIEFDRiwgdGhlIGF1dG9jb3JyZWxhdGlvbnMgYmVjYW1lIGluc2lnbmlmaWNhbnQgb3Igc2xpZ2h0bHkgc2lnbmlmaWNhbnQgYWZ0ZXIgYWRkaW5nIHRoZSBzZWFzb25hbCBjb21wb25lbnQuIFdlIHdpbGwgdXNlIHRoZSByZXN1bHRpbmcgQUNGIGFuZCBQQUNGIHBsb3RzIHRvIHNwZWNpZnkgdGhlIG9yZGVycyBvZiBBUk1BIGNvbXBvbmVudCBhcyB0aGVyZSBpcyBubyBoaWdobHkgc2lnbmlmaWNhbnQgY29ycmVsYXRpb24gYXQgdGhlIGxhZ3MgcywycywzcyzigKYuDQoNClRoZSBsYXN0IEFDRi1QQUNGIHBhaXIgaGFzIHNpZ25pZmljYW50IHBpa2VzIGF0IHRoZSBmaXJzdCBsYWdzIGltcGx5aW5nIGFuIEFSTUEoMSwxKSBtb2RlbCBvciBkdWUgdG8gdGhlIChpbnNpZ25pZmljYW50KSBkZWNyZWFzZSBvZiBjb3JyZWxhdGlvbnMgaW4gUEFDRiwgd2Ugd291bGQgc3BlY2lmeSBBUk1BKDAsMSkgZm9yIHRoZSByZXNpZHVhbHMuDQoNClNvIHdlIGFyZSBzZXR0bGVkIHdpdGggKDAsMSwxKSBmb3Igc2Vhc29uYWwgY29tcG9uZW50IGFzIChQLEQsUSkuDQoNClRoZSBkYXRhIG1heSBmb2xsb3cgYW4gQVJJTUEocCAsZCAsMCkgbW9kZWwgaWYgdGhlIEFDRiBhbmQgUEFDRiBwbG90cyBvZiB0aGUgZGlmZmVyZW5jZWQgZGF0YSBzaG93IHRoZSBmb2xsb3dpbmcgcGF0dGVybnM6DQoNCi0gdGhlIEFDRiBpcyBleHBvbmVudGlhbGx5IGRlY2F5aW5nIG9yIHNpbnVzb2lkYWw7DQotIHRoZXJlIGlzIGEgc2lnbmlmaWNhbnQgc3Bpa2UgYXQgbGFnIHAgaW4gdGhlIFBBQ0YsIGJ1dCBub25lIGJleW9uZCBsYWcgcCAuDQoNCioqKEZvciB0aGUgbm9uIHNlYXNvbmluZyBjb21wb25lbnQpQWxzbyAsdGhlcmUgaXMgYSBzaWduaWZpY2FudCBzcGlrZSBhdCBsYWcgMiBpbiB0aGUgUEFDRiwgYnV0IG5vbmUgYmV5b25kIGxhZyAyIHdoaWNoIHN1Z2dlc3RzIGEgKDIsZCwwKSBtb2RlbC5UaGUgcGF0dGVybiBpbiB0aGUgZmlyc3QgdHdvIHNwaWtlcyBpcyB3aGF0IHdlIHdvdWxkIGV4cGVjdCBmcm9tIGFuIEFSSU1BKDIsMCwwKSwgYXMgdGhlIFBBQ0YgdGVuZHMgdG8gZGVjcmVhc2UuIFNvIGluIHRoaXMgY2FzZSwgdGhlIEFDRiBhbmQgUEFDRiBsZWFkIHVzIHRvIHRoaW5rIGFuIEFSSU1BKDIsMCwwKSBtb2RlbCBtaWdodCBiZSBhcHByb3ByaWF0ZSoqDQoNCioqQnkgZ2V0dGluZyBwIGFzIDIgLCB3ZSBjYW4gYWRkIE1BIGNvbXBvbmVudCB1cHRvIG9yZGVyIDEgbWF4aW11bSoqDQoNCg0KKipDaGVjayBzdGF0aW9uYXJpdHkgYnkgZG9pbmcgQURGIHRlc3QgdG8gaWRlbnRpZnkgaWYgd2UgbmVlZCBvcmRpbmFyeSBkaWZmZXJlbmNpbmcgb3Igbm90KioNCg0KYGBge3J9DQphZGYudGVzdChtb250aGx5TWluVGVtcFRTLCBhbHRlcm5hdGl2ZSA9IGMoInN0YXRpb25hcnkiKSkNCmBgYA0KVGhlIEFERiB1bml0IHJvb3QgdGVzdCBzaG93cyBhIHAtdmFsdWUgb2YgbGVzcyB0aGFuIDAuMDUgd2hpY2ggbWVhbnMgdGhlIG51bGwgaHlwb3RoZXNpcyBvZiBub24gc3RhdGlvbmFyaXR5IGlzIG5vdyByZWplY3RlZCBhbmQgdGhlIGRhdGEgaXMgcHJvdmVkIHRvIGJlIHN0YXRpb25hcnkgLlRoZXJlZm9yZSB3ZSBkbyBub3QgbmVlZCBkaWZmZXJlbmNpbmcgYW5kIGZpeCBkIGFzIDAgDQoqKmQ9MCBJUyBGSVhFRCoqDQoNCg0KTm93IHdlIHNldCBvdXQgdG8gKipzcGVjaWZ5IG1vZGVscyBmb3Igbm9uIHNlYXNvbmFsIEFSSU1BIGNvbXBvbmVudCoqDQoqKldlIGJlZ2luIHdpdGggKDIsMCwxKSBhcyBtZW50aW9uZWQgZWFybGllcioqDQoNCg0KIyMjICoqbTMtKDIsMCwxKSooMCwxLDEpKioNCmBgYHtyfQ0KbTMubW9udGhseU1pblRlbXBUUyA9IGFyaW1hKG1vbnRobHlNaW5UZW1wVFMsb3JkZXI9YygyLDAsMSksc2Vhc29uYWw9bGlzdChvcmRlcj1jKDAsMSwxKSwgcGVyaW9kPTEyKSkNCnJlcy5tMyA9IHJlc2lkdWFscyhtMy5tb250aGx5TWluVGVtcFRTKTsgDQpwbG90KHJlcy5tMyx4bGFiPSdUaW1lJyx5bGFiPSdSZXNpZHVhbHMnLG1haW49Im0zLVRpbWUgc2VyaWVzIHBsb3Qgb2YgdGhlIHJlc2lkdWFscyIpDQpgYGANCg0KDQojIyMqKkFDRiBhbmQgUEFDRiBvZiByZXNpZHVhbHMtbTQqKg0KYGBge3J9DQpwYXIobWZyb3c9YygxLDIpKQ0KYWNmKHJlcy5tMywgbGFnLm1heCA9IDM2LCBtYWluID0gIm0zLUFDRiBvZiByZXNpZHVhbHMiKQ0KcGFjZihyZXMubTMsIGxhZy5tYXggPSAzNiwgbWFpbiA9ICJtMy1QQUNGIG9mIHJlc2lkdWFscyIpDQpgYGANCioqTG9va3MgYWxtb3N0IGxpa2UgYSB3aGl0ZSBub2lzZSBzZXJpZXMgZnJvbSB0aGUgYWJvdmUgcGxvdHMsIGJ1dCB3ZSBjYW5ub3QgY29uZmlybSBpdCB1bnRpbCB3ZSBjaGVjayBmb3IgKDIsMCwwKSBhcyB3ZWxsIHNpbmNlIE1BIGNvbXBvbmVudCBjYW4gYmUgdXB0byBvcmRlciAxLiBJdCBjYW4gYmUgMCBhcyB3ZWxsKioNCg0KDQojIyMgKiptNC0oMiwwLDApKigwLDEsMSkNCmBgYHtyfQ0KbTQubW9udGhseU1pblRlbXBUUyA9IGFyaW1hKG1vbnRobHlNaW5UZW1wVFMsb3JkZXI9YygyLDAsMCksc2Vhc29uYWw9bGlzdChvcmRlcj1jKDAsMSwxKSwgcGVyaW9kPTEyKSkNCnJlcy5tNCA9IHJlc2lkdWFscyhtNC5tb250aGx5TWluVGVtcFRTKTsgDQpwbG90KHJlcy5tNCx4bGFiPSdUaW1lJyx5bGFiPSdSZXNpZHVhbHMnLG1haW49Im00LVRpbWUgc2VyaWVzIHBsb3Qgb2YgdGhlIHJlc2lkdWFscyIpDQpgYGANCiMjIyoqQUNGIGFuZCBQQUNGIG9mIHJlc2lkdWFscy1tNSoqDQpgYGB7cn0NCnBhcihtZnJvdz1jKDEsMikpDQphY2YocmVzLm00LCBsYWcubWF4ID0gMzYsIG1haW4gPSAibTQtQUNGIG9mIHJlc2lkdWFscyIpDQpwYWNmKHJlcy5tNCwgbGFnLm1heCA9IDM2LCBtYWluID0gIm00LVBBQ0Ygb2YgcmVzaWR1YWxzIikNCmBgYA0KKipXZSBjYW4gY2xlYXJseSBzZWUgdGhhdCBldmVuIHRob3VnaCBtMyBhbmQgbTQgbG9va3MgY2xvc2VyLCB0aGUgcmVzaWR1YWxzIG9mIG00LT4gU0FSSU1BKDIsMCwwKSooMCwxLDEpcz0xMiBhcmUgY2xvc2VyIHRvIHRoZSB3aGl0ZSBub2lzZSAuU28gd2UgY2FuIHByZXR0eSBtdWNoIGNvbmNsdWRlIHdpdGggdGhlIG9yZGVycyBwPTIsZD0wLHE9MCxQPTAsRD0xLFE9MSxhbmQgcz0xMioqDQoNCg0KDQoqKkVBQ0Ygb2YgdGhlIHByZXZpb3VzIG1vZGVsKioNClRoZSBFQUNGIHN1Z2dlc3RzICgwLDEpIGFuZCAoMSwxKSBhcyB3ZWxsIGZvciB0aGUgbm9uIHNlYXNvbmFsIGNvbXBvbmVudA0KYGBge3J9DQplYWNmKHJlcy5tNCkNCmBgYA0KDQoNCioqU28gb3VyIGVzdGltYXRlZCBtb2RlbHMgYXJlKioNCiAtICgwLDAsMSkqKDAsMSwxKXM9MTINCiAtICgxLDAsMSkqKDAsMSwxKXM9MTINCiAtICgyLDAsMSkqKDAsMSwxKXM9MTINCiAtICgyLDAsMCkqKDAsMSwxKXM9MTIuDQpOZXh0IHdlIHdpbGwgZml0IHRoZXNlIG1vZGVscw0KIA0KDQojIyAqKk1PREVMIEZJVFRJTkcqKg0KIyMjIFBBUkFNRVRFUiBFU1RJTUFUSU9ODQotIE91ciBmaW5hbCBjYW5kaWRhdGVzIGZvciBwYXJhbWV0ZXIgZXN0aW1hdGlvbiBhcmUgDQogLSAoMCwwLDEpKigwLDEsMSlzPTEyDQogLSAoMSwwLDEpKigwLDEsMSlzPTEyDQogLSAoMiwwLDEpKigwLDEsMSlzPTEyDQogLSAoMiwwLDApKigwLDEsMSlzPTEyDQoNCiMjIyoqRml0dGluZyB0aGUgU0FSSU1BKDAsMCwxKSooMCwxLDEpUz0xMiBtb2RlbCB1c2luZyBNTCBtZXRob2QqKg0KYGBge3J9DQptZl8wMDFfbWwgPSBhcmltYShtb250aGx5TWluVGVtcFRTLG9yZGVyPWMoMCwwLDEpLHNlYXNvbmFsPWxpc3Qob3JkZXI9YygwLDEsMSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmlvZD0xMiksbWV0aG9kID0gIk1MIikNCmNvZWZ0ZXN0KG1mXzAwMV9tbCkNCmBgYA0KDQoNCg0KIyMjKipGaXR0aW5nIHRoZSBTQVJJTUEoMSwwLDEpKigwLDEsMSlTPTEyIG1vZGVsKioNCmBgYHtyfQ0KbWZfMTAxX21sID0gYXJpbWEobW9udGhseU1pblRlbXBUUyxvcmRlcj1jKDEsMCwxKSxzZWFzb25hbD1saXN0KG9yZGVyPWMoMCwxLDEpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJpb2Q9MTIpLG1ldGhvZCA9ICJNTCIpDQpjb2VmdGVzdChtZl8xMDFfbWwpDQpgYGANCg0KDQoNCg0KIyMjKipGaXR0aW5nIHRoZSBTQVJJTUEoMiwwLDEpKigwLDEsMSlTPTEyIG1vZGVsKioNCmBgYHtyfQ0KbWZfMjAxX21sID0gYXJpbWEobW9udGhseU1pblRlbXBUUyxvcmRlcj1jKDIsMCwxKSxzZWFzb25hbD1saXN0KG9yZGVyPWMoMCwxLDEpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJpb2Q9MTIpLG1ldGhvZCA9ICJNTCIpDQpjb2VmdGVzdChtZl8yMDFfbWwpDQpgYGANCg0KIyMjKipGaXR0aW5nIHRoZSBTQVJJTUEoMiwwLDApKigwLDEsMSlTPTEyIG1vZGVsKioNCmBgYHtyfQ0KbWZfMjAwX21sID0gYXJpbWEobW9udGhseU1pblRlbXBUUyxvcmRlcj1jKDIsMCwwKSxzZWFzb25hbD1saXN0KG9yZGVyPWMoMCwxLDEpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJpb2Q9MTIpLG1ldGhvZCA9ICJNTCIpDQpjb2VmdGVzdChtZl8yMDBfbWwpDQpgYGANCg0KDQoNCmBgYHtyfQ0KDQpzYy5BSUM9QUlDKG1mXzAwMV9tbCwgbWZfMTAxX21sLCBtZl8yMDFfbWwsIG1mXzIwMF9tbCkNCnNjLkJJQz1BSUMobWZfMDAxX21sLCBtZl8xMDFfbWwsIG1mXzIwMV9tbCwgbWZfMjAwX21sLCBrID0gbGVuZ3RoKG1vbnRobHlNaW5UZW1wVFMpKQ0KYGBgDQoNCiMjIyoqQUlDIHZhbHVlcyBjb21wYXJpc29uKioNClRoZSBTQVJJTUEgbW9kZWwgKDIsMCwwKSooMCwxLDEpIGhhcyB0aGUgbGVhc3QgQUlDIHZhbHVlIGFuZCBoZW5jZSBpcyBjb25zaWRlcmVkIHRvIGJlIHRoZSBiZXN0IG1vZGVsIGZpdCANCmBgYHtyfQ0Kc29ydC5zY29yZShzYy5BSUMsIHNjb3JlID0gImFpYyIpDQpgYGANCg0KDQoNCiMjIyoqQklDIHZhbHVlcyBjb21wYXJpc29uKioNClRoZSBzYVNBUklNQSBtb2RlbCAoMCwwLDEpICogKDAsMSwxKSBoYXMgdGhlIGxlYXNlIEJJQyB2YWx1ZSBjbG9zZWx5IGZvbGxvd2VkIGJ5ICgyLDAsMCkqKDAsMSwxKQ0KYGBge3J9DQpzb3J0LnNjb3JlKHNjLkJJQywgc2NvcmUgPSAiYWljIikNCmBgYA0KDQogLSAqKkJlY2F1c2UgdGhlIHN0YW5kYXJkIGVycm9yIGVzdGltYXRlcyBmb3IgdGhlIFNBUklNQSAoMiwwLDApKigwLDEsMSlzPTEyIG1vZGVsIGFyZSByZWxhdGl2ZWx5IHNtYWxsZXIgdGhhbiB0aGUgY29ycmVzcG9uZGluZyBwYXJhbWV0ZXIgZXN0aW1hdGVzLCB3ZSB0aGluayB0aGF0IHRoZSBjb2VmZmljaWVudCBlc3RpbWF0ZXMgYXJlIGFsbCBoaWdobHkgc2lnbmlmaWNhbnQqKg0KIC0gKipCZWNhdXNlIHRoZSBTQVJJTUEgKDIsMCwwKSooMCwxLDEpcz0xMiBtb2RlbCBoYXMgdGhlIGxlYXN0IEFJQyB2YWx1ZXMsIHdlIGRlY2xhcmUgdGhpcyBtb2RlbCBhcyBiZXN0IGZpdCBtb2RlbCBhbmQgdG8gYmUgdXNlZCBmb3IgZm9yZWNhc3RpbmcqKg0KIA0KKipPdmVyLXBhcmFtZXRlcml6YXRpb25zOiBTQVJJTUEoMywwLDApeCgxLDEsMSlfMTIqKg0KDQoNCg0KIyMgKipESUFHTk9TVElDIENIRUNLSU5HKioNCg0KDQoNCmBgYHtyfQ0KcGxvdCh3aW5kb3cocnN0YW5kYXJkKG1mXzIwMF9tbCksc3RhcnQ9YygxOTgxLDEpKSwgeWxhYj0nU3RhbmRhcmRpemVkIFJlc2lkdWFscycsdHlwZT0nbycsIG1haW49IlJlc2lkdWFscyBmcm9tIHRoZSBBUklNQSgyLDAsMCl4KDAsMSwxKV8xMiBtb2RlbC4iKQ0KYWJsaW5lKGg9MCkNCmBgYA0KDQpTaW5jZSB3ZSBoYXZlIHNvbWUgc3RyYW5nZSBiZWhhdmlvdXIgbmVhciAxOTgzICwgd2Ugd2lsbCBoYXZlIHRvIGludmVzdGlnYXRlIHRoaXMgYmVzdCBtb2RlbCBmdXJ0aGVyIGZvciBvdXRsaWVycw0KDQoqKnBsb3QgdGhlIEFDRiBvZiBzdGFuZGFyZGlzZWQgcmVzaWR1YWxzIG9mIG91ciBiZXN0IG1vZGVsKDAsMSwxKSooMCwxLDEpcz0xMioqDQpgYGB7cn0NCmFjZihhcy52ZWN0b3Iod2luZG93KHJzdGFuZGFyZChtZl8yMDFfbWwpLHN0YXJ0PWMoMTk4MSwxKSkpLGxhZy5tYXg9MzYsbWFpbj0iQUNGIG9mIHJlc2lkdWFscyBmcm9tIHRoZSBBUklNQSgyLDAsMCl4KDAsMSwxKV8xMiBtb2RlbC4iKQ0KYGBgDQoNCkV4Y2VwdCBmb3IgdGhlIHNsaWdodGx5IHNpZ25pZmljYW50IGF1dG9jb3JyZWxhdGlvbiBhdCBsYWcgMjUsIHRoZXJlIGlzIG5vdCBhbnkgc2lnbiBvZiB2aW9sYXRpb24gb2YgdGhlIGluZGVwZW5kZW5jZSBvZiByZXNpZHVhbHMuDQoNCg0KKipGdW5jdGlvbiBmb3IgcmVzaWR1YWwgYW5hbHlzaXMqKg0KYGBge3J9DQoNCnJlc2lkdWFsLmFuYWx5c2lzIDwtIGZ1bmN0aW9uKG1vZGVsLCBzdGQgPSBUUlVFKXsNCiAgbGlicmFyeShUU0EpDQogIGxpYnJhcnkoRml0QVIpDQogIGlmIChzdGQgPT0gVFJVRSl7DQogICAgcmVzLm1vZGVsID0gcnN0YW5kYXJkKG1vZGVsKQ0KICB9ZWxzZXsNCiAgICByZXMubW9kZWwgPSByZXNpZHVhbHMobW9kZWwpDQogIH0NCiAgcGFyKG1mcm93PWMoMywyKSkNCiAgcGxvdChyZXMubW9kZWwsdHlwZT0nbycseWxhYj0nU3RhbmRhcmRpemVkIHJlc2lkdWFscycsIG1haW49IlRpbWUgc2VyaWVzIHBsb3Qgb2Ygc3RhbmRhcmRpemVkIHJlc2lkdWFscyIpDQogIGFibGluZShoPTApDQogIGhpc3QocmVzLm1vZGVsLG1haW49Ikhpc3RvZ3JhbSBvZiBzdGFuZGFyZGl6ZWQgcmVzaWR1YWxzIikNCiAgcXFub3JtKHJlcy5tb2RlbCxtYWluPSJRUSBwbG90IG9mIHN0YW5kYXJkaXplZCByZXNpZHVhbHMiKQ0KICBxcWxpbmUocmVzLm1vZGVsLCBjb2wgPSAyKQ0KICBhY2YocmVzLm1vZGVsLG1haW49IkFDRiBvZiBzdGFuZGFyZGl6ZWQgcmVzaWR1YWxzIikNCiAgcHJpbnQoc2hhcGlyby50ZXN0KHJlcy5tb2RlbCkpDQogIGs9MA0KICBMQlFQbG90KHJlcy5tb2RlbCwgbGFnLm1heCA9IGxlbmd0aChtb2RlbCRyZXNpZHVhbHMpLTEgLCBTdGFydExhZyA9IGsgKyAxLCBrID0gMCwgU3F1YXJlZFEgPSBGQUxTRSkNCn0NCmBgYA0KDQoNCg0KKipQbGVhc2UgcGVyZm9ybSBCb3ggdGVzdCxoaXN0LHFxbm9ybSxxcWxpbmUsc2hhcGlyby13aWxrIHRlc3QgZm9yIGFsbCAzIG1vZGVscyBnaXZlbiBiZWxvdyoqDQoNCiMjIyMgKipSZXNpZHVhbCBEaWFnbm9zdGljcyAtICgwLDAsMSkqKDAsMSwxKXM9MTIqKg0KKipVc2UgdGhpcyBtb2RlbCBuYW1lIGZyb20gYWJvdmUgLT4gbWZfMDAxX21sKioNCg0KYGBge3J9DQpyZXNpZHVhbC5hbmFseXNpcyhtb2RlbD1tZl8wMDFfbWwpDQpgYGANClNBUklNQSgwLDAsMSl4KDAsMSwxKV8xMg0KMS4gVGltZSBTZXJpZXMgcGxvdHMgZG9lcyBub3QgaGF2ZSBhbnkgdHJlbmQgZXhjZXB0IGZvciBzb21lIGludGVydmVudGlvbi4NCjIuIEhpc3RvZ3JhbSBzaG93cyByZXNpZHVhbHMgc2xpZ2h0bHkgc2tld2VkIHRvIHRoZSByaWdodC4NCjMuIFFRcGxvdCBpcyBub3JtYWxseSBkaXN0cmlidXRlZCB3aXRoIDEgb3IgMiBvdXRsaWVycy4NCjQuIEFDRiBwbG90IGhpZ2hsaWdodHMgdGhlIHdoaXRlIG5vaXNlIHByZXNlbmNlLg0KNS4gTGp1bmcgQm94IHRlc3Qgc2hvd3MgdGhlIHByZXNlbmNlIG9mIHJlc2lkdWFscy4NCg0KDQojIyMjICoqUmVzaWR1YWwgRGlhZ25vc3RpY3MgLSBTQVJJTUEoMSwwLDEpeCgwLDEsMSlfMTINCioqKipVc2UgdGhpcyBtb2RlbCBuYW1lIGZyb20gYWJvdmUgLT4gbWZfMTAxX21sKioNCg0KYGBge3J9DQpyZXNpZHVhbC5hbmFseXNpcyhtb2RlbD1tZl8xMDFfbWwpDQpgYGANClNBUklNQSgxLDAsMSl4KDAsMSwxKV8xMg0KMS4gVGltZSBTZXJpZXMgcGxvdHMgZG9lcyBub3QgaGF2ZSBhbnkgdHJlbmQgZXhjZXB0IGZvciBzb21lIGludGVydmVudGlvbi4NCjIuIEhpc3RvZ3JhbSBpcyBzbGlnaHRseSBza2V3ZWQgdG8gdGhlIHJpZ2h0Lg0KMy4gUVFwbG90IGlzIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIGV4Y2VwdCBmb3Igc29tZSBwb2ludHMgbm90IGx5aW5nIG9uIHRoZSBsaW5lLg0KNC4gQUNGIHBsb3QgaGlnaGxpZ2h0cyB0aGUgd2hpdGUgbm9pc2UgcHJlc2VuY2UuDQo1LiBManVuZyBCb3ggdGVzdCBzaG93cyB0aGUgcHJlc2VuY2Ugb2YgZ29vZCBhbW91bnQgb2YgcmVzaWR1YWxzLg0KDQoNCg0KIyMjIyAqKlJlc2lkdWFsIERpYWdub3N0aWNzIC0gU0FSSU1BKDIsMCwxKXgoMCwxLDEpXzEyDQoqKlVzZSB0aGlzIG1vZGVsIG5hbWUgZnJvbSBhYm92ZSAtPiBtZl8yMDFfbWwqKg0KDQpgYGB7cn0NCnJlc2lkdWFsLmFuYWx5c2lzKG1vZGVsPW1mXzIwMV9tbCkNCmBgYA0KU0FSSU1BKDIsMCwxKXgoMCwxLDEpXzEyDQoxLiBUaW1lIFNlcmllcyBwbG90cyBkb2VzIG5vdCBoYXZlIGFueSB0cmVuZCBleGNlcHQgZm9yIHNvbWUgaW50ZXJ2ZW50aW9uLg0KMi4gSGlzdG9ncmFtIGxvb2tzIHRvIGJlIHZlcnkgc2xpZ2h0bHkgc2tld2VkIHRvIHRoZSByaWdodC4NCjMuIFFRcGxvdCBpcyBub3JtYWxseSBkaXN0cmlidXRlZCBleGNlcHQgZm9yIG9uZSBvciB0d28gb3V0bGllcnMuDQo0LiBBQ0YgcGxvdCBoaWdobGlnaHRzIHRoZSB3aGl0ZSBub2lzZSBwcmVzZW5jZS4NCjUuIExqdW5nIEJveCB0ZXN0IHNob3dzIHRoZSBwcmVzZW5jZSBvZiByZXNpZHVhbHMuDQoNCg0KIyMjIyAqKlJlc2lkdWFsIERpYWdub3N0aWNzIC0gU0FSSU1BKDIsMCwwKXgoMCwxLDEpXzEyDQoqKlVzZSB0aGlzIG1vZGVsIG5hbWUgZnJvbSBhYm92ZSAtPiBtZl8yMDBfbWwqKg0KDQpgYGB7cn0NCnJlc2lkdWFsLmFuYWx5c2lzKG1vZGVsPW1mXzIwMF9tbCkNCmBgYA0KU0FSSU1BKDIsMCwwKXgoMCwxLDEpXzEyDQoxLiBUaW1lIFNlcmllcyBwbG90cyBkb2VzIG5vdCBoYXZlIGFueSB0cmVuZCBleGNlcHQgZm9yIHNvbWUgaW50ZXJ2ZW50aW9uLg0KMi4gSGlzdG9ncmFtIGxvb2tzIHRvIGJlIHZlcnkgc2xpZ2h0bHkgc2tld2VkIHRvIHRoZSByaWdodC4NCjMuIFFRcGxvdCBpcyBub3JtYWxseSBkaXN0cmlidXRlZCBleGNlcHQgZm9yIG9uZSBvciB0d28gb3V0bGllcnMuDQo0LiBBQ0YgcGxvdCBoaWdobGlnaHRzIHRoZSB3aGl0ZSBub2lzZSBwcmVzZW5jZS4NCjUuIExqdW5nIEJveCB0ZXN0IHNob3dzIHRoZSBwcmVzZW5jZSBvZiByZXNpZHVhbHMuDQoNCiMjIEZPUkVDQVNUDQoNCldpdGggKipTQVJJTUEoMiwwLDApICogKDAsMSwxKSoqIGJlaW5nIHRoZSBiZXN0IG1vZGVsIHdpdGggdGhlIFMgaXMgZXF1YWwgdG8gMTIsIGJlbG93IGlzIHRoZSBmb3JjYXN0IGZvciBuZXh0IDEwIHllYXJzLg0KYGBge3J9DQpzYXJpbWEuZm9yKG1vbnRobHlNaW5UZW1wVFMsMTIwLDIsMCwwLDAsMSwxLDEyKQ0KYGBgDQoNCg0KIyMjVXNpbmcgYXV0by5hcmltYSBmdW5jdGlvbg0KKipUbyBhdXRvbWF0aWNhbGx5IGZpdCB0aGUgZGF0YSB3ZSBoYXZlIGFuZCBjaGVjayB0aGUgYmVzdCBtb2RlbCB0aGF0IGNvdWxkIGJlIGZpdHRlZCBmb3Igb3VyIGRhdGEgdXNpbmcgYXV0by5hcmltYSBmdW5jdGlvbioqDQpUaGUgYXV0by5hcmltYSgpIGZ1bmN0aW9uIHVzZXMgbnNkaWZmcygpIHRvIGRldGVybWluZSAgDQpEICAodGhlIG51bWJlciBvZiBzZWFzb25hbCBkaWZmZXJlbmNlcyB0byB1c2UpLCBhbmQgbmRpZmZzKCkgdG8gZGV0ZXJtaW5lICANCmQgICh0aGUgbnVtYmVyIG9mIG9yZGluYXJ5IGRpZmZlcmVuY2VzIHRvIHVzZSkuIFRoZSBzZWxlY3Rpb24gb2YgdGhlIG90aGVyIG1vZGVsIHBhcmFtZXRlcnMgKHAscSxQIGFuZCBRICkgYXJlIGFsbCBkZXRlcm1pbmVkIGJ5IG1pbmltaXppbmcgdGhlIEFJQ2MsIGFzIHdpdGggbm9uLXNlYXNvbmFsIEFSSU1BIG1vZGVscy4NClRoaXMgcmVzdWx0IGFsc28gY29tZXMgYXMgU0FSSU1BKDIsMCwwKSooMCwxLDEpUz0xMg0KDQpgYGB7cn0NCmF1dG9BcmltYU1vZGVsID0gYXV0by5hcmltYShtb250aGx5TWluVGVtcFRTKQ0KYXV0b0FyaW1hTW9kZWwNCmBgYA0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQo=