D.J. Copland

12/18/2025

What has happened to the Cockney dialect? This has been a question asked numerous times by British linguists since the start of the 21st Century. Like many variants of British English, the so-called “Cockney” dialect, traditionally spoken by the inhabitants of London’s East End and immortalized in popular culture by works such as the film musical My Fair Lady, has been subject to significant change since the end of World War 2. Much of this change has been attributed to demographic changes in East London, and particularly to an influx of immigrants to the area in the latter half of the 20th Century.

But is this something we can actually visualize? In fact, yes! A database of recorded speech called the SPADE corpus contains an entire set of speech samples from East Londonders, sorted by age. In this dataset, speakers with a birth year between 1914 and 1943 are categorized as “old” speakers, and those with a birth year between 1985 and 1987 as “young” speakers. We can visualize this data using a vowel chart, which maps the various speech sounds within a speaker’s accent according to their formant frequencies. Simply put, formants are harmonic frequencies within a speech signal that can be used to measure differences between vowel sounds. Points on the chart will be labeled with their corresponding vowel symbol from the IPA, or International Phonetic Alphabet. This will let us see whether the vowel set of East London dialects really has changed over time. Let’s take a look:

library(tidyverse)
library(phonR)
library(Fonology)
library(readr)

spade_oldyoung <- read_csv("~/Montclair/Grad/Fall2025/Quantitative Linguistics/Final project/Cockney Datasets/spade_oldyoung.csv")

spade_oldyoung %>% 
group_by(age_group, ipa) %>% 
summarise(across(c(F1, F2), .fns = mean))  %>% 
  ggplot(aes(x = F2, y = F1, 
             color = age_group, label = ipa))+
  geom_text() + 
  formants() +
  theme(legend.position = "none",
        text = element_text(size = 13)) +
  labs(x = "F2", y = "F1", 
       color = "Age Group", 
       title = "SPADE East London: Old vs. Young Cockneys") +
  theme_classic()

Interesting! There does certainly seem to have been some change in the vowel space. In general, you can see that many of the younger speakers’ vowels seem to have been pulled inward toward the center and down from their older counterparts. One interesting exception to that trend seems to be the /eɪ/ diphthong, as heard in the word “play.” In traditional Cockney, that vowel actually sounds closer to the /aɪ/ sound (as in “pie) in American English, but younger speakers seem to have reverted to a version much closer to the higher and more fronted /e/ vowel, as in the word”pet.”

Cockney Elsewhere?

You may now be thinking, “was this dialect really only spoken in a couple neighborhoods in East London?” As a matter of fact, a 2019 study by Cole & Strycharczuk found what they claimed was a community of Cockney dialect speakers in an area called the Debden Estate within the borough of Loughton, which lies just northeast of the Greater London border. Though the study claims that the dialect there is very close to the older version of Cockney, it unfortunately doesn’t provide any data from East London speakers for comparison… But since we have both datasets, that means we can do the comparison ourselves!

This time, let’s use the geom_mark_hull function from the ggforce package, which will let us see the entire vowel space of each variant as a solid shape so it will be easier to see how the spaces overlap. Let’s also split the East Londoners into Inner East London and Outer East London, since the accents in each area are also slightly different.

library(ggforce)

cockneydata_QL %>% 
  group_by(ipa, InnerOuter) %>% 
  summarize(meanF1 = mean(F1), meanF2 = mean(F2)) %>% 
  ggplot(aes(x = meanF2, y = meanF1, color = InnerOuter))+
  geom_text(aes(label = ipa))+
  ggforce::geom_mark_hull(aes(fill = InnerOuter))+
  formants() +
  guides(fill="none") +
  labs(x = "F2", y = "F1", 
       color = "Region", 
       title = "Cockney Formants By Region") 

Whoops! I expected the vowel spaces to be different, but not this different. It’s actually kind of hard to compare them when they’re this offset from each other. It looks like we’ll need to normalize these formant values first, so they’re easier to compare. Let’s see how this looks when Debden is normalized with the other regions.

normcockney_QL %>% 
  group_by(ipa, InnerOuter) %>% 
  summarize(meanF1 = mean(F1), meanF2 = mean(F2)) %>% 
  ggplot(aes(x = meanF2, y = meanF1, color = InnerOuter))+
  geom_text(aes(label = ipa))+
  ggforce::geom_mark_hull(aes(fill = InnerOuter))+
  formants() +
  guides(fill="none") +
  labs(x = "F2", y = "F1", 
       color = "Region") 

Huh. Well, it looks a little closer now, but the Debden vowel space is still pretty different-looking from the other ones. There might be some other factor that accounts for the difference here, or else it seems like Cole & Strycharczuk might need to get their ears checked.

Testing Other Variables

Let’s take a closer look at our data. I can reframe our combined dataset to show just the demographic information for each speaker, then make a table that tallies the number of speakers per demographic. Let’s start by looking at the makeup of each region by age group and see if there are any discrepancies there.

It looks like the East London dataset had a way larger proportion of young speakers than the Debden dataset! That could certainly account for the difference we’re seeing. Maybe that means Debden really is closer to an older variant of Cockney after all, and the younger speakers in East London are skewing the data.

With that in mind, let’s try this again, but this time comparing only the older speakers from each region:

normcockney_QL %>% 
  filter(age_group != "Young") %>% 
  group_by(ipa, InnerOuter) %>% 
  summarize(meanF1 = mean(F1), meanF2 = mean(F2)) %>% 
  ggplot(aes(x = meanF2, y = meanF1, color = InnerOuter))+
  geom_text(aes(label = ipa))+
  ggforce::geom_mark_hull(aes(fill = InnerOuter))+
  formants() +
  guides(fill="none") +
  labs(x = "F2", y = "F1", 
       color = "Region", title = "Cockney Formants By Region: Older Speakers")

That certainly seems to have been part of the issue, but there’s still a discrepancy here. Let’s try faceting this plot by male and female speakers.

normcockney_QL %>% 
  filter(age_group != "Young") %>% 
  group_by(ipa, InnerOuter, sex) %>% 
  summarize(meanF1 = mean(F1), meanF2 = mean(F2)) %>% 
  ggplot(aes(x = meanF2, y = meanF1, color = InnerOuter))+
  geom_text(aes(label = ipa))+
  ggforce::geom_mark_hull(aes(fill = InnerOuter))+
  formants() +
  guides(fill="none") +
  labs(x = "F2", y = "F1", 
       color = "Region", title = "Cockney Formants By Region: Older Speakers") +
  facet_wrap(~sex)

Well, there’s a surprise! It looks like it was the female East Londoners who were the real difference here all along. Apparently the older women in East London have moved with the times and started speaking a dialect much closer to what the youth are speaking by pulling their vowel space inward and down. In contrast, the Debden folks, regardless of age or gender, seem to have actually stuck much closer to the much wider vowel space of old-fashioned Cockney– and maybe even widened it a little further in some places. Of course, the SPADE dataset is from a pretty small sample size, so we should probably take the results here with a grain of salt– particularly regarding the female speakers. But regardless, it does indeed seem like Debden might be your best bet if you want to hear a 20th-Century Cockney accent.

LS0tDQp0aXRsZTogIlRyYWNraW5nIHRoZSBDb2NrbmV5IEFjY2VudCBBY3Jvc3MgVGltZSBhbmQgU3BhY2UiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCmxpbmstY2l0YXRpb25zOiBUUlVFDQpjb2RlX2ZvbGRpbmc6IGhpZGUNCi0tLQ0KDQojIyMjICpELkouIENvcGxhbmQqDQoNCiMjIyMgKjEyLzE4LzIwMjUqDQoNCldoYXQgaGFzIGhhcHBlbmVkIHRvIHRoZSBDb2NrbmV5IGRpYWxlY3Q/IFRoaXMgaGFzIGJlZW4gYSBxdWVzdGlvbiBhc2tlZCBudW1lcm91cyB0aW1lcyBieSBCcml0aXNoIGxpbmd1aXN0cyBzaW5jZSB0aGUgc3RhcnQgb2YgdGhlIDIxc3QgQ2VudHVyeS4gTGlrZSBtYW55IHZhcmlhbnRzIG9mIEJyaXRpc2ggRW5nbGlzaCwgdGhlIHNvLWNhbGxlZCAiQ29ja25leSIgZGlhbGVjdCwgdHJhZGl0aW9uYWxseSBzcG9rZW4gYnkgdGhlIGluaGFiaXRhbnRzIG9mIExvbmRvbidzIEVhc3QgRW5kIGFuZCBpbW1vcnRhbGl6ZWQgaW4gcG9wdWxhciBjdWx0dXJlIGJ5IHdvcmtzIHN1Y2ggYXMgdGhlIGZpbG0gbXVzaWNhbCAqTXkgRmFpciBMYWR5KiwgaGFzIGJlZW4gc3ViamVjdCB0byBzaWduaWZpY2FudCBjaGFuZ2Ugc2luY2UgdGhlIGVuZCBvZiBXb3JsZCBXYXIgMi4gTXVjaCBvZiB0aGlzIGNoYW5nZSBoYXMgYmVlbiBhdHRyaWJ1dGVkIHRvIGRlbW9ncmFwaGljIGNoYW5nZXMgaW4gRWFzdCBMb25kb24sIGFuZCBwYXJ0aWN1bGFybHkgdG8gYW4gaW5mbHV4IG9mIGltbWlncmFudHMgdG8gdGhlIGFyZWEgaW4gdGhlIGxhdHRlciBoYWxmIG9mIHRoZSAyMHRoIENlbnR1cnkuDQoNCkJ1dCBpcyB0aGlzIHNvbWV0aGluZyB3ZSBjYW4gYWN0dWFsbHkgdmlzdWFsaXplPyBJbiBmYWN0LCB5ZXMhIEEgZGF0YWJhc2Ugb2YgcmVjb3JkZWQgc3BlZWNoIGNhbGxlZCB0aGUgU1BBREUgY29ycHVzIGNvbnRhaW5zIGFuIGVudGlyZSBzZXQgb2Ygc3BlZWNoIHNhbXBsZXMgZnJvbSBFYXN0IExvbmRvbmRlcnMsIHNvcnRlZCBieSBhZ2UuIEluIHRoaXMgZGF0YXNldCwgc3BlYWtlcnMgd2l0aCBhIGJpcnRoIHllYXIgYmV0d2VlbiAxOTE0IGFuZCAxOTQzIGFyZSBjYXRlZ29yaXplZCBhcyAib2xkIiBzcGVha2VycywgYW5kIHRob3NlIHdpdGggYSBiaXJ0aCB5ZWFyIGJldHdlZW4gMTk4NSBhbmQgMTk4NyBhcyAieW91bmciIHNwZWFrZXJzLiBXZSBjYW4gdmlzdWFsaXplIHRoaXMgZGF0YSB1c2luZyBhIHZvd2VsIGNoYXJ0LCB3aGljaCBtYXBzIHRoZSB2YXJpb3VzIHNwZWVjaCBzb3VuZHMgd2l0aGluIGEgc3BlYWtlcidzIGFjY2VudCBhY2NvcmRpbmcgdG8gdGhlaXIgKmZvcm1hbnQgZnJlcXVlbmNpZXMqLiBTaW1wbHkgcHV0LCBmb3JtYW50cyBhcmUgaGFybW9uaWMgZnJlcXVlbmNpZXMgd2l0aGluIGEgc3BlZWNoIHNpZ25hbCB0aGF0IGNhbiBiZSB1c2VkIHRvIG1lYXN1cmUgZGlmZmVyZW5jZXMgYmV0d2VlbiB2b3dlbCBzb3VuZHMuIFBvaW50cyBvbiB0aGUgY2hhcnQgd2lsbCBiZSBsYWJlbGVkIHdpdGggdGhlaXIgY29ycmVzcG9uZGluZyB2b3dlbCBzeW1ib2wgZnJvbSB0aGUgSVBBLCBvciBJbnRlcm5hdGlvbmFsIFBob25ldGljIEFscGhhYmV0LiBUaGlzIHdpbGwgbGV0IHVzIHNlZSB3aGV0aGVyIHRoZSB2b3dlbCBzZXQgb2YgRWFzdCBMb25kb24gZGlhbGVjdHMgcmVhbGx5IGhhcyBjaGFuZ2VkIG92ZXIgdGltZS4gTGV0J3MgdGFrZSBhIGxvb2s6DQoNCmBgYHtyfQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KHBob25SKQ0KbGlicmFyeShGb25vbG9neSkNCmxpYnJhcnkocmVhZHIpDQoNCnNwYWRlX29sZHlvdW5nIDwtIHJlYWRfY3N2KCJ+L01vbnRjbGFpci9HcmFkL0ZhbGwyMDI1L1F1YW50aXRhdGl2ZSBMaW5ndWlzdGljcy9GaW5hbCBwcm9qZWN0L0NvY2tuZXkgRGF0YXNldHMvc3BhZGVfb2xkeW91bmcuY3N2IikNCg0Kc3BhZGVfb2xkeW91bmcgJT4lIA0KZ3JvdXBfYnkoYWdlX2dyb3VwLCBpcGEpICU+JSANCnN1bW1hcmlzZShhY3Jvc3MoYyhGMSwgRjIpLCAuZm5zID0gbWVhbikpICAlPiUgDQogIGdncGxvdChhZXMoeCA9IEYyLCB5ID0gRjEsIA0KICAgICAgICAgICAgIGNvbG9yID0gYWdlX2dyb3VwLCBsYWJlbCA9IGlwYSkpKw0KICBnZW9tX3RleHQoKSArIA0KICBmb3JtYW50cygpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMykpICsNCiAgbGFicyh4ID0gIkYyIiwgeSA9ICJGMSIsIA0KICAgICAgIGNvbG9yID0gIkFnZSBHcm91cCIsIA0KICAgICAgIHRpdGxlID0gIlNQQURFIEVhc3QgTG9uZG9uOiBPbGQgdnMuIFlvdW5nIENvY2tuZXlzIikgKw0KICB0aGVtZV9jbGFzc2ljKCkNCmBgYA0KSW50ZXJlc3RpbmchIFRoZXJlIGRvZXMgY2VydGFpbmx5IHNlZW0gdG8gaGF2ZSBiZWVuIHNvbWUgY2hhbmdlIGluIHRoZSB2b3dlbCBzcGFjZS4gSW4gZ2VuZXJhbCwgeW91IGNhbiBzZWUgdGhhdCBtYW55IG9mIHRoZSB5b3VuZ2VyIHNwZWFrZXJzJyB2b3dlbHMgc2VlbSB0byBoYXZlIGJlZW4gcHVsbGVkIGlud2FyZCB0b3dhcmQgdGhlIGNlbnRlciBhbmQgZG93biBmcm9tIHRoZWlyIG9sZGVyIGNvdW50ZXJwYXJ0cy4gT25lIGludGVyZXN0aW5nIGV4Y2VwdGlvbiB0byB0aGF0IHRyZW5kIHNlZW1zIHRvIGJlIHRoZSAvZcmqLyBkaXBodGhvbmcsIGFzIGhlYXJkIGluIHRoZSB3b3JkICJwbGF5LiIgSW4gdHJhZGl0aW9uYWwgQ29ja25leSwgdGhhdCB2b3dlbCBhY3R1YWxseSBzb3VuZHMgY2xvc2VyIHRvIHRoZSAvYcmqLyBzb3VuZCAoYXMgaW4gInBpZSkgaW4gQW1lcmljYW4gRW5nbGlzaCwgYnV0IHlvdW5nZXIgc3BlYWtlcnMgc2VlbSB0byBoYXZlIHJldmVydGVkIHRvIGEgdmVyc2lvbiBtdWNoIGNsb3NlciB0byB0aGUgaGlnaGVyIGFuZCBtb3JlIGZyb250ZWQgL2UvIHZvd2VsLCBhcyBpbiB0aGUgd29yZCAicGV0LiIgIA0KDQojIyBDb2NrbmV5IEVsc2V3aGVyZT8gIA0KDQpZb3UgbWF5IG5vdyBiZSB0aGlua2luZywgIndhcyB0aGlzIGRpYWxlY3QgcmVhbGx5IG9ubHkgc3Bva2VuIGluIGEgY291cGxlIG5laWdoYm9yaG9vZHMgaW4gRWFzdCBMb25kb24/IiBBcyBhIG1hdHRlciBvZiBmYWN0LCBhIDIwMTkgc3R1ZHkgYnkgQ29sZSAmIFN0cnljaGFyY3p1ayBmb3VuZCB3aGF0IHRoZXkgY2xhaW1lZCB3YXMgYSBjb21tdW5pdHkgb2YgQ29ja25leSBkaWFsZWN0IHNwZWFrZXJzIGluIGFuIGFyZWEgY2FsbGVkIHRoZSBEZWJkZW4gRXN0YXRlIHdpdGhpbiB0aGUgYm9yb3VnaCBvZiBMb3VnaHRvbiwgd2hpY2ggbGllcyBqdXN0IG5vcnRoZWFzdCBvZiB0aGUgR3JlYXRlciBMb25kb24gYm9yZGVyLiBUaG91Z2ggdGhlIHN0dWR5IGNsYWltcyB0aGF0IHRoZSBkaWFsZWN0IHRoZXJlIGlzIHZlcnkgY2xvc2UgdG8gdGhlIG9sZGVyIHZlcnNpb24gb2YgQ29ja25leSwgaXQgdW5mb3J0dW5hdGVseSBkb2Vzbid0IHByb3ZpZGUgYW55IGRhdGEgZnJvbSBFYXN0IExvbmRvbiBzcGVha2VycyBmb3IgY29tcGFyaXNvbi4uLiBCdXQgc2luY2Ugd2UgaGF2ZSBib3RoIGRhdGFzZXRzLCB0aGF0IG1lYW5zIHdlIGNhbiBkbyB0aGUgY29tcGFyaXNvbiBvdXJzZWx2ZXMhICANCg0KVGhpcyB0aW1lLCBsZXQncyB1c2UgdGhlIGdlb21fbWFya19odWxsIGZ1bmN0aW9uIGZyb20gdGhlIGdnZm9yY2UgcGFja2FnZSwgd2hpY2ggd2lsbCBsZXQgdXMgc2VlIHRoZSBlbnRpcmUgdm93ZWwgc3BhY2Ugb2YgZWFjaCB2YXJpYW50IGFzIGEgc29saWQgc2hhcGUgc28gaXQgd2lsbCBiZSBlYXNpZXIgdG8gc2VlIGhvdyB0aGUgc3BhY2VzIG92ZXJsYXAuIExldCdzIGFsc28gc3BsaXQgdGhlIEVhc3QgTG9uZG9uZXJzIGludG8gSW5uZXIgRWFzdCBMb25kb24gYW5kIE91dGVyIEVhc3QgTG9uZG9uLCBzaW5jZSB0aGUgYWNjZW50cyBpbiBlYWNoIGFyZWEgYXJlIGFsc28gc2xpZ2h0bHkgZGlmZmVyZW50Lg0KDQpgYGB7cn0NCmxpYnJhcnkoZ2dmb3JjZSkNCg0KY29ja25leWRhdGFfUUwgJT4lIA0KICBncm91cF9ieShpcGEsIElubmVyT3V0ZXIpICU+JSANCiAgc3VtbWFyaXplKG1lYW5GMSA9IG1lYW4oRjEpLCBtZWFuRjIgPSBtZWFuKEYyKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBtZWFuRjIsIHkgPSBtZWFuRjEsIGNvbG9yID0gSW5uZXJPdXRlcikpKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gaXBhKSkrDQogIGdnZm9yY2U6Omdlb21fbWFya19odWxsKGFlcyhmaWxsID0gSW5uZXJPdXRlcikpKw0KICBmb3JtYW50cygpICsNCiAgZ3VpZGVzKGZpbGw9Im5vbmUiKSArDQogIGxhYnMoeCA9ICJGMiIsIHkgPSAiRjEiLCANCiAgICAgICBjb2xvciA9ICJSZWdpb24iLCANCiAgICAgICB0aXRsZSA9ICJDb2NrbmV5IEZvcm1hbnRzIEJ5IFJlZ2lvbiIpIA0KYGBgDQpXaG9vcHMhIEkgZXhwZWN0ZWQgdGhlIHZvd2VsIHNwYWNlcyB0byBiZSBkaWZmZXJlbnQsIGJ1dCBub3QgKnRoaXMqIGRpZmZlcmVudC4gSXQncyBhY3R1YWxseSBraW5kIG9mIGhhcmQgdG8gY29tcGFyZSB0aGVtIHdoZW4gdGhleSdyZSB0aGlzIG9mZnNldCBmcm9tIGVhY2ggb3RoZXIuIEl0IGxvb2tzIGxpa2Ugd2UnbGwgbmVlZCB0byAqbm9ybWFsaXplKiB0aGVzZSBmb3JtYW50IHZhbHVlcyBmaXJzdCwgc28gdGhleSdyZSBlYXNpZXIgdG8gY29tcGFyZS4gTGV0J3Mgc2VlIGhvdyB0aGlzIGxvb2tzIHdoZW4gRGViZGVuIGlzIG5vcm1hbGl6ZWQgd2l0aCB0aGUgb3RoZXIgcmVnaW9ucy4NCg0KYGBge3J9DQpub3JtY29ja25leV9RTCAlPiUgDQogIGdyb3VwX2J5KGlwYSwgSW5uZXJPdXRlcikgJT4lIA0KICBzdW1tYXJpemUobWVhbkYxID0gbWVhbihGMSksIG1lYW5GMiA9IG1lYW4oRjIpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IG1lYW5GMiwgeSA9IG1lYW5GMSwgY29sb3IgPSBJbm5lck91dGVyKSkrDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBpcGEpKSsNCiAgZ2dmb3JjZTo6Z2VvbV9tYXJrX2h1bGwoYWVzKGZpbGwgPSBJbm5lck91dGVyKSkrDQogIGZvcm1hbnRzKCkgKw0KICBndWlkZXMoZmlsbD0ibm9uZSIpICsNCiAgbGFicyh4ID0gIkYyIiwgeSA9ICJGMSIsIA0KICAgICAgIGNvbG9yID0gIlJlZ2lvbiIpIA0KYGBgDQoNCkh1aC4gV2VsbCwgaXQgbG9va3MgYSAqbGl0dGxlKiBjbG9zZXIgbm93LCBidXQgdGhlIERlYmRlbiB2b3dlbCBzcGFjZSBpcyBzdGlsbCBwcmV0dHkgZGlmZmVyZW50LWxvb2tpbmcgZnJvbSB0aGUgb3RoZXIgb25lcy4gVGhlcmUgbWlnaHQgYmUgc29tZSBvdGhlciBmYWN0b3IgdGhhdCBhY2NvdW50cyBmb3IgdGhlIGRpZmZlcmVuY2UgaGVyZSwgb3IgZWxzZSBpdCBzZWVtcyBsaWtlIENvbGUgJiBTdHJ5Y2hhcmN6dWsgbWlnaHQgbmVlZCB0byBnZXQgdGhlaXIgZWFycyBjaGVja2VkLiAgDQoNCg0KIyMgVGVzdGluZyBPdGhlciBWYXJpYWJsZXMNCg0KTGV0J3MgdGFrZSBhIGNsb3NlciBsb29rIGF0IG91ciBkYXRhLiBJIGNhbiByZWZyYW1lIG91ciBjb21iaW5lZCBkYXRhc2V0IHRvIHNob3cganVzdCB0aGUgZGVtb2dyYXBoaWMgaW5mb3JtYXRpb24gZm9yIGVhY2ggc3BlYWtlciwgdGhlbiBtYWtlIGEgdGFibGUgdGhhdCB0YWxsaWVzIHRoZSBudW1iZXIgb2Ygc3BlYWtlcnMgcGVyIGRlbW9ncmFwaGljLiBMZXQncyBzdGFydCBieSBsb29raW5nIGF0IHRoZSBtYWtldXAgb2YgZWFjaCByZWdpb24gYnkgYWdlIGdyb3VwIGFuZCBzZWUgaWYgdGhlcmUgYXJlIGFueSBkaXNjcmVwYW5jaWVzIHRoZXJlLg0KDQpgYGB7cn0NCmNvY2tuZXlfcGVyc3BlYWtlciA8LSBub3JtY29ja25leV9RTCAlPiUgDQogIGdyb3VwX2J5KHNwZWFrZXJfaWQpICU+JSANCiAgcmVmcmFtZShJbm5lck91dGVyLCBzZXgsIGV0aG5pY19iYWNrZ3JvdW5kLCBhZ2VfZ3JvdXApICU+JSANCiAgZGlzdGluY3QoKQ0KDQpwYXJ0X2FnZSA8LSBjb2NrbmV5X3BlcnNwZWFrZXIgJT4lIA0KICBjb3VudChJbm5lck91dGVyLCBhZ2VfZ3JvdXApDQoNCnBhcnRfYWdlDQpgYGANCg0KSXQgbG9va3MgbGlrZSB0aGUgRWFzdCBMb25kb24gZGF0YXNldCBoYWQgYSB3YXkgbGFyZ2VyIHByb3BvcnRpb24gb2YgeW91bmcgc3BlYWtlcnMgdGhhbiB0aGUgRGViZGVuIGRhdGFzZXQhIFRoYXQgY291bGQgY2VydGFpbmx5IGFjY291bnQgZm9yIHRoZSBkaWZmZXJlbmNlIHdlJ3JlIHNlZWluZy4gTWF5YmUgdGhhdCBtZWFucyBEZWJkZW4gcmVhbGx5IGlzIGNsb3NlciB0byBhbiBvbGRlciB2YXJpYW50IG9mIENvY2tuZXkgYWZ0ZXIgYWxsLCBhbmQgdGhlIHlvdW5nZXIgc3BlYWtlcnMgaW4gRWFzdCBMb25kb24gYXJlIHNrZXdpbmcgdGhlIGRhdGEuICANCg0KV2l0aCB0aGF0IGluIG1pbmQsIGxldCdzIHRyeSB0aGlzIGFnYWluLCBidXQgdGhpcyB0aW1lIGNvbXBhcmluZyBvbmx5IHRoZSBvbGRlciBzcGVha2VycyBmcm9tIGVhY2ggcmVnaW9uOg0KDQpgYGB7cn0NCm5vcm1jb2NrbmV5X1FMICU+JSANCiAgZmlsdGVyKGFnZV9ncm91cCAhPSAiWW91bmciKSAlPiUgDQogIGdyb3VwX2J5KGlwYSwgSW5uZXJPdXRlcikgJT4lIA0KICBzdW1tYXJpemUobWVhbkYxID0gbWVhbihGMSksIG1lYW5GMiA9IG1lYW4oRjIpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IG1lYW5GMiwgeSA9IG1lYW5GMSwgY29sb3IgPSBJbm5lck91dGVyKSkrDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBpcGEpKSsNCiAgZ2dmb3JjZTo6Z2VvbV9tYXJrX2h1bGwoYWVzKGZpbGwgPSBJbm5lck91dGVyKSkrDQogIGZvcm1hbnRzKCkgKw0KICBndWlkZXMoZmlsbD0ibm9uZSIpICsNCiAgbGFicyh4ID0gIkYyIiwgeSA9ICJGMSIsIA0KICAgICAgIGNvbG9yID0gIlJlZ2lvbiIsIHRpdGxlID0gIkNvY2tuZXkgRm9ybWFudHMgQnkgUmVnaW9uOiBPbGRlciBTcGVha2VycyIpDQpgYGANCg0KVGhhdCBjZXJ0YWlubHkgc2VlbXMgdG8gaGF2ZSBiZWVuIHBhcnQgb2YgdGhlIGlzc3VlLCBidXQgdGhlcmUncyBzdGlsbCBhIGRpc2NyZXBhbmN5IGhlcmUuIExldCdzIHRyeSAqZmFjZXRpbmcqIHRoaXMgcGxvdCBieSBtYWxlIGFuZCBmZW1hbGUgc3BlYWtlcnMuDQoNCmBgYHtyfQ0Kbm9ybWNvY2tuZXlfUUwgJT4lIA0KICBmaWx0ZXIoYWdlX2dyb3VwICE9ICJZb3VuZyIpICU+JSANCiAgZ3JvdXBfYnkoaXBhLCBJbm5lck91dGVyLCBzZXgpICU+JSANCiAgc3VtbWFyaXplKG1lYW5GMSA9IG1lYW4oRjEpLCBtZWFuRjIgPSBtZWFuKEYyKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBtZWFuRjIsIHkgPSBtZWFuRjEsIGNvbG9yID0gSW5uZXJPdXRlcikpKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gaXBhKSkrDQogIGdnZm9yY2U6Omdlb21fbWFya19odWxsKGFlcyhmaWxsID0gSW5uZXJPdXRlcikpKw0KICBmb3JtYW50cygpICsNCiAgZ3VpZGVzKGZpbGw9Im5vbmUiKSArDQogIGxhYnMoeCA9ICJGMiIsIHkgPSAiRjEiLCANCiAgICAgICBjb2xvciA9ICJSZWdpb24iLCB0aXRsZSA9ICJDb2NrbmV5IEZvcm1hbnRzIEJ5IFJlZ2lvbjogT2xkZXIgU3BlYWtlcnMiKSArDQogIGZhY2V0X3dyYXAofnNleCkNCmBgYA0KV2VsbCwgdGhlcmUncyBhIHN1cnByaXNlISBJdCBsb29rcyBsaWtlIGl0IHdhcyB0aGUgKmZlbWFsZSBFYXN0IExvbmRvbmVycyogd2hvIHdlcmUgdGhlIHJlYWwgZGlmZmVyZW5jZSBoZXJlIGFsbCBhbG9uZy4gQXBwYXJlbnRseSB0aGUgb2xkZXIgd29tZW4gaW4gRWFzdCBMb25kb24gaGF2ZSBtb3ZlZCB3aXRoIHRoZSB0aW1lcyBhbmQgc3RhcnRlZCBzcGVha2luZyBhIGRpYWxlY3QgbXVjaCBjbG9zZXIgdG8gd2hhdCB0aGUgeW91dGggYXJlIHNwZWFraW5nIGJ5IHB1bGxpbmcgdGhlaXIgdm93ZWwgc3BhY2UgaW53YXJkIGFuZCBkb3duLiBJbiBjb250cmFzdCwgdGhlIERlYmRlbiBmb2xrcywgKnJlZ2FyZGxlc3Mgb2YgYWdlIG9yIGdlbmRlciwqIHNlZW0gdG8gaGF2ZSBhY3R1YWxseSBzdHVjayBtdWNoIGNsb3NlciB0byB0aGUgbXVjaCB3aWRlciB2b3dlbCBzcGFjZSBvZiBvbGQtZmFzaGlvbmVkIENvY2tuZXktLSBhbmQgbWF5YmUgZXZlbiB3aWRlbmVkIGl0IGEgbGl0dGxlIGZ1cnRoZXIgaW4gc29tZSBwbGFjZXMuIE9mIGNvdXJzZSwgdGhlIFNQQURFIGRhdGFzZXQgaXMgZnJvbSBhIHByZXR0eSBzbWFsbCBzYW1wbGUgc2l6ZSwgc28gd2Ugc2hvdWxkIHByb2JhYmx5IHRha2UgdGhlIHJlc3VsdHMgaGVyZSB3aXRoIGEgZ3JhaW4gb2Ygc2FsdC0tIHBhcnRpY3VsYXJseSByZWdhcmRpbmcgdGhlIGZlbWFsZSBzcGVha2Vycy4gQnV0IHJlZ2FyZGxlc3MsIGl0IGRvZXMgaW5kZWVkIHNlZW0gbGlrZSBEZWJkZW4gbWlnaHQgYmUgeW91ciBiZXN0IGJldCBpZiB5b3Ugd2FudCB0byBoZWFyIGEgMjB0aC1DZW50dXJ5IENvY2tuZXkgYWNjZW50Lg==