#Getting Started

For those of you new to R, the first thing you generally need to do is load packages that you will use. The tidyverse package has most of the tools we’ll need today.

If you have never used the package before, you’ll need to install it manually. Click the “Packages” tab in the bottom right window, then click the “Install” button, and type “tidyverse” and click “Install”.

library(tidyverse)

Now we’ll read in data that Anu has graciously shared with us.

data <- read_csv("Pune_SchoolData.csv", na = c("", "NA", "na"))

#Preparing Data

This dataset is currently in long format, meaning there are separate rows for each trial of Anu’s experiment. It also means that participant background data, which does not vary across trials, is repeated.

unique(data$participant_id)
 [1] "A01" "A02" "A03" "A04" "A05" "A06" "A07" "A08" "B01" "B02" "B03" "B04" "B05" "B06" "B07" "B08" "B09" "B10" "B11" "B12" "B13" "C01"
[23] "C02" "C03" "C04" "C05" "C06" "C07" "D01" "D02" "D03" "D04" "D05" "D06" "C08" "C09" "C10" "C11" "C12" "C13" "C14" "C15" "C16" "C17"

900+ rows, but only a few dozen participants.

length(unique(data$participant_id))
[1] 44

44 participants, to be precise!

We want to do a little work on that background data first, so we’ll make a separate dataset for that.

bg <- data %>%
  select(participant_id:marathi_home) %>%
  distinct()

Now we have a dataframe calld bg with 44 rows; one for each participant.

We want to compute a (fairly) precise age for each participant based on their birthday (month and year, it looks like) and the date of data collection. Months are a very meaningful unit of time in child language acquisition, so we can’t just round to the nearest year.

We’ll use some tidyverse functions that are part of the lubridate package.

#change collection data to a special date format
bg$collection_date <- as.Date(bg$collection_date, "%m/%d/%Y")

#also change birthdate to a special date format
bg$birthdate <- as.Date(bg$birthdate, "%m/%d/%Y")

#subtract birthdate from collection date (result in days)
bg$age_cont <- difftime(bg$collection_date, bg$birthdate)/365#divide by 365 to get years

#make this a number
bg$age_cont <- as.numeric(bg$age_cont)*12 #multiply by 12 to get months

Let’s do a little bit of summarizing and plotting to see what our participants’ ages look like.

bg %>% summarise(mean = mean(age_cont),
                 sd = sd(age_cont),
                 median = median(age_cont),
                 min = min(age_cont),
                 max = max(age_cont)) %>%
  round(2)

Now for a histogram…

bg %>% ggplot(aes(x = age_cont))+
  geom_vline(xintercept = 48, linetype = 2)+
  geom_vline(xintercept = 60, linetype = 2)+
  geom_vline(xintercept = 72, linetype = 2)+
  geom_histogram(binwidth = 1)+
  scale_x_continuous(breaks = c(48, 60, 72))+
  scale_y_continuous(expand = c(0,0), limits = c(0, 5.5))+
  labs(x = "Age (mos.)")+
  theme_bw()

Anu’s data also has an age category, which corresponds to Junior and Senior kindergarten. Let’s compare the ages of the two groups:

bg %>% group_by(age_cat) %>%
  summarise(n = n(),
            mean = mean(age_cont),
            sd = sd(age_cont),
            median = median(age_cont),
            min = min(age_cont),               
            max = max(age_cont)) 

As expected, the Senior Kindergarteners are about a year older, on average, than the junior kindergarteners.

Visually:

bg %>% ggplot(aes(x = age_cat, y = age_cont)) +
  geom_boxplot()+
  geom_jitter(height = 0, width = .1, color = "blue")+
  stat_summary(fun = "mean", color = "red", geom = "point", size = 4)+
  theme_bw()

#Proportions of verb interpretations

Anu’s data involves children having to interpret verbs as being causative or conjunctive in Marathi (I think…). These are all intransitive verbs, and can have markers attached(or in proximity? - I know nothing about Marathi!).

We can use the table(), xtabs(), and count() or tally() functions to get a sense of the design and stimuli.

table(data$verb, data$interp)
xtabs(~verb+token_type , data = data)
data %>% group_by(verb, verb_type) %>% count()
data %>% group_by(verb, marker) %>% tally()

Six verbs (cry, getwet, laugh, rise, scare, sleep) are the targets and it seems like Anu is interested how case markers affect verb interpretations (causative or conjunctive) for children at different ages.

data %>% filter(!is.na(interp)) %>%
  group_by(age_cat, marker, interp) %>%
  count() %>%
  pivot_wider(names_from = interp, values_from = n) %>%
  mutate(total = causative + conjunctive,
         cause_perc = (causative/total)*100,
         conj_perc = (conjunctive/total)*100)

And now for a plot of causatives…

data %>% filter(!is.na(interp)) %>%
  group_by(age_cat, marker, interp) %>%
  count() %>%
  pivot_wider(names_from = interp, values_from = n) %>%
  mutate(total = causative + conjunctive,
         cause_perc = (causative/total)*100,
         conj_perc = (conjunctive/total)*100) %>%
  ggplot(aes(x = marker, y = cause_perc, fill = age_cat))+
  geom_bar(stat = "identity", position = "dodge")+
  theme_bw()

And now for a plot of conjunctives…

data %>% filter(!is.na(interp)) %>%
  group_by(age_cat, marker, interp) %>%
  count() %>%
  pivot_wider(names_from = interp, values_from = n) %>%
  mutate(total = causative + conjunctive,
         cause_perc = (causative/total)*100,
         conj_perc = (conjunctive/total)*100) %>%
  ggplot(aes(x = marker, y = conj_perc, fill = age_cat))+
  geom_bar(stat = "identity", position = "dodge")+
  theme_bw()

Now we’ll do something similar, but at the participant level so we can look in greater detail at trends across ages.

And now some plotting….

data %>% filter(!is.na(interp)) %>%
  group_by(participant_id, marker, interp) %>%
  count(.drop = F) %>%
  pivot_wider(names_from = interp, values_from = n) %>%
  mutate(causative = ifelse(is.na(causative), 0, causative),
         conjunctive = ifelse(is.na(conjunctive), 0, conjunctive),
         total = causative + conjunctive,
         cause_perc = (causative/total)*100,
         conj_perc = (conjunctive/total)*100) %>%
  left_join(.,select(bg, participant_id, age_cont), by = "participant_id") %>%
  select(participant_id, age_cont, marker, cause_perc, conj_perc) %>%
  pivot_longer(cause_perc:conj_perc, names_to = "interp", values_to = "percent") %>%
  ggplot(aes(x = age_cont, color = marker, y = percent))+
  geom_point(alpha = .4)+
  geom_smooth(method = "lm")+
  theme_bw()+
  facet_wrap(~interp+marker, nrow = 2)

LS0tDQp0aXRsZTogIlFSREcgRGF0YSBBbmFseXNpcyBXb3Jrc2hvcCBOb3YuIDIwMjIiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQojR2V0dGluZyBTdGFydGVkDQoNCkZvciB0aG9zZSBvZiB5b3UgbmV3IHRvIFIsIHRoZSBmaXJzdCB0aGluZyB5b3UgZ2VuZXJhbGx5IG5lZWQgdG8gZG8gaXMgbG9hZCBwYWNrYWdlcyB0aGF0IHlvdSB3aWxsIHVzZS4gVGhlIGB0aWR5dmVyc2VgIHBhY2thZ2UgaGFzIG1vc3Qgb2YgdGhlIHRvb2xzIHdlJ2xsIG5lZWQgdG9kYXkuDQoNCklmIHlvdSBoYXZlIG5ldmVyIHVzZWQgdGhlIHBhY2thZ2UgYmVmb3JlLCB5b3UnbGwgbmVlZCB0byBpbnN0YWxsIGl0IG1hbnVhbGx5LiBDbGljayB0aGUgIlBhY2thZ2VzIiB0YWIgaW4gdGhlIGJvdHRvbSByaWdodCB3aW5kb3csIHRoZW4gY2xpY2sgdGhlICJJbnN0YWxsIiBidXR0b24sIGFuZCB0eXBlICJ0aWR5dmVyc2UiIGFuZCBjbGljayAiSW5zdGFsbCIuDQoNCmBgYHtyIGVjaG89VCwgcmVzdWx0cz0naGlkZSd9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmBgYA0KDQpOb3cgd2UnbGwgcmVhZCBpbiBkYXRhIHRoYXQgQW51IGhhcyBncmFjaW91c2x5IHNoYXJlZCB3aXRoIHVzLg0KDQpgYGB7ciBlY2hvPVQsIHJlc3VsdHM9J2hpZGUnfQ0KZGF0YSA8LSByZWFkX2NzdigiUHVuZV9TY2hvb2xEYXRhLmNzdiIsIG5hID0gYygiIiwgIk5BIiwgIm5hIikpDQpgYGANCg0KI1ByZXBhcmluZyBEYXRhDQoNClRoaXMgZGF0YXNldCBpcyBjdXJyZW50bHkgaW4gbG9uZyBmb3JtYXQsIG1lYW5pbmcgdGhlcmUgYXJlIHNlcGFyYXRlIHJvd3MgZm9yIGVhY2ggdHJpYWwgb2YgQW51J3MgZXhwZXJpbWVudC4gSXQgYWxzbyBtZWFucyB0aGF0IHBhcnRpY2lwYW50IGJhY2tncm91bmQgZGF0YSwgd2hpY2ggZG9lcyBub3QgdmFyeSBhY3Jvc3MgdHJpYWxzLCBpcyByZXBlYXRlZC4gDQoNCmBgYHtyfQ0KdW5pcXVlKGRhdGEkcGFydGljaXBhbnRfaWQpDQpgYGANCjkwMCsgcm93cywgYnV0IG9ubHkgYSBmZXcgZG96ZW4gcGFydGljaXBhbnRzLg0KDQpgYGB7cn0NCmxlbmd0aCh1bmlxdWUoZGF0YSRwYXJ0aWNpcGFudF9pZCkpDQpgYGANCjQ0IHBhcnRpY2lwYW50cywgdG8gYmUgcHJlY2lzZSENCg0KV2Ugd2FudCB0byBkbyBhIGxpdHRsZSB3b3JrIG9uIHRoYXQgYmFja2dyb3VuZCBkYXRhIGZpcnN0LCBzbyB3ZSdsbCBtYWtlIGEgc2VwYXJhdGUgZGF0YXNldCBmb3IgdGhhdC4NCg0KYGBge3J9DQpiZyA8LSBkYXRhICU+JQ0KICBzZWxlY3QocGFydGljaXBhbnRfaWQ6bWFyYXRoaV9ob21lKSAlPiUNCiAgZGlzdGluY3QoKQ0KYGBgDQoNCk5vdyB3ZSBoYXZlIGEgZGF0YWZyYW1lIGNhbGxkIGBiZ2Agd2l0aCA0NCByb3dzOyBvbmUgZm9yIGVhY2ggcGFydGljaXBhbnQuDQoNCldlIHdhbnQgdG8gY29tcHV0ZSBhIChmYWlybHkpIHByZWNpc2UgYWdlIGZvciBlYWNoIHBhcnRpY2lwYW50IGJhc2VkIG9uIHRoZWlyIGJpcnRoZGF5IChtb250aCBhbmQgeWVhciwgaXQgbG9va3MgbGlrZSkgYW5kIHRoZSBkYXRlIG9mIGRhdGEgY29sbGVjdGlvbi4gTW9udGhzIGFyZSBhIHZlcnkgbWVhbmluZ2Z1bCB1bml0IG9mIHRpbWUgaW4gY2hpbGQgbGFuZ3VhZ2UgYWNxdWlzaXRpb24sIHNvIHdlIGNhbid0IGp1c3Qgcm91bmQgdG8gdGhlIG5lYXJlc3QgeWVhci4NCg0KV2UnbGwgdXNlIHNvbWUgYHRpZHl2ZXJzZWAgZnVuY3Rpb25zIHRoYXQgYXJlIHBhcnQgb2YgdGhlIGBsdWJyaWRhdGVgIHBhY2thZ2UuDQoNCmBgYHtyfQ0KI2NoYW5nZSBjb2xsZWN0aW9uIGRhdGEgdG8gYSBzcGVjaWFsIGRhdGUgZm9ybWF0DQpiZyRjb2xsZWN0aW9uX2RhdGUgPC0gYXMuRGF0ZShiZyRjb2xsZWN0aW9uX2RhdGUsICIlbS8lZC8lWSIpDQoNCiNhbHNvIGNoYW5nZSBiaXJ0aGRhdGUgdG8gYSBzcGVjaWFsIGRhdGUgZm9ybWF0DQpiZyRiaXJ0aGRhdGUgPC0gYXMuRGF0ZShiZyRiaXJ0aGRhdGUsICIlbS8lZC8lWSIpDQoNCiNzdWJ0cmFjdCBiaXJ0aGRhdGUgZnJvbSBjb2xsZWN0aW9uIGRhdGUgKHJlc3VsdCBpbiBkYXlzKQ0KYmckYWdlX2NvbnQgPC0gZGlmZnRpbWUoYmckY29sbGVjdGlvbl9kYXRlLCBiZyRiaXJ0aGRhdGUpLzM2NSNkaXZpZGUgYnkgMzY1IHRvIGdldCB5ZWFycw0KDQojbWFrZSB0aGlzIGEgbnVtYmVyDQpiZyRhZ2VfY29udCA8LSBhcy5udW1lcmljKGJnJGFnZV9jb250KSoxMiAjbXVsdGlwbHkgYnkgMTIgdG8gZ2V0IG1vbnRocw0KYGBgDQoNCkxldCdzIGRvIGEgbGl0dGxlIGJpdCBvZiBzdW1tYXJpemluZyBhbmQgcGxvdHRpbmcgdG8gc2VlIHdoYXQgb3VyIHBhcnRpY2lwYW50cycgYWdlcyBsb29rIGxpa2UuDQoNCmBgYHtyfQ0KYmcgJT4lIHN1bW1hcmlzZShtZWFuID0gbWVhbihhZ2VfY29udCksDQogICAgICAgICAgICAgICAgIHNkID0gc2QoYWdlX2NvbnQpLA0KICAgICAgICAgICAgICAgICBtZWRpYW4gPSBtZWRpYW4oYWdlX2NvbnQpLA0KICAgICAgICAgICAgICAgICBtaW4gPSBtaW4oYWdlX2NvbnQpLA0KICAgICAgICAgICAgICAgICBtYXggPSBtYXgoYWdlX2NvbnQpKSAlPiUNCiAgcm91bmQoMikNCmBgYA0KDQpOb3cgZm9yIGEgaGlzdG9ncmFtLi4uDQoNCmBgYHtyfQ0KYmcgJT4lIGdncGxvdChhZXMoeCA9IGFnZV9jb250KSkrDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDQ4LCBsaW5ldHlwZSA9IDIpKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSA2MCwgbGluZXR5cGUgPSAyKSsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gNzIsIGxpbmV0eXBlID0gMikrDQogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMSkrDQogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBjKDQ4LCA2MCwgNzIpKSsNCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwwKSwgbGltaXRzID0gYygwLCA1LjUpKSsNCiAgbGFicyh4ID0gIkFnZSAobW9zLikiKSsNCiAgdGhlbWVfYncoKQ0KYGBgDQoNCg0KQW51J3MgZGF0YSBhbHNvIGhhcyBhbiBhZ2UgY2F0ZWdvcnksIHdoaWNoIGNvcnJlc3BvbmRzIHRvIEp1bmlvciBhbmQgU2VuaW9yIGtpbmRlcmdhcnRlbi4gTGV0J3MgY29tcGFyZSB0aGUgYWdlcyBvZiB0aGUgdHdvIGdyb3VwczoNCg0KYGBge3J9DQpiZyAlPiUgZ3JvdXBfYnkoYWdlX2NhdCkgJT4lDQogIHN1bW1hcmlzZShuID0gbigpLA0KICAgICAgICAgICAgbWVhbiA9IG1lYW4oYWdlX2NvbnQpLA0KICAgICAgICAgICAgc2QgPSBzZChhZ2VfY29udCksDQogICAgICAgICAgICBtZWRpYW4gPSBtZWRpYW4oYWdlX2NvbnQpLA0KICAgICAgICAgICAgbWluID0gbWluKGFnZV9jb250KSwgICAgICAgICAgICAgICANCiAgICAgICAgICAgIG1heCA9IG1heChhZ2VfY29udCkpIA0KYGBgDQoNCkFzIGV4cGVjdGVkLCB0aGUgU2VuaW9yIEtpbmRlcmdhcnRlbmVycyBhcmUgYWJvdXQgYSB5ZWFyIG9sZGVyLCBvbiBhdmVyYWdlLCB0aGFuIHRoZSBqdW5pb3Iga2luZGVyZ2FydGVuZXJzLg0KDQpWaXN1YWxseToNCg0KYGBge3J9DQpiZyAlPiUgZ2dwbG90KGFlcyh4ID0gYWdlX2NhdCwgeSA9IGFnZV9jb250KSkgKw0KICBnZW9tX2JveHBsb3QoKSsNCiAgZ2VvbV9qaXR0ZXIoaGVpZ2h0ID0gMCwgd2lkdGggPSAuMSwgY29sb3IgPSAiYmx1ZSIpKw0KICBzdGF0X3N1bW1hcnkoZnVuID0gIm1lYW4iLCBjb2xvciA9ICJyZWQiLCBnZW9tID0gInBvaW50Iiwgc2l6ZSA9IDQpKw0KICB0aGVtZV9idygpDQpgYGANCg0KDQojUHJvcG9ydGlvbnMgb2YgdmVyYiBpbnRlcnByZXRhdGlvbnMNCg0KQW51J3MgZGF0YSBpbnZvbHZlcyBjaGlsZHJlbiBoYXZpbmcgdG8gaW50ZXJwcmV0IHZlcmJzIGFzIGJlaW5nIGNhdXNhdGl2ZSBvciBjb25qdW5jdGl2ZSBpbiBNYXJhdGhpIChJIHRoaW5rLi4uKS4gVGhlc2UgYXJlIGFsbCBpbnRyYW5zaXRpdmUgdmVyYnMsIGFuZCBjYW4gaGF2ZSBtYXJrZXJzIGF0dGFjaGVkKG9yIGluIHByb3hpbWl0eT8gLSBJIGtub3cgbm90aGluZyBhYm91dCBNYXJhdGhpISkuDQoNCldlIGNhbiB1c2UgdGhlIGB0YWJsZSgpYCwgYHh0YWJzKClgLCBhbmQgYGNvdW50KClgIG9yIGB0YWxseSgpYCBmdW5jdGlvbnMgdG8gZ2V0IGEgc2Vuc2Ugb2YgdGhlIGRlc2lnbiBhbmQgc3RpbXVsaS4NCg0KYGBge3IgZWNobz1ULCByZXN1bHRzPSdoaWRlJ30NCnRhYmxlKGRhdGEkdmVyYiwgZGF0YSRpbnRlcnApDQp4dGFicyh+dmVyYit0b2tlbl90eXBlICwgZGF0YSA9IGRhdGEpDQpkYXRhICU+JSBncm91cF9ieSh2ZXJiLCB2ZXJiX3R5cGUpICU+JSBjb3VudCgpDQpkYXRhICU+JSBncm91cF9ieSh2ZXJiLCBtYXJrZXIpICU+JSB0YWxseSgpDQpgYGANCg0KU2l4IHZlcmJzIChjcnksIGdldHdldCwgbGF1Z2gsIHJpc2UsIHNjYXJlLCBzbGVlcCkgYXJlIHRoZSB0YXJnZXRzIGFuZCBpdCBzZWVtcyBsaWtlIEFudSBpcyBpbnRlcmVzdGVkIGhvdyBjYXNlIG1hcmtlcnMgYWZmZWN0IHZlcmIgaW50ZXJwcmV0YXRpb25zIChjYXVzYXRpdmUgb3IgY29uanVuY3RpdmUpIGZvciBjaGlsZHJlbiBhdCBkaWZmZXJlbnQgYWdlcy4NCg0KYGBge3J9DQpkYXRhICU+JSBmaWx0ZXIoIWlzLm5hKGludGVycCkpICU+JQ0KICBncm91cF9ieShhZ2VfY2F0LCBtYXJrZXIsIGludGVycCkgJT4lDQogIGNvdW50KCkgJT4lDQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBpbnRlcnAsIHZhbHVlc19mcm9tID0gbikgJT4lDQogIG11dGF0ZSh0b3RhbCA9IGNhdXNhdGl2ZSArIGNvbmp1bmN0aXZlLA0KICAgICAgICAgY2F1c2VfcGVyYyA9IChjYXVzYXRpdmUvdG90YWwpKjEwMCwNCiAgICAgICAgIGNvbmpfcGVyYyA9IChjb25qdW5jdGl2ZS90b3RhbCkqMTAwKQ0KYGBgDQoNCkFuZCBub3cgZm9yIGEgcGxvdCBvZiBjYXVzYXRpdmVzLi4uDQoNCmBgYHtyfQ0KZGF0YSAlPiUgZmlsdGVyKCFpcy5uYShpbnRlcnApKSAlPiUNCiAgZ3JvdXBfYnkoYWdlX2NhdCwgbWFya2VyLCBpbnRlcnApICU+JQ0KICBjb3VudCgpICU+JQ0KICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gaW50ZXJwLCB2YWx1ZXNfZnJvbSA9IG4pICU+JQ0KICBtdXRhdGUodG90YWwgPSBjYXVzYXRpdmUgKyBjb25qdW5jdGl2ZSwNCiAgICAgICAgIGNhdXNlX3BlcmMgPSAoY2F1c2F0aXZlL3RvdGFsKSoxMDAsDQogICAgICAgICBjb25qX3BlcmMgPSAoY29uanVuY3RpdmUvdG90YWwpKjEwMCkgJT4lDQogIGdncGxvdChhZXMoeCA9IG1hcmtlciwgeSA9IGNhdXNlX3BlcmMsIGZpbGwgPSBhZ2VfY2F0KSkrDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpKw0KICB0aGVtZV9idygpDQpgYGANCg0KQW5kIG5vdyBmb3IgYSBwbG90IG9mIGNvbmp1bmN0aXZlcy4uLg0KDQpgYGB7cn0NCmRhdGEgJT4lIGZpbHRlcighaXMubmEoaW50ZXJwKSkgJT4lDQogIGdyb3VwX2J5KGFnZV9jYXQsIG1hcmtlciwgaW50ZXJwKSAlPiUNCiAgY291bnQoKSAlPiUNCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGludGVycCwgdmFsdWVzX2Zyb20gPSBuKSAlPiUNCiAgbXV0YXRlKHRvdGFsID0gY2F1c2F0aXZlICsgY29uanVuY3RpdmUsDQogICAgICAgICBjYXVzZV9wZXJjID0gKGNhdXNhdGl2ZS90b3RhbCkqMTAwLA0KICAgICAgICAgY29ual9wZXJjID0gKGNvbmp1bmN0aXZlL3RvdGFsKSoxMDApICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBtYXJrZXIsIHkgPSBjb25qX3BlcmMsIGZpbGwgPSBhZ2VfY2F0KSkrDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpKw0KICB0aGVtZV9idygpDQpgYGANCg0KDQpOb3cgd2UnbGwgZG8gc29tZXRoaW5nIHNpbWlsYXIsIGJ1dCBhdCB0aGUgcGFydGljaXBhbnQgbGV2ZWwgc28gd2UgY2FuIGxvb2sgaW4gZ3JlYXRlciBkZXRhaWwgYXQgdHJlbmRzIGFjcm9zcyBhZ2VzLg0KDQpgYGB7cn0NCmRhdGEgJT4lIGZpbHRlcighaXMubmEoaW50ZXJwKSkgJT4lDQogIGdyb3VwX2J5KHBhcnRpY2lwYW50X2lkLCBtYXJrZXIsIGludGVycCkgJT4lDQogIGNvdW50KC5kcm9wID0gRikgJT4lDQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBpbnRlcnAsIHZhbHVlc19mcm9tID0gbikgJT4lDQogIG11dGF0ZShjYXVzYXRpdmUgPSBpZmVsc2UoaXMubmEoY2F1c2F0aXZlKSwgMCwgY2F1c2F0aXZlKSwNCiAgICAgICAgIGNvbmp1bmN0aXZlID0gaWZlbHNlKGlzLm5hKGNvbmp1bmN0aXZlKSwgMCwgY29uanVuY3RpdmUpLA0KICAgICAgICAgdG90YWwgPSBjYXVzYXRpdmUgKyBjb25qdW5jdGl2ZSwNCiAgICAgICAgIGNhdXNlX3BlcmMgPSAoY2F1c2F0aXZlL3RvdGFsKSoxMDAsDQogICAgICAgICBjb25qX3BlcmMgPSAoY29uanVuY3RpdmUvdG90YWwpKjEwMCkgJT4lDQogIGxlZnRfam9pbiguLHNlbGVjdChiZywgcGFydGljaXBhbnRfaWQsIGFnZV9jb250KSwgYnkgPSAicGFydGljaXBhbnRfaWQiKQ0KYGBgDQoNCkFuZCBub3cgc29tZSBwbG90dGluZy4uLi4NCg0KYGBge3J9DQpkYXRhICU+JSBmaWx0ZXIoIWlzLm5hKGludGVycCkpICU+JQ0KICBncm91cF9ieShwYXJ0aWNpcGFudF9pZCwgbWFya2VyLCBpbnRlcnApICU+JQ0KICBjb3VudCguZHJvcCA9IEYpICU+JQ0KICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gaW50ZXJwLCB2YWx1ZXNfZnJvbSA9IG4pICU+JQ0KICBtdXRhdGUoY2F1c2F0aXZlID0gaWZlbHNlKGlzLm5hKGNhdXNhdGl2ZSksIDAsIGNhdXNhdGl2ZSksDQogICAgICAgICBjb25qdW5jdGl2ZSA9IGlmZWxzZShpcy5uYShjb25qdW5jdGl2ZSksIDAsIGNvbmp1bmN0aXZlKSwNCiAgICAgICAgIHRvdGFsID0gY2F1c2F0aXZlICsgY29uanVuY3RpdmUsDQogICAgICAgICBjYXVzZV9wZXJjID0gKGNhdXNhdGl2ZS90b3RhbCkqMTAwLA0KICAgICAgICAgY29ual9wZXJjID0gKGNvbmp1bmN0aXZlL3RvdGFsKSoxMDApICU+JQ0KICBsZWZ0X2pvaW4oLixzZWxlY3QoYmcsIHBhcnRpY2lwYW50X2lkLCBhZ2VfY29udCksIGJ5ID0gInBhcnRpY2lwYW50X2lkIikgJT4lDQogIHNlbGVjdChwYXJ0aWNpcGFudF9pZCwgYWdlX2NvbnQsIG1hcmtlciwgY2F1c2VfcGVyYywgY29ual9wZXJjKSAlPiUNCiAgcGl2b3RfbG9uZ2VyKGNhdXNlX3BlcmM6Y29ual9wZXJjLCBuYW1lc190byA9ICJpbnRlcnAiLCB2YWx1ZXNfdG8gPSAicGVyY2VudCIpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBhZ2VfY29udCwgY29sb3IgPSBtYXJrZXIsIHkgPSBwZXJjZW50KSkrDQogIGdlb21fcG9pbnQoYWxwaGEgPSAuNCkrDQogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIpKw0KICB0aGVtZV9idygpKw0KICBmYWNldF93cmFwKH5pbnRlcnArbWFya2VyLCBucm93ID0gMikNCmBgYA0KDQo=