Section 1 - Loading the Data

1.1

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

nrow(D)
[1] 191641

1.2

How many variables are in this dataset?

ncol(D)
[1] 11

1.3

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

max(D$ID)
[1] 9181151

1.4

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

min(D$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(D$Arrest) #15536
   Mode   FALSE    TRUE 
logical  176105   15536 

1.6

How many observations have a LocationDescription value of ALLEY?

summary(D$LocationDescription == "ALLEY") #2308
   Mode   FALSE    TRUE 
logical  189333    2308 

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
head(D$Date) #Month/Day/Year Hour:Minute
[1] 12/31/12 23:15 12/31/12 22:00 12/31/12 22:00 12/31/12 22:00
[5] 12/31/12 21:30 12/31/12 20:30
131680 Levels: 10/10/01 0:00 10/10/01 0:01 10/10/01 0:30 ... 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(D$Date, "%m/%d/%y %H:%M"))
median(DateConvert)
[1] "2006-05-21"
# May 2006

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?

D$Month = months(DateConvert)
D$Weekday = weekdays(DateConvert)
D$Date = DateConvert
table(D$Month) #February 13511

    April    August  December  February   January      July      June 
    15280     16572     16426     13511     16047     16801     16002 
    March       May  November   October September 
    15758     16035     16063     17086     16060 

2.4

On which weekday did the most motor vehicle thefts occur?

table(D$Weekday) #Sunday 26316

   Friday    Monday  Saturday    Sunday  Thursday   Tuesday Wednesday 
    29284     27397     27118     26316     27319     26791     27416 

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?

table(D$Month,D$Arrest) #January 1435
           
            FALSE  TRUE
  April     14028  1252
  August    15243  1329
  December  15029  1397
  February  12273  1238
  January   14612  1435
  July      15477  1324
  June      14772  1230
  March     14460  1298
  May       14848  1187
  November  14807  1256
  October   15744  1342
  September 14812  1248
LS0tCnRpdGxlOiAiQVMxLTEgQW4gQW5hbHl0aWNhbCBEZXRlY3RpdmUiCmF1dGhvcjogIjxuYW1lPiA8c3R1ZGVudCBJRD4iCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCi0gLSAtCgojIyMgU2VjdGlvbiAxIC0gTG9hZGluZyB0aGUgRGF0YQoKIyMjIyAxLjEgCkhvdyBtYW55IHJvd3Mgb2YgZGF0YSAob2JzZXJ2YXRpb25zKSBhcmUgaW4gdGhpcyBkYXRhc2V0PwoKYGBge3J9CkQgPSByZWFkLmNzdigiZGF0YS9tdnRXZWVrMS5jc3YiKQpucm93KEQpCmBgYAoKCiMjIyMgMS4yIApIb3cgbWFueSB2YXJpYWJsZXMgYXJlIGluIHRoaXMgZGF0YXNldD8KYGBge3J9Cm5jb2woRCkKYGBgCgoKIyMjIyAxLjMgClVzaW5nIHRoZSAibWF4IiBmdW5jdGlvbiwgd2hhdCBpcyB0aGUgbWF4aW11bSB2YWx1ZSBvZiB0aGUgdmFyaWFibGUgIklEIj8KCmBgYHtyfQptYXgoRCRJRCkKYGBgCgojIyMjIDEuNCAKV2hhdCBpcyB0aGUgbWluaW11bSB2YWx1ZSBvZiB0aGUgdmFyaWFibGUgIkJlYXQiPwpgYGB7cn0KbWluKEQkQmVhdCkKYGBgCgojIyMjIDEuNSAKSG93IG1hbnkgb2JzZXJ2YXRpb25zIGhhdmUgdmFsdWUgVFJVRSBpbiB0aGUgQXJyZXN0IHZhcmlhYmxlICh0aGlzIGlzIHRoZSBudW1iZXIgb2YgY3JpbWVzIGZvciB3aGljaCBhbiBhcnJlc3Qgd2FzIG1hZGUpPwoKYGBge3J9CnN1bW1hcnkoRCRBcnJlc3QpICMxNTUzNgpgYGAKCiMjIyMgMS42IApIb3cgbWFueSBvYnNlcnZhdGlvbnMgaGF2ZSBhIExvY2F0aW9uRGVzY3JpcHRpb24gdmFsdWUgb2YgQUxMRVk/CgpgYGB7cn0Kc3VtbWFyeShEJExvY2F0aW9uRGVzY3JpcHRpb24gPT0gIkFMTEVZIikgIzIzMDgKYGBgCgojIyMgU2VjdGlvbiAyIC0gVW5kZXJzdGFuZGluZyBEYXRlcyBpbiBSCgoKSW4gbWFueSBkYXRhc2V0cywgbGlrZSB0aGlzIG9uZSwgeW91IGhhdmUgYSBkYXRlIGZpZWxkLiBVbmZvcnR1bmF0ZWx5LCBSIGRvZXMgbm90IGF1dG9tYXRpY2FsbHkgcmVjb2duaXplIGVudHJpZXMgdGhhdCBsb29rIGxpa2UgZGF0ZXMuIFdlIG5lZWQgdG8gdXNlIGEgZnVuY3Rpb24gaW4gUiB0byBleHRyYWN0IHRoZSBkYXRlIGFuZCB0aW1lLiBUYWtlIGEgbG9vayBhdCB0aGUgZmlyc3QgZW50cnkgb2YgRGF0ZSAocmVtZW1iZXIgdG8gdXNlIHNxdWFyZSBicmFja2V0cyB3aGVuIGxvb2tpbmcgYXQgYSBjZXJ0YWluIGVudHJ5IG9mIGEgdmFyaWFibGUpLgoKIyMjIyAyLjEgCkluIHdoYXQgZm9ybWF0IGFyZSB0aGUgZW50cmllcyBpbiB0aGUgdmFyaWFibGUgRGF0ZT8KCisgTW9udGgvRGF5L1llYXIgSG91cjpNaW51dGUKKyBEYXkvTW9udGgvWWVhciBIb3VyOk1pbnV0ZQorIEhvdXI6TWludXRlIE1vbnRoL0RheS9ZZWFyCisgSG91cjpNaW51dGUgRGF5L01vbnRoL1llYXIKCmBgYHtyfQpoZWFkKEQkRGF0ZSkgI01vbnRoL0RheS9ZZWFyIEhvdXI6TWludXRlCmBgYAoKIyMjIyAyLjIgCgpOb3csIGxldCdzIGNvbnZlcnQgdGhlc2UgY2hhcmFjdGVycyBpbnRvIGEgRGF0ZSBvYmplY3QgaW4gUi4gSW4geW91ciBSIGNvbnNvbGUsIHR5cGUKCiAgICBEYXRlQ29udmVydCA9IGFzLkRhdGUoc3RycHRpbWUobXZ0JERhdGUsICIlbS8lZC8leSAlSDolTSIpKQoKVGhpcyBjb252ZXJ0cyB0aGUgdmFyaWFibGUgIkRhdGUiIGludG8gYSBEYXRlIG9iamVjdCBpbiBSLiBUYWtlIGEgbG9vayBhdCB0aGUgdmFyaWFibGUgRGF0ZUNvbnZlcnQgdXNpbmcgdGhlIHN1bW1hcnkgZnVuY3Rpb24uCgpXaGF0IGlzIHRoZSBtb250aCBhbmQgeWVhciBvZiB0aGUgbWVkaWFuIGRhdGUgaW4gb3VyIGRhdGFzZXQ/IEVudGVyIHlvdXIgYW5zd2VyIGFzICJNb250aCBZZWFyIiwgd2l0aG91dCB0aGUgcXVvdGVzLiAoRXg6IGlmIHRoZSBhbnN3ZXIgd2FzIDIwMDgtMDMtMjgsIHlvdSB3b3VsZCBnaXZlIHRoZSBhbnN3ZXIgIk1hcmNoIDIwMDgiLCB3aXRob3V0IHRoZSBxdW90ZXMuKQoKYGBge3J9CkRhdGVDb252ZXJ0ID0gYXMuRGF0ZShzdHJwdGltZShEJERhdGUsICIlbS8lZC8leSAlSDolTSIpKQptZWRpYW4oRGF0ZUNvbnZlcnQpCiMgTWF5IDIwMDYKYGBgCgojIyMjIDIuMwpOb3csIGxldCdzIGV4dHJhY3QgdGhlIG1vbnRoIGFuZCB0aGUgZGF5IG9mIHRoZSB3ZWVrLCBhbmQgYWRkIHRoZXNlIHZhcmlhYmxlcyB0byBvdXIgZGF0YSBmcmFtZSBtdnQuIFdlIGNhbiBkbyB0aGlzIHdpdGggdHdvIHNpbXBsZSBmdW5jdGlvbnMuIFR5cGUgdGhlIGZvbGxvd2luZyBjb21tYW5kcyBpbiBSOgoKICAgIG12dCRNb250aCA9IG1vbnRocyhEYXRlQ29udmVydCkKCiAgICBtdnQkV2Vla2RheSA9IHdlZWtkYXlzKERhdGVDb252ZXJ0KQoKVGhpcyBjcmVhdGVzIHR3byBuZXcgdmFyaWFibGVzIGluIG91ciBkYXRhIGZyYW1lLCBNb250aCBhbmQgV2Vla2RheSwgYW5kIHNldHMgdGhlbSBlcXVhbCB0byB0aGUgbW9udGggYW5kIHdlZWtkYXkgdmFsdWVzIHRoYXQgd2UgY2FuIGV4dHJhY3QgZnJvbSB0aGUgRGF0ZSBvYmplY3QuIExhc3RseSwgcmVwbGFjZSB0aGUgb2xkIERhdGUgdmFyaWFibGUgd2l0aCBEYXRlQ29udmVydCBieSB0eXBpbmc6CgogICAgbXZ0JERhdGUgPSBEYXRlQ29udmVydAoKVXNpbmcgdGhlIHRhYmxlIGNvbW1hbmQsIGFuc3dlciB0aGUgZm9sbG93aW5nIHF1ZXN0aW9ucy4KCkluIHdoaWNoIG1vbnRoIGRpZCB0aGUgZmV3ZXN0IG1vdG9yIHZlaGljbGUgdGhlZnRzIG9jY3VyPwoKYGBge3J9CkQkTW9udGggPSBtb250aHMoRGF0ZUNvbnZlcnQpCkQkV2Vla2RheSA9IHdlZWtkYXlzKERhdGVDb252ZXJ0KQpEJERhdGUgPSBEYXRlQ29udmVydAp0YWJsZShEJE1vbnRoKSAjRmVicnVhcnkgMTM1MTEKYGBgCgojIyMjIDIuNCAKT24gd2hpY2ggd2Vla2RheSBkaWQgdGhlIG1vc3QgbW90b3IgdmVoaWNsZSB0aGVmdHMgb2NjdXI/CgpgYGB7cn0KdGFibGUoRCRXZWVrZGF5KSAjU3VuZGF5IDI2MzE2CmBgYAoKIyMjIyAyLjUgCkVhY2ggb2JzZXJ2YXRpb24gaW4gdGhlIGRhdGFzZXQgcmVwcmVzZW50cyBhIG1vdG9yIHZlaGljbGUgdGhlZnQsIGFuZCB0aGUgQXJyZXN0IHZhcmlhYmxlIGluZGljYXRlcyB3aGV0aGVyIGFuIGFycmVzdCB3YXMgbGF0ZXIgbWFkZSBmb3IgdGhpcyB0aGVmdC4gV2hpY2ggbW9udGggaGFzIHRoZSBsYXJnZXN0IG51bWJlciBvZiBtb3RvciB2ZWhpY2xlIHRoZWZ0cyBmb3Igd2hpY2ggYW4gYXJyZXN0IHdhcyBtYWRlPwoKYGBge3J9CnRhYmxlKEQkTW9udGgsRCRBcnJlc3QpICNKYW51YXJ5IDE0MzUKYGBgCgojIyMgU2VjdGlvbiAzIC0gVmlzdWFsaXppbmcgQ3JpbWUgVHJlbmRzCgojIyMjIDMuMQoKTm93LCBsZXQncyBtYWtlIHNvbWUgcGxvdHMgdG8gaGVscCB1cyBiZXR0ZXIgdW5kZXJzdGFuZCBob3cgY3JpbWUgaGFzIGNoYW5nZWQgb3ZlciB0aW1lIGluIENoaWNhZ28uIFRocm91Z2hvdXQgdGhpcyBwcm9ibGVtLCBhbmQgaW4gZ2VuZXJhbCwgeW91IGNhbiBzYXZlIHlvdXIgcGxvdCB0byBhIGZpbGUuIEZvciBtb3JlIGluZm9ybWF0aW9uLCB0aGlzIHdlYnNpdGUgdmVyeSBjbGVhcmx5IGV4cGxhaW5zIHRoZSBwcm9jZXNzLgoKRmlyc3QsIGxldCdzIG1ha2UgYSBoaXN0b2dyYW0gb2YgdGhlIHZhcmlhYmxlIERhdGUuIFdlJ2xsIGFkZCBhbiBleHRyYSBhcmd1bWVudCwgdG8gc3BlY2lmeSB0aGUgbnVtYmVyIG9mIGJhcnMgd2Ugd2FudCBpbiBvdXIgaGlzdG9ncmFtLiBJbiB5b3VyIFIgY29uc29sZSwgdHlwZQoKICAgIGhpc3QobXZ0JERhdGUsIGJyZWFrcz0xMDApCgpgYGB7cn0KaGlzdChEJERhdGUsIGJyZWFrcz0xMDApCmBgYAoKTG9va2luZyBhdCB0aGUgaGlzdG9ncmFtLCBhbnN3ZXIgdGhlIGZvbGxvd2luZyBxdWVzdGlvbnMuCgpJbiBnZW5lcmFsLCBkb2VzIGl0IGxvb2sgbGlrZSBjcmltZSBpbmNyZWFzZXMgb3IgZGVjcmVhc2VzIGZyb20gMjAwMiAtIDIwMTI/CgorIEluY3JlYXNlcworIERlY3JlYXNlcwoKYGBge3J9CiNEZWNyZWFzZXMKYGBgCgpJbiBnZW5lcmFsLCBkb2VzIGl0IGxvb2sgbGlrZSBjcmltZSBpbmNyZWFzZXMgb3IgZGVjcmVhc2VzIGZyb20gMjAwNSAtIDIwMDg/CgorIEluY3JlYXNlcworIERlY3JlYXNlcwoKYGBge3J9CiNkZWNyZWFzZXMKYGBgCgojIyMjIDMuMgpOb3csIGxldCdzIHNlZSBob3cgYXJyZXN0cyBoYXZlIGNoYW5nZWQgb3ZlciB0aW1lLiBDcmVhdGUgYSBib3hwbG90IG9mIHRoZSB2YXJpYWJsZSAiRGF0ZSIsIHNvcnRlZCBieSB0aGUgdmFyaWFibGUgIkFycmVzdCIgKGlmIHlvdSBhcmUgbm90IGZhbWlsaWFyIHdpdGggYm94cGxvdHMgYW5kIHdvdWxkIGxpa2UgdG8gbGVhcm4gbW9yZSwgY2hlY2sgb3V0IHRoaXMgdHV0b3JpYWwpLiBJbiBhIGJveHBsb3QsIHRoZSBib2xkIGhvcml6b250YWwgbGluZSBpcyB0aGUgbWVkaWFuIHZhbHVlIG9mIHRoZSBkYXRhLCB0aGUgYm94IHNob3dzIHRoZSByYW5nZSBvZiB2YWx1ZXMgYmV0d2VlbiB0aGUgZmlyc3QgcXVhcnRpbGUgYW5kIHRoaXJkIHF1YXJ0aWxlLCBhbmQgdGhlIHdoaXNrZXJzICh0aGUgZG90dGVkIGxpbmVzIGV4dGVuZGluZyBvdXRzaWRlIHRoZSBib3gpIHNob3cgdGhlIG1pbmltdW0gYW5kIG1heGltdW0gdmFsdWVzLCBleGNsdWRpbmcgYW55IG91dGxpZXJzICh3aGljaCBhcmUgcGxvdHRlZCBhcyBjaXJjbGVzKS4gT3V0bGllcnMgYXJlIGRlZmluZWQgYnkgZmlyc3QgY29tcHV0aW5nIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGZpcnN0IGFuZCB0aGlyZCBxdWFydGlsZSB2YWx1ZXMsIG9yIHRoZSBoZWlnaHQgb2YgdGhlIGJveC4gVGhpcyBudW1iZXIgaXMgY2FsbGVkIHRoZSBJbnRlci1RdWFydGlsZSBSYW5nZSAoSVFSKS4gQW55IHBvaW50IHRoYXQgaXMgZ3JlYXRlciB0aGFuIHRoZSB0aGlyZCBxdWFydGlsZSBwbHVzIHRoZSBJUVIgb3IgbGVzcyB0aGFuIHRoZSBmaXJzdCBxdWFydGlsZSBtaW51cyB0aGUgSVFSIGlzIGNvbnNpZGVyZWQgYW4gb3V0bGllci4KCkRvZXMgaXQgbG9vayBsaWtlIHRoZXJlIHdlcmUgbW9yZSBjcmltZXMgZm9yIHdoaWNoIGFycmVzdHMgd2VyZSBtYWRlIGluIHRoZSBmaXJzdCBoYWxmIG9mIHRoZSB0aW1lIHBlcmlvZCBvciB0aGUgc2Vjb25kIGhhbGYgb2YgdGhlIHRpbWUgcGVyaW9kPyAoTm90ZSB0aGF0IHRoZSB0aW1lIHBlcmlvZCBpcyBmcm9tIDIwMDEgdG8gMjAxMiwgc28gdGhlIG1pZGRsZSBvZiB0aGUgdGltZSBwZXJpb2QgaXMgdGhlIGJlZ2lubmluZyBvZiAyMDA3LikKCisgRmlyc3QgaGFsZgorIFNlY29uZCBoYWxmCgpgYGB7cn0KYm94cGxvdChBcnJlc3R+RGF0ZSxkYXRhPUQpCmBgYAoKCiMjIyMgMy4zCkxldCdzIGludmVzdGlnYXRlIHRoaXMgZnVydGhlci4gVXNlIHRoZSB0YWJsZSBmdW5jdGlvbiBmb3IgdGhlIG5leHQgZmV3IHF1ZXN0aW9ucy4KCkZvciB3aGF0IHByb3BvcnRpb24gb2YgbW90b3IgdmVoaWNsZSB0aGVmdHMgaW4gMjAwMSB3YXMgYW4gYXJyZXN0IG1hZGU/CgpOb3RlOiBpbiB0aGlzIHF1ZXN0aW9uIGFuZCBtYW55IG90aGVycyBpbiB0aGUgY291cnNlLCB3ZSBhcmUgYXNraW5nIGZvciBhbiBhbnN3ZXIgYXMgYSBwcm9wb3J0aW9uLiBUaGVyZWZvcmUsIHlvdXIgYW5zd2VyIHNob3VsZCB0YWtlIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAxLgoKYGBge3J9CnRhYmxlKEQkWWVhcikKYW5zID0gMjA2NjkvbnJvdyhEKQphbnMKCmBgYAoKIyMjIyAzLjQKRm9yIHdoYXQgcHJvcG9ydGlvbiBvZiBtb3RvciB2ZWhpY2xlIHRoZWZ0cyBpbiAyMDA3IHdhcyBhbiBhcnJlc3QgbWFkZT8KCmBgYHtyfQphbnMgPSAxNDI4MC9ucm93KEQpCmFucwoKYGBgCgojIyMjIDMuNQpGb3Igd2hhdCBwcm9wb3J0aW9uIG9mIG1vdG9yIHZlaGljbGUgdGhlZnRzIGluIDIwMTIgd2FzIGFuIGFycmVzdCBtYWRlPwoKYGBge3J9CmFucyA9IDE0MDkyL25yb3coRCkKYW5zCmBgYAoKU2luY2UgdGhlcmUgbWF5IHN0aWxsIGJlIG9wZW4gaW52ZXN0aWdhdGlvbnMgZm9yIHJlY2VudCBjcmltZXMsIHRoaXMgY291bGQgZXhwbGFpbiB0aGUgdHJlbmQgd2UgYXJlIHNlZWluZyBpbiB0aGUgZGF0YS4gVGhlcmUgY291bGQgYWxzbyBiZSBvdGhlciBmYWN0b3JzIGF0IHBsYXksIGFuZCB0aGlzIHRyZW5kIHNob3VsZCBiZSBpbnZlc3RpZ2F0ZWQgZnVydGhlci4gSG93ZXZlciwgc2luY2Ugd2UgZG9uJ3Qga25vdyB3aGVuIHRoZSBhcnJlc3RzIHdlcmUgYWN0dWFsbHkgbWFkZSwgb3VyIGRldGVjdGl2ZSB3b3JrIGluIHRoaXMgYXJlYSBoYXMgcmVhY2hlZCBhIGRlYWQgZW5kLgoKIyMjIFNlY3Rpb24gNCAtIFBvcHVsYXIgTG9jYXRpb25zCgojIyMjIDQuMQpBbmFseXppbmcgdGhpcyBkYXRhIGNvdWxkIGJlIHVzZWZ1bCB0byB0aGUgQ2hpY2FnbyBQb2xpY2UgRGVwYXJ0bWVudCB3aGVuIGRlY2lkaW5nIHdoZXJlIHRvIGFsbG9jYXRlIHJlc291cmNlcy4gSWYgdGhleSB3YW50IHRvIGluY3JlYXNlIHRoZSBudW1iZXIgb2YgYXJyZXN0cyB0aGF0IGFyZSBtYWRlIGZvciBtb3RvciB2ZWhpY2xlIHRoZWZ0cywgd2hlcmUgc2hvdWxkIHRoZXkgZm9jdXMgdGhlaXIgZWZmb3J0cz8KCldlIHdhbnQgdG8gZmluZCB0aGUgdG9wIGZpdmUgbG9jYXRpb25zIHdoZXJlIG1vdG9yIHZlaGljbGUgdGhlZnRzIG9jY3VyLiBJZiB5b3UgY3JlYXRlIGEgdGFibGUgb2YgdGhlIExvY2F0aW9uRGVzY3JpcHRpb24gdmFyaWFibGUsIGl0IGlzIHVuZm9ydHVuYXRlbHkgdmVyeSBoYXJkIHRvIHJlYWQgc2luY2UgdGhlcmUgYXJlIDc4IGRpZmZlcmVudCBsb2NhdGlvbnMgaW4gdGhlIGRhdGEgc2V0LiBCeSB1c2luZyB0aGUgc29ydCBmdW5jdGlvbiwgd2UgY2FuIHZpZXcgdGhpcyBzYW1lIHRhYmxlLCBidXQgc29ydGVkIGJ5IHRoZSBudW1iZXIgb2Ygb2JzZXJ2YXRpb25zIGluIGVhY2ggY2F0ZWdvcnkuIEluIHlvdXIgUiBjb25zb2xlLCB0eXBlOgoKICAgIHNvcnQodGFibGUobXZ0JExvY2F0aW9uRGVzY3JpcHRpb24pKQoKV2hpY2ggbG9jYXRpb25zIGFyZSB0aGUgdG9wIGZpdmUgbG9jYXRpb25zIGZvciBtb3RvciB2ZWhpY2xlIHRoZWZ0cywgZXhjbHVkaW5nIHRoZSAiT3RoZXIiIGNhdGVnb3J5PyBZb3Ugc2hvdWxkIHNlbGVjdCA1IG9mIHRoZSBmb2xsb3dpbmcgb3B0aW9ucy4KCisgQmFuaworIEdhcyBTdGF0aW9uCisgSG90ZWwvTW90ZWwKKyBTdHJlZXQKKyBDYXIgV2FzaAorIFJlc3RhdXJhbnQKKyBQYXJraW5nIExvdC9HYXJhZ2UgKE5vbi1SZXNpZGVudGlhbCkKKyBBbGxleQorIERyaXZld2F5IChSZXNpZGVudGlhbCkKKyBWYWNhbnQgTG90L0xhbmQKCmBgYHtyfQpoZWFkKHNvcnQodGFibGUoRCRMb2NhdGlvbkRlc2NyaXB0aW9uKSxkZWNyZWFzaW5nID0gVFJVRSkpCgoKYGBgCgojIyMjIDQuMiAKQ3JlYXRlIGEgc3Vic2V0IG9mIHlvdXIgZGF0YSwgb25seSB0YWtpbmcgb2JzZXJ2YXRpb25zIGZvciB3aGljaCB0aGUgdGhlZnQgaGFwcGVuZWQgaW4gb25lIG9mIHRoZXNlIGZpdmUgbG9jYXRpb25zLCBhbmQgY2FsbCB0aGlzIG5ldyBkYXRhIHNldCAiVG9wNSIuIFRvIGRvIHRoaXMsIHlvdSBjYW4gdXNlIHRoZSB8IHN5bWJvbC4gSW4gbGVjdHVyZSwgd2UgdXNlZCB0aGUgJiBzeW1ib2wgdG8gdXNlIHR3byBjcml0ZXJpYSB0byBtYWtlIGEgc3Vic2V0IG9mIHRoZSBkYXRhLiBUbyBvbmx5IHRha2Ugb2JzZXJ2YXRpb25zIHRoYXQgaGF2ZSBhIGNlcnRhaW4gdmFsdWUgaW4gb25lIHZhcmlhYmxlIG9yIHRoZSBvdGhlciwgdGhlIHwgY2hhcmFjdGVyIGNhbiBiZSB1c2VkIGluIHBsYWNlIG9mIHRoZSAmIHN5bWJvbC4gVGhpcyBpcyBhbHNvIGNhbGxlZCBhIGxvZ2ljYWwgIm9yIiBvcGVyYXRpb24uCgpBbHRlcm5hdGVseSwgeW91IGNvdWxkIGNyZWF0ZSBmaXZlIGRpZmZlcmVudCBzdWJzZXRzLCBhbmQgdGhlbiBtZXJnZSB0aGVtIHRvZ2V0aGVyIGludG8gb25lIGRhdGEgZnJhbWUgdXNpbmcgcmJpbmQuCgpIb3cgbWFueSBvYnNlcnZhdGlvbnMgYXJlIGluIFRvcDU/CgpgYGB7cn0KVG9wNSA9IHN1YnNldChELExvY2F0aW9uRGVzY3JpcHRpb24gPT0gIlNUUkVFVCIgfCAKICAgICAgICAgICAgICAgIExvY2F0aW9uRGVzY3JpcHRpb24gPT0iUEFSS0lORyBMT1QvR0FSQUdFKE5PTi5SRVNJRC4pInwKICAgICAgICAgICAgICBMb2NhdGlvbkRlc2NyaXB0aW9uID09Ik9USEVSInwKICAgICAgICAgICAgICAgIExvY2F0aW9uRGVzY3JpcHRpb24gPT0iQUxMRVkifAogICAgICAgICAgICAgIExvY2F0aW9uRGVzY3JpcHRpb24gPT0iR0FTIFNUQVRJT04iKQpgYGAKCiMjIyMgNC4zClIgd2lsbCByZW1lbWJlciB0aGUgb3RoZXIgY2F0ZWdvcmllcyBvZiB0aGUgTG9jYXRpb25EZXNjcmlwdGlvbiB2YXJpYWJsZSBmcm9tIHRoZSBvcmlnaW5hbCBkYXRhc2V0LCBzbyBydW5uaW5nIHRhYmxlKFRvcDUkTG9jYXRpb25EZXNjcmlwdGlvbikgd2lsbCBoYXZlIGEgbG90IG9mIHVubmVjZXNzYXJ5IG91dHB1dC4gVG8gbWFrZSBvdXIgdGFibGVzIGEgYml0IG5pY2VyIHRvIHJlYWQsIHdlIGNhbiByZWZyZXNoIHRoaXMgZmFjdG9yIHZhcmlhYmxlLiBJbiB5b3VyIFIgY29uc29sZSwgdHlwZToKCiAgICBUb3A1JExvY2F0aW9uRGVzY3JpcHRpb24gPSBmYWN0b3IoVG9wNSRMb2NhdGlvbkRlc2NyaXB0aW9uKQoKSWYgeW91IHJ1biB0aGUgc3RyIG9yIHRhYmxlIGZ1bmN0aW9uIG9uIFRvcDUgbm93LCB5b3Ugc2hvdWxkIHNlZSB0aGF0IExvY2F0aW9uRGVzY3JpcHRpb24gbm93IG9ubHkgaGFzIDUgdmFsdWVzLCBhcyB3ZSBleHBlY3QuCgpVc2UgdGhlIFRvcDUgZGF0YSBmcmFtZSB0byBhbnN3ZXIgdGhlIHJlbWFpbmluZyBxdWVzdGlvbnMuCgpPbmUgb2YgdGhlIGxvY2F0aW9ucyBoYXMgYSBtdWNoIGhpZ2hlciBhcnJlc3QgcmF0ZSB0aGFuIHRoZSBvdGhlciBsb2NhdGlvbnMuIFdoaWNoIGlzIGl0PyBQbGVhc2UgZW50ZXIgdGhlIHRleHQgaW4gZXhhY3RseSB0aGUgc2FtZSB3YXkgYXMgaG93IGl0IGxvb2tzIGluIHRoZSBhbnN3ZXIgb3B0aW9ucyBmb3IgUHJvYmxlbSA0LjEuCgpgYGB7cn0KVG9wNSRMb2NhdGlvbkRlc2NyaXB0aW9uID0gZmFjdG9yKFRvcDUkTG9jYXRpb25EZXNjcmlwdGlvbikgI1LmnIPoh6rli5XoqJjmhrbljp/mnKxkYXRhc2V055qEZmFjdG9y77yM6YCZ5pmC5Yi3dGFibGXmnIPlh7rnj77lvojlpJpmYWN0b3LkvYbmlbjph4/ngrow77yM5omA5Lul6KaB6YeN5Yi35pawZmFjdG9yCnRhYmxlKFRvcDUkTG9jYXRpb25EZXNjcmlwdGlvbikKCiNhbnM6U1RSRUVUCgpgYGAKCgojIyMjIDQuNCAKT24gd2hpY2ggZGF5IG9mIHRoZSB3ZWVrIGRvIHRoZSBtb3N0IG1vdG9yIHZlaGljbGUgdGhlZnRzIGF0IGdhcyBzdGF0aW9ucyBoYXBwZW4/CihNb25kYXl+U3VuZGF5KQoKYGBge3J9CnRhYmxlKFRvcDUkTG9jYXRpb25EZXNjcmlwdGlvbixUb3A1JFdlZWtkYXkpICNhbnM6IHN1bmRheQpgYGAKCiMjIyMgNC41Ck9uIHdoaWNoIGRheSBvZiB0aGUgd2VlayBkbyB0aGUgZmV3ZXN0IG1vdG9yIHZlaGljbGUgdGhlZnRzIGluIHJlc2lkZW50aWFsIGRyaXZld2F5cyBoYXBwZW4/KE1vbmRheX5TdW5kYXkpCgpgYGB7cn0KbGV2ZWxzKEQkTG9jYXRpb25EZXNjcmlwdGlvbikgI+aJvuWIsERSSVZFV0FZIC0gUkVTSURFTlRJQUwKdGFibGUoRCRMb2NhdGlvbkRlc2NyaXB0aW9uID09ICJEUklWRVdBWSAtIFJFU0lERU5USUFMIixEJFdlZWtkYXkpICNhbnM6U2F0dXJkYXkKYGBgCgoKCgoK