Languages can be difficult to learn, though infants and children seem to do so easily. This project uncovers how language learning may occur in adults and what strategy aids improvement in identifying speech sounds, a crucial part of learning a language.

In this dataset, participants learned to distinguish two auditory categories. These categories were sounds that were created by combining two frequencies together (similar to a two-note-chord).

[[1]]
[1] TRUE

[[2]]
[1] TRUE
head(learningdata)

Dataset includes:

First, I want to know whether participants did learn the categories. Thus, I compared accuracy from the first block to the last block.

# get accuracy averaged across block for each participant
subaccuracy <- aggregate(Correct ~ Block + Participant.Private.ID, data = learningdata, FUN = mean, na.rm=TRUE)
# we only want to look at the first and last block
subaccuracy <- subaccuracy %>% mutate(Block = replace(Block, Block == "1", "start"), 
                                    Block = replace(Block, Block == "12", "end"))
# plot accuracy for first and last block
subaccuracy %>%
 filter(Block %in% c("start", "end")) %>%
 ggplot() +
 aes(x = Block, y = Correct) +
 geom_boxplot(fill = "#112446") +
 theme_minimal()

t.test(subaccuracy$Correct[subaccuracy$Block == "start"], subaccuracy$Correct[subaccuracy$Block == "end"])

    Welch Two Sample t-test

data:  subaccuracy$Correct[subaccuracy$Block == "start"] and subaccuracy$Correct[subaccuracy$Block == "end"]
t = -4.5939, df = 321.61, p-value = 6.253e-06
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -0.08706174 -0.03485184
sample estimates:
mean of x mean of y 
0.6529707 0.7139275 

Great! On average, everyone improved from the first block to the last block. But did everyone improve? Let’s calculate a difference score between the first and last block to find out.

diffdata <- spread(subaccuracy,Block,Correct)
diffdata$diffscore <- diffdata$end - diffdata$start # for each subject, subtract block 12 from block 1

hist(diffdata$diffscore)

Not everyone improved! Some improved between the first and last block (difference score > 0) while others did not (difference score <= 0).

How many participants improved?

improvement <- diffdata$Participant.Private.ID[which(diffdata$diffscore>0)]
noimprovement <- diffdata$Participant.Private.ID[which(diffdata$diffscore<=0)]

print(paste(length(improvement), ' participants improved while ',paste(length(noimprovement)), ' participants did not improve.' ))
[1] "97  participants improved while  65  participants did not improve."

Why did some participants improve while others didn’t?

Participants who improved must use pitch differences to categorize sounds. Ideally, they’d recognize and match the pitch to its category.

However, a simpler approach might be to use similarity judgments: categorizing based on whether the current sound is similar or dissimilar to the previous one.

I measured similarity by comparing sound frequencies between trials and note if participants maintained or switched category labels. This information can be used to predict whether participants improved or not in a logistic regression.

learningdata <- learningdata %>% 
  group_by(Participant.Private.ID) %>% # for each subject
  mutate(dist = c(NA, sqrt(diff(t1bk)^2 + diff(t2bk)^2)), # calculate the difference between the previous and current sound, leaving the first one out
         respchange = as.integer(Response != lag(Response, default = first(Response))))
learningdata <- learningdata[-which(learningdata$Trial.Number == 1),] # since the first trial doesn't have a previous sound, let's remove that from analysis 

learningdata$dist_cent <- learningdata$dist - mean(learningdata$dist) # standardize distance between sounds
learningdata$CC_respchange <- learningdata$respchange - .5 # codify whether learners changed response
learningdata$dist_chng <- learningdata$dist_cent*learningdata$CC_respchange # codify whether learners changed response as a function of hearing differences between sounds 

sublvldata <- aggregate(cbind(dist_cent, CC_respchange, dist_chng) ~ Participant.Private.ID, data = learningdata[which(learningdata$Block == 12),], FUN = mean, na.rm = TRUE)

sublvldata$learned <- "improved"
sublvldata$learned[sublvldata$Participant.Private.ID %in% noimprovement] <- "no improvement"
sublvldata$bin_learned <- 1
sublvldata$bin_learned[sublvldata$Participant.Private.ID %in% noimprovement] <- 0

improvemodel <- glm(bin_learned ~ dist_cent+CC_respchange+dist_chng, data = sublvldata)
summary(improvemodel)

Call:
glm(formula = bin_learned ~ dist_cent + CC_respchange + dist_chng, 
    data = sublvldata)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-0.8141  -0.5025   0.1811   0.3785   0.6908  

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)    0.33766    0.07582   4.453 1.59e-05 ***
dist_cent      0.71204    0.37530   1.897 0.059617 .  
CC_respchange -0.37871    0.35980  -1.053 0.294157    
dist_chng      1.53934    0.45211   3.405 0.000839 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for gaussian family taken to be 0.2203873)

    Null deviance: 38.920  on 161  degrees of freedom
Residual deviance: 34.821  on 158  degrees of freedom
AIC: 220.68

Number of Fisher Scoring iterations: 2

ggplot(sublvldata) +
 aes(x = learned, y = dist_chng) +
 geom_boxplot(fill = "#112446") +
 theme_minimal()

People improved when they focused on how similar or different the sounds were. When sounds were different, learners changed their response; when sounds were similar, learners kept the same response. Those who improved used this strategy more than those who didn’t.

Though this may seem obvious, this gives insight into strategies of language learning. Learning a new language depends on hearing differences between sounds. If we can help people hear these differences more clearly and consistently, they can learn languages faster.

What if listeners were given prior exposure to the language? Would that be useful in improving language learning? To test this, I assess whether listeners hearing sounds that match the categories will improve learning. Half of participants heard matching categories while the other half heard similar sounds, but mismatching categories.


matchinfo <- unique(learningdata[,c("Participant.Private.ID","Match")])
sublvldata <- merge(sublvldata,matchinfo)

ggplot(sublvldata) +
 aes(x = learned) +
 geom_bar(fill = "#112446") +
 theme_minimal() +
 facet_wrap(vars(Match))

print(paste('Within those who heard matching categories,' , round(length(which(sublvldata$Match == "Match" & sublvldata$bin_learned == 1))/length(which(sublvldata$Match == "Match"))*100,2), '% of participants improved while ', round(length(which(sublvldata$Match == "Mismatch" & sublvldata$bin_learned == 1))/length(which(sublvldata$Match == "Mismatch"))*100,2),'% of participants who heard mismatching categories improved.'))
[1] "Within those who heard matching categories, 62.96 % of participants improved while  56.79 % of participants who heard mismatching categories improved."

sublvldata$CC_Match <- (sublvldata$Match == "Match") - .5

improvemodel2 <- glm(bin_learned ~ dist_cent+CC_respchange+dist_chng+CC_Match, data = sublvldata)
summary(improvemodel2)

Call:
glm(formula = bin_learned ~ dist_cent + CC_respchange + dist_chng + 
    CC_Match, data = sublvldata)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-0.8408  -0.5031   0.1803   0.3786   0.7279  

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)    0.33316    0.07602   4.383 2.14e-05 ***
dist_cent      0.67943    0.37718   1.801 0.073565 .  
CC_respchange -0.33800    0.36273  -0.932 0.352861    
dist_chng      1.58372    0.45494   3.481 0.000647 ***
CC_Match       0.06850    0.07490   0.915 0.361803    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for gaussian family taken to be 0.2206156)

    Null deviance: 38.920  on 161  degrees of freedom
Residual deviance: 34.637  on 157  degrees of freedom
AIC: 221.82

Number of Fisher Scoring iterations: 2

These differences between participants were not statistically significant; hearing matching or mismatching categories does not predict whether participants improved in the task. The majority of learning still came from actively learning labels for sound categories.

Though familiarizing with the sound categories may not be a viable strategy to improve language learning, this is encouraging to know that it may not matter what listeners hear before learning. Learners can still learn a language even if they heard the wrong categories to start. Learners can still learn a language regardless of what languages they already know.

LS0tDQp0aXRsZTogIlVuY292ZXJpbmcgU3RyYXRlZ2llcyBpbiBNdXNpYyBhbmQgTGFuZ3VhZ2UgTGVhcm5pbmciDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQojIyMjIExhbmd1YWdlcyBjYW4gYmUgZGlmZmljdWx0IHRvIGxlYXJuLCB0aG91Z2ggaW5mYW50cyBhbmQgY2hpbGRyZW4gc2VlbSB0byBkbyBzbyBlYXNpbHkgKENJVEUpLiBUaGlzIHByb2plY3QgdW5jb3ZlcnMgaG93IGxhbmd1YWdlIGxlYXJuaW5nIG1heSBvY2N1ciBpbiBhZHVsdHMgYW5kIHdoYXQgc3RyYXRlZ3kgYWlkcyBpbXByb3ZlbWVudCBpbiBpZGVudGlmeWluZyBzcGVlY2ggc291bmRzLCBhIGNydWNpYWwgcGFydCBvZiBsZWFybmluZyBhIGxhbmd1YWdlLiANCg0KIyMjIyBJbiB0aGlzIGRhdGFzZXQsIHBhcnRpY2lwYW50cyBsZWFybmVkIHRvIGRpc3Rpbmd1aXNoIHR3byBhdWRpdG9yeSBjYXRlZ29yaWVzLiBUaGVzZSBjYXRlZ29yaWVzIHdlcmUgc291bmRzIHRoYXQgd2VyZSBjcmVhdGVkIGJ5IGNvbWJpbmluZyB0d28gZnJlcXVlbmNpZXMgdG9nZXRoZXIgKHNpbWlsYXIgdG8gYSB0d28tbm90ZS1jaG9yZCkuIA0KDQpgYGB7ciwgZWNobyA9IGZhbHNlfQ0Kcm0obGlzdD1scygpKQ0KDQpteV9wYWNrYWdlcyA8LSBjKCJ0aWR5dmVyc2UiLCJsbWU0IikgIyBTcGVjaWZ5IHlvdXIgcGFja2FnZXMNCmxhcHBseShteV9wYWNrYWdlcywgcmVxdWlyZSwgY2hhcmFjdGVyLm9ubHkgPSBUUlVFKSANCg0KbGVhcm5pbmdkYXRhIDwtIHJlYWQuY3N2KCdDOlxcVXNlcnNcXHNhbWFuXFxEZXNrdG9wXFxsZWFybmluZ2NhdGVnb3JpZXMuY3N2JykNCmBgYA0KDQpgYGAge3IgbG9hZCBkYXRhfSANCmhlYWQobGVhcm5pbmdkYXRhKQ0KYGBgDQoNCiMjIyMgRGF0YXNldCBpbmNsdWRlczogDQoNCiogUGFydGljaXBhbnQuUHJpdmF0ZS5JRDogMTYyIHBhcnRpY2lwYW50IElEcw0KKiBUcmlhbC5OdW1iZXI6IDM4NCB0cmlhbHMgcGVyIHBhcnRpY2lwYW50DQoqIEJsb2NrOiAxMiBibG9ja3MgcGVyIHBhcnRpY2lwYW50ICgzMiB0cmlhbHMgcGVyIGJsb2NrKQ0KKiB0MWJrOiB0b25lIDEgaW4gYmFyayAoYW4gYWx0ZXJuYXRpdmUgdW5pdCB0byBIejsgYmV0dGVyIHJlZmxlY3RpdmUgb2YgaHVtYW4gaGVhcmluZykNCiogdDJiazogdG9uZSAyIGluIGJhcmsgKGFuIGFsdGVybmF0aXZlIHVuaXQgdG8gSHo7IGJldHRlciByZWZsZWN0aXZlIG9mIGh1bWFuIGhlYXJpbmcpDQoqIE1hdGNoOiB3aGV0aGVyIGxpc3RlbmVycyBoZWFyZCBNYXRjaGluZyBjYXRlZ29yaWVzIG9yIE1pc21hdGNoaW5nIGNhdGVnb3JpZXMNCiogUmVzcG9uc2U6IHRoZSBjYXRlZ29yeSBsYWJlbCBhc3NpZ25lZCB0byBlYWNoIHN0aW11bHVzIChub3QgbGlzdGVkKTsgZiBvciBqDQoqIENvcnJlY3Q6IHdoZXRoZXIgcmVzcG9uc2Ugd2FzIENvcnJlY3QNCg0KIyMjIyBGaXJzdCwgSSB3YW50IHRvIGtub3cgd2hldGhlciBwYXJ0aWNpcGFudHMgZGlkIGxlYXJuIHRoZSBjYXRlZ29yaWVzLiBUaHVzLCBJIGNvbXBhcmVkIGFjY3VyYWN5IGZyb20gdGhlIGZpcnN0IGJsb2NrIHRvIHRoZSBsYXN0IGJsb2NrLg0KDQpgYGAge3IgRGlkIHBhcnRpY2lwYW50cyBsZWFybj99DQojIGdldCBhY2N1cmFjeSBhdmVyYWdlZCBhY3Jvc3MgYmxvY2sgZm9yIGVhY2ggcGFydGljaXBhbnQNCnN1YmFjY3VyYWN5IDwtIGFnZ3JlZ2F0ZShDb3JyZWN0IH4gQmxvY2sgKyBQYXJ0aWNpcGFudC5Qcml2YXRlLklELCBkYXRhID0gbGVhcm5pbmdkYXRhLCBGVU4gPSBtZWFuLCBuYS5ybT1UUlVFKQ0KIyB3ZSBvbmx5IHdhbnQgdG8gbG9vayBhdCB0aGUgZmlyc3QgYW5kIGxhc3QgYmxvY2sNCnN1YmFjY3VyYWN5IDwtIHN1YmFjY3VyYWN5ICU+JSBtdXRhdGUoQmxvY2sgPSByZXBsYWNlKEJsb2NrLCBCbG9jayA9PSAiMSIsICJzdGFydCIpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsb2NrID0gcmVwbGFjZShCbG9jaywgQmxvY2sgPT0gIjEyIiwgImVuZCIpKQ0KIyBwbG90IGFjY3VyYWN5IGZvciBmaXJzdCBhbmQgbGFzdCBibG9jaw0Kc3ViYWNjdXJhY3kgJT4lDQogZmlsdGVyKEJsb2NrICVpbiUgYygic3RhcnQiLCAiZW5kIikpICU+JQ0KIGdncGxvdCgpICsNCiBhZXMoeCA9IEJsb2NrLCB5ID0gQ29ycmVjdCkgKw0KIGdlb21fYm94cGxvdChmaWxsID0gIiMxMTI0NDYiKSArDQogdGhlbWVfbWluaW1hbCgpDQpgYGANCmBgYCB7ciB0IHRlc3QgdG8gY29tcGFyZSBtZWFucyBhY3Jvc3Mgc3ViamVjdHN9DQp0LnRlc3Qoc3ViYWNjdXJhY3kkQ29ycmVjdFtzdWJhY2N1cmFjeSRCbG9jayA9PSAic3RhcnQiXSwgc3ViYWNjdXJhY3kkQ29ycmVjdFtzdWJhY2N1cmFjeSRCbG9jayA9PSAiZW5kIl0pDQpgYGANCiMjIyMgR3JlYXQhIE9uIGF2ZXJhZ2UsIGV2ZXJ5b25lIGltcHJvdmVkIGZyb20gdGhlIGZpcnN0IGJsb2NrIHRvIHRoZSBsYXN0IGJsb2NrLiBCdXQgZGlkIGV2ZXJ5b25lIGltcHJvdmU/IExldCdzIGNhbGN1bGF0ZSBhIGRpZmZlcmVuY2Ugc2NvcmUgYmV0d2VlbiB0aGUgZmlyc3QgYW5kIGxhc3QgYmxvY2sgdG8gZmluZCBvdXQuIA0KDQpgYGAge3IgRGlkIGV2ZXJ5b25lIGxlYXJuP30NCmRpZmZkYXRhIDwtIHNwcmVhZChzdWJhY2N1cmFjeSxCbG9jayxDb3JyZWN0KQ0KZGlmZmRhdGEkZGlmZnNjb3JlIDwtIGRpZmZkYXRhJGVuZCAtIGRpZmZkYXRhJHN0YXJ0ICMgZm9yIGVhY2ggc3ViamVjdCwgc3VidHJhY3QgYmxvY2sgMTIgZnJvbSBibG9jayAxDQoNCmhpc3QoZGlmZmRhdGEkZGlmZnNjb3JlKQ0KYGBgDQoNCiMjIyMgTm90IGV2ZXJ5b25lIGltcHJvdmVkISBTb21lIGltcHJvdmVkIGJldHdlZW4gdGhlIGZpcnN0IGFuZCBsYXN0IGJsb2NrIChkaWZmZXJlbmNlIHNjb3JlID4gMCkgd2hpbGUgb3RoZXJzIGRpZCBub3QgKGRpZmZlcmVuY2Ugc2NvcmUgPD0gMCkuIA0KDQojIyMjIEhvdyBtYW55IHBhcnRpY2lwYW50cyBpbXByb3ZlZD8gDQoNCmBgYCB7ciBIb3cgbWFueSBwYXJ0aWNpcGFudHMgaW1wcm92ZWQ/fQ0KaW1wcm92ZW1lbnQgPC0gZGlmZmRhdGEkUGFydGljaXBhbnQuUHJpdmF0ZS5JRFt3aGljaChkaWZmZGF0YSRkaWZmc2NvcmU+MCldDQpub2ltcHJvdmVtZW50IDwtIGRpZmZkYXRhJFBhcnRpY2lwYW50LlByaXZhdGUuSURbd2hpY2goZGlmZmRhdGEkZGlmZnNjb3JlPD0wKV0NCg0KcHJpbnQocGFzdGUobGVuZ3RoKGltcHJvdmVtZW50KSwgJyBwYXJ0aWNpcGFudHMgaW1wcm92ZWQgd2hpbGUgJyxwYXN0ZShsZW5ndGgobm9pbXByb3ZlbWVudCkpLCAnIHBhcnRpY2lwYW50cyBkaWQgbm90IGltcHJvdmUuJyApKQ0KYGBgDQoNCiMjIyMgV2h5IGRpZCBzb21lIHBhcnRpY2lwYW50cyBpbXByb3ZlIHdoaWxlIG90aGVycyBkaWRuJ3Q/IA0KDQojIyMjIFBhcnRpY2lwYW50cyB3aG8gaW1wcm92ZWQgbXVzdCB1c2UgcGl0Y2ggZGlmZmVyZW5jZXMgdG8gY2F0ZWdvcml6ZSBzb3VuZHMuIElkZWFsbHksIHRoZXknZCByZWNvZ25pemUgYW5kIG1hdGNoIHRoZSBwaXRjaCB0byBpdHMgY2F0ZWdvcnkuIA0KDQojIyMjIEhvd2V2ZXIsIGEgc2ltcGxlciBhcHByb2FjaCBtaWdodCBiZSB0byB1c2Ugc2ltaWxhcml0eSBqdWRnbWVudHM6IGNhdGVnb3JpemluZyBiYXNlZCBvbiB3aGV0aGVyIHRoZSBjdXJyZW50IHNvdW5kIGlzIHNpbWlsYXIgb3IgZGlzc2ltaWxhciB0byB0aGUgcHJldmlvdXMgb25lLg0KDQojIyMjIEkgbWVhc3VyZWQgc2ltaWxhcml0eSBieSBjb21wYXJpbmcgc291bmQgZnJlcXVlbmNpZXMgYmV0d2VlbiB0cmlhbHMgYW5kIG5vdGUgaWYgcGFydGljaXBhbnRzIG1haW50YWluZWQgb3Igc3dpdGNoZWQgY2F0ZWdvcnkgbGFiZWxzLiBUaGlzIGluZm9ybWF0aW9uIGNhbiBiZSB1c2VkIHRvIHByZWRpY3Qgd2hldGhlciBwYXJ0aWNpcGFudHMgaW1wcm92ZWQgb3Igbm90IGluIGEgbG9naXN0aWMgcmVncmVzc2lvbi4NCmBgYCB7ciBkaWQgcGFydGljaXBhbnRzIHVzZSBzaW1pbGFyaXR5IGp1ZGdtZW50cz8gfQ0KbGVhcm5pbmdkYXRhIDwtIGxlYXJuaW5nZGF0YSAlPiUgDQogIGdyb3VwX2J5KFBhcnRpY2lwYW50LlByaXZhdGUuSUQpICU+JSAjIGZvciBlYWNoIHN1YmplY3QNCiAgbXV0YXRlKGRpc3QgPSBjKE5BLCBzcXJ0KGRpZmYodDFiayleMiArIGRpZmYodDJiayleMikpLCAjIGNhbGN1bGF0ZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBwcmV2aW91cyBhbmQgY3VycmVudCBzb3VuZCwgbGVhdmluZyB0aGUgZmlyc3Qgb25lIG91dA0KICAgICAgICAgcmVzcGNoYW5nZSA9IGFzLmludGVnZXIoUmVzcG9uc2UgIT0gbGFnKFJlc3BvbnNlLCBkZWZhdWx0ID0gZmlyc3QoUmVzcG9uc2UpKSkpDQpsZWFybmluZ2RhdGEgPC0gbGVhcm5pbmdkYXRhWy13aGljaChsZWFybmluZ2RhdGEkVHJpYWwuTnVtYmVyID09IDEpLF0gIyBzaW5jZSB0aGUgZmlyc3QgdHJpYWwgZG9lc24ndCBoYXZlIGEgcHJldmlvdXMgc291bmQsIGxldCdzIHJlbW92ZSB0aGF0IGZyb20gYW5hbHlzaXMgDQoNCmxlYXJuaW5nZGF0YSRkaXN0X2NlbnQgPC0gbGVhcm5pbmdkYXRhJGRpc3QgLSBtZWFuKGxlYXJuaW5nZGF0YSRkaXN0KSAjIHN0YW5kYXJkaXplIGRpc3RhbmNlIGJldHdlZW4gc291bmRzDQpsZWFybmluZ2RhdGEkQ0NfcmVzcGNoYW5nZSA8LSBsZWFybmluZ2RhdGEkcmVzcGNoYW5nZSAtIC41ICMgY29kaWZ5IHdoZXRoZXIgbGVhcm5lcnMgY2hhbmdlZCByZXNwb25zZQ0KbGVhcm5pbmdkYXRhJGRpc3RfY2huZyA8LSBsZWFybmluZ2RhdGEkZGlzdF9jZW50KmxlYXJuaW5nZGF0YSRDQ19yZXNwY2hhbmdlICMgY29kaWZ5IHdoZXRoZXIgbGVhcm5lcnMgY2hhbmdlZCByZXNwb25zZSBhcyBhIGZ1bmN0aW9uIG9mIGhlYXJpbmcgZGlmZmVyZW5jZXMgYmV0d2VlbiBzb3VuZHMgDQoNCnN1Ymx2bGRhdGEgPC0gYWdncmVnYXRlKGNiaW5kKGRpc3RfY2VudCwgQ0NfcmVzcGNoYW5nZSwgZGlzdF9jaG5nKSB+IFBhcnRpY2lwYW50LlByaXZhdGUuSUQsIGRhdGEgPSBsZWFybmluZ2RhdGFbd2hpY2gobGVhcm5pbmdkYXRhJEJsb2NrID09IDEyKSxdLCBGVU4gPSBtZWFuLCBuYS5ybSA9IFRSVUUpDQoNCnN1Ymx2bGRhdGEkbGVhcm5lZCA8LSAiaW1wcm92ZWQiDQpzdWJsdmxkYXRhJGxlYXJuZWRbc3VibHZsZGF0YSRQYXJ0aWNpcGFudC5Qcml2YXRlLklEICVpbiUgbm9pbXByb3ZlbWVudF0gPC0gIm5vIGltcHJvdmVtZW50Ig0Kc3VibHZsZGF0YSRiaW5fbGVhcm5lZCA8LSAxDQpzdWJsdmxkYXRhJGJpbl9sZWFybmVkW3N1Ymx2bGRhdGEkUGFydGljaXBhbnQuUHJpdmF0ZS5JRCAlaW4lIG5vaW1wcm92ZW1lbnRdIDwtIDANCg0KaW1wcm92ZW1vZGVsIDwtIGdsbShiaW5fbGVhcm5lZCB+IGRpc3RfY2VudCtDQ19yZXNwY2hhbmdlK2Rpc3RfY2huZywgZGF0YSA9IHN1Ymx2bGRhdGEpDQpzdW1tYXJ5KGltcHJvdmVtb2RlbCkNCg0KYGBgDQoNCmBgYCB7ciBwbG90IGltcHJvdmVkIHZzIG5vIGltcHJvdmVtZW50IH0NCg0KZ2dwbG90KHN1Ymx2bGRhdGEpICsNCiBhZXMoeCA9IGxlYXJuZWQsIHkgPSBkaXN0X2NobmcpICsNCiBnZW9tX2JveHBsb3QoZmlsbCA9ICIjMTEyNDQ2IikgKw0KIHRoZW1lX21pbmltYWwoKQ0KDQpgYGANCiMjIyMgUGVvcGxlIGltcHJvdmVkIHdoZW4gdGhleSBmb2N1c2VkIG9uIGhvdyBzaW1pbGFyIG9yIGRpZmZlcmVudCB0aGUgc291bmRzIHdlcmUuIFdoZW4gc291bmRzIHdlcmUgZGlmZmVyZW50LCBsZWFybmVycyBjaGFuZ2VkIHRoZWlyIHJlc3BvbnNlOyB3aGVuIHNvdW5kcyB3ZXJlIHNpbWlsYXIsIGxlYXJuZXJzIGtlcHQgdGhlIHNhbWUgcmVzcG9uc2UuIFRob3NlIHdobyBpbXByb3ZlZCB1c2VkIHRoaXMgc3RyYXRlZ3kgbW9yZSB0aGFuIHRob3NlIHdobyBkaWRuJ3QuDQoNCiMjIyMgVGhvdWdoIHRoaXMgbWF5IHNlZW0gb2J2aW91cywgdGhpcyBnaXZlcyBpbnNpZ2h0IGludG8gc3RyYXRlZ2llcyBvZiBsYW5ndWFnZSBsZWFybmluZy4gTGVhcm5pbmcgYSBuZXcgbGFuZ3VhZ2UgZGVwZW5kcyBvbiBoZWFyaW5nIGRpZmZlcmVuY2VzIGJldHdlZW4gc291bmRzLiBJZiB3ZSBjYW4gaGVscCBwZW9wbGUgaGVhciB0aGVzZSBkaWZmZXJlbmNlcyBtb3JlIGNsZWFybHkgYW5kIGNvbnNpc3RlbnRseSwgdGhleSBjYW4gbGVhcm4gbGFuZ3VhZ2VzIGZhc3Rlci4NCg0KIyMjIyBXaGF0IGlmIGxpc3RlbmVycyB3ZXJlIGdpdmVuIHByaW9yIGV4cG9zdXJlIHRvIHRoZSBsYW5ndWFnZT8gV291bGQgdGhhdCBiZSB1c2VmdWwgaW4gaW1wcm92aW5nIGxhbmd1YWdlIGxlYXJuaW5nPyBUbyB0ZXN0IHRoaXMsIEkgYXNzZXNzIHdoZXRoZXIgbGlzdGVuZXJzIGhlYXJpbmcgc291bmRzIHRoYXQgbWF0Y2ggdGhlIGNhdGVnb3JpZXMgd2lsbCBpbXByb3ZlIGxlYXJuaW5nLiBIYWxmIG9mIHBhcnRpY2lwYW50cyBoZWFyZCBtYXRjaGluZyBjYXRlZ29yaWVzIHdoaWxlIHRoZSBvdGhlciBoYWxmIGhlYXJkIHNpbWlsYXIgc291bmRzLCBidXQgbWlzbWF0Y2hpbmcgY2F0ZWdvcmllcy4NCg0KYGBge3IgbWF0Y2hpbmcgY2F0ZWdvcmllc30NCg0KbWF0Y2hpbmZvIDwtIHVuaXF1ZShsZWFybmluZ2RhdGFbLGMoIlBhcnRpY2lwYW50LlByaXZhdGUuSUQiLCJNYXRjaCIpXSkNCnN1Ymx2bGRhdGEgPC0gbWVyZ2Uoc3VibHZsZGF0YSxtYXRjaGluZm8pDQoNCmdncGxvdChzdWJsdmxkYXRhKSArDQogYWVzKHggPSBsZWFybmVkKSArDQogZ2VvbV9iYXIoZmlsbCA9ICIjMTEyNDQ2IikgKw0KIHRoZW1lX21pbmltYWwoKSArDQogZmFjZXRfd3JhcCh2YXJzKE1hdGNoKSkNCmBgYA0KYGBge3IgfQ0KcHJpbnQocGFzdGUoJ1dpdGhpbiB0aG9zZSB3aG8gaGVhcmQgbWF0Y2hpbmcgY2F0ZWdvcmllcywnICwgcm91bmQobGVuZ3RoKHdoaWNoKHN1Ymx2bGRhdGEkTWF0Y2ggPT0gIk1hdGNoIiAmIHN1Ymx2bGRhdGEkYmluX2xlYXJuZWQgPT0gMSkpL2xlbmd0aCh3aGljaChzdWJsdmxkYXRhJE1hdGNoID09ICJNYXRjaCIpKSoxMDAsMiksICclIG9mIHBhcnRpY2lwYW50cyBpbXByb3ZlZCB3aGlsZSAnLCByb3VuZChsZW5ndGgod2hpY2goc3VibHZsZGF0YSRNYXRjaCA9PSAiTWlzbWF0Y2giICYgc3VibHZsZGF0YSRiaW5fbGVhcm5lZCA9PSAxKSkvbGVuZ3RoKHdoaWNoKHN1Ymx2bGRhdGEkTWF0Y2ggPT0gIk1pc21hdGNoIikpKjEwMCwyKSwnJSBvZiBwYXJ0aWNpcGFudHMgd2hvIGhlYXJkIG1pc21hdGNoaW5nIGNhdGVnb3JpZXMgaW1wcm92ZWQuJykpDQpgYGANCg0KYGBge3IgZG9lcyBhZGRpbmcgdGhpcyBpbmZvIGltcHJvdmUgdGhlIG1vZGVsP30NCg0Kc3VibHZsZGF0YSRDQ19NYXRjaCA8LSAoc3VibHZsZGF0YSRNYXRjaCA9PSAiTWF0Y2giKSAtIC41DQoNCmltcHJvdmVtb2RlbDIgPC0gZ2xtKGJpbl9sZWFybmVkIH4gZGlzdF9jZW50K0NDX3Jlc3BjaGFuZ2UrZGlzdF9jaG5nK0NDX01hdGNoLCBkYXRhID0gc3VibHZsZGF0YSkNCnN1bW1hcnkoaW1wcm92ZW1vZGVsMikNCmBgYA0KDQojIyMjIFRoZXNlIGRpZmZlcmVuY2VzIGJldHdlZW4gcGFydGljaXBhbnRzIHdlcmUgbm90IHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQ7IGhlYXJpbmcgbWF0Y2hpbmcgb3IgbWlzbWF0Y2hpbmcgY2F0ZWdvcmllcyBkb2VzIG5vdCBwcmVkaWN0IHdoZXRoZXIgcGFydGljaXBhbnRzIGltcHJvdmVkIGluIHRoZSB0YXNrLiBUaGUgbWFqb3JpdHkgb2YgbGVhcm5pbmcgc3RpbGwgY2FtZSBmcm9tIGFjdGl2ZWx5IGxlYXJuaW5nIGxhYmVscyBmb3Igc291bmQgY2F0ZWdvcmllcy4NCg0KIyMjIyBUaG91Z2ggZmFtaWxpYXJpemluZyB3aXRoIHRoZSBzb3VuZCBjYXRlZ29yaWVzIG1heSBub3QgYmUgYSB2aWFibGUgc3RyYXRlZ3kgdG8gaW1wcm92ZSBsYW5ndWFnZSBsZWFybmluZywgdGhpcyBpcyBlbmNvdXJhZ2luZyB0byBrbm93IHRoYXQgaXQgbWF5IG5vdCBtYXR0ZXIgd2hhdCBsaXN0ZW5lcnMgaGVhciBiZWZvcmUgbGVhcm5pbmcuIExlYXJuZXJzIGNhbiBzdGlsbCBsZWFybiBhIGxhbmd1YWdlIGV2ZW4gaWYgdGhleSBoZWFyZCB0aGUgd3JvbmcgY2F0ZWdvcmllcyB0byBzdGFydC4gTGVhcm5lcnMgY2FuIHN0aWxsIGxlYXJuIGEgbGFuZ3VhZ2UgcmVnYXJkbGVzcyBvZiB3aGF0IGxhbmd1YWdlcyB0aGV5IGFscmVhZHkga25vdy4=