source(here::here("src/common_basis.R"))

Overall

dl <- bind_rows(
    d %>% filter(str_sub(theme,1,1)!='{') %>% mutate(multiple=F),
    d %>% filter(str_sub(theme,1,1)=='{') %>%
        mutate(theme=map(theme,~fromJSON(.) %>% as.data.frame())) %>% 
        unnest(theme) %>% 
        rename(theme=choices)
  ) %>% 
  mutate(ann=TRUE) %>% 
  complete(nesting(annotator_number,name,document_id,media,part,complement,gradation,implicitness),theme,fill=list(ann=FALSE))
New names:New names:
p <- scales::percent_format(accuracy=1)
dl %>% 
  inner_join(dl, join_by(document_id,theme), relationship="many-to-many") %>%
  filter(theme!="not alcohol policy") %>%
  filter(name.x!=name.y) %>%
  mutate(agree=ann.x==ann.y) %>%
  group_by(annotator_number.x,annotator_number.y) %>%
  summarise(agree=sum(agree),pagree=sum(agree)/n(),.groups="drop") %>%
  ggplot(aes(x=annotator_number.x,y=annotator_number.y,fill=pagree)) +
  geom_raster() +
  theme_hsci(base_family="Arial") +
  scale_fill_viridis_c(labels=scales::percent_format(accuracy=1)) +
  geom_text(aes(label=p(pagree))) +
  labs(fill="Agreement") +
  theme(legend.position = "bottom") +
  xlab("Annotator 1") +
  ylab("Annotator 2")

By stage

p <- scales::percent_format(accuracy=1)
dl %>% 
  inner_join(dl, join_by(document_id,part,theme), relationship="many-to-many") %>%
  filter(theme!="not alcohol policy") %>%
  filter(name.x!=name.y) %>%
  mutate(agree=ann.x==ann.y) %>%
  group_by(part,annotator_number.x,annotator_number.y) %>%
  summarise(agree=sum(agree),pagree=sum(agree)/n(),.groups="drop") %>%
  ggplot(aes(x=annotator_number.x,y=annotator_number.y,fill=pagree)) +
  geom_raster() +
  theme_hsci(base_family="Arial") +
  scale_fill_viridis_c(labels=scales::percent_format(accuracy=1)) +
  geom_text(aes(label=p(pagree))) +
  labs(fill="Agreement") +
  theme(legend.position = "bottom") +
  xlab("Annotator 1") +
  ylab("Annotator 2") +
  facet_wrap(~part,scales="free")

By media

p <- scales::percent_format(accuracy=1)
dl %>% 
  inner_join(dl, join_by(document_id,media,theme), relationship="many-to-many") %>%
  filter(theme!="not alcohol policy") %>%
  filter(name.x!=name.y) %>%
  mutate(agree=ann.x==ann.y) %>%
  group_by(media,annotator_number.x,annotator_number.y) %>%
  summarise(agree=sum(agree),pagree=sum(agree)/n(),.groups="drop") %>%
  ggplot(aes(x=annotator_number.x,y=annotator_number.y,fill=pagree)) +
  geom_raster() +
  theme_hsci(base_family="Arial") +
  scale_fill_viridis_c(labels=scales::percent_format(accuracy=1)) +
  geom_text(aes(label=p(pagree))) +
  labs(fill="Agreement") +
  theme(legend.position = "bottom") +
  xlab("Annotator 1") +
  ylab("Annotator 2") +
  facet_wrap(~media,scales="free",ncol=1)

By stage and media

p <- scales::percent_format(accuracy=1)
dl %>% 
  inner_join(dl, join_by(document_id,media,part,theme), relationship="many-to-many") %>%
  filter(theme!="not alcohol policy") %>%
  filter(name.x!=name.y) %>%
  mutate(agree=ann.x==ann.y) %>%
  group_by(media,part,annotator_number.x,annotator_number.y) %>%
  summarise(agree=sum(agree),pagree=sum(agree)/n(),.groups="drop") %>%
  ggplot(aes(x=annotator_number.x,y=annotator_number.y,fill=pagree)) +
  geom_raster() +
  theme_hsci(base_family="Arial") +
  scale_fill_viridis_c(labels=scales::percent_format(accuracy=1)) +
  geom_text(aes(label=p(pagree))) +
  labs(fill="Agreement") +
  theme(legend.position = "bottom") +
  xlab("Annotator 1") +
  ylab("Annotator 2") +
  facet_grid(media~part,scales="free")

By media and features

By media and presence of gradation

p <- scales::percent_format(accuracy=1)
dl %>% 
  inner_join(dl, join_by(document_id,media,gradation,theme), relationship="many-to-many") %>%
  filter(theme!="not alcohol policy") %>%
  filter(name.x!=name.y) %>%
  mutate(agree=ann.x==ann.y) %>%
  group_by(media,gradation,annotator_number.x,annotator_number.y) %>%
  summarise(agree=sum(agree),pagree=sum(agree)/n(),.groups="drop") %>%
  ggplot(aes(x=annotator_number.x,y=annotator_number.y,fill=pagree)) +
  geom_raster() +
  theme_hsci(base_family="Arial") +
  scale_fill_viridis_c(labels=scales::percent_format(accuracy=1)) +
  geom_text(aes(label=p(pagree))) +
  labs(fill="Agreement") +
  theme(legend.position = "bottom") +
  xlab("Annotator 1") +
  ylab("Annotator 2") +
  facet_grid(media~gradation,scales="free")

By media and presence of implicitness

p <- scales::percent_format(accuracy=1)
dl %>% 
  inner_join(dl, join_by(document_id,media,implicitness,theme), relationship="many-to-many") %>%
  filter(theme!="not alcohol policy") %>%
  filter(name.x!=name.y) %>%
  mutate(agree=ann.x==ann.y) %>%
  group_by(media,implicitness,annotator_number.x,annotator_number.y) %>%
  summarise(agree=sum(agree),pagree=sum(agree)/n(),.groups="drop") %>%
  ggplot(aes(x=annotator_number.x,y=annotator_number.y,fill=pagree)) +
  geom_raster() +
  theme_hsci(base_family="Arial") +
  scale_fill_viridis_c(labels=scales::percent_format(accuracy=1)) +
  geom_text(aes(label=p(pagree))) +
  labs(fill="Agreement") +
  theme(legend.position = "bottom") +
  xlab("Annotator 1") +
  ylab("Annotator 2") +
  facet_grid(media~implicitness,scales="free")

By media and presence of complement

p <- scales::percent_format(accuracy=1)
dl %>% 
  inner_join(dl, join_by(document_id,media,complement,theme), relationship="many-to-many") %>%
  filter(theme!="not alcohol policy") %>%
  filter(name.x!=name.y) %>%
  mutate(agree=ann.x==ann.y) %>%
  group_by(media,complement,annotator_number.x,annotator_number.y) %>%
  summarise(agree=sum(agree),pagree=sum(agree)/n(),.groups="drop") %>%
  ggplot(aes(x=annotator_number.x,y=annotator_number.y,fill=pagree)) +
  geom_raster() +
  theme_hsci(base_family="Arial") +
  scale_fill_viridis_c(labels=scales::percent_format(accuracy=1)) +
  geom_text(aes(label=p(pagree))) +
  labs(fill="Agreement") +
  theme(legend.position = "bottom") +
  xlab("Annotator 1") +
  ylab("Annotator 2") +
  facet_grid(media~complement,scales="free")

By media and theme

p <- scales::percent_format(accuracy=1)
dl %>% 
  inner_join(dl, join_by(document_id,media,theme), relationship="many-to-many") %>%
  filter(name.x!=name.y) %>%
  mutate(agree=ann.x==ann.y) %>%
  group_by(media,theme,annotator_number.x,annotator_number.y) %>%
  summarise(agree=sum(agree),pagree=sum(agree)/n(),.groups="drop") %>%
  ggplot(aes(x=annotator_number.x,y=annotator_number.y,fill=pagree)) +
  geom_raster() +
  theme_hsci(base_family="Arial") +
  scale_fill_viridis_c(labels=scales::percent_format(accuracy=1)) +
  geom_text(aes(label=p(pagree))) +
  labs(fill="Agreement") +
  theme(legend.position = "bottom") +
  xlab("Annotator 1") +
  ylab("Annotator 2") +
  facet_grid(theme~media,scales="free")

By theme and features

By theme and presence of gradation

p <- scales::percent_format(accuracy=1)
dl %>% 
  inner_join(dl, join_by(document_id,gradation,theme), relationship="many-to-many") %>%
  filter(name.x!=name.y) %>%
  mutate(agree=ann.x==ann.y) %>%
  group_by(theme,gradation,annotator_number.x,annotator_number.y) %>%
  summarise(agree=sum(agree),pagree=sum(agree)/n(),.groups="drop") %>%
  ggplot(aes(x=annotator_number.x,y=annotator_number.y,fill=pagree)) +
  geom_raster() +
  theme_hsci(base_family="Arial") +
  scale_fill_viridis_c(labels=scales::percent_format(accuracy=1)) +
  geom_text(aes(label=p(pagree))) +
  labs(fill="Agreement") +
  theme(legend.position = "bottom") +
  xlab("Annotator 1") +
  ylab("Annotator 2") +
  facet_grid(theme~gradation,scales="free")

By theme and presence of implicitness

p <- scales::percent_format(accuracy=1)
dl %>% 
  inner_join(dl, join_by(document_id,implicitness,theme), relationship="many-to-many") %>%
  filter(name.x!=name.y) %>%
  mutate(agree=ann.x==ann.y) %>%
  group_by(theme,implicitness,annotator_number.x,annotator_number.y) %>%
  summarise(agree=sum(agree),pagree=sum(agree)/n(),.groups="drop") %>%
  ggplot(aes(x=annotator_number.x,y=annotator_number.y,fill=pagree)) +
  geom_raster() +
  theme_hsci(base_family="Arial") +
  scale_fill_viridis_c(labels=scales::percent_format(accuracy=1)) +
  geom_text(aes(label=p(pagree))) +
  labs(fill="Agreement") +
  theme(legend.position = "bottom") +
  xlab("Annotator 1") +
  ylab("Annotator 2") +
  facet_grid(theme~implicitness,scales="free")

By theme and presence of complement

p <- scales::percent_format(accuracy=1)
dl %>% 
  inner_join(dl, join_by(document_id,complement,theme), relationship="many-to-many") %>%
  filter(name.x!=name.y) %>%
  mutate(agree=ann.x==ann.y) %>%
  group_by(theme,complement,annotator_number.x,annotator_number.y) %>%
  summarise(agree=sum(agree),pagree=sum(agree)/n(),.groups="drop") %>%
  ggplot(aes(x=annotator_number.x,y=annotator_number.y,fill=pagree)) +
  geom_raster() +
  theme_hsci(base_family="Arial") +
  scale_fill_viridis_c(labels=scales::percent_format(accuracy=1)) +
  geom_text(aes(label=p(pagree))) +
  labs(fill="Agreement") +
  theme(legend.position = "bottom") +
  xlab("Annotator 1") +
  ylab("Annotator 2") +
  facet_grid(theme~complement,scales="free")

Feature, theme and media summary

p <- scales::percent_format(accuracy=1)
dl %>% 
  pivot_longer(complement:implicitness,names_to="feature") %>%
  inner_join(dl %>% 
  pivot_longer(complement:implicitness,names_to="feature"), join_by(document_id,feature,value,theme,media), relationship="many-to-many") %>%
  filter(name.x!=name.y) %>%
  mutate(agree=ann.x==ann.y) %>%
  group_by(media,theme,feature,value,annotator_number.x,annotator_number.y) %>%
  summarise(agree=sum(agree),pagree=sum(agree)/n(),.groups="drop") %>%
  group_by(media,theme,feature,value) %>%
  summarise(agree=mean(agree),pagree=mean(pagree),.groups="drop") %>%
  ggplot(aes(x=media,y=theme,fill=pagree)) +
  geom_raster() +
  theme_hsci(base_family="Arial") +
  scale_fill_viridis_c(labels=scales::percent_format(accuracy=1)) +
  geom_text(aes(label=p(pagree))) +
  labs(fill="Agreement") +
  theme(legend.position = "bottom") +
#  xlab("Annotator 1") +
#  ylab("Annotator 2") +
  facet_grid(feature~value,scales="free")

LS0tCnRpdGxlOiAiQW5ub3RhdGlvbiBhbmFseXNpcyIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6CiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUKICAgIHRvYzogeWVzCi0tLQoKYGBge3Igc2V0dXAsbWVzc2FnZT1GQUxTRX0Kc291cmNlKGhlcmU6OmhlcmUoInNyYy9jb21tb25fYmFzaXMuUiIpKQpgYGAKCiMgT3ZlcmFsbAoKYGBge3J9CmRsIDwtIGJpbmRfcm93cygKICAgIGQgJT4lIGZpbHRlcihzdHJfc3ViKHRoZW1lLDEsMSkhPSd7JykgJT4lIG11dGF0ZShtdWx0aXBsZT1GKSwKICAgIGQgJT4lIGZpbHRlcihzdHJfc3ViKHRoZW1lLDEsMSk9PSd7JykgJT4lCiAgICAgICAgbXV0YXRlKHRoZW1lPW1hcCh0aGVtZSx+ZnJvbUpTT04oLikgJT4lIGFzLmRhdGEuZnJhbWUoKSkpICU+JSAKICAgICAgICB1bm5lc3QodGhlbWUpICU+JSAKICAgICAgICByZW5hbWUodGhlbWU9Y2hvaWNlcykKICApICU+JSAKICBtdXRhdGUoYW5uPVRSVUUpICU+JSAKICBjb21wbGV0ZShuZXN0aW5nKGFubm90YXRvcl9udW1iZXIsbmFtZSxkb2N1bWVudF9pZCxtZWRpYSxwYXJ0LGNvbXBsZW1lbnQsZ3JhZGF0aW9uLGltcGxpY2l0bmVzcyksdGhlbWUsZmlsbD1saXN0KGFubj1GQUxTRSkpCmBgYAoKYGBge3IsZmlnLndpZHRoPTZ9CnAgPC0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdChhY2N1cmFjeT0xKQpkbCAlPiUgCiAgaW5uZXJfam9pbihkbCwgam9pbl9ieShkb2N1bWVudF9pZCx0aGVtZSksIHJlbGF0aW9uc2hpcD0ibWFueS10by1tYW55IikgJT4lCiAgZmlsdGVyKHRoZW1lIT0ibm90IGFsY29ob2wgcG9saWN5IikgJT4lCiAgZmlsdGVyKG5hbWUueCE9bmFtZS55KSAlPiUKICBtdXRhdGUoYWdyZWU9YW5uLng9PWFubi55KSAlPiUKICBncm91cF9ieShhbm5vdGF0b3JfbnVtYmVyLngsYW5ub3RhdG9yX251bWJlci55KSAlPiUKICBzdW1tYXJpc2UoYWdyZWU9c3VtKGFncmVlKSxwYWdyZWU9c3VtKGFncmVlKS9uKCksLmdyb3Vwcz0iZHJvcCIpICU+JQogIGdncGxvdChhZXMoeD1hbm5vdGF0b3JfbnVtYmVyLngseT1hbm5vdGF0b3JfbnVtYmVyLnksZmlsbD1wYWdyZWUpKSArCiAgZ2VvbV9yYXN0ZXIoKSArCiAgdGhlbWVfaHNjaShiYXNlX2ZhbWlseT0iQXJpYWwiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzX2MobGFiZWxzPXNjYWxlczo6cGVyY2VudF9mb3JtYXQoYWNjdXJhY3k9MSkpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsPXAocGFncmVlKSkpICsKICBsYWJzKGZpbGw9IkFncmVlbWVudCIpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikgKwogIHhsYWIoIkFubm90YXRvciAxIikgKwogIHlsYWIoIkFubm90YXRvciAyIikKYGBgCgojIEJ5IHN0YWdlCgpgYGB7cixmaWcud2lkdGg9OH0KcCA8LSBzY2FsZXM6OnBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5PTEpCmRsICU+JSAKICBpbm5lcl9qb2luKGRsLCBqb2luX2J5KGRvY3VtZW50X2lkLHBhcnQsdGhlbWUpLCByZWxhdGlvbnNoaXA9Im1hbnktdG8tbWFueSIpICU+JQogIGZpbHRlcih0aGVtZSE9Im5vdCBhbGNvaG9sIHBvbGljeSIpICU+JQogIGZpbHRlcihuYW1lLnghPW5hbWUueSkgJT4lCiAgbXV0YXRlKGFncmVlPWFubi54PT1hbm4ueSkgJT4lCiAgZ3JvdXBfYnkocGFydCxhbm5vdGF0b3JfbnVtYmVyLngsYW5ub3RhdG9yX251bWJlci55KSAlPiUKICBzdW1tYXJpc2UoYWdyZWU9c3VtKGFncmVlKSxwYWdyZWU9c3VtKGFncmVlKS9uKCksLmdyb3Vwcz0iZHJvcCIpICU+JQogIGdncGxvdChhZXMoeD1hbm5vdGF0b3JfbnVtYmVyLngseT1hbm5vdGF0b3JfbnVtYmVyLnksZmlsbD1wYWdyZWUpKSArCiAgZ2VvbV9yYXN0ZXIoKSArCiAgdGhlbWVfaHNjaShiYXNlX2ZhbWlseT0iQXJpYWwiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzX2MobGFiZWxzPXNjYWxlczo6cGVyY2VudF9mb3JtYXQoYWNjdXJhY3k9MSkpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsPXAocGFncmVlKSkpICsKICBsYWJzKGZpbGw9IkFncmVlbWVudCIpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikgKwogIHhsYWIoIkFubm90YXRvciAxIikgKwogIHlsYWIoIkFubm90YXRvciAyIikgKwogIGZhY2V0X3dyYXAofnBhcnQsc2NhbGVzPSJmcmVlIikKYGBgCgojIEJ5IG1lZGlhCgpgYGB7cixmaWcud2lkdGg9NixmaWcuaGVpZ2h0PTh9CnAgPC0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdChhY2N1cmFjeT0xKQpkbCAlPiUgCiAgaW5uZXJfam9pbihkbCwgam9pbl9ieShkb2N1bWVudF9pZCxtZWRpYSx0aGVtZSksIHJlbGF0aW9uc2hpcD0ibWFueS10by1tYW55IikgJT4lCiAgZmlsdGVyKHRoZW1lIT0ibm90IGFsY29ob2wgcG9saWN5IikgJT4lCiAgZmlsdGVyKG5hbWUueCE9bmFtZS55KSAlPiUKICBtdXRhdGUoYWdyZWU9YW5uLng9PWFubi55KSAlPiUKICBncm91cF9ieShtZWRpYSxhbm5vdGF0b3JfbnVtYmVyLngsYW5ub3RhdG9yX251bWJlci55KSAlPiUKICBzdW1tYXJpc2UoYWdyZWU9c3VtKGFncmVlKSxwYWdyZWU9c3VtKGFncmVlKS9uKCksLmdyb3Vwcz0iZHJvcCIpICU+JQogIGdncGxvdChhZXMoeD1hbm5vdGF0b3JfbnVtYmVyLngseT1hbm5vdGF0b3JfbnVtYmVyLnksZmlsbD1wYWdyZWUpKSArCiAgZ2VvbV9yYXN0ZXIoKSArCiAgdGhlbWVfaHNjaShiYXNlX2ZhbWlseT0iQXJpYWwiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzX2MobGFiZWxzPXNjYWxlczo6cGVyY2VudF9mb3JtYXQoYWNjdXJhY3k9MSkpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsPXAocGFncmVlKSkpICsKICBsYWJzKGZpbGw9IkFncmVlbWVudCIpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikgKwogIHhsYWIoIkFubm90YXRvciAxIikgKwogIHlsYWIoIkFubm90YXRvciAyIikgKwogIGZhY2V0X3dyYXAofm1lZGlhLHNjYWxlcz0iZnJlZSIsbmNvbD0xKQpgYGAKCiMgQnkgc3RhZ2UgYW5kIG1lZGlhCgpgYGB7cixmaWcud2lkdGg9OCxmaWcuaGVpZ2h0PTEwfQpwIDwtIHNjYWxlczo6cGVyY2VudF9mb3JtYXQoYWNjdXJhY3k9MSkKZGwgJT4lIAogIGlubmVyX2pvaW4oZGwsIGpvaW5fYnkoZG9jdW1lbnRfaWQsbWVkaWEscGFydCx0aGVtZSksIHJlbGF0aW9uc2hpcD0ibWFueS10by1tYW55IikgJT4lCiAgZmlsdGVyKHRoZW1lIT0ibm90IGFsY29ob2wgcG9saWN5IikgJT4lCiAgZmlsdGVyKG5hbWUueCE9bmFtZS55KSAlPiUKICBtdXRhdGUoYWdyZWU9YW5uLng9PWFubi55KSAlPiUKICBncm91cF9ieShtZWRpYSxwYXJ0LGFubm90YXRvcl9udW1iZXIueCxhbm5vdGF0b3JfbnVtYmVyLnkpICU+JQogIHN1bW1hcmlzZShhZ3JlZT1zdW0oYWdyZWUpLHBhZ3JlZT1zdW0oYWdyZWUpL24oKSwuZ3JvdXBzPSJkcm9wIikgJT4lCiAgZ2dwbG90KGFlcyh4PWFubm90YXRvcl9udW1iZXIueCx5PWFubm90YXRvcl9udW1iZXIueSxmaWxsPXBhZ3JlZSkpICsKICBnZW9tX3Jhc3RlcigpICsKICB0aGVtZV9oc2NpKGJhc2VfZmFtaWx5PSJBcmlhbCIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXNfYyhsYWJlbHM9c2NhbGVzOjpwZXJjZW50X2Zvcm1hdChhY2N1cmFjeT0xKSkgKwogIGdlb21fdGV4dChhZXMobGFiZWw9cChwYWdyZWUpKSkgKwogIGxhYnMoZmlsbD0iQWdyZWVtZW50IikgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSArCiAgeGxhYigiQW5ub3RhdG9yIDEiKSArCiAgeWxhYigiQW5ub3RhdG9yIDIiKSArCiAgZmFjZXRfZ3JpZChtZWRpYX5wYXJ0LHNjYWxlcz0iZnJlZSIpCmBgYAoKIyBCeSBtZWRpYSBhbmQgZmVhdHVyZXMKIyMgQnkgbWVkaWEgYW5kIHByZXNlbmNlIG9mIGdyYWRhdGlvbgoKYGBge3IsZmlnLndpZHRoPTgsZmlnLmhlaWdodD0xMH0KcCA8LSBzY2FsZXM6OnBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5PTEpCmRsICU+JSAKICBpbm5lcl9qb2luKGRsLCBqb2luX2J5KGRvY3VtZW50X2lkLG1lZGlhLGdyYWRhdGlvbix0aGVtZSksIHJlbGF0aW9uc2hpcD0ibWFueS10by1tYW55IikgJT4lCiAgZmlsdGVyKHRoZW1lIT0ibm90IGFsY29ob2wgcG9saWN5IikgJT4lCiAgZmlsdGVyKG5hbWUueCE9bmFtZS55KSAlPiUKICBtdXRhdGUoYWdyZWU9YW5uLng9PWFubi55KSAlPiUKICBncm91cF9ieShtZWRpYSxncmFkYXRpb24sYW5ub3RhdG9yX251bWJlci54LGFubm90YXRvcl9udW1iZXIueSkgJT4lCiAgc3VtbWFyaXNlKGFncmVlPXN1bShhZ3JlZSkscGFncmVlPXN1bShhZ3JlZSkvbigpLC5ncm91cHM9ImRyb3AiKSAlPiUKICBnZ3Bsb3QoYWVzKHg9YW5ub3RhdG9yX251bWJlci54LHk9YW5ub3RhdG9yX251bWJlci55LGZpbGw9cGFncmVlKSkgKwogIGdlb21fcmFzdGVyKCkgKwogIHRoZW1lX2hzY2koYmFzZV9mYW1pbHk9IkFyaWFsIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpc19jKGxhYmVscz1zY2FsZXM6OnBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5PTEpKSArCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbD1wKHBhZ3JlZSkpKSArCiAgbGFicyhmaWxsPSJBZ3JlZW1lbnQiKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpICsKICB4bGFiKCJBbm5vdGF0b3IgMSIpICsKICB5bGFiKCJBbm5vdGF0b3IgMiIpICsKICBmYWNldF9ncmlkKG1lZGlhfmdyYWRhdGlvbixzY2FsZXM9ImZyZWUiKQpgYGAKCiMjIEJ5IG1lZGlhIGFuZCBwcmVzZW5jZSBvZiBpbXBsaWNpdG5lc3MKCmBgYHtyLGZpZy53aWR0aD04LGZpZy5oZWlnaHQ9MTB9CnAgPC0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdChhY2N1cmFjeT0xKQpkbCAlPiUgCiAgaW5uZXJfam9pbihkbCwgam9pbl9ieShkb2N1bWVudF9pZCxtZWRpYSxpbXBsaWNpdG5lc3MsdGhlbWUpLCByZWxhdGlvbnNoaXA9Im1hbnktdG8tbWFueSIpICU+JQogIGZpbHRlcih0aGVtZSE9Im5vdCBhbGNvaG9sIHBvbGljeSIpICU+JQogIGZpbHRlcihuYW1lLnghPW5hbWUueSkgJT4lCiAgbXV0YXRlKGFncmVlPWFubi54PT1hbm4ueSkgJT4lCiAgZ3JvdXBfYnkobWVkaWEsaW1wbGljaXRuZXNzLGFubm90YXRvcl9udW1iZXIueCxhbm5vdGF0b3JfbnVtYmVyLnkpICU+JQogIHN1bW1hcmlzZShhZ3JlZT1zdW0oYWdyZWUpLHBhZ3JlZT1zdW0oYWdyZWUpL24oKSwuZ3JvdXBzPSJkcm9wIikgJT4lCiAgZ2dwbG90KGFlcyh4PWFubm90YXRvcl9udW1iZXIueCx5PWFubm90YXRvcl9udW1iZXIueSxmaWxsPXBhZ3JlZSkpICsKICBnZW9tX3Jhc3RlcigpICsKICB0aGVtZV9oc2NpKGJhc2VfZmFtaWx5PSJBcmlhbCIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXNfYyhsYWJlbHM9c2NhbGVzOjpwZXJjZW50X2Zvcm1hdChhY2N1cmFjeT0xKSkgKwogIGdlb21fdGV4dChhZXMobGFiZWw9cChwYWdyZWUpKSkgKwogIGxhYnMoZmlsbD0iQWdyZWVtZW50IikgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSArCiAgeGxhYigiQW5ub3RhdG9yIDEiKSArCiAgeWxhYigiQW5ub3RhdG9yIDIiKSArCiAgZmFjZXRfZ3JpZChtZWRpYX5pbXBsaWNpdG5lc3Msc2NhbGVzPSJmcmVlIikKYGBgCgojIyBCeSBtZWRpYSBhbmQgcHJlc2VuY2Ugb2YgY29tcGxlbWVudAoKYGBge3IsZmlnLndpZHRoPTgsZmlnLmhlaWdodD0xMH0KcCA8LSBzY2FsZXM6OnBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5PTEpCmRsICU+JSAKICBpbm5lcl9qb2luKGRsLCBqb2luX2J5KGRvY3VtZW50X2lkLG1lZGlhLGNvbXBsZW1lbnQsdGhlbWUpLCByZWxhdGlvbnNoaXA9Im1hbnktdG8tbWFueSIpICU+JQogIGZpbHRlcih0aGVtZSE9Im5vdCBhbGNvaG9sIHBvbGljeSIpICU+JQogIGZpbHRlcihuYW1lLnghPW5hbWUueSkgJT4lCiAgbXV0YXRlKGFncmVlPWFubi54PT1hbm4ueSkgJT4lCiAgZ3JvdXBfYnkobWVkaWEsY29tcGxlbWVudCxhbm5vdGF0b3JfbnVtYmVyLngsYW5ub3RhdG9yX251bWJlci55KSAlPiUKICBzdW1tYXJpc2UoYWdyZWU9c3VtKGFncmVlKSxwYWdyZWU9c3VtKGFncmVlKS9uKCksLmdyb3Vwcz0iZHJvcCIpICU+JQogIGdncGxvdChhZXMoeD1hbm5vdGF0b3JfbnVtYmVyLngseT1hbm5vdGF0b3JfbnVtYmVyLnksZmlsbD1wYWdyZWUpKSArCiAgZ2VvbV9yYXN0ZXIoKSArCiAgdGhlbWVfaHNjaShiYXNlX2ZhbWlseT0iQXJpYWwiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzX2MobGFiZWxzPXNjYWxlczo6cGVyY2VudF9mb3JtYXQoYWNjdXJhY3k9MSkpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsPXAocGFncmVlKSkpICsKICBsYWJzKGZpbGw9IkFncmVlbWVudCIpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikgKwogIHhsYWIoIkFubm90YXRvciAxIikgKwogIHlsYWIoIkFubm90YXRvciAyIikgKwogIGZhY2V0X2dyaWQobWVkaWF+Y29tcGxlbWVudCxzY2FsZXM9ImZyZWUiKQpgYGAKCiMgQnkgbWVkaWEgYW5kIHRoZW1lCgpgYGB7cixmaWcud2lkdGg9OCxmaWcuaGVpZ2h0PTEwfQpwIDwtIHNjYWxlczo6cGVyY2VudF9mb3JtYXQoYWNjdXJhY3k9MSkKZGwgJT4lIAogIGlubmVyX2pvaW4oZGwsIGpvaW5fYnkoZG9jdW1lbnRfaWQsbWVkaWEsdGhlbWUpLCByZWxhdGlvbnNoaXA9Im1hbnktdG8tbWFueSIpICU+JQogIGZpbHRlcihuYW1lLnghPW5hbWUueSkgJT4lCiAgbXV0YXRlKGFncmVlPWFubi54PT1hbm4ueSkgJT4lCiAgZ3JvdXBfYnkobWVkaWEsdGhlbWUsYW5ub3RhdG9yX251bWJlci54LGFubm90YXRvcl9udW1iZXIueSkgJT4lCiAgc3VtbWFyaXNlKGFncmVlPXN1bShhZ3JlZSkscGFncmVlPXN1bShhZ3JlZSkvbigpLC5ncm91cHM9ImRyb3AiKSAlPiUKICBnZ3Bsb3QoYWVzKHg9YW5ub3RhdG9yX251bWJlci54LHk9YW5ub3RhdG9yX251bWJlci55LGZpbGw9cGFncmVlKSkgKwogIGdlb21fcmFzdGVyKCkgKwogIHRoZW1lX2hzY2koYmFzZV9mYW1pbHk9IkFyaWFsIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpc19jKGxhYmVscz1zY2FsZXM6OnBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5PTEpKSArCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbD1wKHBhZ3JlZSkpKSArCiAgbGFicyhmaWxsPSJBZ3JlZW1lbnQiKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpICsKICB4bGFiKCJBbm5vdGF0b3IgMSIpICsKICB5bGFiKCJBbm5vdGF0b3IgMiIpICsKICBmYWNldF9ncmlkKHRoZW1lfm1lZGlhLHNjYWxlcz0iZnJlZSIpCmBgYAoKIyBCeSB0aGVtZSBhbmQgZmVhdHVyZXMKIyMgQnkgdGhlbWUgYW5kIHByZXNlbmNlIG9mIGdyYWRhdGlvbgoKYGBge3IsZmlnLndpZHRoPTgsZmlnLmhlaWdodD0xMH0KcCA8LSBzY2FsZXM6OnBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5PTEpCmRsICU+JSAKICBpbm5lcl9qb2luKGRsLCBqb2luX2J5KGRvY3VtZW50X2lkLGdyYWRhdGlvbix0aGVtZSksIHJlbGF0aW9uc2hpcD0ibWFueS10by1tYW55IikgJT4lCiAgZmlsdGVyKG5hbWUueCE9bmFtZS55KSAlPiUKICBtdXRhdGUoYWdyZWU9YW5uLng9PWFubi55KSAlPiUKICBncm91cF9ieSh0aGVtZSxncmFkYXRpb24sYW5ub3RhdG9yX251bWJlci54LGFubm90YXRvcl9udW1iZXIueSkgJT4lCiAgc3VtbWFyaXNlKGFncmVlPXN1bShhZ3JlZSkscGFncmVlPXN1bShhZ3JlZSkvbigpLC5ncm91cHM9ImRyb3AiKSAlPiUKICBnZ3Bsb3QoYWVzKHg9YW5ub3RhdG9yX251bWJlci54LHk9YW5ub3RhdG9yX251bWJlci55LGZpbGw9cGFncmVlKSkgKwogIGdlb21fcmFzdGVyKCkgKwogIHRoZW1lX2hzY2koYmFzZV9mYW1pbHk9IkFyaWFsIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpc19jKGxhYmVscz1zY2FsZXM6OnBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5PTEpKSArCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbD1wKHBhZ3JlZSkpKSArCiAgbGFicyhmaWxsPSJBZ3JlZW1lbnQiKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpICsKICB4bGFiKCJBbm5vdGF0b3IgMSIpICsKICB5bGFiKCJBbm5vdGF0b3IgMiIpICsKICBmYWNldF9ncmlkKHRoZW1lfmdyYWRhdGlvbixzY2FsZXM9ImZyZWUiKQpgYGAKCiMjIEJ5IHRoZW1lIGFuZCBwcmVzZW5jZSBvZiBpbXBsaWNpdG5lc3MKCmBgYHtyLGZpZy53aWR0aD04LGZpZy5oZWlnaHQ9MTB9CnAgPC0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdChhY2N1cmFjeT0xKQpkbCAlPiUgCiAgaW5uZXJfam9pbihkbCwgam9pbl9ieShkb2N1bWVudF9pZCxpbXBsaWNpdG5lc3MsdGhlbWUpLCByZWxhdGlvbnNoaXA9Im1hbnktdG8tbWFueSIpICU+JQogIGZpbHRlcihuYW1lLnghPW5hbWUueSkgJT4lCiAgbXV0YXRlKGFncmVlPWFubi54PT1hbm4ueSkgJT4lCiAgZ3JvdXBfYnkodGhlbWUsaW1wbGljaXRuZXNzLGFubm90YXRvcl9udW1iZXIueCxhbm5vdGF0b3JfbnVtYmVyLnkpICU+JQogIHN1bW1hcmlzZShhZ3JlZT1zdW0oYWdyZWUpLHBhZ3JlZT1zdW0oYWdyZWUpL24oKSwuZ3JvdXBzPSJkcm9wIikgJT4lCiAgZ2dwbG90KGFlcyh4PWFubm90YXRvcl9udW1iZXIueCx5PWFubm90YXRvcl9udW1iZXIueSxmaWxsPXBhZ3JlZSkpICsKICBnZW9tX3Jhc3RlcigpICsKICB0aGVtZV9oc2NpKGJhc2VfZmFtaWx5PSJBcmlhbCIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXNfYyhsYWJlbHM9c2NhbGVzOjpwZXJjZW50X2Zvcm1hdChhY2N1cmFjeT0xKSkgKwogIGdlb21fdGV4dChhZXMobGFiZWw9cChwYWdyZWUpKSkgKwogIGxhYnMoZmlsbD0iQWdyZWVtZW50IikgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSArCiAgeGxhYigiQW5ub3RhdG9yIDEiKSArCiAgeWxhYigiQW5ub3RhdG9yIDIiKSArCiAgZmFjZXRfZ3JpZCh0aGVtZX5pbXBsaWNpdG5lc3Msc2NhbGVzPSJmcmVlIikKYGBgCgojIyBCeSB0aGVtZSBhbmQgcHJlc2VuY2Ugb2YgY29tcGxlbWVudAoKYGBge3IsZmlnLndpZHRoPTgsZmlnLmhlaWdodD0xMH0KcCA8LSBzY2FsZXM6OnBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5PTEpCmRsICU+JSAKICBpbm5lcl9qb2luKGRsLCBqb2luX2J5KGRvY3VtZW50X2lkLGNvbXBsZW1lbnQsdGhlbWUpLCByZWxhdGlvbnNoaXA9Im1hbnktdG8tbWFueSIpICU+JQogIGZpbHRlcihuYW1lLnghPW5hbWUueSkgJT4lCiAgbXV0YXRlKGFncmVlPWFubi54PT1hbm4ueSkgJT4lCiAgZ3JvdXBfYnkodGhlbWUsY29tcGxlbWVudCxhbm5vdGF0b3JfbnVtYmVyLngsYW5ub3RhdG9yX251bWJlci55KSAlPiUKICBzdW1tYXJpc2UoYWdyZWU9c3VtKGFncmVlKSxwYWdyZWU9c3VtKGFncmVlKS9uKCksLmdyb3Vwcz0iZHJvcCIpICU+JQogIGdncGxvdChhZXMoeD1hbm5vdGF0b3JfbnVtYmVyLngseT1hbm5vdGF0b3JfbnVtYmVyLnksZmlsbD1wYWdyZWUpKSArCiAgZ2VvbV9yYXN0ZXIoKSArCiAgdGhlbWVfaHNjaShiYXNlX2ZhbWlseT0iQXJpYWwiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzX2MobGFiZWxzPXNjYWxlczo6cGVyY2VudF9mb3JtYXQoYWNjdXJhY3k9MSkpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsPXAocGFncmVlKSkpICsKICBsYWJzKGZpbGw9IkFncmVlbWVudCIpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikgKwogIHhsYWIoIkFubm90YXRvciAxIikgKwogIHlsYWIoIkFubm90YXRvciAyIikgKwogIGZhY2V0X2dyaWQodGhlbWV+Y29tcGxlbWVudCxzY2FsZXM9ImZyZWUiKQpgYGAKCiMgRmVhdHVyZSwgdGhlbWUgYW5kIG1lZGlhIHN1bW1hcnkKCmBgYHtyLGZpZy53aWR0aD04LGZpZy5oZWlnaHQ9MTB9CnAgPC0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdChhY2N1cmFjeT0xKQpkbCAlPiUgCiAgcGl2b3RfbG9uZ2VyKGNvbXBsZW1lbnQ6aW1wbGljaXRuZXNzLG5hbWVzX3RvPSJmZWF0dXJlIikgJT4lCiAgaW5uZXJfam9pbihkbCAlPiUgCiAgcGl2b3RfbG9uZ2VyKGNvbXBsZW1lbnQ6aW1wbGljaXRuZXNzLG5hbWVzX3RvPSJmZWF0dXJlIiksIGpvaW5fYnkoZG9jdW1lbnRfaWQsZmVhdHVyZSx2YWx1ZSx0aGVtZSxtZWRpYSksIHJlbGF0aW9uc2hpcD0ibWFueS10by1tYW55IikgJT4lCiAgZmlsdGVyKG5hbWUueCE9bmFtZS55KSAlPiUKICBtdXRhdGUoYWdyZWU9YW5uLng9PWFubi55KSAlPiUKICBncm91cF9ieShtZWRpYSx0aGVtZSxmZWF0dXJlLHZhbHVlLGFubm90YXRvcl9udW1iZXIueCxhbm5vdGF0b3JfbnVtYmVyLnkpICU+JQogIHN1bW1hcmlzZShhZ3JlZT1zdW0oYWdyZWUpLHBhZ3JlZT1zdW0oYWdyZWUpL24oKSwuZ3JvdXBzPSJkcm9wIikgJT4lCiAgZ3JvdXBfYnkobWVkaWEsdGhlbWUsZmVhdHVyZSx2YWx1ZSkgJT4lCiAgc3VtbWFyaXNlKGFncmVlPW1lYW4oYWdyZWUpLHBhZ3JlZT1tZWFuKHBhZ3JlZSksLmdyb3Vwcz0iZHJvcCIpICU+JQogIGdncGxvdChhZXMoeD1tZWRpYSx5PXRoZW1lLGZpbGw9cGFncmVlKSkgKwogIGdlb21fcmFzdGVyKCkgKwogIHRoZW1lX2hzY2koYmFzZV9mYW1pbHk9IkFyaWFsIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpc19jKGxhYmVscz1zY2FsZXM6OnBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5PTEpKSArCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbD1wKHBhZ3JlZSkpKSArCiAgbGFicyhmaWxsPSJBZ3JlZW1lbnQiKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpICsKIyAgeGxhYigiQW5ub3RhdG9yIDEiKSArCiMgIHlsYWIoIkFubm90YXRvciAyIikgKwogIGZhY2V0X2dyaWQoZmVhdHVyZX52YWx1ZSxzY2FsZXM9ImZyZWUiKQpgYGAKCg==