#start with clean workspace 
rm(list=ls())
getwd()
#> [1] "C:/Users/ninab/OneDrive/Documenten/GitHub/labjournal"

1 packages

library(data.table) 
library(tidyverse) 
require(stringi)
require(Rsiena)
require(igraph)

2 Data

#load dataobjects
load("./data/descriptives/RU_net_array_sym.RData")
load("./data/descriptives/RU_dfv2.RData")

3 custum functions

# density: observed relations divided by possible relations
fdensity <- function(x) {
    # x is your nomination network make sure diagonal cells are NA
    diag(x) <- NA
    # take care of RSiena structural zeros, set as missing.
    x[x == 10] <- NA
    sum(x == 1, na.rm = T)/(sum(x == 1 | x == 0, na.rm = T))
}

# calculate intragroup density
fdensityintra <- function(x, A) {
    # A is matrix indicating whether nodes in dyad have same node attributes
    diag(x) <- NA
    x[x == 10] <- NA
    diag(A) <- NA
    sum(x == 1 & A == 1, na.rm = T)/(sum((x == 1 | x == 0) & A == 1, na.rm = T))
}

# calculate intergroup density
fdensityinter <- function(x, A) {
    # A is matrix indicating whether nodes in dyad have same node attributes
    diag(x) <- NA
    x[x == 10] <- NA
    diag(A) <- NA
    sum(x == 1 & A != 1, na.rm = T)/(sum((x == 1 | x == 0) & A != 1, na.rm = T))
}

# construct dyadcharacteristic whether nodes are similar/homogenous
fhomomat <- function(x) {
    # x is a vector of node-covariate
    xmat <- matrix(x, nrow = length(x), ncol = length(x))
    xmatt <- t(xmat)
    xhomo <- xmat == xmatt
    return(xhomo)
}

# a function to calculate all valid dyads.
fndyads <- function(x) {
    diag(x) <- NA
    x[x == 10] <- NA
    (sum((x == 1 | x == 0), na.rm = T))
}

# a function to calculate all valid intragroupdyads.
fndyads2 <- function(x, A) {
    diag(x) <- NA
    x[x == 10] <- NA
    diag(A) <- NA
    (sum((x == 1 | x == 0) & A == 1, na.rm = T))
}

4 descriptives

summary(soc_df$div.net)
#>    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
#>    0.00    0.00   15.48   23.61   37.24  100.00       2
sd(soc_df$div.net, na.rm=TRUE)
#> [1] 27.7464
table(soc_df$div.net)
#> 
#>     0  4.17  6.98  9.09 13.79 14.29 16.67 18.75  22.5    25 28.57 28.95    40 42.86    60    70 
#>    10     1     1     1     1     1     2     1     1     1     1     1     2     1     1     1 
#> 71.43 78.57   100 
#>     1     1     1
hist(soc_df$div.net, col="lightblue", main='RU: ethnic diversity egonets', xlab='Percentage non-Dutch collaborators')

summary(soc_df$div.ego)
#>    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
#>  0.0000  1.0000  1.0000  0.8438  1.0000  1.0000
table(soc_df$div.ego)
#> 
#>  0  1 
#>  5 27
summary(soc_df$nauthors)
#>    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
#>     1.0     5.5    11.0    13.1    15.0    43.0       1
sd(soc_df$nauthors, na.rm=TRUE)
#> [1] 11.06452
hist(soc_df$nauthors, col="lightblue", main='RU: number of co-authors', xlab='Number of co-authors since 2019')

summary(soc_df$pub_first)
#>    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
#>    1970    2005    2011    2007    2017    2019
sd(soc_df$pub_first, na.rm=TRUE)
#> [1] 13.59254
hist(soc_df$pub_first, col="lightblue", main='RU: year first publication', xlab='Year first publication')

table(soc_df$gender4)
#> 
#>  0  1 
#> 16 16
hist(soc_df$gender4, col="lightblue")

5 degree

5.1 net 1

net1 <- net_soc_array[ ,, 1]
diag(net1) <- 0
degree <- rowSums(net1)
hist(degree)

summary(degree)
#>    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
#>  0.0000  0.0000  0.0000  0.9375  1.2500  7.0000
sd(degree)
#> [1] 1.66438

5.2 net 2

net2 <- net_soc_array[ ,, 2]
diag(net2) <- 0
degree <- rowSums(net2)
hist(degree)

summary(degree)
#>    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
#>   0.000   0.000   0.000   1.062   1.250   6.000
sd(degree)
#> [1] 1.721543

5.3 net 3

net3 <- net_soc_array[ ,, 3]
diag(net3) <- 0
degree <- rowSums(net3)
hist(degree)

summary(degree)
#>    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
#>    0.00    0.00    1.50    1.75    3.00    6.00
sd(degree)
#> [1] 2

6 igraph object

6.1 net 1

net1_g <- igraph::graph_from_adjacency_matrix(net1, mode = c("undirected"))
plot(net1_g)

igraph::degree(net1_g)
#>  [1] 0 0 0 0 0 0 4 0 0 0 1 0 0 7 2 1 2 0 3 2 3 4 0 0 0 0 0 0 0 1 0 0
igraph::dyad.census(net1_g)
#> $mut
#> [1] 15
#> 
#> $asym
#> [1] 0
#> 
#> $null
#> [1] 481
igraph::triad.census(net1_g)
#>  [1] 4546    0  384    0    0    0    0    0    0    0   24    0    0    0    0    6
igraph::edge_density(net1_g)
#> [1] 0.03024194
sum(igraph::degree(net1_g))
#> [1] 30

6.2 net 2

net2_g <- igraph::graph_from_adjacency_matrix(net2, mode = c("undirected"))
plot(net2_g)

igraph::degree(net2_g)
#>  [1] 1 0 0 0 2 0 5 0 2 1 0 0 0 6 1 1 5 2 1 0 4 3 0 0 0 0 0 0 0 0 0 0
igraph::dyad.census(net2_g)
#> $mut
#> [1] 17
#> 
#> $asym
#> [1] 0
#> 
#> $null
#> [1] 479
igraph::triad.census(net2_g)
#>  [1] 4492    0  431    0    0    0    0    0    0    0   32    0    0    0    0    5
igraph::edge_density(net2_g)
#> [1] 0.03427419
sum(igraph::degree(net2_g))
#> [1] 34

6.3 net 3

net3_g <- igraph::graph_from_adjacency_matrix(net3, mode = c("undirected"))
plot(net3_g)

igraph::degree(net3_g)
#>  [1] 0 0 0 0 2 0 6 1 1 0 0 0 0 6 2 3 5 6 3 4 2 2 2 0 0 2 2 4 3 0 0 0
igraph::dyad.census(net3_g)
#> $mut
#> [1] 28
#> 
#> $asym
#> [1] 0
#> 
#> $null
#> [1] 468
igraph::triad.census(net3_g)
#>  [1] 4192    0  707    0    0    0    0    0    0    0   50    0    0    0    0   11
igraph::edge_density(net3_g)
#> [1] 0.05645161
sum(igraph::degree(net3_g))
#> [1] 56

7 density

7.1 net 1

net_und <- net1 + t(net1)
net_und[net_und==2] <- 1

sum(net_und, na.rm=TRUE)
#> [1] 30
fdensity(net1)
#> [1] 0.03024194

7.2 net 2

net_und <- net2 + t(net2)
net_und[net_und==2] <- 1

sum(net_und, na.rm=TRUE)
#> [1] 34
fdensity(net2)
#> [1] 0.03427419

7.3 net 3

net_und <- net3 + t(net3)
net_und[net_und==2] <- 1

sum(net_und, na.rm=TRUE)
#> [1] 56
fdensity(net3)
#> [1] 0.05645161

8 inter-/intragroup density

div_m <-  fhomomat(soc_df$div.ego)
# calculate intra-/intergroup density diversity ego
fdensityintra(x=net_und, A=div_m) 
#> [1] 0.06371191
fdensityinter(x=net_und, A=div_m)
#> [1] 0.03703704
# calculate intra-/intergroup density gender
gender_m <-  fhomomat(soc_df$gender4)
fdensityintra(x=net_und, A=gender_m) 
#> [1] 0.05833333
fdensityinter(x=net_und, A=gender_m)
#> [1] 0.0546875
LS0tDQp0aXRsZTogIlJVIGRlc2NyaXB0aXZlcyINCmF1dGhvcjogImJ5OiBOaW5hIEJyYW50ZW4iDQpiaWJsaW9ncmFwaHk6IHJlZmVyZW5jZXMuYmliDQotLS0NCg0KDQoNCmBgYHtyLCBpbnN0YWxsIHJlbW90ZWx5LCBnbG9iYWxzZXR0aW5ncywgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgcmVzdWx0cz0naGlkZScsIGV2YWw9RkFMU0V9DQppbnN0YWxsLnBhY2thZ2VzKCJyZW1vdGVzIikNCnJlbW90ZXM6Omluc3RhbGxfZ2l0aHViKCJybGVzdXIva2xpcHB5IikNCmBgYCANCg0KYGBge3IsIGdsb2JhbHNldHRpbmdzLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCByZXN1bHRzPSdoaWRlJ30NCmxpYnJhcnkoa25pdHIpDQpsaWJyYXJ5KHJnbCkNCg0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQ0Kb3B0c19jaHVuayRzZXQodGlkeS5vcHRzPWxpc3Qod2lkdGguY3V0b2ZmPTEwMCksdGlkeT1UUlVFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSxjb21tZW50ID0gIiM+IiwgY2FjaGU9VFJVRSwgY2xhc3Muc291cmNlPWMoInRlc3QiKSwgY2xhc3Mub3V0cHV0PWMoInRlc3QyIikpDQpvcHRpb25zKHdpZHRoID0gMTAwKQ0KcmdsOjpzZXR1cEtuaXRyKCkNCg0KDQoNCmNvbG9yaXplIDwtIGZ1bmN0aW9uKHgsIGNvbG9yKSB7c3ByaW50ZigiPHNwYW4gc3R5bGU9J2NvbG9yOiAlczsnPiVzPC9zcGFuPiIsIGNvbG9yLCB4KSB9DQoNCmBgYA0KDQpgYGB7ciBrbGlwcHksIGVjaG89RkFMU0UsIGluY2x1ZGU9VFJVRX0NCmtsaXBweTo6a2xpcHB5KHBvc2l0aW9uID0gYygndG9wJywgJ3JpZ2h0JykpDQoja2xpcHB5OjprbGlwcHkoY29sb3IgPSAnZGFya3JlZCcpDQoja2xpcHB5OjprbGlwcHkodG9vbHRpcF9tZXNzYWdlID0gJ0NsaWNrIHRvIGNvcHknLCB0b29sdGlwX3N1Y2Nlc3MgPSAnRG9uZScpDQpgYGANCg0KDQpgYGB7cn0NCiNzdGFydCB3aXRoIGNsZWFuIHdvcmtzcGFjZSANCnJtKGxpc3Q9bHMoKSkNCmdldHdkKCkNCmBgYA0KDQojIHBhY2thZ2VzDQoNCmBgYHtyfQ0KbGlicmFyeShkYXRhLnRhYmxlKSANCmxpYnJhcnkodGlkeXZlcnNlKSANCnJlcXVpcmUoc3RyaW5naSkNCnJlcXVpcmUoUnNpZW5hKQ0KcmVxdWlyZShpZ3JhcGgpDQoNCmBgYA0KIyBEYXRhDQoNCmBgYHtyfQ0KI2xvYWQgZGF0YW9iamVjdHMNCmxvYWQoIi4vZGF0YS9kZXNjcmlwdGl2ZXMvUlVfbmV0X2FycmF5X3N5bS5SRGF0YSIpDQpsb2FkKCIuL2RhdGEvZGVzY3JpcHRpdmVzL1JVX2RmdjIuUkRhdGEiKQ0KYGBgDQoNCg0KIyBjdXN0dW0gZnVuY3Rpb25zDQoNCmBgYHtyfQ0KIyBkZW5zaXR5OiBvYnNlcnZlZCByZWxhdGlvbnMgZGl2aWRlZCBieSBwb3NzaWJsZSByZWxhdGlvbnMNCmZkZW5zaXR5IDwtIGZ1bmN0aW9uKHgpIHsNCiAgICAjIHggaXMgeW91ciBub21pbmF0aW9uIG5ldHdvcmsgbWFrZSBzdXJlIGRpYWdvbmFsIGNlbGxzIGFyZSBOQQ0KICAgIGRpYWcoeCkgPC0gTkENCiAgICAjIHRha2UgY2FyZSBvZiBSU2llbmEgc3RydWN0dXJhbCB6ZXJvcywgc2V0IGFzIG1pc3NpbmcuDQogICAgeFt4ID09IDEwXSA8LSBOQQ0KICAgIHN1bSh4ID09IDEsIG5hLnJtID0gVCkvKHN1bSh4ID09IDEgfCB4ID09IDAsIG5hLnJtID0gVCkpDQp9DQoNCiMgY2FsY3VsYXRlIGludHJhZ3JvdXAgZGVuc2l0eQ0KZmRlbnNpdHlpbnRyYSA8LSBmdW5jdGlvbih4LCBBKSB7DQogICAgIyBBIGlzIG1hdHJpeCBpbmRpY2F0aW5nIHdoZXRoZXIgbm9kZXMgaW4gZHlhZCBoYXZlIHNhbWUgbm9kZSBhdHRyaWJ1dGVzDQogICAgZGlhZyh4KSA8LSBOQQ0KICAgIHhbeCA9PSAxMF0gPC0gTkENCiAgICBkaWFnKEEpIDwtIE5BDQogICAgc3VtKHggPT0gMSAmIEEgPT0gMSwgbmEucm0gPSBUKS8oc3VtKCh4ID09IDEgfCB4ID09IDApICYgQSA9PSAxLCBuYS5ybSA9IFQpKQ0KfQ0KDQojIGNhbGN1bGF0ZSBpbnRlcmdyb3VwIGRlbnNpdHkNCmZkZW5zaXR5aW50ZXIgPC0gZnVuY3Rpb24oeCwgQSkgew0KICAgICMgQSBpcyBtYXRyaXggaW5kaWNhdGluZyB3aGV0aGVyIG5vZGVzIGluIGR5YWQgaGF2ZSBzYW1lIG5vZGUgYXR0cmlidXRlcw0KICAgIGRpYWcoeCkgPC0gTkENCiAgICB4W3ggPT0gMTBdIDwtIE5BDQogICAgZGlhZyhBKSA8LSBOQQ0KICAgIHN1bSh4ID09IDEgJiBBICE9IDEsIG5hLnJtID0gVCkvKHN1bSgoeCA9PSAxIHwgeCA9PSAwKSAmIEEgIT0gMSwgbmEucm0gPSBUKSkNCn0NCg0KIyBjb25zdHJ1Y3QgZHlhZGNoYXJhY3RlcmlzdGljIHdoZXRoZXIgbm9kZXMgYXJlIHNpbWlsYXIvaG9tb2dlbm91cw0KZmhvbW9tYXQgPC0gZnVuY3Rpb24oeCkgew0KICAgICMgeCBpcyBhIHZlY3RvciBvZiBub2RlLWNvdmFyaWF0ZQ0KICAgIHhtYXQgPC0gbWF0cml4KHgsIG5yb3cgPSBsZW5ndGgoeCksIG5jb2wgPSBsZW5ndGgoeCkpDQogICAgeG1hdHQgPC0gdCh4bWF0KQ0KICAgIHhob21vIDwtIHhtYXQgPT0geG1hdHQNCiAgICByZXR1cm4oeGhvbW8pDQp9DQoNCiMgYSBmdW5jdGlvbiB0byBjYWxjdWxhdGUgYWxsIHZhbGlkIGR5YWRzLg0KZm5keWFkcyA8LSBmdW5jdGlvbih4KSB7DQogICAgZGlhZyh4KSA8LSBOQQ0KICAgIHhbeCA9PSAxMF0gPC0gTkENCiAgICAoc3VtKCh4ID09IDEgfCB4ID09IDApLCBuYS5ybSA9IFQpKQ0KfQ0KDQojIGEgZnVuY3Rpb24gdG8gY2FsY3VsYXRlIGFsbCB2YWxpZCBpbnRyYWdyb3VwZHlhZHMuDQpmbmR5YWRzMiA8LSBmdW5jdGlvbih4LCBBKSB7DQogICAgZGlhZyh4KSA8LSBOQQ0KICAgIHhbeCA9PSAxMF0gPC0gTkENCiAgICBkaWFnKEEpIDwtIE5BDQogICAgKHN1bSgoeCA9PSAxIHwgeCA9PSAwKSAmIEEgPT0gMSwgbmEucm0gPSBUKSkNCn0NCmBgYA0KDQojIGRlc2NyaXB0aXZlcw0KDQpgYGB7cn0NCnN1bW1hcnkoc29jX2RmJGRpdi5uZXQpDQpzZChzb2NfZGYkZGl2Lm5ldCwgbmEucm09VFJVRSkNCnRhYmxlKHNvY19kZiRkaXYubmV0KQ0KaGlzdChzb2NfZGYkZGl2Lm5ldCwgY29sPSJsaWdodGJsdWUiLCBtYWluPSdSVTogZXRobmljIGRpdmVyc2l0eSBlZ29uZXRzJywgeGxhYj0nUGVyY2VudGFnZSBub24tRHV0Y2ggY29sbGFib3JhdG9ycycpDQpgYGANCmBgYHtyfQ0Kc3VtbWFyeShzb2NfZGYkZGl2LmVnbykNCnRhYmxlKHNvY19kZiRkaXYuZWdvKQ0KDQpgYGANCmBgYHtyfQ0Kc3VtbWFyeShzb2NfZGYkbmF1dGhvcnMpDQpzZChzb2NfZGYkbmF1dGhvcnMsIG5hLnJtPVRSVUUpDQpoaXN0KHNvY19kZiRuYXV0aG9ycywgY29sPSJsaWdodGJsdWUiLCBtYWluPSdSVTogbnVtYmVyIG9mIGNvLWF1dGhvcnMnLCB4bGFiPSdOdW1iZXIgb2YgY28tYXV0aG9ycyBzaW5jZSAyMDE5JykNCg0KYGBgDQpgYGB7cn0NCnN1bW1hcnkoc29jX2RmJHB1Yl9maXJzdCkNCnNkKHNvY19kZiRwdWJfZmlyc3QsIG5hLnJtPVRSVUUpDQpoaXN0KHNvY19kZiRwdWJfZmlyc3QsIGNvbD0ibGlnaHRibHVlIiwgbWFpbj0nUlU6IHllYXIgZmlyc3QgcHVibGljYXRpb24nLCB4bGFiPSdZZWFyIGZpcnN0IHB1YmxpY2F0aW9uJykNCg0KYGBgDQoNCmBgYHtyfQ0KDQp0YWJsZShzb2NfZGYkZ2VuZGVyNCkNCmhpc3Qoc29jX2RmJGdlbmRlcjQsIGNvbD0ibGlnaHRibHVlIikNCg0KYGBgDQoNCiMgZGVncmVlDQojIyBuZXQgMQ0KDQoNCmBgYHtyfQ0KbmV0MSA8LSBuZXRfc29jX2FycmF5WyAsLCAxXQ0KZGlhZyhuZXQxKSA8LSAwDQpkZWdyZWUgPC0gcm93U3VtcyhuZXQxKQ0KaGlzdChkZWdyZWUpDQpzdW1tYXJ5KGRlZ3JlZSkNCnNkKGRlZ3JlZSkNCg0KYGBgDQoNCiMjIG5ldCAyDQpgYGB7cn0NCm5ldDIgPC0gbmV0X3NvY19hcnJheVsgLCwgMl0NCmRpYWcobmV0MikgPC0gMA0KZGVncmVlIDwtIHJvd1N1bXMobmV0MikNCmhpc3QoZGVncmVlKQ0Kc3VtbWFyeShkZWdyZWUpDQpzZChkZWdyZWUpDQoNCmBgYA0KDQoNCiMjIG5ldCAzDQoNCmBgYHtyfQ0KbmV0MyA8LSBuZXRfc29jX2FycmF5WyAsLCAzXQ0KZGlhZyhuZXQzKSA8LSAwDQpkZWdyZWUgPC0gcm93U3VtcyhuZXQzKQ0KaGlzdChkZWdyZWUpDQpzdW1tYXJ5KGRlZ3JlZSkNCnNkKGRlZ3JlZSkNCg0KYGBgDQoNCg0KIyBpZ3JhcGggb2JqZWN0IA0KIyMgbmV0IDENCg0KYGBge3J9DQpuZXQxX2cgPC0gaWdyYXBoOjpncmFwaF9mcm9tX2FkamFjZW5jeV9tYXRyaXgobmV0MSwgbW9kZSA9IGMoInVuZGlyZWN0ZWQiKSkNCnBsb3QobmV0MV9nKQ0KDQppZ3JhcGg6OmRlZ3JlZShuZXQxX2cpDQppZ3JhcGg6OmR5YWQuY2Vuc3VzKG5ldDFfZykNCmlncmFwaDo6dHJpYWQuY2Vuc3VzKG5ldDFfZykNCmlncmFwaDo6ZWRnZV9kZW5zaXR5KG5ldDFfZykNCg0Kc3VtKGlncmFwaDo6ZGVncmVlKG5ldDFfZykpDQoNCmBgYA0KDQojIyBuZXQgMg0KDQpgYGB7cn0NCm5ldDJfZyA8LSBpZ3JhcGg6OmdyYXBoX2Zyb21fYWRqYWNlbmN5X21hdHJpeChuZXQyLCBtb2RlID0gYygidW5kaXJlY3RlZCIpKQ0KcGxvdChuZXQyX2cpDQoNCmlncmFwaDo6ZGVncmVlKG5ldDJfZykNCmlncmFwaDo6ZHlhZC5jZW5zdXMobmV0Ml9nKQ0KaWdyYXBoOjp0cmlhZC5jZW5zdXMobmV0Ml9nKQ0KaWdyYXBoOjplZGdlX2RlbnNpdHkobmV0Ml9nKQ0KDQpzdW0oaWdyYXBoOjpkZWdyZWUobmV0Ml9nKSkNCg0KYGBgDQoNCiMjIG5ldCAzDQpgYGB7cn0NCm5ldDNfZyA8LSBpZ3JhcGg6OmdyYXBoX2Zyb21fYWRqYWNlbmN5X21hdHJpeChuZXQzLCBtb2RlID0gYygidW5kaXJlY3RlZCIpKQ0KcGxvdChuZXQzX2cpDQoNCmlncmFwaDo6ZGVncmVlKG5ldDNfZykNCmlncmFwaDo6ZHlhZC5jZW5zdXMobmV0M19nKQ0KaWdyYXBoOjp0cmlhZC5jZW5zdXMobmV0M19nKQ0KaWdyYXBoOjplZGdlX2RlbnNpdHkobmV0M19nKQ0KDQpzdW0oaWdyYXBoOjpkZWdyZWUobmV0M19nKSkNCg0KYGBgDQojIGRlbnNpdHkNCiMjIG5ldCAxDQpgYGB7cn0NCm5ldF91bmQgPC0gbmV0MSArIHQobmV0MSkNCm5ldF91bmRbbmV0X3VuZD09Ml0gPC0gMQ0KDQpzdW0obmV0X3VuZCwgbmEucm09VFJVRSkNCmZkZW5zaXR5KG5ldDEpDQpgYGANCiMjIG5ldCAyDQpgYGB7cn0NCg0KbmV0X3VuZCA8LSBuZXQyICsgdChuZXQyKQ0KbmV0X3VuZFtuZXRfdW5kPT0yXSA8LSAxDQoNCnN1bShuZXRfdW5kLCBuYS5ybT1UUlVFKQ0KZmRlbnNpdHkobmV0MikNCmBgYA0KIyMgbmV0IDMNCmBgYHtyfQ0KDQpuZXRfdW5kIDwtIG5ldDMgKyB0KG5ldDMpDQpuZXRfdW5kW25ldF91bmQ9PTJdIDwtIDENCg0Kc3VtKG5ldF91bmQsIG5hLnJtPVRSVUUpDQpmZGVuc2l0eShuZXQzKQ0KYGBgDQoNCiMgaW50ZXItL2ludHJhZ3JvdXAgZGVuc2l0eQ0KYGBge3J9DQpkaXZfbSA8LSAgZmhvbW9tYXQoc29jX2RmJGRpdi5lZ28pDQpgYGANCg0KDQpgYGB7cn0NCiMgY2FsY3VsYXRlIGludHJhLS9pbnRlcmdyb3VwIGRlbnNpdHkgZGl2ZXJzaXR5IGVnbw0KZmRlbnNpdHlpbnRyYSh4PW5ldF91bmQsIEE9ZGl2X20pIA0KZmRlbnNpdHlpbnRlcih4PW5ldF91bmQsIEE9ZGl2X20pDQogICAgDQpgYGANCg0KYGBge3J9DQojIGNhbGN1bGF0ZSBpbnRyYS0vaW50ZXJncm91cCBkZW5zaXR5IGdlbmRlcg0KZ2VuZGVyX20gPC0gIGZob21vbWF0KHNvY19kZiRnZW5kZXI0KQ0KZmRlbnNpdHlpbnRyYSh4PW5ldF91bmQsIEE9Z2VuZGVyX20pIA0KZmRlbnNpdHlpbnRlcih4PW5ldF91bmQsIEE9Z2VuZGVyX20pDQogICAgDQpgYGANCg0KDQoNCg==