Section 1 - Loading the Data

1.1

How many rows of data (observations) are in this dataset?

mvt=read.csv("mvtWeek1.csv")
nrow(mvt)
[1] 191641

1.2

How many variables are in this dataset?

mvt=read.csv("mvtWeek1.csv")
str(mvt)
'data.frame':   191641 obs. of  11 variables:
 $ ID                 : int  8951354 8951141 8952745 8952223 8951608 8950793 8950760 8951611 8951802 8950706 ...
 $ Date               : Factor w/ 131680 levels "1/1/01 0:01",..: 42824 42823 42823 42823 42822 42821 42820 42819 42817 42816 ...
 $ LocationDescription: Factor w/ 78 levels "ABANDONED BUILDING",..: 72 72 62 72 72 72 72 72 72 72 ...
 $ Arrest             : logi  FALSE FALSE FALSE FALSE FALSE TRUE ...
 $ Domestic           : logi  FALSE FALSE FALSE FALSE FALSE FALSE ...
 $ Beat               : int  623 1213 1622 724 211 2521 423 231 1021 1215 ...
 $ District           : int  6 12 16 7 2 25 4 2 10 12 ...
 $ CommunityArea      : int  69 24 11 67 35 19 48 40 29 24 ...
 $ Year               : int  2012 2012 2012 2012 2012 2012 2012 2012 2012 2012 ...
 $ Latitude           : num  41.8 41.9 42 41.8 41.8 ...
 $ Longitude          : num  -87.6 -87.7 -87.8 -87.7 -87.6 ...

1.3

Using the “max” function, what is the maximum value of the variable “ID”?

max(mvt$ID)
[1] 9181151

1.4

What is the minimum value of the variable “Beat”?

min(mvt$Beat)
[1] 111

1.5

How many observations have value TRUE in the Arrest variable (this is the number of crimes for which an arrest was made)?

summary(mvt)
       ID                      Date                            LocationDescription
 Min.   :1310022   5/16/08 0:00  :    11   STREET                        :156564  
 1st Qu.:2832144   10/17/01 22:00:    10   PARKING LOT/GARAGE(NON.RESID.): 14852  
 Median :4762956   4/13/04 21:00 :    10   OTHER                         :  4573  
 Mean   :4968629   9/17/05 22:00 :    10   ALLEY                         :  2308  
 3rd Qu.:7201878   10/12/01 22:00:     9   GAS STATION                   :  2111  
 Max.   :9181151   10/13/01 22:00:     9   DRIVEWAY - RESIDENTIAL        :  1675  
                   (Other)       :191582   (Other)                       :  9558  
   Arrest         Domestic            Beat         District     CommunityArea        Year     
 Mode :logical   Mode :logical   Min.   : 111   Min.   : 1.00   Min.   : 0      Min.   :2001  
 FALSE:176105    FALSE:191226    1st Qu.: 722   1st Qu.: 6.00   1st Qu.:22      1st Qu.:2003  
 TRUE :15536     TRUE :415       Median :1121   Median :10.00   Median :32      Median :2006  
                                 Mean   :1259   Mean   :11.82   Mean   :38      Mean   :2006  
                                 3rd Qu.:1733   3rd Qu.:17.00   3rd Qu.:60      3rd Qu.:2009  
                                 Max.   :2535   Max.   :31.00   Max.   :77      Max.   :2012  
                                                NA's   :43056   NA's   :24616                 
    Latitude       Longitude     
 Min.   :41.64   Min.   :-87.93  
 1st Qu.:41.77   1st Qu.:-87.72  
 Median :41.85   Median :-87.68  
 Mean   :41.84   Mean   :-87.68  
 3rd Qu.:41.92   3rd Qu.:-87.64  
 Max.   :42.02   Max.   :-87.52  
 NA's   :2276    NA's   :2276    

1.6

How many observations have a LocationDescription value of ALLEY?

summary(mvt)
       ID                      Date                            LocationDescription
 Min.   :1310022   5/16/08 0:00  :    11   STREET                        :156564  
 1st Qu.:2832144   10/17/01 22:00:    10   PARKING LOT/GARAGE(NON.RESID.): 14852  
 Median :4762956   4/13/04 21:00 :    10   OTHER                         :  4573  
 Mean   :4968629   9/17/05 22:00 :    10   ALLEY                         :  2308  
 3rd Qu.:7201878   10/12/01 22:00:     9   GAS STATION                   :  2111  
 Max.   :9181151   10/13/01 22:00:     9   DRIVEWAY - RESIDENTIAL        :  1675  
                   (Other)       :191582   (Other)                       :  9558  
   Arrest         Domestic            Beat         District     CommunityArea        Year     
 Mode :logical   Mode :logical   Min.   : 111   Min.   : 1.00   Min.   : 0      Min.   :2001  
 FALSE:176105    FALSE:191226    1st Qu.: 722   1st Qu.: 6.00   1st Qu.:22      1st Qu.:2003  
 TRUE :15536     TRUE :415       Median :1121   Median :10.00   Median :32      Median :2006  
                                 Mean   :1259   Mean   :11.82   Mean   :38      Mean   :2006  
                                 3rd Qu.:1733   3rd Qu.:17.00   3rd Qu.:60      3rd Qu.:2009  
                                 Max.   :2535   Max.   :31.00   Max.   :77      Max.   :2012  
                                                NA's   :43056   NA's   :24616                 
    Latitude       Longitude     
 Min.   :41.64   Min.   :-87.93  
 1st Qu.:41.77   1st Qu.:-87.72  
 Median :41.85   Median :-87.68  
 Mean   :41.84   Mean   :-87.68  
 3rd Qu.:41.92   3rd Qu.:-87.64  
 Max.   :42.02   Max.   :-87.52  
 NA's   :2276    NA's   :2276    

Section 2 - Understanding Dates in R

In many datasets, like this one, you have a date field. Unfortunately, R does not automatically recognize entries that look like dates. We need to use a function in R to extract the date and time. Take a look at the first entry of Date (remember to use square brackets when looking at a certain entry of a variable).

2.1

In what format are the entries in the variable Date?

  • Month/Day/Year Hour:Minute
  • Day/Month/Year Hour:Minute
  • Hour:Minute Month/Day/Year
  • Hour:Minute Day/Month/Year
mvt$Date[1] 
[1] 12/31/12 23:15
131680 Levels: 1/1/01 0:01 1/1/01 0:05 1/1/01 0:30 1/1/01 1:17 1/1/01 1:50 ... 9/9/12 9:50

2.2

Now, let’s convert these characters into a Date object in R. In your R console, type

DateConvert = as.Date(strptime(mvt$Date, "%m/%d/%y %H:%M"))

This converts the variable “Date” into a Date object in R. Take a look at the variable DateConvert using the summary function.

What is the month and year of the median date in our dataset? Enter your answer as “Month Year”, without the quotes. (Ex: if the answer was 2008-03-28, you would give the answer “March 2008”, without the quotes.)

DateConvert = as.Date(strptime(mvt$Date, "%m/%d/%y %H:%M"))
summary(DateConvert)
        Min.      1st Qu.       Median         Mean      3rd Qu.         Max. 
"2001-01-01" "2003-07-10" "2006-05-21" "2006-08-23" "2009-10-24" "2012-12-31" 

2.3

Now, let’s extract the month and the day of the week, and add these variables to our data frame mvt. We can do this with two simple functions. Type the following commands in R:

mvt$Month = months(DateConvert)

mvt$Weekday = weekdays(DateConvert)

This creates two new variables in our data frame, Month and Weekday, and sets them equal to the month and weekday values that we can extract from the Date object. Lastly, replace the old Date variable with DateConvert by typing:

mvt$Date = DateConvert

Using the table command, answer the following questions.

In which month did the fewest motor vehicle thefts occur?

mvt$Month = months(DateConvert)
mvt$Weekday = weekdays(DateConvert)
mvt$Date = DateConvert
table(mvt$Month)

  一月   七月   九月   二月   八月 十一月 十二月   十月   三月   五月   六月   四月 
 16047  16801  16060  13511  16572  16063  16426  17086  15758  16035  16002  15280 

2.4

On which weekday did the most motor vehicle thefts occur?

table(mvt$Weekday)

星期一 星期二 星期三 星期五 星期六 星期日 星期四 
 27397  26791  27416  29284  27118  26316  27319 

2.5

Each observation in the dataset represents a motor vehicle theft, and the Arrest variable indicates whether an arrest was later made for this theft. Which month has the largest number of motor vehicle thefts for which an arrest was made?

  七月  九月  二月  八月 十一月"
1, 十二月"  十月  三月  五月  六月  四月
  FALSE 14612 15477 14812 12273 15243  14807  15029 15744 14460 14848 14772 14028
  TRUE   1435  1324  1248  1238  1329   1256   1397  1342  1298  1187  1230  1252
LS0tDQp0aXRsZTogIkFTMS0xIEFuIEFuYWx5dGljYWwgRGV0ZWN0aXZlIg0KYXV0aG9yOiAiPEhvIFl1IEppZT4gPE0wNjQwMjAwNDA+IiANCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCi0gLSAtIA0KDQojIyMgU2VjdGlvbiAxIC0gTG9hZGluZyB0aGUgRGF0YQ0KDQojIyMjIDEuMSANCkhvdyBtYW55IHJvd3Mgb2YgZGF0YSAob2JzZXJ2YXRpb25zKSBhcmUgaW4gdGhpcyBkYXRhc2V0Pw0KDQpgYGB7cn0NCm12dD1yZWFkLmNzdigibXZ0V2VlazEuY3N2IikNCm5yb3cobXZ0KQ0KYGBgDQoNCg0KIyMjIyAxLjIgDQpIb3cgbWFueSB2YXJpYWJsZXMgYXJlIGluIHRoaXMgZGF0YXNldD8NCmBgYHtyfQ0KbXZ0PXJlYWQuY3N2KCJtdnRXZWVrMS5jc3YiKQ0Kc3RyKG12dCkNCmBgYA0KDQoNCiMjIyMgMS4zIA0KVXNpbmcgdGhlICJtYXgiIGZ1bmN0aW9uLCB3aGF0IGlzIHRoZSBtYXhpbXVtIHZhbHVlIG9mIHRoZSB2YXJpYWJsZSAiSUQiPw0KDQpgYGB7cn0NCm1heChtdnQkSUQpDQpgYGANCg0KIyMjIyAxLjQgDQpXaGF0IGlzIHRoZSBtaW5pbXVtIHZhbHVlIG9mIHRoZSB2YXJpYWJsZSAiQmVhdCI/DQpgYGB7cn0NCm1pbihtdnQkQmVhdCkNCmBgYA0KDQojIyMjIDEuNSANCkhvdyBtYW55IG9ic2VydmF0aW9ucyBoYXZlIHZhbHVlIFRSVUUgaW4gdGhlIEFycmVzdCB2YXJpYWJsZSAodGhpcyBpcyB0aGUgbnVtYmVyIG9mIGNyaW1lcyBmb3Igd2hpY2ggYW4gYXJyZXN0IHdhcyBtYWRlKT8NCg0KYGBge3J9DQpzdW1tYXJ5KG12dCkNCmBgYA0KDQojIyMjIDEuNiANCkhvdyBtYW55IG9ic2VydmF0aW9ucyBoYXZlIGEgTG9jYXRpb25EZXNjcmlwdGlvbiB2YWx1ZSBvZiBBTExFWT8NCg0KYGBge3J9DQpzdW1tYXJ5KG12dCkNCmBgYA0KDQojIyMgU2VjdGlvbiAyIC0gVW5kZXJzdGFuZGluZyBEYXRlcyBpbiBSDQoNCg0KSW4gbWFueSBkYXRhc2V0cywgbGlrZSB0aGlzIG9uZSwgeW91IGhhdmUgYSBkYXRlIGZpZWxkLiBVbmZvcnR1bmF0ZWx5LCBSIGRvZXMgbm90IGF1dG9tYXRpY2FsbHkgcmVjb2duaXplIGVudHJpZXMgdGhhdCBsb29rIGxpa2UgZGF0ZXMuIFdlIG5lZWQgdG8gdXNlIGEgZnVuY3Rpb24gaW4gUiB0byBleHRyYWN0IHRoZSBkYXRlIGFuZCB0aW1lLiBUYWtlIGEgbG9vayBhdCB0aGUgZmlyc3QgZW50cnkgb2YgRGF0ZSAocmVtZW1iZXIgdG8gdXNlIHNxdWFyZSBicmFja2V0cyB3aGVuIGxvb2tpbmcgYXQgYSBjZXJ0YWluIGVudHJ5IG9mIGEgdmFyaWFibGUpLg0KDQojIyMjIDIuMSANCkluIHdoYXQgZm9ybWF0IGFyZSB0aGUgZW50cmllcyBpbiB0aGUgdmFyaWFibGUgRGF0ZT8NCg0KKyBNb250aC9EYXkvWWVhciBIb3VyOk1pbnV0ZQ0KKyBEYXkvTW9udGgvWWVhciBIb3VyOk1pbnV0ZQ0KKyBIb3VyOk1pbnV0ZSBNb250aC9EYXkvWWVhcg0KKyBIb3VyOk1pbnV0ZSBEYXkvTW9udGgvWWVhcg0KDQpgYGB7cn0NCm12dCREYXRlWzFdIA0KYGBgDQoNCiMjIyMgMi4yIA0KDQpOb3csIGxldCdzIGNvbnZlcnQgdGhlc2UgY2hhcmFjdGVycyBpbnRvIGEgRGF0ZSBvYmplY3QgaW4gUi4gSW4geW91ciBSIGNvbnNvbGUsIHR5cGUNCg0KICAgIERhdGVDb252ZXJ0ID0gYXMuRGF0ZShzdHJwdGltZShtdnQkRGF0ZSwgIiVtLyVkLyV5ICVIOiVNIikpDQoNClRoaXMgY29udmVydHMgdGhlIHZhcmlhYmxlICJEYXRlIiBpbnRvIGEgRGF0ZSBvYmplY3QgaW4gUi4gVGFrZSBhIGxvb2sgYXQgdGhlIHZhcmlhYmxlIERhdGVDb252ZXJ0IHVzaW5nIHRoZSBzdW1tYXJ5IGZ1bmN0aW9uLg0KDQpXaGF0IGlzIHRoZSBtb250aCBhbmQgeWVhciBvZiB0aGUgbWVkaWFuIGRhdGUgaW4gb3VyIGRhdGFzZXQ/IEVudGVyIHlvdXIgYW5zd2VyIGFzICJNb250aCBZZWFyIiwgd2l0aG91dCB0aGUgcXVvdGVzLiAoRXg6IGlmIHRoZSBhbnN3ZXIgd2FzIDIwMDgtMDMtMjgsIHlvdSB3b3VsZCBnaXZlIHRoZSBhbnN3ZXIgIk1hcmNoIDIwMDgiLCB3aXRob3V0IHRoZSBxdW90ZXMuKQ0KDQpgYGB7cn0NCkRhdGVDb252ZXJ0ID0gYXMuRGF0ZShzdHJwdGltZShtdnQkRGF0ZSwgIiVtLyVkLyV5ICVIOiVNIikpDQpzdW1tYXJ5KERhdGVDb252ZXJ0KQ0KYGBgDQoNCiMjIyMgMi4zDQpOb3csIGxldCdzIGV4dHJhY3QgdGhlIG1vbnRoIGFuZCB0aGUgZGF5IG9mIHRoZSB3ZWVrLCBhbmQgYWRkIHRoZXNlIHZhcmlhYmxlcyB0byBvdXIgZGF0YSBmcmFtZSBtdnQuIFdlIGNhbiBkbyB0aGlzIHdpdGggdHdvIHNpbXBsZSBmdW5jdGlvbnMuIFR5cGUgdGhlIGZvbGxvd2luZyBjb21tYW5kcyBpbiBSOg0KDQogICAgbXZ0JE1vbnRoID0gbW9udGhzKERhdGVDb252ZXJ0KQ0KDQogICAgbXZ0JFdlZWtkYXkgPSB3ZWVrZGF5cyhEYXRlQ29udmVydCkNCg0KVGhpcyBjcmVhdGVzIHR3byBuZXcgdmFyaWFibGVzIGluIG91ciBkYXRhIGZyYW1lLCBNb250aCBhbmQgV2Vla2RheSwgYW5kIHNldHMgdGhlbSBlcXVhbCB0byB0aGUgbW9udGggYW5kIHdlZWtkYXkgdmFsdWVzIHRoYXQgd2UgY2FuIGV4dHJhY3QgZnJvbSB0aGUgRGF0ZSBvYmplY3QuIExhc3RseSwgcmVwbGFjZSB0aGUgb2xkIERhdGUgdmFyaWFibGUgd2l0aCBEYXRlQ29udmVydCBieSB0eXBpbmc6DQoNCiAgICBtdnQkRGF0ZSA9IERhdGVDb252ZXJ0DQoNClVzaW5nIHRoZSB0YWJsZSBjb21tYW5kLCBhbnN3ZXIgdGhlIGZvbGxvd2luZyBxdWVzdGlvbnMuDQoNCkluIHdoaWNoIG1vbnRoIGRpZCB0aGUgZmV3ZXN0IG1vdG9yIHZlaGljbGUgdGhlZnRzIG9jY3VyPw0KDQpgYGB7cn0NCm12dCRNb250aCA9IG1vbnRocyhEYXRlQ29udmVydCkNCm12dCRXZWVrZGF5ID0gd2Vla2RheXMoRGF0ZUNvbnZlcnQpDQptdnQkRGF0ZSA9IERhdGVDb252ZXJ0DQp0YWJsZShtdnQkTW9udGgpDQpgYGANCg0KIyMjIyAyLjQgDQpPbiB3aGljaCB3ZWVrZGF5IGRpZCB0aGUgbW9zdCBtb3RvciB2ZWhpY2xlIHRoZWZ0cyBvY2N1cj8NCg0KYGBge3J9DQp0YWJsZShtdnQkV2Vla2RheSkNCmBgYA0KDQojIyMjIDIuNSANCkVhY2ggb2JzZXJ2YXRpb24gaW4gdGhlIGRhdGFzZXQgcmVwcmVzZW50cyBhIG1vdG9yIHZlaGljbGUgdGhlZnQsIGFuZCB0aGUgQXJyZXN0IHZhcmlhYmxlIGluZGljYXRlcyB3aGV0aGVyIGFuIGFycmVzdCB3YXMgbGF0ZXIgbWFkZSBmb3IgdGhpcyB0aGVmdC4gV2hpY2ggbW9udGggaGFzIHRoZSBsYXJnZXN0IG51bWJlciBvZiBtb3RvciB2ZWhpY2xlIHRoZWZ0cyBmb3Igd2hpY2ggYW4gYXJyZXN0IHdhcyBtYWRlPw0KDQpgYGB7cn0NCnRhYmxlKG12dCRBcnJlc3QsbXZ0JE1vbnRoKQ0KYGBgDQoNCiMjIyBTZWN0aW9uIDMgLSBWaXN1YWxpemluZyBDcmltZSBUcmVuZHMNCg0KIyMjIyAzLjENCg0KTm93LCBsZXQncyBtYWtlIHNvbWUgcGxvdHMgdG8gaGVscCB1cyBiZXR0ZXIgdW5kZXJzdGFuZCBob3cgY3JpbWUgaGFzIGNoYW5nZWQgb3ZlciB0aW1lIGluIENoaWNhZ28uIFRocm91Z2hvdXQgdGhpcyBwcm9ibGVtLCBhbmQgaW4gZ2VuZXJhbCwgeW91IGNhbiBzYXZlIHlvdXIgcGxvdCB0byBhIGZpbGUuIEZvciBtb3JlIGluZm9ybWF0aW9uLCB0aGlzIHdlYnNpdGUgdmVyeSBjbGVhcmx5IGV4cGxhaW5zIHRoZSBwcm9jZXNzLg0KDQpGaXJzdCwgbGV0J3MgbWFrZSBhIGhpc3RvZ3JhbSBvZiB0aGUgdmFyaWFibGUgRGF0ZS4gV2UnbGwgYWRkIGFuIGV4dHJhIGFyZ3VtZW50LCB0byBzcGVjaWZ5IHRoZSBudW1iZXIgb2YgYmFycyB3ZSB3YW50IGluIG91ciBoaXN0b2dyYW0uIEluIHlvdXIgUiBjb25zb2xlLCB0eXBlDQoNCmhpc3QobXZ0JERhdGUsIGJyZWFrcz0xMDApDQoNCmBgYHtyfQ0KaGlzdChtdnQkRGF0ZSwgYnJlYWtzPTEwMCkNCmBgYA0KDQpMb29raW5nIGF0IHRoZSBoaXN0b2dyYW0sIGFuc3dlciB0aGUgZm9sbG93aW5nIHF1ZXN0aW9ucy4NCg0KSW4gZ2VuZXJhbCwgZG9lcyBpdCBsb29rIGxpa2UgY3JpbWUgaW5jcmVhc2VzIG9yIGRlY3JlYXNlcyBmcm9tIDIwMDIgLSAyMDEyPw0KDQorIEluY3JlYXNlcw0KKyBEZWNyZWFzZXMNCg0KYGBge3J9DQpgYGANCg0KSW4gZ2VuZXJhbCwgZG9lcyBpdCBsb29rIGxpa2UgY3JpbWUgaW5jcmVhc2VzIG9yIGRlY3JlYXNlcyBmcm9tIDIwMDUgLSAyMDA4Pw0KDQorIEluY3JlYXNlcw0KKyBEZWNyZWFzZXMNCg0KYGBge3J9DQoNCmBgYA0KDQojIyMjIDMuMg0KTm93LCBsZXQncyBzZWUgaG93IGFycmVzdHMgaGF2ZSBjaGFuZ2VkIG92ZXIgdGltZS4gQ3JlYXRlIGEgYm94cGxvdCBvZiB0aGUgdmFyaWFibGUgIkRhdGUiLCBzb3J0ZWQgYnkgdGhlIHZhcmlhYmxlICJBcnJlc3QiIChpZiB5b3UgYXJlIG5vdCBmYW1pbGlhciB3aXRoIGJveHBsb3RzIGFuZCB3b3VsZCBsaWtlIHRvIGxlYXJuIG1vcmUsIGNoZWNrIG91dCB0aGlzIHR1dG9yaWFsKS4gSW4gYSBib3hwbG90LCB0aGUgYm9sZCBob3Jpem9udGFsIGxpbmUgaXMgdGhlIG1lZGlhbiB2YWx1ZSBvZiB0aGUgZGF0YSwgdGhlIGJveCBzaG93cyB0aGUgcmFuZ2Ugb2YgdmFsdWVzIGJldHdlZW4gdGhlIGZpcnN0IHF1YXJ0aWxlIGFuZCB0aGlyZCBxdWFydGlsZSwgYW5kIHRoZSB3aGlza2VycyAodGhlIGRvdHRlZCBsaW5lcyBleHRlbmRpbmcgb3V0c2lkZSB0aGUgYm94KSBzaG93IHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHZhbHVlcywgZXhjbHVkaW5nIGFueSBvdXRsaWVycyAod2hpY2ggYXJlIHBsb3R0ZWQgYXMgY2lyY2xlcykuIE91dGxpZXJzIGFyZSBkZWZpbmVkIGJ5IGZpcnN0IGNvbXB1dGluZyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBmaXJzdCBhbmQgdGhpcmQgcXVhcnRpbGUgdmFsdWVzLCBvciB0aGUgaGVpZ2h0IG9mIHRoZSBib3guIFRoaXMgbnVtYmVyIGlzIGNhbGxlZCB0aGUgSW50ZXItUXVhcnRpbGUgUmFuZ2UgKElRUikuIEFueSBwb2ludCB0aGF0IGlzIGdyZWF0ZXIgdGhhbiB0aGUgdGhpcmQgcXVhcnRpbGUgcGx1cyB0aGUgSVFSIG9yIGxlc3MgdGhhbiB0aGUgZmlyc3QgcXVhcnRpbGUgbWludXMgdGhlIElRUiBpcyBjb25zaWRlcmVkIGFuIG91dGxpZXIuDQoNCkRvZXMgaXQgbG9vayBsaWtlIHRoZXJlIHdlcmUgbW9yZSBjcmltZXMgZm9yIHdoaWNoIGFycmVzdHMgd2VyZSBtYWRlIGluIHRoZSBmaXJzdCBoYWxmIG9mIHRoZSB0aW1lIHBlcmlvZCBvciB0aGUgc2Vjb25kIGhhbGYgb2YgdGhlIHRpbWUgcGVyaW9kPyAoTm90ZSB0aGF0IHRoZSB0aW1lIHBlcmlvZCBpcyBmcm9tIDIwMDEgdG8gMjAxMiwgc28gdGhlIG1pZGRsZSBvZiB0aGUgdGltZSBwZXJpb2QgaXMgdGhlIGJlZ2lubmluZyBvZiAyMDA3LikNCg0KKyBGaXJzdCBoYWxmDQorIFNlY29uZCBoYWxmDQoNCmBgYHtyfQ0KYm94cGxvdChtdnQkRGF0ZSB+IG12dCRBcnJlc3QpDQpgYGANCg0KDQojIyMjIDMuMw0KTGV0J3MgaW52ZXN0aWdhdGUgdGhpcyBmdXJ0aGVyLiBVc2UgdGhlIHRhYmxlIGZ1bmN0aW9uIGZvciB0aGUgbmV4dCBmZXcgcXVlc3Rpb25zLg0KDQpGb3Igd2hhdCBwcm9wb3J0aW9uIG9mIG1vdG9yIHZlaGljbGUgdGhlZnRzIGluIDIwMDEgd2FzIGFuIGFycmVzdCBtYWRlPw0KDQpOb3RlOiBpbiB0aGlzIHF1ZXN0aW9uIGFuZCBtYW55IG90aGVycyBpbiB0aGUgY291cnNlLCB3ZSBhcmUgYXNraW5nIGZvciBhbiBhbnN3ZXIgYXMgYSBwcm9wb3J0aW9uLiBUaGVyZWZvcmUsIHlvdXIgYW5zd2VyIHNob3VsZCB0YWtlIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAxLg0KDQpgYGB7cn0NCnRhYmxlKG12dCRBcnJlc3QsIG12dCRZZWFyKQ0KMjE1Mi8oMjE1MisxODUxNykNCmBgYA0KDQojIyMjIDMuNA0KRm9yIHdoYXQgcHJvcG9ydGlvbiBvZiBtb3RvciB2ZWhpY2xlIHRoZWZ0cyBpbiAyMDA3IHdhcyBhbiBhcnJlc3QgbWFkZT8NCg0KYGBge3J9DQp0YWJsZShtdnQkQXJyZXN0LCBtdnQkWWVhcikNCjEyMTIvKDEyMTIrMTMwNjgpDQpgYGANCg0KIyMjIyAzLjUNCkZvciB3aGF0IHByb3BvcnRpb24gb2YgbW90b3IgdmVoaWNsZSB0aGVmdHMgaW4gMjAxMiB3YXMgYW4gYXJyZXN0IG1hZGU/DQoNCmBgYHtyfQ0KdGFibGUobXZ0JEFycmVzdCwgbXZ0JFllYXIpDQo1NTAvKDU1MCsxMzU0MikNCmBgYA0KDQpTaW5jZSB0aGVyZSBtYXkgc3RpbGwgYmUgb3BlbiBpbnZlc3RpZ2F0aW9ucyBmb3IgcmVjZW50IGNyaW1lcywgdGhpcyBjb3VsZCBleHBsYWluIHRoZSB0cmVuZCB3ZSBhcmUgc2VlaW5nIGluIHRoZSBkYXRhLiBUaGVyZSBjb3VsZCBhbHNvIGJlIG90aGVyIGZhY3RvcnMgYXQgcGxheSwgYW5kIHRoaXMgdHJlbmQgc2hvdWxkIGJlIGludmVzdGlnYXRlZCBmdXJ0aGVyLiBIb3dldmVyLCBzaW5jZSB3ZSBkb24ndCBrbm93IHdoZW4gdGhlIGFycmVzdHMgd2VyZSBhY3R1YWxseSBtYWRlLCBvdXIgZGV0ZWN0aXZlIHdvcmsgaW4gdGhpcyBhcmVhIGhhcyByZWFjaGVkIGEgZGVhZCBlbmQuDQoNCiMjIyBTZWN0aW9uIDQgLSBQb3B1bGFyIExvY2F0aW9ucw0KDQojIyMjIDQuMQ0KQW5hbHl6aW5nIHRoaXMgZGF0YSBjb3VsZCBiZSB1c2VmdWwgdG8gdGhlIENoaWNhZ28gUG9saWNlIERlcGFydG1lbnQgd2hlbiBkZWNpZGluZyB3aGVyZSB0byBhbGxvY2F0ZSByZXNvdXJjZXMuIElmIHRoZXkgd2FudCB0byBpbmNyZWFzZSB0aGUgbnVtYmVyIG9mIGFycmVzdHMgdGhhdCBhcmUgbWFkZSBmb3IgbW90b3IgdmVoaWNsZSB0aGVmdHMsIHdoZXJlIHNob3VsZCB0aGV5IGZvY3VzIHRoZWlyIGVmZm9ydHM/DQoNCldlIHdhbnQgdG8gZmluZCB0aGUgdG9wIGZpdmUgbG9jYXRpb25zIHdoZXJlIG1vdG9yIHZlaGljbGUgdGhlZnRzIG9jY3VyLiBJZiB5b3UgY3JlYXRlIGEgdGFibGUgb2YgdGhlIExvY2F0aW9uRGVzY3JpcHRpb24gdmFyaWFibGUsIGl0IGlzIHVuZm9ydHVuYXRlbHkgdmVyeSBoYXJkIHRvIHJlYWQgc2luY2UgdGhlcmUgYXJlIDc4IGRpZmZlcmVudCBsb2NhdGlvbnMgaW4gdGhlIGRhdGEgc2V0LiBCeSB1c2luZyB0aGUgc29ydCBmdW5jdGlvbiwgd2UgY2FuIHZpZXcgdGhpcyBzYW1lIHRhYmxlLCBidXQgc29ydGVkIGJ5IHRoZSBudW1iZXIgb2Ygb2JzZXJ2YXRpb25zIGluIGVhY2ggY2F0ZWdvcnkuIEluIHlvdXIgUiBjb25zb2xlLCB0eXBlOg0KDQogICAgc29ydCh0YWJsZShtdnQkTG9jYXRpb25EZXNjcmlwdGlvbikpDQoNCldoaWNoIGxvY2F0aW9ucyBhcmUgdGhlIHRvcCBmaXZlIGxvY2F0aW9ucyBmb3IgbW90b3IgdmVoaWNsZSB0aGVmdHMsIGV4Y2x1ZGluZyB0aGUgIk90aGVyIiBjYXRlZ29yeT8gWW91IHNob3VsZCBzZWxlY3QgNSBvZiB0aGUgZm9sbG93aW5nIG9wdGlvbnMuDQoNCisgQmFuaw0KKyBHYXMgU3RhdGlvbg0KKyBIb3RlbC9Nb3RlbA0KKyBTdHJlZXQNCisgQ2FyIFdhc2gNCisgUmVzdGF1cmFudA0KKyBQYXJraW5nIExvdC9HYXJhZ2UgKE5vbi1SZXNpZGVudGlhbCkNCisgQWxsZXkNCisgRHJpdmV3YXkgKFJlc2lkZW50aWFsKQ0KKyBWYWNhbnQgTG90L0xhbmQNCg0KYGBge3J9DQpzb3J0KHRhYmxlKG12dCRMb2NhdGlvbkRlc2NyaXB0aW9uKSkNCmBgYA0KDQojIyMjIDQuMiANCkNyZWF0ZSBhIHN1YnNldCBvZiB5b3VyIGRhdGEsIG9ubHkgdGFraW5nIG9ic2VydmF0aW9ucyBmb3Igd2hpY2ggdGhlIHRoZWZ0IGhhcHBlbmVkIGluIG9uZSBvZiB0aGVzZSBmaXZlIGxvY2F0aW9ucywgYW5kIGNhbGwgdGhpcyBuZXcgZGF0YSBzZXQgIlRvcDUiLiBUbyBkbyB0aGlzLCB5b3UgY2FuIHVzZSB0aGUgfCBzeW1ib2wuIEluIGxlY3R1cmUsIHdlIHVzZWQgdGhlICYgc3ltYm9sIHRvIHVzZSB0d28gY3JpdGVyaWEgdG8gbWFrZSBhIHN1YnNldCBvZiB0aGUgZGF0YS4gVG8gb25seSB0YWtlIG9ic2VydmF0aW9ucyB0aGF0IGhhdmUgYSBjZXJ0YWluIHZhbHVlIGluIG9uZSB2YXJpYWJsZSBvciB0aGUgb3RoZXIsIHRoZSB8IGNoYXJhY3RlciBjYW4gYmUgdXNlZCBpbiBwbGFjZSBvZiB0aGUgJiBzeW1ib2wuIFRoaXMgaXMgYWxzbyBjYWxsZWQgYSBsb2dpY2FsICJvciIgb3BlcmF0aW9uLg0KDQpBbHRlcm5hdGVseSwgeW91IGNvdWxkIGNyZWF0ZSBmaXZlIGRpZmZlcmVudCBzdWJzZXRzLCBhbmQgdGhlbiBtZXJnZSB0aGVtIHRvZ2V0aGVyIGludG8gb25lIGRhdGEgZnJhbWUgdXNpbmcgcmJpbmQuDQoNCkhvdyBtYW55IG9ic2VydmF0aW9ucyBhcmUgaW4gVG9wNT8NCg0KYGBge3J9DQpUb3A1ID0gc3Vic2V0KG12dCwgTG9jYXRpb25EZXNjcmlwdGlvbj09IlNUUkVFVCIgfCBMb2NhdGlvbkRlc2NyaXB0aW9uPT0iUEFSS0lORyBMT1QvR0FSQUdFKE5PTi5SRVNJRC4pIiB8IExvY2F0aW9uRGVzY3JpcHRpb249PSJBTExFWSIgfCBMb2NhdGlvbkRlc2NyaXB0aW9uPT0iR0FTIFNUQVRJT04iIHwgTG9jYXRpb25EZXNjcmlwdGlvbj09IkRSSVZFV0FZIC0gUkVTSURFTlRJQUwiKQ0KYGBgDQoNCiMjIyMgNC4zDQpSIHdpbGwgcmVtZW1iZXIgdGhlIG90aGVyIGNhdGVnb3JpZXMgb2YgdGhlIExvY2F0aW9uRGVzY3JpcHRpb24gdmFyaWFibGUgZnJvbSB0aGUgb3JpZ2luYWwgZGF0YXNldCwgc28gcnVubmluZyB0YWJsZShUb3A1JExvY2F0aW9uRGVzY3JpcHRpb24pIHdpbGwgaGF2ZSBhIGxvdCBvZiB1bm5lY2Vzc2FyeSBvdXRwdXQuIFRvIG1ha2Ugb3VyIHRhYmxlcyBhIGJpdCBuaWNlciB0byByZWFkLCB3ZSBjYW4gcmVmcmVzaCB0aGlzIGZhY3RvciB2YXJpYWJsZS4gSW4geW91ciBSIGNvbnNvbGUsIHR5cGU6DQoNCiAgICBUb3A1JExvY2F0aW9uRGVzY3JpcHRpb24gPSBmYWN0b3IoVG9wNSRMb2NhdGlvbkRlc2NyaXB0aW9uKQ0KDQpJZiB5b3UgcnVuIHRoZSBzdHIgb3IgdGFibGUgZnVuY3Rpb24gb24gVG9wNSBub3csIHlvdSBzaG91bGQgc2VlIHRoYXQgTG9jYXRpb25EZXNjcmlwdGlvbiBub3cgb25seSBoYXMgNSB2YWx1ZXMsIGFzIHdlIGV4cGVjdC4NCg0KVXNlIHRoZSBUb3A1IGRhdGEgZnJhbWUgdG8gYW5zd2VyIHRoZSByZW1haW5pbmcgcXVlc3Rpb25zLg0KDQpPbmUgb2YgdGhlIGxvY2F0aW9ucyBoYXMgYSBtdWNoIGhpZ2hlciBhcnJlc3QgcmF0ZSB0aGFuIHRoZSBvdGhlciBsb2NhdGlvbnMuIFdoaWNoIGlzIGl0PyBQbGVhc2UgZW50ZXIgdGhlIHRleHQgaW4gZXhhY3RseSB0aGUgc2FtZSB3YXkgYXMgaG93IGl0IGxvb2tzIGluIHRoZSBhbnN3ZXIgb3B0aW9ucyBmb3IgUHJvYmxlbSA0LjEuDQoNCmBgYHtyfQ0KdGFibGUoVG9wNSRMb2NhdGlvbkRlc2NyaXB0aW9uLCBUb3A1JEFycmVzdCkNCmBgYA0KDQoNCiMjIyMgNC40IA0KT24gd2hpY2ggZGF5IG9mIHRoZSB3ZWVrIGRvIHRoZSBtb3N0IG1vdG9yIHZlaGljbGUgdGhlZnRzIGF0IGdhcyBzdGF0aW9ucyBoYXBwZW4/DQooTW9uZGF5flN1bmRheSkNCg0KYGBge3J9DQoNCmBgYA0KDQojIyMjIDQuNQ0KT24gd2hpY2ggZGF5IG9mIHRoZSB3ZWVrIGRvIHRoZSBmZXdlc3QgbW90b3IgdmVoaWNsZSB0aGVmdHMgaW4gcmVzaWRlbnRpYWwgZHJpdmV3YXlzIGhhcHBlbj8oTW9uZGF5flN1bmRheSkNCg0KYGBge3J9DQoNCmBgYA0KDQoNCg0KDQoNCg==