On this first assignment, applying the basic functions of the Igraph package is required. The following datasets are going to be used:

You have to complete the code chunks in this document but also analyze the results, extract insights and answer the short questions. Fill the CSV attached with your answers, sometimes just the number is enough, some others just a small sentence. Remember to change the header with your email.

In your submission please upload both the R Markdown and the CSV with the solutions.

Loading data

In this section, the goal is loading the datasets given, building the graph and analyzing basics metrics. Include the edge or node attributes you consider.

rm(list=ls())
library('igraph')

Attaching package: ‘igraph’

The following objects are masked from ‘package:stats’:

    decompose, spectrum

The following object is masked from ‘package:base’:

    union
library('ggplot2')
actors_dataset <- read.table("/Users/sauravghoshroy/Downloads/imdb_actors_key.tsv",header = TRUE, sep = '\t')
actors_edges <- read.table("/Users/sauravghoshroy/Downloads/imdb_actor_edges.tsv", header = TRUE, sep = '\t')
g <- graph_from_data_frame(d = actors_edges, directed = FALSE, vertices = actors_dataset)
summary(g)
IGRAPH d5b8d4d UNW- 17577 287074 -- 
+ attr: name (v/c), movies_95_04 (v/n), main_genre (v/c), genres (v/c), weight (e/n)
sprintf("The vertex attributes considered in graph g are %s",paste(unlist(vertex_attr_names(g)),collapse=","))
[1] "The vertex attributes considered in graph g are name,movies_95_04,main_genre,genres"
sprintf("The edge attribute considered in graph g is %s",paste(unlist(edge_attr_names(g)),collapse=","))
[1] "The edge attribute considered in graph g is weight"
plot(g)

Describe the values provided by summary function on the graph object. 1) How many nodes are there? 2) How many edges are there?

sprintf("There are %i nodes in the graph",gorder(g))
[1] "There are 17577 nodes in the graph"
sprintf("There are %i edges in the graph",gsize(g))
[1] "There are 287074 edges in the graph"

Degree distribution

Analyse the degree distribution. Compute the total degree distribution. 3) How does this distributions look like? 4) What is the maximum degree? 5) What is the minum degree?

degree_distribution <- degree_distribution(g, mode="total",cumulative=TRUE)
plot(degree_distribution,col="red",xlab="Degree",ylab="Distribution")

sprintf("The maximum degree is %i",max(degree(g)))
[1] "The maximum degree is 784"
sprintf("The minimum degree is %i",min(degree(g)))
[1] "The minimum degree is 1"

Network Diameter and Average Path Length

6) What is the diameter of the graph? 7) What is the avg path length of the graph?

diameter <- diameter(g)
mean_distance <- mean_distance(g,unconnected = TRUE)
sprintf("The diameter of the graph is %i",diameter)
[1] "The diameter of the graph is 39"
sprintf("The average distance between nodes is %f", mean_distance)
[1] "The average distance between nodes is 4.890546"

Node importance: Centrality measures

Obtain the distribution of the number of movies made by an actor and the number of genres in which an actor starred in. It may be useful to analyze and discuss the results to be obtained in the following exercises.

Obtain three vectors with the degree, betweeness and closeness for each vertex of the actors’ graph.

degree_vector <- degree(g)
betweenness_vector <- betweenness(g,directed=FALSE)
closeness_vector <- closeness(g)
At centrality.c:2617 :closeness centrality is not well-defined for disconnected graphs
head(degree_vector,5)
Rudder, Michael (I)       Morgan, Debbi        Bellows, Gil        Dray, Albert     Daly, Shane (I) 
                 36                  23                  22                  23                  46 
head(betweenness_vector,5)
Rudder, Michael (I)       Morgan, Debbi        Bellows, Gil        Dray, Albert     Daly, Shane (I) 
           3929.012           21716.283           13283.000          111250.619           39968.780 
head(closeness_vector,5)
Rudder, Michael (I)       Morgan, Debbi        Bellows, Gil        Dray, Albert     Daly, Shane (I) 
       4.337794e-07        4.367972e-07        4.344953e-07        4.348333e-07        4.354900e-07 

Obtain the list of the 20 actors with the largest degree centrality. It can be useful to show a list with the degree, the name of the actor, the number of movies, the main genre, and the number of genres in which the actor has participated.

8) Who is the actor with highest degree centrality? 9) How do you explain the high degree of the top-20 list??

top20_degree <- head(sort(degree_vector,decreasing = TRUE),20)

top_20_degrees <- data.frame('degree'=top20_degree,'name'=names(top20_degree),'no_movies'=(vertex_attr(g, "movies_95_04",index = names(top20_degree))),'main_genre'=vertex_attr(g, "main_genre",index = names(top20_degree)),'no_of_genres'=lengths(strsplit(vertex_attr(g, "genres",index = names(top20_degree)),",")))
top_20_degrees

Obtain the list of the 20 actors with the largest betweenness centrality. Show a list with the betweenness, the name of the actor, the number of movies, the main genre, and the number of genres in which the actor has participated. 10) Who is the actor with highest betweenes? 11) How do you explain the high betweenness of the top-20 list?

top20_betweenness <- head(sort(betweenness_vector,decreasing = TRUE),20)
top20_betweenness
         Jeremy, Ron     Shahlavi, Darren Del Rosario, Monsour     Chan, Jackie (I) 
             8433928              4302671              4267096              4148216 
      Cruz, Penélope    Depardieu, Gérard      Arquette, David    Bachchan, Amitabh 
             3730691              3297737              2717568              2512696 
   Soualem, Zinedine            Kier, Udo      Del Rio, Olivia                 Pelé 
             2367794              2331680              2300975              2263239 
               Ice-T       Corbett, Denis     Jaenicke, Hannes       Knaup, Herbert 
             2246827              2138339              2072783              2050590 
         Dogg, Snoop   Deneuve, Catherine   Jackson, Samuel L.   Táborský, Miroslav 
             1983749              1979450              1958456              1901014 
top_20_betweenness <- data.frame('betweenness'=top20_betweenness,'name'=names(top20_betweenness),'no_movies'=(vertex_attr(g, "movies_95_04",index = names(top20_betweenness))),'main_genre'=vertex_attr(g, "main_genre",index = names(top20_betweenness)),'no_of_genres'=lengths(strsplit(vertex_attr(g, "genres",index = names(top20_betweenness)),",")))
top_20_betweenness

Obtain the list of the 20 actors with the largest closeness centrality. Show a list with the closeness the name of the actor, the number of movies, the main genre, and the number of genres in which the actor has participated.

12) Who is the actor with highest closeness centrality? 13) How do you explain the high closeness of the top-20 list?

top20_closeness <- head(sort(closeness_vector,decreasing = TRUE),20)
top20_closeness
       Diaz, Cameron     Goldberg, Whoopi           Hanks, Tom         Berry, Halle 
        4.410807e-07         4.410499e-07         4.409749e-07         4.409620e-07 
  Jackson, Samuel L. Douglas, Michael (I)      De Niro, Robert    Willis, Bruce (I) 
        4.409037e-07         4.408397e-07         4.407583e-07         4.407255e-07 
      Hopper, Dennis   Washington, Denzel      Hoffman, Dustin       Kidman, Nicole 
        4.407032e-07         4.406898e-07         4.406478e-07         4.406459e-07 
      Travolta, John         Stiller, Ben       Cruz, Penélope      Myers, Mike (I) 
        4.405315e-07         4.405156e-07         4.405149e-07         4.404999e-07 
    Woods, James (I)   Ford, Harrison (I)  Lopez, Jennifer (I)      Smith, Will (I) 
        4.404951e-07         4.404904e-07         4.404780e-07         4.404371e-07 
top_20_closeness <- data.frame('closeness'=top20_closeness,'name'=names(top20_closeness),'no_movies'=(vertex_attr(g, "movies_95_04",index = names(top20_closeness))),'main_genre'=vertex_attr(g, "main_genre",index = names(top20_closeness)),'no_of_genres'=lengths(strsplit(vertex_attr(g, "genres",index = names(top20_closeness)),",")))
top_20_closeness

Network Models (Optional)

Explore the Erdös-Renyi model and compare its structural properties to those of real-world networks (actors):

Comunity detection (Optional)

Use any community detection algorithm for the actors’ network and discuss whether the communities found make sense according to the vertex labels.

LS0tCnRpdGxlOiAiQXNzaWdubWVudCIKb3V0cHV0OgogIHdvcmRfZG9jdW1lbnQ6IGRlZmF1bHQKICBwZGZfZG9jdW1lbnQ6IGRlZmF1bHQKICBodG1sX25vdGVib29rOiBkZWZhdWx0CmVtYWlsOiBzYXVyYXZAc3R1ZGVudC5pZS5lZHUKLS0tCgoKT24gdGhpcyBmaXJzdCBhc3NpZ25tZW50LCBhcHBseWluZyB0aGUgYmFzaWMgZnVuY3Rpb25zIG9mIHRoZSBJZ3JhcGggcGFja2FnZSBpcyByZXF1aXJlZC4gVGhlIGZvbGxvd2luZyBkYXRhc2V0cyBhcmUgZ29pbmcgdG8gYmUgdXNlZDoKCiogQWN0b3JzIGRhdGFzZXQgLSB1bmRpcmVjdGVkIGdyYXBoIC0gOiBGb3IgdGhlIDIwMDUgR3JhcGggRHJhd2luZyBjb25mZXJlbmNlIGEgZGF0YSBzZXQgd2FzIHByb3ZpZGVkIG9mIHRoZSBJTURCIG1vdmllIGRhdGFiYXNlLiBXZSB3aWxsIHVzZSBhIHJlZHVjZWQgdmVyc2lvbiBvZiB0aGlzIGRhdGFzZXQsIHdoaWNoIGRlcml2ZWQgYWxsIGFjdG9yLWFjdG9yIGNvbGxhYm9yYXRpb24gZWRnZXMgd2hlcmUgdGhlIGFjdG9ycyBjby1zdGFycmVkIGluIGF0IGxlYXN0IDIgbW92aWVzIHRvZ2V0aGVyIGJldHdlZW4gMTk5NSBhbmQgMjAwNC4gCgoKWW91IGhhdmUgdG8gY29tcGxldGUgdGhlIGNvZGUgY2h1bmtzIGluIHRoaXMgZG9jdW1lbnQgYnV0IGFsc28gYW5hbHl6ZSB0aGUgcmVzdWx0cywgZXh0cmFjdCBpbnNpZ2h0cyBhbmQgYW5zd2VyIHRoZSBzaG9ydCBxdWVzdGlvbnMuIEZpbGwgdGhlIENTViBhdHRhY2hlZCB3aXRoIHlvdXIgYW5zd2Vycywgc29tZXRpbWVzIGp1c3QgdGhlIG51bWJlciBpcyBlbm91Z2gsIHNvbWUgb3RoZXJzIGp1c3QgYSBzbWFsbCBzZW50ZW5jZS4gUmVtZW1iZXIgdG8gY2hhbmdlIHRoZSBoZWFkZXIgd2l0aCB5b3VyIGVtYWlsLgoKSW4geW91ciBzdWJtaXNzaW9uIHBsZWFzZSB1cGxvYWQgYm90aCB0aGUgUiBNYXJrZG93biBhbmQgdGhlIENTViB3aXRoIHRoZSBzb2x1dGlvbnMuCgoKIyBMb2FkaW5nIGRhdGEKCkluIHRoaXMgc2VjdGlvbiwgdGhlIGdvYWwgaXMgbG9hZGluZyB0aGUgZGF0YXNldHMgZ2l2ZW4sIGJ1aWxkaW5nIHRoZSBncmFwaCBhbmQgYW5hbHl6aW5nIGJhc2ljcyBtZXRyaWNzLiBJbmNsdWRlIHRoZSBlZGdlIG9yIG5vZGUgYXR0cmlidXRlcyB5b3UgY29uc2lkZXIuCgpgYGB7cn0Kcm0obGlzdD1scygpKQpsaWJyYXJ5KCdpZ3JhcGgnKQpsaWJyYXJ5KCdnZ3Bsb3QyJykKYWN0b3JzX2RhdGFzZXQgPC0gcmVhZC50YWJsZSgiL1VzZXJzL3NhdXJhdmdob3Nocm95L0Rvd25sb2Fkcy9pbWRiX2FjdG9yc19rZXkudHN2IixoZWFkZXIgPSBUUlVFLCBzZXAgPSAnXHQnKQphY3RvcnNfZWRnZXMgPC0gcmVhZC50YWJsZSgiL1VzZXJzL3NhdXJhdmdob3Nocm95L0Rvd25sb2Fkcy9pbWRiX2FjdG9yX2VkZ2VzLnRzdiIsIGhlYWRlciA9IFRSVUUsIHNlcCA9ICdcdCcpCmcgPC0gZ3JhcGhfZnJvbV9kYXRhX2ZyYW1lKGQgPSBhY3RvcnNfZWRnZXMsIGRpcmVjdGVkID0gRkFMU0UsIHZlcnRpY2VzID0gYWN0b3JzX2RhdGFzZXQpCnN1bW1hcnkoZykKc3ByaW50ZigiVGhlIHZlcnRleCBhdHRyaWJ1dGVzIGNvbnNpZGVyZWQgaW4gZ3JhcGggZyBhcmUgJXMiLHBhc3RlKHVubGlzdCh2ZXJ0ZXhfYXR0cl9uYW1lcyhnKSksY29sbGFwc2U9IiwiKSkKc3ByaW50ZigiVGhlIGVkZ2UgYXR0cmlidXRlIGNvbnNpZGVyZWQgaW4gZ3JhcGggZyBpcyAlcyIscGFzdGUodW5saXN0KGVkZ2VfYXR0cl9uYW1lcyhnKSksY29sbGFwc2U9IiwiKSkKcGxvdChnKQpgYGAKCgpEZXNjcmliZSB0aGUgdmFsdWVzIHByb3ZpZGVkIGJ5IHN1bW1hcnkgZnVuY3Rpb24gb24gdGhlIGdyYXBoIG9iamVjdC4KKjEpIEhvdyBtYW55IG5vZGVzIGFyZSB0aGVyZT8qCioyKSBIb3cgbWFueSBlZGdlcyBhcmUgdGhlcmU/KgoKCmBgYHtyfQpzcHJpbnRmKCJUaGVyZSBhcmUgJWkgbm9kZXMgaW4gdGhlIGdyYXBoIixnb3JkZXIoZykpCnNwcmludGYoIlRoZXJlIGFyZSAlaSBlZGdlcyBpbiB0aGUgZ3JhcGgiLGdzaXplKGcpKQpgYGAKCgojIERlZ3JlZSBkaXN0cmlidXRpb24KCgpBbmFseXNlIHRoZSBkZWdyZWUgZGlzdHJpYnV0aW9uLiBDb21wdXRlIHRoZSB0b3RhbCBkZWdyZWUgZGlzdHJpYnV0aW9uLgoqMykgSG93IGRvZXMgdGhpcyBkaXN0cmlidXRpb25zIGxvb2sgbGlrZT8qCio0KSBXaGF0IGlzIHRoZSBtYXhpbXVtIGRlZ3JlZT8qCio1KSBXaGF0IGlzIHRoZSBtaW51bSBkZWdyZWU/KgpgYGB7cn0KZGVncmVlX2Rpc3RyaWJ1dGlvbiA8LSBkZWdyZWVfZGlzdHJpYnV0aW9uKGcsIG1vZGU9InRvdGFsIixjdW11bGF0aXZlPVRSVUUpCnBsb3QoZGVncmVlX2Rpc3RyaWJ1dGlvbixjb2w9InJlZCIseGxhYj0iRGVncmVlIix5bGFiPSJEaXN0cmlidXRpb24iKQpzcHJpbnRmKCJUaGUgbWF4aW11bSBkZWdyZWUgaXMgJWkiLG1heChkZWdyZWUoZykpKQpzcHJpbnRmKCJUaGUgbWluaW11bSBkZWdyZWUgaXMgJWkiLG1pbihkZWdyZWUoZykpKQpgYGAKCgoKCgojIE5ldHdvcmsgRGlhbWV0ZXIgYW5kIEF2ZXJhZ2UgUGF0aCBMZW5ndGgKKjYpIFdoYXQgaXMgdGhlIGRpYW1ldGVyIG9mIHRoZSBncmFwaD8qCio3KSBXaGF0IGlzIHRoZSBhdmcgcGF0aCBsZW5ndGggb2YgdGhlIGdyYXBoPyoKYGBge3J9CmRpYW1ldGVyIDwtIGRpYW1ldGVyKGcpCm1lYW5fZGlzdGFuY2UgPC0gbWVhbl9kaXN0YW5jZShnLHVuY29ubmVjdGVkID0gVFJVRSkKc3ByaW50ZigiVGhlIGRpYW1ldGVyIG9mIHRoZSBncmFwaCBpcyAlaSIsZGlhbWV0ZXIpCnNwcmludGYoIlRoZSBhdmVyYWdlIGRpc3RhbmNlIGJldHdlZW4gbm9kZXMgaXMgJWYiLCBtZWFuX2Rpc3RhbmNlKQpgYGAKCgojIE5vZGUgaW1wb3J0YW5jZTogQ2VudHJhbGl0eSBtZWFzdXJlcwoKT2J0YWluIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIG51bWJlciBvZiBtb3ZpZXMgbWFkZSBieSBhbiBhY3RvciBhbmQgdGhlIG51bWJlciBvZiBnZW5yZXMgaW4gd2hpY2ggYW4gYWN0b3Igc3RhcnJlZCBpbi4gSXQgbWF5IGJlIHVzZWZ1bCB0byBhbmFseXplIGFuZCBkaXNjdXNzIHRoZSByZXN1bHRzIHRvIGJlIG9idGFpbmVkIGluIHRoZSBmb2xsb3dpbmcgZXhlcmNpc2VzLgoKYGBge3J9CgpgYGAKCk9idGFpbiB0aHJlZSB2ZWN0b3JzIHdpdGggdGhlIGRlZ3JlZSwgYmV0d2VlbmVzcyBhbmQgY2xvc2VuZXNzIGZvciBlYWNoIHZlcnRleCBvZiB0aGUgYWN0b3JzJyBncmFwaC4KCmBgYHtyfQpkZWdyZWVfdmVjdG9yIDwtIGRlZ3JlZShnKQpiZXR3ZWVubmVzc192ZWN0b3IgPC0gYmV0d2Vlbm5lc3MoZyxkaXJlY3RlZD1GQUxTRSkKY2xvc2VuZXNzX3ZlY3RvciA8LSBjbG9zZW5lc3MoZykKaGVhZChkZWdyZWVfdmVjdG9yLDUpCmhlYWQoYmV0d2Vlbm5lc3NfdmVjdG9yLDUpCmhlYWQoY2xvc2VuZXNzX3ZlY3Rvciw1KQoKYGBgCgoKT2J0YWluIHRoZSBsaXN0IG9mIHRoZSAyMCBhY3RvcnMgd2l0aCB0aGUgbGFyZ2VzdCBkZWdyZWUgY2VudHJhbGl0eS4gSXQgY2FuIGJlIHVzZWZ1bCB0byBzaG93IGEgbGlzdCB3aXRoIHRoZSBkZWdyZWUsIHRoZSBuYW1lIG9mIHRoZSBhY3RvciwgdGhlIG51bWJlciBvZiBtb3ZpZXMsIHRoZSBtYWluIGdlbnJlLCBhbmQgdGhlIG51bWJlciBvZiBnZW5yZXMgaW4gd2hpY2ggdGhlIGFjdG9yIGhhcyBwYXJ0aWNpcGF0ZWQuCgoqOCkgV2hvIGlzIHRoZSBhY3RvciB3aXRoIGhpZ2hlc3QgZGVncmVlIGNlbnRyYWxpdHk/KgoqOSkgSG93IGRvIHlvdSBleHBsYWluIHRoZSBoaWdoIGRlZ3JlZSBvZiB0aGUgdG9wLTIwIGxpc3Q/PyoKYGBge3J9CnRvcDIwX2RlZ3JlZSA8LSBoZWFkKHNvcnQoZGVncmVlX3ZlY3RvcixkZWNyZWFzaW5nID0gVFJVRSksMjApCgp0b3BfMjBfZGVncmVlcyA8LSBkYXRhLmZyYW1lKCdkZWdyZWUnPXRvcDIwX2RlZ3JlZSwnbmFtZSc9bmFtZXModG9wMjBfZGVncmVlKSwnbm9fbW92aWVzJz0odmVydGV4X2F0dHIoZywgIm1vdmllc185NV8wNCIsaW5kZXggPSBuYW1lcyh0b3AyMF9kZWdyZWUpKSksJ21haW5fZ2VucmUnPXZlcnRleF9hdHRyKGcsICJtYWluX2dlbnJlIixpbmRleCA9IG5hbWVzKHRvcDIwX2RlZ3JlZSkpLCdub19vZl9nZW5yZXMnPWxlbmd0aHMoc3Ryc3BsaXQodmVydGV4X2F0dHIoZywgImdlbnJlcyIsaW5kZXggPSBuYW1lcyh0b3AyMF9kZWdyZWUpKSwiLCIpKSkKdG9wXzIwX2RlZ3JlZXMKYGBgCgoKCgpPYnRhaW4gdGhlIGxpc3Qgb2YgdGhlIDIwIGFjdG9ycyB3aXRoIHRoZSBsYXJnZXN0IGJldHdlZW5uZXNzIGNlbnRyYWxpdHkuIFNob3cgYSBsaXN0IHdpdGggdGhlIGJldHdlZW5uZXNzLCB0aGUgbmFtZSBvZiB0aGUgYWN0b3IsIHRoZSBudW1iZXIgb2YgbW92aWVzLCB0aGUgbWFpbiBnZW5yZSwgYW5kIHRoZSBudW1iZXIgb2YgZ2VucmVzIGluIHdoaWNoIHRoZSBhY3RvciBoYXMgcGFydGljaXBhdGVkLgoqMTApIFdobyBpcyB0aGUgYWN0b3Igd2l0aCBoaWdoZXN0IGJldHdlZW5lcz8qCioxMSkgSG93IGRvIHlvdSBleHBsYWluIHRoZSBoaWdoIGJldHdlZW5uZXNzIG9mIHRoZSB0b3AtMjAgbGlzdD8qCmBgYHtyfQp0b3AyMF9iZXR3ZWVubmVzcyA8LSBoZWFkKHNvcnQoYmV0d2Vlbm5lc3NfdmVjdG9yLGRlY3JlYXNpbmcgPSBUUlVFKSwyMCkKdG9wMjBfYmV0d2Vlbm5lc3MKdG9wXzIwX2JldHdlZW5uZXNzIDwtIGRhdGEuZnJhbWUoJ2JldHdlZW5uZXNzJz10b3AyMF9iZXR3ZWVubmVzcywnbmFtZSc9bmFtZXModG9wMjBfYmV0d2Vlbm5lc3MpLCdub19tb3ZpZXMnPSh2ZXJ0ZXhfYXR0cihnLCAibW92aWVzXzk1XzA0IixpbmRleCA9IG5hbWVzKHRvcDIwX2JldHdlZW5uZXNzKSkpLCdtYWluX2dlbnJlJz12ZXJ0ZXhfYXR0cihnLCAibWFpbl9nZW5yZSIsaW5kZXggPSBuYW1lcyh0b3AyMF9iZXR3ZWVubmVzcykpLCdub19vZl9nZW5yZXMnPWxlbmd0aHMoc3Ryc3BsaXQodmVydGV4X2F0dHIoZywgImdlbnJlcyIsaW5kZXggPSBuYW1lcyh0b3AyMF9iZXR3ZWVubmVzcykpLCIsIikpKQp0b3BfMjBfYmV0d2Vlbm5lc3MKYGBgCgoKCgoKT2J0YWluIHRoZSBsaXN0IG9mIHRoZSAyMCBhY3RvcnMgd2l0aCB0aGUgbGFyZ2VzdCBjbG9zZW5lc3MgY2VudHJhbGl0eS4gU2hvdyBhIGxpc3Qgd2l0aCB0aGUgY2xvc2VuZXNzIHRoZSBuYW1lIG9mIHRoZSBhY3RvciwgdGhlIG51bWJlciBvZiBtb3ZpZXMsIHRoZSBtYWluIGdlbnJlLCBhbmQgdGhlIG51bWJlciBvZiBnZW5yZXMgaW4gd2hpY2ggdGhlIGFjdG9yIGhhcyBwYXJ0aWNpcGF0ZWQuCgoqMTIpIFdobyBpcyB0aGUgYWN0b3Igd2l0aCBoaWdoZXN0IGNsb3NlbmVzcyBjZW50cmFsaXR5PyoKKjEzKSBIb3cgZG8geW91IGV4cGxhaW4gdGhlIGhpZ2ggY2xvc2VuZXNzIG9mIHRoZSB0b3AtMjAgbGlzdD8gKgpgYGB7cn0KdG9wMjBfY2xvc2VuZXNzIDwtIGhlYWQoc29ydChjbG9zZW5lc3NfdmVjdG9yLGRlY3JlYXNpbmcgPSBUUlVFKSwyMCkKdG9wMjBfY2xvc2VuZXNzCnRvcF8yMF9jbG9zZW5lc3MgPC0gZGF0YS5mcmFtZSgnY2xvc2VuZXNzJz10b3AyMF9jbG9zZW5lc3MsJ25hbWUnPW5hbWVzKHRvcDIwX2Nsb3NlbmVzcyksJ25vX21vdmllcyc9KHZlcnRleF9hdHRyKGcsICJtb3ZpZXNfOTVfMDQiLGluZGV4ID0gbmFtZXModG9wMjBfY2xvc2VuZXNzKSkpLCdtYWluX2dlbnJlJz12ZXJ0ZXhfYXR0cihnLCAibWFpbl9nZW5yZSIsaW5kZXggPSBuYW1lcyh0b3AyMF9jbG9zZW5lc3MpKSwnbm9fb2ZfZ2VucmVzJz1sZW5ndGhzKHN0cnNwbGl0KHZlcnRleF9hdHRyKGcsICJnZW5yZXMiLGluZGV4ID0gbmFtZXModG9wMjBfY2xvc2VuZXNzKSksIiwiKSkpCnRvcF8yMF9jbG9zZW5lc3MKYGBgCgoKCiMgTmV0d29yayBNb2RlbHMgKE9wdGlvbmFsKQpFeHBsb3JlIHRoZSBFcmTDtnMtUmVueWkgbW9kZWwgYW5kIGNvbXBhcmUgaXRzIHN0cnVjdHVyYWwgcHJvcGVydGllcyB0byB0aG9zZSBvZiByZWFsLXdvcmxkIG5ldHdvcmtzIChhY3RvcnMpOgoKKiBEZWdyZWUgZGlzdHJpYnV0aW9uICBQKGspCiogTmV0d29yayBEaWFtZXRlciBhbmQgQXZlcmFnZSBQYXRoIExlbmd0aAoqIChHbG9iYWwgYW5kIExvY2FsKSBDbHVzdGVyaW5nIENvZWZmaWNpZW50CgoKIyBDb211bml0eSBkZXRlY3Rpb24gKE9wdGlvbmFsKQpVc2UgYW55IGNvbW11bml0eSBkZXRlY3Rpb24gYWxnb3JpdGhtIGZvciB0aGUgYWN0b3JzJyBuZXR3b3JrIGFuZCBkaXNjdXNzIHdoZXRoZXIgdGhlIGNvbW11bml0aWVzIGZvdW5kIG1ha2Ugc2Vuc2UgYWNjb3JkaW5nIHRvIHRoZSB2ZXJ0ZXggbGFiZWxzLgoK