Assignment

Let’s start by loading in a library that has some string functions and then do some smaller stuff just to warm up.

library(stringr)

In the code chunk below, create a variable called first_name and assign it a value equal to your name.

### your first name

Now, how any characters are in your name?

### Characters in name

Assign the variable last_name the value of your last name.

### Last Name

And in the following chunck, make a variable named full_name that combines your first_name and last_name.

### Your full name - Look Magic!

Now pay attention, this is very important. Take the output of the last chunk (e.g., your full name), and copy it to the 3\(^{rd}\) line of this document where it say author: "Your Name Here"! That way I know whose work this is! Nice Job!1

String Operations

So we’ll have a little fun with this one. Here are the lyrics to a popular song from the Beetles, entitled Hey Jude.

heyJude <- "Hey Jude don't make it bad Take a sad song and make it better Remember to let her into your heart Then you can start to make it better Hey Jude don't be afraid You were made to go out and get her The minute you let her under your skin Then you begin to make it better And anytime you feel the pain Hey Jude refrain Don't carry the world upon your shoulders For well you know that it's a fool Who plays it cool By making his world a little colder Na na na na na Na na na na Hey Jude don't let me down You have found her now go and get her let it out and let it in Remember to let her into your heart hey Jude Then you can start to make it better So let it out and let it in Hey Jude begin You're waiting for someone to perform with And don't you know that it's just you Hey Jude you'll do The movement you need is on your shoulder Na na na na na Na na na na yeah Hey Jude don't make it bad Take a sad song and make it better Remember to let her under your skin Then you'll begin to make it better Better better better better better ah Na na na na na na na yeah Yeah yeah yeah yeah yeah yeah Na na na na hey Jude Na na na na na na na Na na na na hey Jude Na na na na na na na Na na na na hey Jude Na na na na na na na Na na na na hey Jude Jude Jude Judy Judy Judy Judy ow wow Na na na na na na na my my my Na na na na hey Jude Jude Jude Jude Jude Jude Na na na na na na na yeah yeah yeah Na na na na hey Jude yeah you know you can make it Jude Jude you're not gonna break it Na na na na na na na don't make it bad Jude take a sad song and make it better Na na na na hey Jude oh Jude Jude hey Jude wa Na na na na na na na oh Jude Na na na na hey Jude hey hey hey hey Na na na na na na na hey hey Na na na na hey Jude now Jude Jude Jude Jude Jude Na na na na na na na Jude yeah yeah yeah yeah Na na na na hey Jude Na na na na na na na Na na na na hey Jude na na na na na na na na na Na na na na na na na Na na na na hey Jude Na na na na na na na Na na na na hey Jude Na na na na na na na yeah make it Jude Na na na na hey Jude yeah yeah yeah yeah yeah Yeah Yeah Yeah Yeah Na na na na na na na yeah yeah yeah yeah Yeah Yeah Na na na na hey Jude Na na na na na na na Na na na na hey Jude Na na na na na na na Na na na na hey Jude Na na na na na na na Na na na na hey Jude"

I thought it would be interesting to take a look at word frequencies for this song. To do so, we should probably first make everything the same case so that Hey and hay are the same. Look up the function tolower and make the lyrics in heyJude all lower cased.

### Make all the text lower case

Splitting Text into Words

In the lecture, I showed how to split a string into sections using the function str_split() function. Split the lyrics into a single vector as I showed in the recorded lecture and assign it to a variable named words. In the talk I point out that you should add the optional argument simplify=TRUE to the optional values in the str_split() function, make sure to do that here as well.

### Split the song into individual words 

Summarizing Word Orders

Now here is something new. The function table() takes a vector of values and tallies the count of each element. In this case, it will allow you to count each word in that song. Make a new variable named word.freqs to hold the result and then print it out (by just typing the variable name by itself in the chunk and running the chunk).

### Make a table of the words to get counts

Here is another new thing. You can use the sort() function to sort the word list by the magnitude of occurrences. It also has an optional argument decreasing that you can set to TRUE and have the results presented in decreasing order. (You can see the help file for sort() by typing in the console ?sort and hitting return).

### Sort the words in decreasing order.

What are the five most common words in that song?

List of words in decreasing frequency (replace the {XXXX} stuff below to answer:

  1. {most common word is X and occurs Y times}
  2. {second most common word is X and occurs Y times}
  3. {third most common word is X and occurs Y times}
  4. {fourth most common word is X and occurs Y times}
  5. {fifth most common word is X and occurs Y times}

Finding Locations in the String

Where is it the location in the full lyrics of the song where “Jude” is repeated three times?

### Show where Jude x 3 occurs

That was easy, now let’s do something more in-depth. The Clean Water Act of 1977 is an important document in our nations recognition that we may need to stop being jerks to the environment. There is a textual copy found on my github site at the following url.

Load in this document and we can do some textual findings.

clean_water_act <- "https://github.com/dyerlab/ENVS-Lectures/raw/master/data/clean_water_act.txt"
text <- readLines( clean_water_act)

The Clean Water Act consists of two main parts. The first one authorizes federal funds to support the treatment of sewage and the second part defines the regulatory requirements for industrial and municipal dischargers. I’ve formatted it such that each row in the file is a single element of the act (e.g., SEC. 101 [33 U.S.C. 1251] paragraph (a)(1) is entirely contained on its own line.

How many times is the word sewage found (either as sewage or Sewage)?

### Finding sewage

The great lakes were intimately involved in the formulation of this Act. What is the official definition of the Great Lakes as it pertains to bodies of water covered by the Clean Water Act?

### The great lakes...  Why are they so great?

  1. You’d be surprised how many assignments are turned in without a name on it…↩︎

LS0tCnRpdGxlOiAiQ2hhcmFjdGVyIERhdGEgQWN0aXZpdHkiCmF1dGhvcjogIlJvZG5leSBEeWVyIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgojIyBBc3NpZ25tZW50CgoKTGV0J3Mgc3RhcnQgYnkgbG9hZGluZyBpbiBhIGxpYnJhcnkgdGhhdCBoYXMgc29tZSBzdHJpbmcgZnVuY3Rpb25zIGFuZCB0aGVuIGRvIHNvbWUgc21hbGxlciBzdHVmZiBqdXN0IHRvIHdhcm0gdXAuCgpgYGB7cn0KbGlicmFyeShzdHJpbmdyKQpgYGAKCkluIHRoZSBjb2RlIGNodW5rIGJlbG93LCBjcmVhdGUgYSB2YXJpYWJsZSBjYWxsZWQgYGZpcnN0X25hbWVgIGFuZCBhc3NpZ24gaXQgYSB2YWx1ZSBlcXVhbCB0byB5b3VyIG5hbWUuCgpgYGB7ciBlY2hvPVRSVUV9CiMjIyB5b3VyIGZpcnN0IG5hbWUKYGBgCgpOb3csIGhvdyBhbnkgY2hhcmFjdGVycyBhcmUgaW4geW91ciBuYW1lPyAKCmBgYHtyfQojIyMgQ2hhcmFjdGVycyBpbiBuYW1lCmBgYAoKQXNzaWduIHRoZSB2YXJpYWJsZSBgbGFzdF9uYW1lYCB0aGUgdmFsdWUgb2YgeW91ciBsYXN0IG5hbWUuCgpgYGB7cn0KIyMjIExhc3QgTmFtZQpgYGAKCkFuZCBpbiB0aGUgZm9sbG93aW5nIGNodW5jaywgbWFrZSBhIHZhcmlhYmxlIG5hbWVkIGBmdWxsX25hbWVgIHRoYXQgY29tYmluZXMgeW91ciBgZmlyc3RfbmFtZWAgYW5kIGBsYXN0X25hbWVgLgoKYGBge3J9CiMjIyBZb3VyIGZ1bGwgbmFtZSAtIExvb2sgTWFnaWMhCgpgYGAKCk5vdyBwYXkgYXR0ZW50aW9uLCB0aGlzIGlzICoqdmVyeSBpbXBvcnRhbnQqKi4gIFRha2UgdGhlIG91dHB1dCBvZiB0aGUgbGFzdCBjaHVuayAoZS5nLiwgeW91ciBmdWxsIG5hbWUpLCBhbmQgKmNvcHkgaXQgdG8gdGhlIDMkXntyZH0kIGxpbmUgb2YgdGhpcyBkb2N1bWVudCB3aGVyZSBpdCBzYXkgYGF1dGhvcjogIllvdXIgTmFtZSBIZXJlImAhKiAgVGhhdCB3YXkgSSBrbm93IHdob3NlIHdvcmsgdGhpcyBpcyEgIE5pY2UgSm9iIV5bWW91J2QgYmUgc3VycHJpc2VkIGhvdyBtYW55IGFzc2lnbm1lbnRzIGFyZSB0dXJuZWQgaW4gd2l0aG91dCBhIG5hbWUgb24gaXQuLi5dCgojIyBTdHJpbmcgT3BlcmF0aW9ucwoKU28gd2UnbGwgaGF2ZSBhIGxpdHRsZSBmdW4gd2l0aCB0aGlzIG9uZS4gIEhlcmUgYXJlIHRoZSBseXJpY3MgdG8gYSBwb3B1bGFyIHNvbmcgZnJvbSB0aGUgQmVldGxlcywgZW50aXRsZWQgKkhleSBKdWRlKi4KCmBgYHtyfQpoZXlKdWRlIDwtICJIZXkgSnVkZSBkb24ndCBtYWtlIGl0IGJhZCBUYWtlIGEgc2FkIHNvbmcgYW5kIG1ha2UgaXQgYmV0dGVyIFJlbWVtYmVyIHRvIGxldCBoZXIgaW50byB5b3VyIGhlYXJ0IFRoZW4geW91IGNhbiBzdGFydCB0byBtYWtlIGl0IGJldHRlciBIZXkgSnVkZSBkb24ndCBiZSBhZnJhaWQgWW91IHdlcmUgbWFkZSB0byBnbyBvdXQgYW5kIGdldCBoZXIgVGhlIG1pbnV0ZSB5b3UgbGV0IGhlciB1bmRlciB5b3VyIHNraW4gVGhlbiB5b3UgYmVnaW4gdG8gbWFrZSBpdCBiZXR0ZXIgQW5kIGFueXRpbWUgeW91IGZlZWwgdGhlIHBhaW4gSGV5IEp1ZGUgcmVmcmFpbiBEb24ndCBjYXJyeSB0aGUgd29ybGQgdXBvbiB5b3VyIHNob3VsZGVycyBGb3Igd2VsbCB5b3Uga25vdyB0aGF0IGl0J3MgYSBmb29sIFdobyBwbGF5cyBpdCBjb29sIEJ5IG1ha2luZyBoaXMgd29ybGQgYSBsaXR0bGUgY29sZGVyIE5hIG5hIG5hIG5hIG5hIE5hIG5hIG5hIG5hIEhleSBKdWRlIGRvbid0IGxldCBtZSBkb3duIFlvdSBoYXZlIGZvdW5kIGhlciBub3cgZ28gYW5kIGdldCBoZXIgbGV0IGl0IG91dCBhbmQgbGV0IGl0IGluIFJlbWVtYmVyIHRvIGxldCBoZXIgaW50byB5b3VyIGhlYXJ0IGhleSBKdWRlIFRoZW4geW91IGNhbiBzdGFydCB0byBtYWtlIGl0IGJldHRlciBTbyBsZXQgaXQgb3V0IGFuZCBsZXQgaXQgaW4gSGV5IEp1ZGUgYmVnaW4gWW91J3JlIHdhaXRpbmcgZm9yIHNvbWVvbmUgdG8gcGVyZm9ybSB3aXRoIEFuZCBkb24ndCB5b3Uga25vdyB0aGF0IGl0J3MganVzdCB5b3UgSGV5IEp1ZGUgeW91J2xsIGRvIFRoZSBtb3ZlbWVudCB5b3UgbmVlZCBpcyBvbiB5b3VyIHNob3VsZGVyIE5hIG5hIG5hIG5hIG5hIE5hIG5hIG5hIG5hIHllYWggSGV5IEp1ZGUgZG9uJ3QgbWFrZSBpdCBiYWQgVGFrZSBhIHNhZCBzb25nIGFuZCBtYWtlIGl0IGJldHRlciBSZW1lbWJlciB0byBsZXQgaGVyIHVuZGVyIHlvdXIgc2tpbiBUaGVuIHlvdSdsbCBiZWdpbiB0byBtYWtlIGl0IGJldHRlciBCZXR0ZXIgYmV0dGVyIGJldHRlciBiZXR0ZXIgYmV0dGVyIGFoIE5hIG5hIG5hIG5hIG5hIG5hIG5hIHllYWggWWVhaCB5ZWFoIHllYWggeWVhaCB5ZWFoIHllYWggTmEgbmEgbmEgbmEgaGV5IEp1ZGUgTmEgbmEgbmEgbmEgbmEgbmEgbmEgTmEgbmEgbmEgbmEgaGV5IEp1ZGUgTmEgbmEgbmEgbmEgbmEgbmEgbmEgTmEgbmEgbmEgbmEgaGV5IEp1ZGUgTmEgbmEgbmEgbmEgbmEgbmEgbmEgTmEgbmEgbmEgbmEgaGV5IEp1ZGUgSnVkZSBKdWRlIEp1ZHkgSnVkeSBKdWR5IEp1ZHkgb3cgd293IE5hIG5hIG5hIG5hIG5hIG5hIG5hIG15IG15IG15IE5hIG5hIG5hIG5hIGhleSBKdWRlIEp1ZGUgSnVkZSBKdWRlIEp1ZGUgSnVkZSBOYSBuYSBuYSBuYSBuYSBuYSBuYSB5ZWFoIHllYWggeWVhaCBOYSBuYSBuYSBuYSBoZXkgSnVkZSB5ZWFoIHlvdSBrbm93IHlvdSBjYW4gbWFrZSBpdCBKdWRlIEp1ZGUgeW91J3JlIG5vdCBnb25uYSBicmVhayBpdCBOYSBuYSBuYSBuYSBuYSBuYSBuYSBkb24ndCBtYWtlIGl0IGJhZCBKdWRlIHRha2UgYSBzYWQgc29uZyBhbmQgbWFrZSBpdCBiZXR0ZXIgTmEgbmEgbmEgbmEgaGV5IEp1ZGUgb2ggSnVkZSBKdWRlIGhleSBKdWRlIHdhIE5hIG5hIG5hIG5hIG5hIG5hIG5hIG9oIEp1ZGUgTmEgbmEgbmEgbmEgaGV5IEp1ZGUgaGV5IGhleSBoZXkgaGV5IE5hIG5hIG5hIG5hIG5hIG5hIG5hIGhleSBoZXkgTmEgbmEgbmEgbmEgaGV5IEp1ZGUgbm93IEp1ZGUgSnVkZSBKdWRlIEp1ZGUgSnVkZSBOYSBuYSBuYSBuYSBuYSBuYSBuYSBKdWRlIHllYWggeWVhaCB5ZWFoIHllYWggTmEgbmEgbmEgbmEgaGV5IEp1ZGUgTmEgbmEgbmEgbmEgbmEgbmEgbmEgTmEgbmEgbmEgbmEgaGV5IEp1ZGUgbmEgbmEgbmEgbmEgbmEgbmEgbmEgbmEgbmEgTmEgbmEgbmEgbmEgbmEgbmEgbmEgTmEgbmEgbmEgbmEgaGV5IEp1ZGUgTmEgbmEgbmEgbmEgbmEgbmEgbmEgTmEgbmEgbmEgbmEgaGV5IEp1ZGUgTmEgbmEgbmEgbmEgbmEgbmEgbmEgeWVhaCBtYWtlIGl0IEp1ZGUgTmEgbmEgbmEgbmEgaGV5IEp1ZGUgeWVhaCB5ZWFoIHllYWggeWVhaCB5ZWFoIFllYWggWWVhaCBZZWFoIFllYWggTmEgbmEgbmEgbmEgbmEgbmEgbmEgeWVhaCB5ZWFoIHllYWggeWVhaCBZZWFoIFllYWggTmEgbmEgbmEgbmEgaGV5IEp1ZGUgTmEgbmEgbmEgbmEgbmEgbmEgbmEgTmEgbmEgbmEgbmEgaGV5IEp1ZGUgTmEgbmEgbmEgbmEgbmEgbmEgbmEgTmEgbmEgbmEgbmEgaGV5IEp1ZGUgTmEgbmEgbmEgbmEgbmEgbmEgbmEgTmEgbmEgbmEgbmEgaGV5IEp1ZGUiCmBgYAoKSSB0aG91Z2h0IGl0IHdvdWxkIGJlIGludGVyZXN0aW5nIHRvIHRha2UgYSBsb29rIGF0IHdvcmQgZnJlcXVlbmNpZXMgZm9yIHRoaXMgc29uZy4gIFRvIGRvIHNvLCB3ZSBzaG91bGQgcHJvYmFibHkgZmlyc3QgbWFrZSBldmVyeXRoaW5nIHRoZSBzYW1lIGNhc2Ugc28gdGhhdCBgSGV5YCBhbmQgYGhheWAgYXJlIHRoZSBzYW1lLiAgTG9vayB1cCB0aGUgZnVuY3Rpb24gYHRvbG93ZXJgIGFuZCBtYWtlIHRoZSBseXJpY3MgaW4gYGhleUp1ZGVgIGFsbCBsb3dlciBjYXNlZC4KCmBgYHtyfQojIyMgTWFrZSBhbGwgdGhlIHRleHQgbG93ZXIgY2FzZQpgYGAKCiMjIFNwbGl0dGluZyBUZXh0IGludG8gV29yZHMKCkluIHRoZSBsZWN0dXJlLCBJIHNob3dlZCBob3cgdG8gc3BsaXQgYSBzdHJpbmcgaW50byBzZWN0aW9ucyB1c2luZyB0aGUgZnVuY3Rpb24gYHN0cl9zcGxpdCgpYCBmdW5jdGlvbi4gIFNwbGl0IHRoZSBseXJpY3MgaW50byBhIHNpbmdsZSB2ZWN0b3IgYXMgSSBzaG93ZWQgaW4gdGhlIHJlY29yZGVkIGxlY3R1cmUgYW5kIGFzc2lnbiBpdCB0byBhIHZhcmlhYmxlIG5hbWVkIGB3b3Jkc2AuICBJbiB0aGUgdGFsayBJIHBvaW50IG91dCB0aGF0IHlvdSBzaG91bGQgYWRkIHRoZSBvcHRpb25hbCBhcmd1bWVudCBgc2ltcGxpZnk9VFJVRWAgdG8gdGhlIG9wdGlvbmFsIHZhbHVlcyBpbiB0aGUgYHN0cl9zcGxpdCgpYCBmdW5jdGlvbiwgbWFrZSBzdXJlIHRvIGRvIHRoYXQgaGVyZSBhcyB3ZWxsLgoKYGBge3J9CiMjIyBTcGxpdCB0aGUgc29uZyBpbnRvIGluZGl2aWR1YWwgd29yZHMgCmBgYAoKCiMjIFN1bW1hcml6aW5nIFdvcmQgT3JkZXJzCgpOb3cgaGVyZSBpcyBzb21ldGhpbmcgbmV3LiAgVGhlIGZ1bmN0aW9uIGB0YWJsZSgpYCB0YWtlcyBhIHZlY3RvciBvZiB2YWx1ZXMgYW5kIHRhbGxpZXMgdGhlIGNvdW50IG9mIGVhY2ggZWxlbWVudC4gIEluIHRoaXMgY2FzZSwgaXQgd2lsbCBhbGxvdyB5b3UgdG8gY291bnQgZWFjaCB3b3JkIGluIHRoYXQgc29uZy4gIE1ha2UgYSBuZXcgdmFyaWFibGUgbmFtZWQgYHdvcmQuZnJlcXNgIHRvIGhvbGQgdGhlIHJlc3VsdCBhbmQgdGhlbiBwcmludCBpdCBvdXQgKGJ5IGp1c3QgdHlwaW5nIHRoZSB2YXJpYWJsZSBuYW1lIGJ5IGl0c2VsZiBpbiB0aGUgY2h1bmsgYW5kIHJ1bm5pbmcgdGhlIGNodW5rKS4KCmBgYHtyfQojIyMgTWFrZSBhIHRhYmxlIG9mIHRoZSB3b3JkcyB0byBnZXQgY291bnRzCmBgYAoKSGVyZSBpcyBhbm90aGVyIG5ldyB0aGluZy4gIFlvdSBjYW4gdXNlIHRoZSBgc29ydCgpYCBmdW5jdGlvbiB0byBzb3J0IHRoZSB3b3JkIGxpc3QgYnkgdGhlIG1hZ25pdHVkZSBvZiBvY2N1cnJlbmNlcy4gSXQgYWxzbyBoYXMgYW4gb3B0aW9uYWwgYXJndW1lbnQgYGRlY3JlYXNpbmdgIHRoYXQgeW91IGNhbiBzZXQgdG8gYFRSVUVgIGFuZCBoYXZlIHRoZSByZXN1bHRzIHByZXNlbnRlZCBpbiBkZWNyZWFzaW5nIG9yZGVyLiAgKFlvdSBjYW4gc2VlIHRoZSBoZWxwIGZpbGUgZm9yIGBzb3J0KClgIGJ5IHR5cGluZyBpbiB0aGUgY29uc29sZSBgP3NvcnRgIGFuZCBoaXR0aW5nIHJldHVybikuCgpgYGB7cn0KIyMjIFNvcnQgdGhlIHdvcmRzIGluIGRlY3JlYXNpbmcgb3JkZXIuCmBgYAoKV2hhdCBhcmUgdGhlIGZpdmUgbW9zdCBjb21tb24gd29yZHMgaW4gdGhhdCBzb25nPwoKTGlzdCBvZiB3b3JkcyBpbiBkZWNyZWFzaW5nIGZyZXF1ZW5jeSAocmVwbGFjZSB0aGUge1hYWFh9IHN0dWZmIGJlbG93IHRvIGFuc3dlcjogIAoKMS4ge21vc3QgY29tbW9uIHdvcmQgaXMgWCBhbmQgb2NjdXJzIFkgdGltZXN9ICAKMi4ge3NlY29uZCBtb3N0IGNvbW1vbiB3b3JkIGlzIFggYW5kIG9jY3VycyBZIHRpbWVzfSAKMy4ge3RoaXJkIG1vc3QgY29tbW9uIHdvcmQgaXMgWCBhbmQgb2NjdXJzIFkgdGltZXN9IAo0LiB7Zm91cnRoIG1vc3QgY29tbW9uIHdvcmQgaXMgWCBhbmQgb2NjdXJzIFkgdGltZXN9IAo1LiB7ZmlmdGggbW9zdCBjb21tb24gd29yZCBpcyBYIGFuZCBvY2N1cnMgWSB0aW1lc30gCgoKIyMgRmluZGluZyBMb2NhdGlvbnMgaW4gdGhlIFN0cmluZwoKV2hlcmUgaXMgaXQgdGhlIGxvY2F0aW9uIGluIHRoZSBmdWxsIGx5cmljcyBvZiB0aGUgc29uZyB3aGVyZSAiSnVkZSIgaXMgcmVwZWF0ZWQgdGhyZWUgdGltZXM/CgpgYGB7cn0KIyMjIFNob3cgd2hlcmUgSnVkZSB4IDMgb2NjdXJzCmBgYAoKCi0tLQoKVGhhdCB3YXMgZWFzeSwgbm93IGxldCdzIGRvIHNvbWV0aGluZyBtb3JlIGluLWRlcHRoLiAgVGhlIENsZWFuIFdhdGVyIEFjdCBvZiAxOTc3IGlzIGFuIGltcG9ydGFudCBkb2N1bWVudCBpbiBvdXIgbmF0aW9ucyByZWNvZ25pdGlvbiB0aGF0IHdlIG1heSBuZWVkIHRvIHN0b3AgYmVpbmcgamVya3MgdG8gdGhlIGVudmlyb25tZW50LiAgVGhlcmUgaXMgYSB0ZXh0dWFsIGNvcHkgZm91bmQgb24gbXkgZ2l0aHViIHNpdGUgYXQgdGhlIGZvbGxvd2luZyB1cmwuCgpMb2FkIGluIHRoaXMgZG9jdW1lbnQgYW5kIHdlIGNhbiBkbyBzb21lIHRleHR1YWwgZmluZGluZ3MuCgpgYGB7cn0KY2xlYW5fd2F0ZXJfYWN0IDwtICJodHRwczovL2dpdGh1Yi5jb20vZHllcmxhYi9FTlZTLUxlY3R1cmVzL3Jhdy9tYXN0ZXIvZGF0YS9jbGVhbl93YXRlcl9hY3QudHh0Igp0ZXh0IDwtIHJlYWRMaW5lcyggY2xlYW5fd2F0ZXJfYWN0KQpgYGAKCgoKVGhlIENsZWFuIFdhdGVyIEFjdCBjb25zaXN0cyBvZiB0d28gbWFpbiBwYXJ0cy4gIFRoZSBmaXJzdCBvbmUgYXV0aG9yaXplcyBmZWRlcmFsIGZ1bmRzIHRvIHN1cHBvcnQgdGhlIHRyZWF0bWVudCBvZiBzZXdhZ2UgYW5kIHRoZSBzZWNvbmQgcGFydCBkZWZpbmVzIHRoZSByZWd1bGF0b3J5IHJlcXVpcmVtZW50cyBmb3IgaW5kdXN0cmlhbCBhbmQgbXVuaWNpcGFsIGRpc2NoYXJnZXJzLiAgSSd2ZSBmb3JtYXR0ZWQgaXQgc3VjaCB0aGF0IGVhY2ggcm93IGluIHRoZSBmaWxlIGlzIGEgc2luZ2xlIGVsZW1lbnQgb2YgdGhlIGFjdCAoZS5nLiwgU0VDLiAxMDEgWzMzIFUuUy5DLiAxMjUxXSBwYXJhZ3JhcGggKGEpKDEpIGlzIGVudGlyZWx5IGNvbnRhaW5lZCBvbiBpdHMgb3duIGxpbmUuCgpIb3cgbWFueSB0aW1lcyBpcyB0aGUgd29yZCBgc2V3YWdlYCBmb3VuZCAoZWl0aGVyIGFzIGBzZXdhZ2VgIG9yIGBTZXdhZ2VgKT8KCmBgYHtyfQojIyMgRmluZGluZyBzZXdhZ2UKYGBgCgpUaGUgZ3JlYXQgbGFrZXMgd2VyZSBpbnRpbWF0ZWx5IGludm9sdmVkIGluIHRoZSBmb3JtdWxhdGlvbiBvZiB0aGlzIEFjdC4gIFdoYXQgaXMgdGhlIG9mZmljaWFsIGRlZmluaXRpb24gb2YgdGhlIGBHcmVhdCBMYWtlc2AgYXMgaXQgcGVydGFpbnMgdG8gYm9kaWVzIG9mIHdhdGVyIGNvdmVyZWQgYnkgdGhlIENsZWFuIFdhdGVyIEFjdD8KCmBgYHtyfQojIyMgVGhlIGdyZWF0IGxha2VzLi4uICBXaHkgYXJlIHRoZXkgc28gZ3JlYXQ/CmBgYAoKCgoK