- Use the us-senate list to get the last 200 tweets from US senators.
- Create a network of retweets.
- Get a count of nodes and edges, and get the density of the network.
- Create a data table of the senators, showing only their names and degree.
- Find communities and make a network diagram showing the communities. (You may make two diagrams, one with the communities and one without.)
us_senate <- search_tweets
us_senate <- search_tweets(geocode = "45.80,-108.55,25mi", n = 200)
Downloading [=========================================] 100%
# This creates the network with some commands from graphTweets
# The variables in the parentheses of gt_edges() are used, so in this case we're using retweets
# We're also keeping text of the tweets
us_senate_network <- bl_tweets %>%
gt_edges(screen_name, retweet_screen_name, text) %>%
gt_graph()
# This next line gets the nodes
us_senate_nodes <- as_data_frame(us_senate_network, what = "vertices")
# This adds some additional info to the nodes, so we get the names on hover
# and the size of the node is based on its degree, etc.
us_senate_nodes <- us_senate_nodes %>%
mutate(id = name) %>%
mutate(label = name) %>%
mutate(title = name) %>%
mutate(degree = degree(us_senate_network)) %>%
mutate(value = degree)
# This gets the edges, similar to how we got the nodes above
us_senate_edges <- as_data_frame(us_senate_network, what = "edges")
# This puts the text of the tweet itself into the edge
# so when you hover over a line in the diagram it will show the tweet
us_senate_edges <- us_senate_edges %>%
mutate(title = text)
# Creates the diagram
visNetwork(us_senate_nodes, us_senate_edges, main = "Retweet network US senate Around Billings") %>%
visIgraphLayout(layout = "layout_nicely") %>%
visEdges(arrows = "to")
us_senate_network %>%
vcount()
[1] 487
us_senate_network %>%
ecount()
[1] 453
us_senate_edges %>%
select(from, to, text)
us_senate_network %>%
edge_density
[1] 0.001913961
bg_reporters <- c("RobRogersBG",
"samalwilson",
"BGKord",
"BGmhoffman",
"DarrellEhrlick",
"BGMayer",
"bgSueOlp",
"hollykmichels",
"kscherting",
"TomLutey",
"PhoebeTollefson")
bg_tweets <- get_timeline(bg_reporters, n = 500)
# create network, including only members of our group
bg_mentions_network <- bg_tweets %>%
filter(mentions_screen_name %in% bg_reporters) %>%
gt_edges(screen_name, mentions_screen_name, text) %>%
gt_graph
#get nodes
bg_mentions_nodes <- as_data_frame(bg_mentions_network, what = "vertices")
# get edges
bg_mentions_edges <- as_data_frame(bg_mentions_network, what = "edges")
# add info to nodes
bg_mentions_nodes <- bg_mentions_nodes %>%
mutate(id = name) %>%
mutate(label = name) %>%
mutate(title = name) %>%
mutate(degree = degree(bg_mentions_network)) %>%
mutate(value = degree)
# add info to edges
bg_mentions_edges <- bg_mentions_edges %>%
mutate(title = text)
# create the network diagram
visNetwork(bg_mentions_nodes,
bg_mentions_edges,
main = "Billings Gazette Reporters Twitter Mentions Network") %>%
visIgraphLayout(layout = "layout_nicely") %>%
visEdges(arrows = "to")
bg_mentions_nodes %>%
select(name, degree)
One group of lists comes from TwitterGov. Here are a few of the government lists they keep: “us-cabinet” (n = 41), “us-governors” (n = 50), “world-leaders” (n = 107), “us-senate” (n = 180). The senate list has 180 even though there are 100 senators because it includes personal accounts of the senators as well as their official senate accounts.
senate <- lists_members(slug = "us-senate", owner_user = "TwitterGov")
senate_tweets <- get_timeline(senate$screen_name, n = 180)
# This creates the network with some commands from graphTweets
# The variables in the parentheses of gt_edges() are used, so in this case we're using retweets
senate_retweets_network <- senate_tweets %>%
filter(retweet_screen_name %in% senate$screen_name) %>% # <- This is a new line and important.
gt_edges(screen_name, retweet_screen_name, text) %>% # It only keep retweets of other cabinet members
gt_graph()
# This next line gets the nodes
senate_retweets_nodes <- as_data_frame(senate_retweets_network, what = "vertices")
# This adds some additional info to the nodes, so we get the names on hover
# and the size of the node is based on its degree, etc.
senate_retweets_nodes <- senate_retweets_nodes %>%
mutate(id = name) %>%
mutate(label = name) %>%
mutate(title = name) %>%
mutate(degree = degree(senate_retweets_network)) %>%
mutate(value = degree)
# This gets the edges, similar to how we got the nodes above
senate_retweets_edges <- as_data_frame(senate_retweets_network, what = "edges")
# This puts the text of the tweet itself into the edge
# so when you hover over a line in the diagram it will show the tweet
senate_retweets_edges <- senate_retweets_edges %>%
mutate(title = text)
# Creates the diagram
visNetwork(senate_retweets_nodes, senate_retweets_edges, main = "US senate officials retweet network") %>%
visIgraphLayout(layout = "layout_nicely") %>%
visEdges(arrows = "to")
senate_retweets_nodes <- senate_retweets_nodes %>%
mutate(group = membership(infomap.community(senate_retweets_network)))
Modularity is implemented for undirected graphs only.
visNetwork(cabinet_retweets_nodes, cabinet_retweets_edges, main = "US senate officials retweet network") %>%
visIgraphLayout(layout = "layout_nicely") %>%
visEdges(arrows = "to") %>%
visOptions(highlightNearest = T, nodesIdSelection = T, selectedBy = "group")
Can't find 'group' in node data.frame
senate_retweets_nodes <- senate_retweets_nodes %>%
mutate(group = membership(infomap.community(senate_retweets_network)))
Modularity is implemented for undirected graphs only.
visNetwork(senate_retweets_nodes, senate_retweets_edges, main = "US senate officials retweet network") %>%
visIgraphLayout(layout = "layout_nicely") %>%
visEdges(arrows = "to") %>%
visOptions(highlightNearest = T, nodesIdSelection = T, selectedBy = "group")
LS0tCnRpdGxlOiAiUmllc2VuIHJldHdlZXRzIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgoxLiBVc2UgdGhlIHVzLXNlbmF0ZSBsaXN0IHRvIGdldCB0aGUgbGFzdCAyMDAgdHdlZXRzIGZyb20gVVMgc2VuYXRvcnMuICAKMi4gQ3JlYXRlIGEgbmV0d29yayBvZiByZXR3ZWV0cy4gIAozLiBHZXQgYSBjb3VudCBvZiBub2RlcyBhbmQgZWRnZXMsIGFuZCBnZXQgdGhlIGRlbnNpdHkgb2YgdGhlIG5ldHdvcmsuICAKNC4gQ3JlYXRlIGEgZGF0YSB0YWJsZSBvZiB0aGUgc2VuYXRvcnMsIHNob3dpbmcgb25seSB0aGVpciBuYW1lcyBhbmQgZGVncmVlLiAgCjUuIEZpbmQgY29tbXVuaXRpZXMgYW5kIG1ha2UgYSBuZXR3b3JrIGRpYWdyYW0gc2hvd2luZyB0aGUgY29tbXVuaXRpZXMuIChZb3UgbWF5IG1ha2UgdHdvIGRpYWdyYW1zLCBvbmUgd2l0aCB0aGUgY29tbXVuaXRpZXMgYW5kIG9uZSB3aXRob3V0LikKCmBgYHtyfQp1c19zZW5hdGUgPC0gc2VhcmNoX3R3ZWV0cwpgYGAKCgpgYGB7cn0KdXNfc2VuYXRlIDwtIHNlYXJjaF90d2VldHMoZ2VvY29kZSA9ICI0NS44MCwtMTA4LjU1LDI1bWkiLCBuID0gMjAwKQoKYGBgCgpgYGB7cn0KIyBUaGlzIGNyZWF0ZXMgdGhlIG5ldHdvcmsgd2l0aCBzb21lIGNvbW1hbmRzIGZyb20gZ3JhcGhUd2VldHMKIyBUaGUgdmFyaWFibGVzIGluIHRoZSBwYXJlbnRoZXNlcyBvZiBndF9lZGdlcygpIGFyZSB1c2VkLCBzbyBpbiB0aGlzIGNhc2Ugd2UncmUgdXNpbmcgcmV0d2VldHMKIyBXZSdyZSBhbHNvIGtlZXBpbmcgdGV4dCBvZiB0aGUgdHdlZXRzCnVzX3NlbmF0ZV9uZXR3b3JrIDwtIGJsX3R3ZWV0cyAlPiUgCiAgZ3RfZWRnZXMoc2NyZWVuX25hbWUsIHJldHdlZXRfc2NyZWVuX25hbWUsIHRleHQpICU+JSAKICBndF9ncmFwaCgpCgoKIyBUaGlzIG5leHQgbGluZSBnZXRzIHRoZSBub2Rlcwp1c19zZW5hdGVfbm9kZXMgPC0gYXNfZGF0YV9mcmFtZSh1c19zZW5hdGVfbmV0d29yaywgd2hhdCA9ICJ2ZXJ0aWNlcyIpCgojIFRoaXMgYWRkcyBzb21lIGFkZGl0aW9uYWwgaW5mbyB0byB0aGUgbm9kZXMsIHNvIHdlIGdldCB0aGUgbmFtZXMgb24gaG92ZXIKIyBhbmQgdGhlIHNpemUgb2YgdGhlIG5vZGUgaXMgYmFzZWQgb24gaXRzIGRlZ3JlZSwgZXRjLgp1c19zZW5hdGVfbm9kZXMgPC0gdXNfc2VuYXRlX25vZGVzICU+JSAKICBtdXRhdGUoaWQgPSBuYW1lKSAlPiUgCiAgbXV0YXRlKGxhYmVsID0gbmFtZSkgJT4lIAogIG11dGF0ZSh0aXRsZSA9IG5hbWUpICU+JSAKICBtdXRhdGUoZGVncmVlID0gZGVncmVlKHVzX3NlbmF0ZV9uZXR3b3JrKSkgJT4lIAogIG11dGF0ZSh2YWx1ZSA9IGRlZ3JlZSkKCiMgVGhpcyBnZXRzIHRoZSBlZGdlcywgc2ltaWxhciB0byBob3cgd2UgZ290IHRoZSBub2RlcyBhYm92ZQp1c19zZW5hdGVfZWRnZXMgPC0gYXNfZGF0YV9mcmFtZSh1c19zZW5hdGVfbmV0d29yaywgd2hhdCA9ICJlZGdlcyIpCgojIFRoaXMgcHV0cyB0aGUgdGV4dCBvZiB0aGUgdHdlZXQgaXRzZWxmIGludG8gdGhlIGVkZ2UKIyBzbyB3aGVuIHlvdSBob3ZlciBvdmVyIGEgbGluZSBpbiB0aGUgZGlhZ3JhbSBpdCB3aWxsIHNob3cgdGhlIHR3ZWV0CnVzX3NlbmF0ZV9lZGdlcyA8LSB1c19zZW5hdGVfZWRnZXMgJT4lIAogIG11dGF0ZSh0aXRsZSA9IHRleHQpCgojIENyZWF0ZXMgdGhlIGRpYWdyYW0KdmlzTmV0d29yayh1c19zZW5hdGVfbm9kZXMsIHVzX3NlbmF0ZV9lZGdlcywgbWFpbiA9ICJSZXR3ZWV0IG5ldHdvcmsgVVMgc2VuYXRlIEFyb3VuZCBCaWxsaW5ncyIpICU+JSAKICB2aXNJZ3JhcGhMYXlvdXQobGF5b3V0ID0gImxheW91dF9uaWNlbHkiKSAlPiUgCiAgdmlzRWRnZXMoYXJyb3dzID0gInRvIikKYGBgCgoKCgpgYGB7cn0KdXNfc2VuYXRlX25ldHdvcmsgJT4lIAogIHZjb3VudCgpCmBgYAoKYGBge3J9CnVzX3NlbmF0ZV9uZXR3b3JrICU+JSAKICBlY291bnQoKQpgYGAKCmBgYHtyfQp1c19zZW5hdGVfZWRnZXMgJT4lCiAgc2VsZWN0KGZyb20sIHRvLCB0ZXh0KQpgYGAKCmBgYHtyfQp1c19zZW5hdGVfbmV0d29yayAlPiUKICBlZGdlX2RlbnNpdHkKYGBgCgoKCmBgYHtyfQpiZ19yZXBvcnRlcnMgPC0gYygiUm9iUm9nZXJzQkciLCAKICAgICAgICAgICAgICAgICAgInNhbWFsd2lsc29uIiwgCiAgICAgICAgICAgICAgICAgICJCR0tvcmQiLCAKICAgICAgICAgICAgICAgICAgIkJHbWhvZmZtYW4iLCAKICAgICAgICAgICAgICAgICAgIkRhcnJlbGxFaHJsaWNrIiwgCiAgICAgICAgICAgICAgICAgICJCR01heWVyIiwgCiAgICAgICAgICAgICAgICAgICJiZ1N1ZU9scCIsIAogICAgICAgICAgICAgICAgICAiaG9sbHlrbWljaGVscyIsIAogICAgICAgICAgICAgICAgICAia3NjaGVydGluZyIsIAogICAgICAgICAgICAgICAgICAiVG9tTHV0ZXkiLCAKICAgICAgICAgICAgICAgICAgIlBob2ViZVRvbGxlZnNvbiIpCgpiZ190d2VldHMgPC0gZ2V0X3RpbWVsaW5lKGJnX3JlcG9ydGVycywgbiA9IDUwMCkKYGBgCgoKCmBgYHtyfQojIGNyZWF0ZSBuZXR3b3JrLCBpbmNsdWRpbmcgb25seSBtZW1iZXJzIG9mIG91ciBncm91cApiZ19tZW50aW9uc19uZXR3b3JrIDwtIGJnX3R3ZWV0cyAlPiUgCiAgZmlsdGVyKG1lbnRpb25zX3NjcmVlbl9uYW1lICVpbiUgYmdfcmVwb3J0ZXJzKSAlPiUgCiAgZ3RfZWRnZXMoc2NyZWVuX25hbWUsIG1lbnRpb25zX3NjcmVlbl9uYW1lLCB0ZXh0KSAlPiUgCiAgZ3RfZ3JhcGgKCgojZ2V0IG5vZGVzCmJnX21lbnRpb25zX25vZGVzIDwtIGFzX2RhdGFfZnJhbWUoYmdfbWVudGlvbnNfbmV0d29yaywgd2hhdCA9ICJ2ZXJ0aWNlcyIpCgoKIyBnZXQgZWRnZXMKYmdfbWVudGlvbnNfZWRnZXMgPC0gYXNfZGF0YV9mcmFtZShiZ19tZW50aW9uc19uZXR3b3JrLCB3aGF0ID0gImVkZ2VzIikKCgojIGFkZCBpbmZvIHRvIG5vZGVzCmJnX21lbnRpb25zX25vZGVzIDwtIGJnX21lbnRpb25zX25vZGVzICU+JSAKICBtdXRhdGUoaWQgPSBuYW1lKSAlPiUgCiAgbXV0YXRlKGxhYmVsID0gbmFtZSkgJT4lIAogIG11dGF0ZSh0aXRsZSA9IG5hbWUpICU+JSAKICBtdXRhdGUoZGVncmVlID0gZGVncmVlKGJnX21lbnRpb25zX25ldHdvcmspKSAlPiUgCiAgbXV0YXRlKHZhbHVlID0gZGVncmVlKQoKIyBhZGQgaW5mbyB0byBlZGdlcwpiZ19tZW50aW9uc19lZGdlcyA8LSBiZ19tZW50aW9uc19lZGdlcyAlPiUgCiAgbXV0YXRlKHRpdGxlID0gdGV4dCkKCgojIGNyZWF0ZSB0aGUgbmV0d29yayBkaWFncmFtCnZpc05ldHdvcmsoYmdfbWVudGlvbnNfbm9kZXMsIAogICAgICAgICAgIGJnX21lbnRpb25zX2VkZ2VzLAogICAgICAgICAgIG1haW4gPSAiQmlsbGluZ3MgR2F6ZXR0ZSBSZXBvcnRlcnMgVHdpdHRlciBNZW50aW9ucyBOZXR3b3JrIikgJT4lIAogIHZpc0lncmFwaExheW91dChsYXlvdXQgPSAibGF5b3V0X25pY2VseSIpICU+JSAKICB2aXNFZGdlcyhhcnJvd3MgPSAidG8iKQpgYGAKCgoKCgoKYGBge3J9CmJnX21lbnRpb25zX25vZGVzICU+JQogIHNlbGVjdChuYW1lLCBkZWdyZWUpCmBgYAoKCgpPbmUgZ3JvdXAgb2YgbGlzdHMgY29tZXMgZnJvbSBUd2l0dGVyR292LiBIZXJlIGFyZSBhIGZldyBvZiB0aGUgZ292ZXJubWVudCBsaXN0cyB0aGV5IGtlZXA6ICJ1cy1jYWJpbmV0IiAobiA9IDQxKSwgInVzLWdvdmVybm9ycyIgKG4gPSA1MCksICJ3b3JsZC1sZWFkZXJzIiAobiA9IDEwNyksICJ1cy1zZW5hdGUiIChuID0gMTgwKS4gVGhlIHNlbmF0ZSBsaXN0IGhhcyAxODAgZXZlbiB0aG91Z2ggdGhlcmUgYXJlIDEwMCBzZW5hdG9ycyBiZWNhdXNlIGl0IGluY2x1ZGVzIHBlcnNvbmFsIGFjY291bnRzIG9mIHRoZSBzZW5hdG9ycyBhcyB3ZWxsIGFzIHRoZWlyIG9mZmljaWFsIHNlbmF0ZSBhY2NvdW50cy4KCgpgYGB7cn0Kc2VuYXRlIDwtIGxpc3RzX21lbWJlcnMoc2x1ZyA9ICJ1cy1zZW5hdGUiLCBvd25lcl91c2VyID0gIlR3aXR0ZXJHb3YiKQoKc2VuYXRlX3R3ZWV0cyA8LSBnZXRfdGltZWxpbmUoc2VuYXRlJHNjcmVlbl9uYW1lLCBuID0gMTgwKQoKCgpgYGAKCgpgYGB7cn0KIyBUaGlzIGNyZWF0ZXMgdGhlIG5ldHdvcmsgd2l0aCBzb21lIGNvbW1hbmRzIGZyb20gZ3JhcGhUd2VldHMKIyBUaGUgdmFyaWFibGVzIGluIHRoZSBwYXJlbnRoZXNlcyBvZiBndF9lZGdlcygpIGFyZSB1c2VkLCBzbyBpbiB0aGlzIGNhc2Ugd2UncmUgdXNpbmcgcmV0d2VldHMKc2VuYXRlX3JldHdlZXRzX25ldHdvcmsgPC0gc2VuYXRlX3R3ZWV0cyAlPiUgCiAgZmlsdGVyKHJldHdlZXRfc2NyZWVuX25hbWUgJWluJSBzZW5hdGUkc2NyZWVuX25hbWUpICU+JSAgICAgIyA8LSBUaGlzIGlzIGEgbmV3IGxpbmUgYW5kIGltcG9ydGFudC4KICBndF9lZGdlcyhzY3JlZW5fbmFtZSwgcmV0d2VldF9zY3JlZW5fbmFtZSwgdGV4dCkgJT4lICAgICAgICAgICAgICMgSXQgb25seSBrZWVwIHJldHdlZXRzIG9mIG90aGVyIGNhYmluZXQgbWVtYmVycwogIGd0X2dyYXBoKCkKCgojIFRoaXMgbmV4dCBsaW5lIGdldHMgdGhlIG5vZGVzCnNlbmF0ZV9yZXR3ZWV0c19ub2RlcyA8LSBhc19kYXRhX2ZyYW1lKHNlbmF0ZV9yZXR3ZWV0c19uZXR3b3JrLCB3aGF0ID0gInZlcnRpY2VzIikKCiMgVGhpcyBhZGRzIHNvbWUgYWRkaXRpb25hbCBpbmZvIHRvIHRoZSBub2Rlcywgc28gd2UgZ2V0IHRoZSBuYW1lcyBvbiBob3ZlcgojIGFuZCB0aGUgc2l6ZSBvZiB0aGUgbm9kZSBpcyBiYXNlZCBvbiBpdHMgZGVncmVlLCBldGMuCnNlbmF0ZV9yZXR3ZWV0c19ub2RlcyA8LSBzZW5hdGVfcmV0d2VldHNfbm9kZXMgJT4lIAogIG11dGF0ZShpZCA9IG5hbWUpICU+JSAKICBtdXRhdGUobGFiZWwgPSBuYW1lKSAlPiUgCiAgbXV0YXRlKHRpdGxlID0gbmFtZSkgJT4lIAogIG11dGF0ZShkZWdyZWUgPSBkZWdyZWUoc2VuYXRlX3JldHdlZXRzX25ldHdvcmspKSAlPiUgCiAgbXV0YXRlKHZhbHVlID0gZGVncmVlKQoKIyBUaGlzIGdldHMgdGhlIGVkZ2VzLCBzaW1pbGFyIHRvIGhvdyB3ZSBnb3QgdGhlIG5vZGVzIGFib3ZlCnNlbmF0ZV9yZXR3ZWV0c19lZGdlcyA8LSBhc19kYXRhX2ZyYW1lKHNlbmF0ZV9yZXR3ZWV0c19uZXR3b3JrLCB3aGF0ID0gImVkZ2VzIikKCiMgVGhpcyBwdXRzIHRoZSB0ZXh0IG9mIHRoZSB0d2VldCBpdHNlbGYgaW50byB0aGUgZWRnZQojIHNvIHdoZW4geW91IGhvdmVyIG92ZXIgYSBsaW5lIGluIHRoZSBkaWFncmFtIGl0IHdpbGwgc2hvdyB0aGUgdHdlZXQKc2VuYXRlX3JldHdlZXRzX2VkZ2VzIDwtIHNlbmF0ZV9yZXR3ZWV0c19lZGdlcyAlPiUgCiAgbXV0YXRlKHRpdGxlID0gdGV4dCkKCiMgQ3JlYXRlcyB0aGUgZGlhZ3JhbQp2aXNOZXR3b3JrKHNlbmF0ZV9yZXR3ZWV0c19ub2Rlcywgc2VuYXRlX3JldHdlZXRzX2VkZ2VzLCBtYWluID0gIlVTIHNlbmF0ZSBvZmZpY2lhbHMgcmV0d2VldCBuZXR3b3JrIikgJT4lIAogIHZpc0lncmFwaExheW91dChsYXlvdXQgPSAibGF5b3V0X25pY2VseSIpICU+JSAKICB2aXNFZGdlcyhhcnJvd3MgPSAidG8iKQpgYGAKCmBgYHtyfQpzZW5hdGVfcmV0d2VldHNfbm9kZXMgPC0gc2VuYXRlX3JldHdlZXRzX25vZGVzICU+JSAKICBtdXRhdGUoZ3JvdXAgPSBtZW1iZXJzaGlwKGluZm9tYXAuY29tbXVuaXR5KHNlbmF0ZV9yZXR3ZWV0c19uZXR3b3JrKSkpCgp2aXNOZXR3b3JrKGNhYmluZXRfcmV0d2VldHNfbm9kZXMsIGNhYmluZXRfcmV0d2VldHNfZWRnZXMsIG1haW4gPSAiVVMgc2VuYXRlIG9mZmljaWFscyByZXR3ZWV0IG5ldHdvcmsiKSAlPiUgCiAgdmlzSWdyYXBoTGF5b3V0KGxheW91dCA9ICJsYXlvdXRfbmljZWx5IikgJT4lIAogIHZpc0VkZ2VzKGFycm93cyA9ICJ0byIpICU+JSAgIAogIHZpc09wdGlvbnMoaGlnaGxpZ2h0TmVhcmVzdCA9IFQsIG5vZGVzSWRTZWxlY3Rpb24gPSBULCBzZWxlY3RlZEJ5ID0gImdyb3VwIikKYGBgCgoKYGBge3J9CnNlbmF0ZV9yZXR3ZWV0c19ub2RlcyA8LSBzZW5hdGVfcmV0d2VldHNfbm9kZXMgJT4lIAogIG11dGF0ZShncm91cCA9IG1lbWJlcnNoaXAoaW5mb21hcC5jb21tdW5pdHkoc2VuYXRlX3JldHdlZXRzX25ldHdvcmspKSkKCnZpc05ldHdvcmsoc2VuYXRlX3JldHdlZXRzX25vZGVzLCBzZW5hdGVfcmV0d2VldHNfZWRnZXMsIG1haW4gPSAiVVMgc2VuYXRlIG9mZmljaWFscyByZXR3ZWV0IG5ldHdvcmsiKSAlPiUgCiAgdmlzSWdyYXBoTGF5b3V0KGxheW91dCA9ICJsYXlvdXRfbmljZWx5IikgJT4lIAogIHZpc0VkZ2VzKGFycm93cyA9ICJ0byIpICU+JSAgIAogIHZpc09wdGlvbnMoaGlnaGxpZ2h0TmVhcmVzdCA9IFQsIG5vZGVzSWRTZWxlY3Rpb24gPSBULCBzZWxlY3RlZEJ5ID0gImdyb3VwIikKYGBgCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg==