Table of Contents

Table of Contents
Abstract
Data Preprocessing
Conducting Analysis Testing for exponential correlation
Determining correlation between Loves and other variables
Visualizing Data
Conclusion References

Abstract

Utilizing the dataset provided from the Scratch community(Benjamin Mako Hill 2016), we are able to determine that there is a statistically significant exponential correlation between view count and remix status, as well as a correlation between Loves and Views + Sprites. Finally, we will visualize these relations using ggplot2.

Data Preprocessing

Importing Libraries

Start by importing the library for tidyverse which contains various data science tools like ggplot2 and dpylr, and RColorBrewer, because pretty colors are good.

library(tidyverse)
library(RColorBrewer)

Importing dataset into \(R\)

df <- read.csv("250750views.csv")

Selecting relevent variables and renaming them

dataset <- dplyr::select(df, "is_remixed", "sprites_website", 
                           "scripts_website", "viewers_website", 
                           "lovers_website")
names(dataset) <- c("remix.status", "sprites", "scripts", 
                      "views", "loves")

Conducting analysis

Performing linear regression to correlation between remix status and other variables.

Attempt One

First, we test all variables against remix status to determine if there is a correlation between Remix status and other variables.

regressor <- lm(formula = remix.status ~., data = dataset)
summary(regressor)

Call:
lm(formula = remix.status ~ ., data = dataset)

Residuals:
    Min      1Q  Median      3Q     Max 
-0.7330 -0.4663  0.2772  0.5081  0.5921 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)  3.146e-01  9.726e-03  32.350   <2e-16 ***
sprites      4.390e-05  1.610e-04   0.273   0.7852    
scripts     -3.999e-06  1.960e-06  -2.040   0.0413 *  
views        4.137e-04  2.209e-05  18.730   <2e-16 ***
loves        7.865e-05  3.486e-04   0.226   0.8215    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.4938 on 18210 degrees of freedom
  (4102 observations deleted due to missingness)
Multiple R-squared:  0.02483,   Adjusted R-squared:  0.02462 
F-statistic: 115.9 on 4 and 18210 DF,  p-value: < 2.2e-16

Notice that there are two variables with \(P_{r} >\left|t\right|\) values less than 0.05. If we choose that as the significance level, we can re-run the linear regression test and see if we get better results.

Attempt Two

We will remove the Loves variable and rerun. (Potentially, the Loves variable could be masking the Scripts variable, so we will include it in the next test)

regressor2 <- lm(formula = remix.status ~ views + sprites + scripts,
                data = dataset)
summary(regressor2)

Call:
lm(formula = remix.status ~ views + sprites + scripts, data = dataset)

Residuals:
    Min      1Q  Median      3Q     Max 
-0.7530 -0.4579 -0.4096  0.5161  0.5917 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)  3.032e-01  9.497e-03  31.924   <2e-16 ***
views        4.182e-04  1.912e-05  21.870   <2e-16 ***
sprites      1.877e-04  1.597e-04   1.175   0.2399    
scripts     -4.079e-06  1.960e-06  -2.082   0.0374 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.4937 on 18956 degrees of freedom
  (3357 observations deleted due to missingness)
Multiple R-squared:  0.025, Adjusted R-squared:  0.02485 
F-statistic:   162 on 3 and 18956 DF,  p-value: < 2.2e-16

We can conclude that the Sprites variable is not statistically significant and remove it to perform the test again.

Attempt Three

regressor3 <- lm(formula = remix.status ~ views + scripts, data = dataset)
summary(regressor3)

Call:
lm(formula = remix.status ~ views + scripts, data = dataset)

Residuals:
    Min      1Q  Median      3Q     Max 
-0.7066 -0.4446 -0.3966  0.5287  0.6571 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)  2.896e-01  8.798e-03  32.915   <2e-16 ***
views        4.180e-04  1.803e-05  23.189   <2e-16 ***
scripts     -3.458e-06  1.941e-06  -1.782   0.0748 .  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.4934 on 21432 degrees of freedom
  (882 observations deleted due to missingness)
Multiple R-squared:  0.0246,    Adjusted R-squared:  0.02451 
F-statistic: 270.3 on 2 and 21432 DF,  p-value: < 2.2e-16

Now we can see that the only variable with statistical significance is Views. We will perform regression once more for our final value.

Attempt Four

regressor4 <- lm(formula = remix.status ~ views, data = dataset)
summary(regressor4)

Call:
lm(formula = remix.status ~ views, data = dataset)

Residuals:
    Min      1Q  Median      3Q     Max 
-0.7042 -0.4384 -0.3895  0.5331  0.6135 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) 2.798e-01  8.613e-03   32.48   <2e-16 ***
views       4.253e-04  1.769e-05   24.05   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.4928 on 22315 degrees of freedom
Multiple R-squared:  0.02526,   Adjusted R-squared:  0.02521 
F-statistic: 578.2 on 1 and 22315 DF,  p-value: < 2.2e-16

The significance code is much much less than 0.001 and can be deemed as statistically significant. The \(R^{2}\) and \(R^{2}_{\textrm{adjusted}}\) values are less than 1 implying that there is not a linear relationship between the two variables, but the \(p\)-value being so low shows that there is a relation between the two.

Testing for exponential correlation

Below we have taken the dataset variables for Remix Status and counted the total amount of remixes per number of views. We then take the log of Remix Totals and perform linear regression against it.

data.log <- aggregate(dataset$remix.status, by=list(dataset$views), FUN=sum)
names(data.log) <- c("views", "remix.totals")
log.reg <- lm(formula = log(remix.totals) ~ views, data = data.log)
summary(log.reg)

Call:
lm(formula = log(remix.totals) ~ views, data = data.log)

Residuals:
    Min      1Q  Median      3Q     Max 
-2.1150 -0.1776  0.0601  0.2325  1.1970 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)  4.343e+00  4.395e-02   98.81   <2e-16 ***
views       -3.196e-03  6.652e-05  -48.05   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.3928 on 746 degrees of freedom
Multiple R-squared:  0.7558,    Adjusted R-squared:  0.7555 
F-statistic:  2309 on 1 and 746 DF,  p-value: < 2.2e-16

Our \(p\)-value is still good and we have an \(R^{2}\) closer to 1. This leads us to the conclusion that the variables are related exponentially.

Determining correlation between Loves and other variables

We can run tests as before to determine which variables will be statistically significant as before.

love.reg <- lm(formula = loves ~., data = dataset)
love.reg2 <- lm(formula = loves ~ views + sprites + scripts, 
                data = dataset)
love.reg3 <- lm(formula = loves ~ views + sprites, 
                data = dataset)
summary(love.reg3)

Call:
lm(formula = loves ~ views + sprites, data = dataset)

Residuals:
   Min     1Q Median     3Q    Max 
-36.17  -5.92  -1.94   3.91 400.39 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept) -1.6110280  0.2179760  -7.391 1.52e-13 ***
views        0.0306892  0.0004368  70.254  < 2e-16 ***
sprites      0.0365094  0.0035985  10.146  < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 11.23 on 18678 degrees of freedom
  (3636 observations deleted due to missingness)
Multiple R-squared:  0.2147,    Adjusted R-squared:  0.2146 
F-statistic:  2553 on 2 and 18678 DF,  p-value: < 2.2e-16

This shows that we have statistical significance between Loves, Views, and Sprites.

Visualizing Data

Finally, we shall use ggplot to visualize the data that we have looked at so far before importing the csv into Tableau.

ggplot(data = dataset, aes(x = views, fill = remix.status)) + 
  geom_histogram(color = "black", alpha = 0.4) + ggtitle("Views") + xlab("Views") +
  ylab("Counts") + scale_fill_brewer(palette = "Paired") + theme(line = element_line(size = 1))

ggplot(data = data.log, aes(x = views, y = log(remix.totals), 
                            color = I("Blue"))) +
  geom_point() + geom_smooth(color = I("Green")) + 
  ggtitle("Log Remix Totals vs. Views") + xlab("Views") +
  ylab("Log Remix") 

Conclusion

The Scratch data obtained shows that there is an exponential correlation between Remix status and Views. We also learned that there is a relationship between Loves and Views + Sprites. These findings will make our analysis with Tableau much more meaningful.

LicenseFacebooktwitterLinkedin
Feel free to check out the source R code at my github

References

Benjamin Mako Hill, Andrés Monroy-Hernández. 2016. “Archival Dataset: A Longitudinal Dataset of Five Years of Public Activity in the Scratch Online Community.” https://dataverse.harvard.edu/dataset.xhtml?persistentId=doi:10.7910/DVN/KFT8EZ.

LS0tCnRpdGxlOiAiVXNpbmcgUiB0byBkZXRlcm1pbmUgc2lnbmlmaWNhbmNlIGJldHdlZW4gZGF0YSBwb2ludHMiCm91dHB1dDogaHRtbF9ub3RlYm9vawpiaWJsaW9ncmFwaHk6IHJlZi5iaWIKYXV0aG9yOiAiRGFuaWVsIFIgQnJvd24gSnIuIgotLS0KIyBUYWJsZSBvZiBDb250ZW50cwpbVGFibGUgb2YgQ29udGVudHNdKCNUYWJsZS1vZi1jb250ZW50cykgIApbQWJzdHJhY3RdKCNBYnN0cmFjdCkgIApbRGF0YSBQcmVwcm9jZXNzaW5nXSgjRGF0YS1QcmVwcm9jZXNzaW5nKSAgICAKW0NvbmR1Y3RpbmcgQW5hbHlzaXNdKCNDb25kdWN0aW5nLUFuYWx5c2lzKQpbVGVzdGluZyBmb3IgZXhwb25lbnRpYWwgY29ycmVsYXRpb25dKCNUZXN0aW5nLWZvci1leHBvbmVudGlhbC1jb3JyZWxhdGlvbikgIApbRGV0ZXJtaW5pbmcgY29ycmVsYXRpb24gYmV0d2VlbiBMb3ZlcyBhbmQgb3RoZXIgdmFyaWFibGVzXSgjRGV0ZXJtaW5pbmctY29ycmVsYXRpb24tYmV0d2Vlbi1Mb3Zlcy1hbmQtb3RoZXItdmFyaWFibGVzKSAgCltWaXN1YWxpemluZyBEYXRhXSgjVmlzdWFsaXppbmctRGF0YSkgIApbQ29uY2x1c2lvbl0oI0NvbmNsdXNpb24pIApbUmVmZXJlbmNlc10oI1JlZmVyZW5jZXMpICAKCiMgQWJzdHJhY3QKVXRpbGl6aW5nIHRoZSBkYXRhc2V0IHByb3ZpZGVkIGZyb20gdGhlIFNjcmF0Y2ggY29tbXVuaXR5W0BibWgxNl0sIHdlIGFyZSBhYmxlIHRvIGRldGVybWluZSB0aGF0IHRoZXJlIGlzIGEgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBleHBvbmVudGlhbCBjb3JyZWxhdGlvbiBiZXR3ZWVuICp2aWV3KiBjb3VudCBhbmQgKnJlbWl4KiBzdGF0dXMsIGFzIHdlbGwgYXMgYSBjb3JyZWxhdGlvbiBiZXR3ZWVuICpMb3ZlcyogYW5kICpWaWV3cyArIFNwcml0ZXMqLiBGaW5hbGx5LCB3ZSB3aWxsIHZpc3VhbGl6ZSB0aGVzZSByZWxhdGlvbnMgdXNpbmcgKipnZ3Bsb3QyKiouCgojIERhdGEgUHJlcHJvY2Vzc2luZwojIyBJbXBvcnRpbmcgTGlicmFyaWVzClN0YXJ0IGJ5IGltcG9ydGluZyB0aGUgbGlicmFyeSBmb3IgKip0aWR5dmVyc2UqKiB3aGljaCBjb250YWlucyB2YXJpb3VzIGRhdGEgc2NpZW5jZSB0b29scyBsaWtlICoqZ2dwbG90MioqIGFuZCAqKmRweWxyKiosIGFuZCAqKlJDb2xvckJyZXdlcioqLCBiZWNhdXNlIHByZXR0eSBjb2xvcnMgYXJlIGdvb2QuCmBgYHtyfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShSQ29sb3JCcmV3ZXIpCmBgYAoKIyMgSW1wb3J0aW5nIGRhdGFzZXQgaW50byAkUiQKYGBge3J9CmRmIDwtIHJlYWQuY3N2KCIyNTA3NTB2aWV3cy5jc3YiKQpgYGAKCiMjIFNlbGVjdGluZyByZWxldmVudCB2YXJpYWJsZXMgYW5kIHJlbmFtaW5nIHRoZW0KYGBge3J9CmRhdGFzZXQgPC0gZHBseXI6OnNlbGVjdChkZiwgImlzX3JlbWl4ZWQiLCAic3ByaXRlc193ZWJzaXRlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJzY3JpcHRzX3dlYnNpdGUiLCAidmlld2Vyc193ZWJzaXRlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJsb3ZlcnNfd2Vic2l0ZSIpCm5hbWVzKGRhdGFzZXQpIDwtIGMoInJlbWl4LnN0YXR1cyIsICJzcHJpdGVzIiwgInNjcmlwdHMiLCAKICAgICAgICAgICAgICAgICAgICAgICJ2aWV3cyIsICJsb3ZlcyIpCmBgYAoKIyBDb25kdWN0aW5nIGFuYWx5c2lzCiMjIFBlcmZvcm1pbmcgbGluZWFyIHJlZ3Jlc3Npb24gdG8gY29ycmVsYXRpb24gYmV0d2VlbiByZW1peCBzdGF0dXMgYW5kIG90aGVyIHZhcmlhYmxlcy4KIyMjIEF0dGVtcHQgT25lCkZpcnN0LCB3ZSB0ZXN0IGFsbCB2YXJpYWJsZXMgYWdhaW5zdCByZW1peCBzdGF0dXMgdG8gZGV0ZXJtaW5lIGlmIHRoZXJlIGlzIGEgY29ycmVsYXRpb24gYmV0d2VlbiBSZW1peCBzdGF0dXMgYW5kIG90aGVyIHZhcmlhYmxlcy4KYGBge3J9CnJlZ3Jlc3NvciA8LSBsbShmb3JtdWxhID0gcmVtaXguc3RhdHVzIH4uLCBkYXRhID0gZGF0YXNldCkKc3VtbWFyeShyZWdyZXNzb3IpCmBgYApOb3RpY2UgdGhhdCB0aGVyZSBhcmUgdHdvIHZhcmlhYmxlcyB3aXRoICRQX3tyfSA+XGxlZnR8dFxyaWdodHwkIHZhbHVlcyBsZXNzIHRoYW4gMC4wNS4gSWYgd2UgY2hvb3NlIHRoYXQgYXMgdGhlIHNpZ25pZmljYW5jZSBsZXZlbCwgd2UgY2FuIHJlLXJ1biB0aGUgbGluZWFyIHJlZ3Jlc3Npb24gdGVzdCBhbmQgc2VlIGlmIHdlIGdldCBiZXR0ZXIgcmVzdWx0cy4gCgojIyMgQXR0ZW1wdCBUd28KV2Ugd2lsbCByZW1vdmUgdGhlIExvdmVzIHZhcmlhYmxlIGFuZCByZXJ1bi4gKFBvdGVudGlhbGx5LCB0aGUgTG92ZXMgdmFyaWFibGUgY291bGQgYmUgbWFza2luZyB0aGUgU2NyaXB0cyB2YXJpYWJsZSwgc28gd2Ugd2lsbCBpbmNsdWRlIGl0IGluIHRoZSBuZXh0IHRlc3QpCmBgYHtyfQpyZWdyZXNzb3IyIDwtIGxtKGZvcm11bGEgPSByZW1peC5zdGF0dXMgfiB2aWV3cyArIHNwcml0ZXMgKyBzY3JpcHRzLAogICAgICAgICAgICAgICAgZGF0YSA9IGRhdGFzZXQpCnN1bW1hcnkocmVncmVzc29yMikKYGBgCldlIGNhbiBjb25jbHVkZSB0aGF0IHRoZSBTcHJpdGVzIHZhcmlhYmxlIGlzIG5vdCBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IGFuZCByZW1vdmUgaXQgdG8gcGVyZm9ybSB0aGUgdGVzdCBhZ2Fpbi4KCiMjIyBBdHRlbXB0IFRocmVlCmBgYHtyfQpyZWdyZXNzb3IzIDwtIGxtKGZvcm11bGEgPSByZW1peC5zdGF0dXMgfiB2aWV3cyArIHNjcmlwdHMsIGRhdGEgPSBkYXRhc2V0KQpzdW1tYXJ5KHJlZ3Jlc3NvcjMpCmBgYApOb3cgd2UgY2FuIHNlZSB0aGF0IHRoZSBvbmx5IHZhcmlhYmxlIHdpdGggc3RhdGlzdGljYWwgc2lnbmlmaWNhbmNlIGlzIFZpZXdzLiBXZSB3aWxsIHBlcmZvcm0gcmVncmVzc2lvbiBvbmNlIG1vcmUgZm9yIG91ciBmaW5hbCB2YWx1ZS4KCiMjIyBBdHRlbXB0IEZvdXIKYGBge3J9CnJlZ3Jlc3NvcjQgPC0gbG0oZm9ybXVsYSA9IHJlbWl4LnN0YXR1cyB+IHZpZXdzLCBkYXRhID0gZGF0YXNldCkKc3VtbWFyeShyZWdyZXNzb3I0KQpgYGAKClRoZSBzaWduaWZpY2FuY2UgY29kZSBpcyBtdWNoIG11Y2ggbGVzcyB0aGFuIDAuMDAxIGFuZCBjYW4gYmUgZGVlbWVkIGFzIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQuIFRoZSAkUl57Mn0kIGFuZCAkUl57Mn1fe1x0ZXh0cm17YWRqdXN0ZWR9fSQgdmFsdWVzIGFyZSBsZXNzIHRoYW4gMSBpbXBseWluZyB0aGF0IHRoZXJlIGlzIG5vdCBhICpsaW5lYXIqIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSB0d28gdmFyaWFibGVzLCBidXQgdGhlICRwJC12YWx1ZSBiZWluZyBzbyBsb3cgc2hvd3MgdGhhdCB0aGVyZSBpcyBhIHJlbGF0aW9uIGJldHdlZW4gdGhlIHR3by4KCiMgVGVzdGluZyBmb3IgZXhwb25lbnRpYWwgY29ycmVsYXRpb24KQmVsb3cgd2UgaGF2ZSB0YWtlbiB0aGUgZGF0YXNldCB2YXJpYWJsZXMgZm9yIFJlbWl4IFN0YXR1cyBhbmQgY291bnRlZCB0aGUgdG90YWwgYW1vdW50IG9mIHJlbWl4ZXMgcGVyIG51bWJlciBvZiB2aWV3cy4gV2UgdGhlbiB0YWtlIHRoZSBsb2cgb2YgUmVtaXggVG90YWxzIGFuZCBwZXJmb3JtIGxpbmVhciByZWdyZXNzaW9uIGFnYWluc3QgaXQuCmBgYHtyfQpkYXRhLmxvZyA8LSBhZ2dyZWdhdGUoZGF0YXNldCRyZW1peC5zdGF0dXMsIGJ5PWxpc3QoZGF0YXNldCR2aWV3cyksIEZVTj1zdW0pCm5hbWVzKGRhdGEubG9nKSA8LSBjKCJ2aWV3cyIsICJyZW1peC50b3RhbHMiKQpsb2cucmVnIDwtIGxtKGZvcm11bGEgPSBsb2cocmVtaXgudG90YWxzKSB+IHZpZXdzLCBkYXRhID0gZGF0YS5sb2cpCnN1bW1hcnkobG9nLnJlZykKYGBgCk91ciAkcCQtdmFsdWUgaXMgc3RpbGwgZ29vZCBhbmQgd2UgaGF2ZSBhbiAkUl57Mn0kIGNsb3NlciB0byAxLiBUaGlzIGxlYWRzIHVzIHRvIHRoZSBjb25jbHVzaW9uIHRoYXQgdGhlIHZhcmlhYmxlcyBhcmUgcmVsYXRlZCAqZXhwb25lbnRpYWxseSouCgojIERldGVybWluaW5nIGNvcnJlbGF0aW9uIGJldHdlZW4gTG92ZXMgYW5kIG90aGVyIHZhcmlhYmxlcwpXZSBjYW4gcnVuIHRlc3RzIGFzIGJlZm9yZSB0byBkZXRlcm1pbmUgd2hpY2ggdmFyaWFibGVzIHdpbGwgYmUgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBhcyBiZWZvcmUuCmBgYHtyfQpsb3ZlLnJlZyA8LSBsbShmb3JtdWxhID0gbG92ZXMgfi4sIGRhdGEgPSBkYXRhc2V0KQpsb3ZlLnJlZzIgPC0gbG0oZm9ybXVsYSA9IGxvdmVzIH4gdmlld3MgKyBzcHJpdGVzICsgc2NyaXB0cywgCiAgICAgICAgICAgICAgICBkYXRhID0gZGF0YXNldCkKbG92ZS5yZWczIDwtIGxtKGZvcm11bGEgPSBsb3ZlcyB+IHZpZXdzICsgc3ByaXRlcywgCiAgICAgICAgICAgICAgICBkYXRhID0gZGF0YXNldCkKc3VtbWFyeShsb3ZlLnJlZzMpCmBgYApUaGlzIHNob3dzIHRoYXQgd2UgaGF2ZSBzdGF0aXN0aWNhbCBzaWduaWZpY2FuY2UgYmV0d2VlbiBMb3ZlcywgVmlld3MsIGFuZCBTcHJpdGVzLgogIAojIFZpc3VhbGl6aW5nIERhdGEKRmluYWxseSwgd2Ugc2hhbGwgdXNlICoqZ2dwbG90KiogdG8gdmlzdWFsaXplIHRoZSBkYXRhIHRoYXQgd2UgaGF2ZSBsb29rZWQgYXQgc28gZmFyCmJlZm9yZSBpbXBvcnRpbmcgdGhlIGNzdiBpbnRvICpUYWJsZWF1Ki4KYGBge3J9CmdncGxvdChkYXRhID0gZGF0YXNldCwgYWVzKHggPSB2aWV3cywgZmlsbCA9IHJlbWl4LnN0YXR1cykpICsgCiAgZ2VvbV9oaXN0b2dyYW0oY29sb3IgPSAiYmxhY2siLCBhbHBoYSA9IDAuNCkgKyBnZ3RpdGxlKCJWaWV3cyIpICsgeGxhYigiVmlld3MiKSArCiAgeWxhYigiQ291bnRzIikgKyBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlBhaXJlZCIpICsgdGhlbWUobGluZSA9IGVsZW1lbnRfbGluZShzaXplID0gMSkpCmdncGxvdChkYXRhID0gZGF0YS5sb2csIGFlcyh4ID0gdmlld3MsIHkgPSBsb2cocmVtaXgudG90YWxzKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9IEkoIkJsdWUiKSkpICsKICBnZW9tX3BvaW50KCkgKyBnZW9tX3Ntb290aChjb2xvciA9IEkoIkdyZWVuIikpICsgCiAgZ2d0aXRsZSgiTG9nIFJlbWl4IFRvdGFscyB2cy4gVmlld3MiKSArIHhsYWIoIlZpZXdzIikgKwogIHlsYWIoIkxvZyBSZW1peCIpIApgYGAKCiMgQ29uY2x1c2lvbgpUaGUgU2NyYXRjaCBkYXRhIG9idGFpbmVkIHNob3dzIHRoYXQgdGhlcmUgaXMgYW4gZXhwb25lbnRpYWwgY29ycmVsYXRpb24gYmV0d2VlbiBSZW1peCBzdGF0dXMgYW5kIFZpZXdzLiBXZSBhbHNvIGxlYXJuZWQgdGhhdCB0aGVyZSBpcyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIExvdmVzIGFuZCBWaWV3cyArIFNwcml0ZXMuIFRoZXNlIGZpbmRpbmdzIHdpbGwgbWFrZSBvdXIgYW5hbHlzaXMgd2l0aCBUYWJsZWF1IG11Y2ggbW9yZSBtZWFuaW5nZnVsLgoKWyFbTGljZW5zZV0oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9iYWRnZS9MSUNFTlNFLU1JVC1yZWQuc3ZnKV0oLi9MaWNlbnNlKVshW0ZhY2Vib29rXShodHRwczovL2ltZy5zaGllbGRzLmlvL2JhZGdlL2ZhY2Vib29rLURhbmllbC1yZWQuc3ZnP3N0eWxlPXNvY2lhbCldKGh0dHBzOi8vd3d3LmZhY2Vib29rLmNvbS9jaGFzZWFmdGVyc3RhcnQyMDA2KVshW3R3aXR0ZXJdKGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vYmFkZ2UvdHdpdHRlci1jaGFzZWFmdGVyc3RhcnQtcmVkLnN2Zz9zdHlsZT1zb2NpYWwpXShodHRwczovL3R3aXR0ZXIuY29tL0NoYXNlQWZ0ZXJTdGFydClbIVtMaW5rZWRpbl0oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9iYWRnZS9MaW5rZWRpbi1EYW5pZWwtcmVkLnN2Zz9zdHlsZT1zb2NpYWwpXShodHRwOi8vdGlueS5jYy9kYW5pZWxicm93bikgIApGZWVsIGZyZWUgdG8gY2hlY2sgb3V0IHRoZSBzb3VyY2UgUiBjb2RlIGF0IG15IFtnaXRodWJdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYW5pZWxicm93bmpyL1NjcmF0Y2hQcm9qZWN0KQoKCiMgUmVmZXJlbmNlcwo=