Education


Population by status of education


UDXISCPROF_raw <- 
  statgl_url("UDXISCPROF", lang = language) |> 
  statgl_fetch(
    Fsted         = px_all(),
    ISCED11_level = px_all(),
    Aar           = px_top(),
    .col_code     = T
  ) |> 
  as_tibble()

UDXISCPROF <- 
  UDXISCPROF_raw |> 
  select(-Aar) |> 
  mutate(ISCED11_level = ISCED11_level |> fct_inorder()) |> 
  spread(Fsted, value)

UDXISCPROF |> 
  rename(" " = 1) |> 
  statgl_table() |> 
  row_spec(1, bold = T)
In Greenland Outside Greenland
In total 36.905 5.947
Lower secondary education 21.586 2.741
Upper secondary education 2.083 298
Vocational education and training 7.871 962
Supplementary examination courses 1.409 32
Short-cycle higher education 1.051 306
Bachelors programme 247 121
Professional bachelors programme 2.199 651
Masters programme 443 788
Phd. Programmes 16 48


See the table in our Statbank: UDXISCPROF

UDXUMG3_raw <- 
  statgl_url("UDXUMG3", lang = language) |> 
  statgl_fetch(
    registrering = px_all(),
    HFU          = px_all(),
    aar          = px_top(),
    .col_code    = T
  ) |> 
  as_tibble()

UDXUMG3 <- 
  UDXUMG3_raw |> 
  mutate(HFU = HFU |> fct_inorder() |>  fct_rev()) |>
  select(aar, registrering, HFU, value) |> 
  spread(HFU, value)

UDXUMG3 |> 
  select(-1) |> 
  rename(" " = 1) |> 
  statgl_table() |> 
  row_spec(1, bold = T) |> 
  column_spec(2, bold = T)
In total Without completed education With completed higher education With vocational upper secondary education completed With general upper secondary education completed
Continuation school 266 266 0 0 0
Higher education 386 49 33 21 283
In employment 3.048 2.211 63 285 489
In total 7.323 5.850 112 379 982
NEET 2.235 2.038 8 54 135
Upper secondary education 948 926 0 8 14
Vocational education and training 440 360 8 11 61


See the table in our Statbank: UDXUMG3

Primary and lower secondary education


UDXESG_raw <- 
  statgl_url("UDXESG", lang = language) |> 
  statgl_fetch(
    unit       = "andel",
    sex        = px_all(),
    efterskole = px_all(),
    status     = px_all(),
    skoleaar   = px_all(),
    .col_code  = T
  ) |> 
  as_tibble()


UDXESG <- 
  UDXESG_raw |> 
  filter(skoleaar == max(skoleaar)) |> 
  mutate(efterskole = efterskole |> fct_inorder() |> fct_rev(),
         sex = sex |> fct_inorder() |> fct_rev()) |> 
  unite(combi, unit, skoleaar, sep = "-")

UDXESG |> 
  select(-combi) |> 
  spread(efterskole, value) |> 
  select(sex, status, 3:6) |> 
  arrange(sex, desc(status)) |> 
  rename(" " = 1) |> 
  statgl_table() |> 
  row_spec(1:3, bold = T) |> 
  column_spec(3, bold = T) |> 
  add_footnote(UDXESG[[1]][1], notation = "symbol")
status In total Danish continuation schools Maniitsumi Efterskoli Efterskole Villads Villadsen
In total Enrolled in total 100 100 100 100
In total Dropped out 37 25 72 51
In total Completed 63 75 28 49
Girls Enrolled in total 100 100 100 100
Girls Dropped out 40 31 79 43
Girls Completed 60 69 21 57
Boys Enrolled in total 100 100 100 100
Boys Dropped out 34 20 67 62
Boys Completed 66 80 33 38
* share in percent-2023/2024


See the table in our Statbank: UDXESG

UDXTKK_raw <- 
  statgl_url("UDXTKK", lang = language) |> 
  statgl_fetch(
    subject      = px_all(),
    grade        = px_all(),
    municipality = px_all(),
    unit         = "B",
    time         = px_top(),
    .col_code    = T
  ) |> 
  as_tibble()

UDXTKK <- 
  UDXTKK_raw |> 
  unite(combi, unit, time, sep = " ") |>
  mutate(municipality = municipality |> fct_inorder()) |> 
  spread(subject, value)

UDXTKK |> 
  select(-3) |> 
  rename(" " = 1) |> 
  statgl_table() |> 
  row_spec(c(1, 7), bold = T) |> 
  pack_rows(index = table(UDXTKK[[3]]))
municipality Danish English Greenlandic Mathematics
Problem-solving proficiency (pct. correct) 2024
3rd grade Total 41 NA 45 49
3rd grade Kommune Kujalleq 30 NA 38 43
3rd grade Kommuneqarfik Sermersooq 48 NA 43 44
3rd grade Qeqqata Kommunia 51 NA 59 63
3rd grade Kommune Qeqertalik 36 NA 51 51
3rd grade Avannaata Kommunia 41 NA 48 49
7th grade Total 42 84 56 40
7th grade Kommune Kujalleq 36 53 49 34
7th grade Kommuneqarfik Sermersooq 48 88 48 41
7th grade Qeqqata Kommunia 42 88 64 40
7th grade Kommune Qeqertalik 45 78 66 34
7th grade Avannaata Kommunia 40 84 59 39


See the table in our Statbank: UDXTKK

Upper secondary and tertiary education


UDXISC11A_raw <- 
  statgl_url("UDXISC11A", lang = language) |> 
  statgl_fetch(
    Isced     = px_all(),
    skoleomr  = px_all(),
    startaar  = px_top(1),
    .col_code = T
  ) |> 
  as_tibble()

UDXISC11A <- 
  UDXISC11A_raw |> 
  mutate(startaar = startaar |> fct_inorder(),
         skoleomr = skoleomr |> fct_inorder()) |> 
  spread(skoleomr, value)

UDXISC11A |> 
  select(-startaar) |> 
  rename(" " = 1) |> 
  statgl_table() |> 
  pack_rows(index = table(UDXISC11A[[2]]))
Schools in Greenland Schools in Denmark Schools abroad
2024
Bachelors programme 101 48 2
Masters programme 28 21 2
Professional bachelors programme 135 80 0
Short-cycle higher education 70 26 0
Supplementary examination courses 123 2 1
Upper secondary education 471 39 2
Vocational education and training 601 73 0


See the table in our Statbank: UDXISC11A

UDXISC11L_raw <- 
  statgl_url("UDXISC11L", lang = language) |> 
  statgl_fetch(
    aar       = 2,
    isced     = px_all(),
    status    = px_all(),
    startaar  = px_top(3),
    .col_code = T
  ) |> 
  as_tibble()

UDXISC11L <- 
  UDXISC11L_raw |> 
  filter(value > 0) |> 
  mutate(status = status |> fct_inorder()) |> 
  spread(status, value) |> 
  unite(combi, aar, startaar, sep = " ")

UDXISC11L |> 
  select(-1) |> 
  rename(" " = 1) |> 
  statgl_table() |> 
  add_footnote(UDXISC11L[[1]][1], notation = "symbol")
Still in education Graduated Dropped out New entrants in total
Bachelors programme 57 1 73 131
Masters programme 20 12 12 44
Professional bachelors programme 104 13 94 211
Short-cycle higher education 8 51 50 109
Upper secondary education 200 6 153 359
Vocational education and training, general 135 68 265 468
Vocational education and training, short 8 135 98 241
* 2 years 2022


See the table in our Statbank: UDXISC11L

Educational progress


UDXTRFA1_raw <- 
  statgl_url("UDXTRFA1", lang = language) |> 
  statgl_fetch(
    aar       = 0,
    isced     = px_all(),
    status    = px_all(),
    dim_aar   = px_top(),
    .col_code = T
  ) |> 
  as_tibble()

UDXTRFA1 <- 
  UDXTRFA1_raw |> 
  unite(combi, aar, dim_aar, sep = " ") |> 
  mutate(isced = isced |> fct_inorder(),
         status = status |> fct_inorder())

UDXTRFA1 |> 
  select(-1) |> 
  spread(isced, value) |> 
  rename(" " = 1) |> 
  statgl_table() |> 
  add_footnote(UDXTRFA1[[1]][1], notation = "symbol")
Upper secondary education Vocational education and training No registration
In education 69 6 0
Graduated 0 0 0
Dropped out 11 0 0
Not enrolled in education 0 0 621
* Directly 2024


See the table in our Statbank: UDXTRFA1


Last updated: 22. juni 2025
LS0tDQpwYXJhbXM6DQogIGxhbmc6ICJkYSINCm91dHB1dDoNCiAgc3RhdGdsOjpzdGF0Z2xfcmVwb3J0Og0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCmVkaXRvcl9vcHRpb25zOiANCiAgY2h1bmtfb3V0cHV0X3R5cGU6IGNvbnNvbGUNCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCg0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KA0KCWVjaG8gICAgPSBUUlVFLA0KCW1lc3NhZ2UgPSBGQUxTRSwNCgl3YXJuaW5nID0gRkFMU0UsDQoJY2xhc3Mub3V0cHV0ID0gInNjcm9sbC0xMDAiDQopDQoNCmxpYnJhcnkoInRpZHl2ZXJzZSIpDQpsaWJyYXJ5KCJzdGF0Z2wiKQ0KbGlicmFyeSgia2FibGVFeHRyYSIpDQpsaWJyYXJ5KCJsdWJyaWRhdGUiKQ0KbGlicmFyeSgieWFtbCIpDQoNCmxhbmd1YWdlICA8LSBwYXJhbXMkbGFuZw0Kb3B0aW9uICAgIDwtIHBhc3RlMCgiP2xhbmc9IiwgbGFuZ3VhZ2UsICImc2VsZWN0IikNCmxvZ28gICAgICA8LSBwYXN0ZTAoZ2V0d2QoKSwiL2FkZC9sb2dvLmdpZiIpDQp0eHQgICAgICAgPC0gcmVhZF95YW1sKHBhc3RlMChnZXR3ZCgpLCAiL2FkZC90eHQueW1sIiksIGZpbGVFbmNvZGluZyA9ICJJU08tODg1OS0xIikNCnNvdXJjZSAgICA8LSB0eHQkc291cmNlW2xhbmd1YWdlXSAlPiUgdW5saXN0KCkNCg0KeGFyaW5nYW5FeHRyYTo6dXNlX2NsaXBib2FyZCgpDQoNCmBgYA0KDQpgYGB7Y3NzLCBlY2hvID0gRkFMU0V9DQoNCi5hY2NvcmRpb24gew0KICBiYWNrZ3JvdW5kLWNvbG9yOiAjOTE5OTAwOw0KICBjb2xvcjogd2hpdGU7DQogIGN1cnNvcjogcG9pbnRlcjsNCiAgcGFkZGluZzogMThweDsNCiAgd2lkdGg6IDEwMCU7DQogIGJvcmRlcjogbm9uZTsNCiAgYm9yZGVyLXJhZGl1czogNXB4Ow0KICB0ZXh0LWFsaWduOiBsZWZ0Ow0KICBvdXRsaW5lOiBub25lOw0KICBmb250LXNpemU6IDE1cHg7DQogIHRyYW5zaXRpb246IDAuNHM7DQp9DQoNCi5hY3RpdmUsIC5hY2NvcmRpb246aG92ZXIgew0KICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjk3MjQyOw0KfQ0KDQouYWNjb3JkaW9uOmFmdGVyIHsNCiAgY29udGVudDogJ1wwMDJCJzsNCiAgY29sb3I6ICM3Nzc7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICBmbG9hdDogcmlnaHQ7DQogIG1hcmdpbi1sZWZ0OiA1cHg7DQp9DQoNCi5hY3RpdmU6YWZ0ZXIgew0KICBjb250ZW50OiAiXDIyMTIiOw0KfQ0KDQoucGFuZWwgew0KICBwYWRkaW5nOiAwcHggNXB4IDBweCA1cHg7DQogIGJhY2tncm91bmQtY29sb3I6IHdoaXRlOw0KICBtYXgtaGVpZ2h0OiAwOw0KICBvdmVyZmxvdzogaGlkZGVuOw0KICB0cmFuc2l0aW9uOiBtYXgtaGVpZ2h0IDAuMnMgZWFzZS1vdXQ7DQp9DQoNCmRldGFpbHMgew0KICB3aWR0aDogMTAwJTsNCn0NCg0KZGV0YWlscyA+IHN1bW1hcnkgew0KICBwYWRkaW5nOiA0cHggMTJweDsNCiAgd2lkdGg6IDEwMCU7DQogIGJhY2tncm91bmQtY29sb3I6ICMwMDdmOTk7DQogIGJvcmRlcjogc29saWQ7DQogIGJvcmRlci1jb2xvcjogd2hpdGU7DQogIGJvcmRlci1yYWRpdXM6IDVweDsNCiAgY3Vyc29yOiBwb2ludGVyOw0KICBmb250LXNpemU6IDE1cHg7DQogIGNvbG9yOiB3aGl0ZTsNCn0NCg0KZGV0YWlsc1tvcGVuXSA+IHN1bW1hcnkgew0KICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmFhNDFhOw0KfQ0KDQoNCi50aXRsZSB7DQogIGNvbG9yOiAjMWI1NDYzOw0KICBmb250LXNpemU6IDM2cHg7DQp9DQoNCg0KLnBlcnNvbmVyIHsNCiAgYm94LXNoYWRvdzogM3B4IDNweCA0cHggYmxhY2s7DQogIGJhY2tncm91bmQ6ICMwMDQ0NTk7DQogIHBhZGRpbmctcmlnaHQ6IDE1cHg7DQogIHBhZGRpbmctbGVmdDogMTZweDsNCiAgcGFkZGluZy10b3A6IDAuMXB4Ow0KICBwYWRkaW5nLWJvdHRvbTogMXB4Ow0KICBmb250LXNpemU6IDExcHg7DQogIGNvbG9yOiB3aGl0ZTsNCiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsNCn0NCg0KLsO4a29ub21pIHsNCiAgYm94LXNoYWRvdzogM3B4IDNweCA0cHggYmxhY2s7DQogIGJhY2tncm91bmQ6ICMwMDdGOTk7DQogIHBhZGRpbmctcmlnaHQ6IDE1cHg7DQogIHBhZGRpbmctbGVmdDogMTZweDsNCiAgcGFkZGluZy10b3A6IDFweDsNCiAgcGFkZGluZy1ib3R0b206IDAuMXB4Ow0KICBmb250LXNpemU6IDExcHg7DQogIGNvbG9yOiB3aGl0ZTsNCiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsNCn0NCg0KLnR2w6ZyZ8OlZW5kZSB7DQogIGJveC1zaGFkb3c6IDNweCAzcHggNHB4IGJsYWNrOw0KICBiYWNrZ3JvdW5kOiAjZmFhNDFhOw0KICBwYWRkaW5nLXJpZ2h0OiAxNXB4Ow0KICBwYWRkaW5nLWxlZnQ6IDE2cHg7DQogIHBhZGRpbmctdG9wOiAwLjFweDsNCiAgcGFkZGluZy1ib3R0b206IDFweDsNCiAgZm9udC1zaXplOiAxMXB4Ow0KICBjb2xvcjogd2hpdGU7DQogIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7DQp9DQoNCi5jb250YWluZXIgew0KICB3aWR0aDogaW5oZXJpdDsNCn0NCg0KLnNjcm9sbC0xMDAgew0KICBtYXgtaGVpZ2h0OiAxMDA7DQogIG92ZXJmbG93LXk6IGF1dG87DQogIGJhY2tncm91bmQtY29sb3I6IGluaGVyaXQ7DQp9DQoNCg0KcHJlIHsNCiAgbWF4LWhlaWdodDogMzAwcHg7DQogIG92ZXJmbG93LXk6IGF1dG87DQp9DQoNCnByZVtjbGFzc10gew0KICBtYXgtaGVpZ2h0OiAzMDBweDsNCn0NCg0KYGBgDQoNCjxicj4NCjxicj4NCg0KPGNlbnRlcj4NCg0KLS0tDQogDQojIFtgciB0eHQkVUQkdGl0bGVbbGFuZ3VhZ2VdYF17LnRpdGxlfQ0KIA0KLS0tDQo8L2NlbnRlcj4NCg0KPGRldGFpbHM+IDxzdW1tYXJ5PiBgciB0eHQkVUQkc3ViMVtsYW5ndWFnZV1gIDwvc3VtbWFyeT4gDQo8YnI+DQoNCjxidXR0b24gY2xhc3M9ImFjY29yZGlvbiI+IGByIHBhc3RlMCgiKipUYWJlbCAxOiAqKiIsIHN0YXRnbF9tZXRhKHN0YXRnbF91cmwoIlVEWElTQ1BST0YiLCBsYW5nID0gbGFuZ3VhZ2UpKVsxXSR0aXRsZSkgYCA8L2J1dHRvbj4gPGRpdiBjbGFzcz0icGFuZWwiPg0KDQpgYGB7ciBVRFhJU0NQUk9GfQ0KDQpVRFhJU0NQUk9GX3JhdyA8LSANCiAgc3RhdGdsX3VybCgiVURYSVNDUFJPRiIsIGxhbmcgPSBsYW5ndWFnZSkgfD4gDQogIHN0YXRnbF9mZXRjaCgNCiAgICBGc3RlZCAgICAgICAgID0gcHhfYWxsKCksDQogICAgSVNDRUQxMV9sZXZlbCA9IHB4X2FsbCgpLA0KICAgIEFhciAgICAgICAgICAgPSBweF90b3AoKSwNCiAgICAuY29sX2NvZGUgICAgID0gVA0KICApIHw+IA0KICBhc190aWJibGUoKQ0KDQpVRFhJU0NQUk9GIDwtIA0KICBVRFhJU0NQUk9GX3JhdyB8PiANCiAgc2VsZWN0KC1BYXIpIHw+IA0KICBtdXRhdGUoSVNDRUQxMV9sZXZlbCA9IElTQ0VEMTFfbGV2ZWwgfD4gZmN0X2lub3JkZXIoKSkgfD4gDQogIHNwcmVhZChGc3RlZCwgdmFsdWUpDQoNClVEWElTQ1BST0YgfD4gDQogIHJlbmFtZSgiICIgPSAxKSB8PiANCiAgc3RhdGdsX3RhYmxlKCkgfD4gDQogIHJvd19zcGVjKDEsIGJvbGQgPSBUKQ0KDQpgYGANCjxicj4NClshW10oYHIgbG9nb2Ape3dpZHRoPTQwfWByIHBhc3RlKHNvdXJjZSwgIlVEWElTQ1BST0YiKWBdKGByIHBhc3RlMCgiaHR0cHM6Ly9iYW5rLnN0YXQuZ2w6NDQzL3NxLzE3NmVhYTQxLTBiMDAtNGNjNC1iOGEzLTA4MmY5NWM0OWUwMiIsIG9wdGlvbilgKXt0YXJnZXQ9Il9ibGFuayJ9DQo8L2Rpdj4NCg0KPGJ1dHRvbiBjbGFzcz0iYWNjb3JkaW9uIj4gYHIgcGFzdGUwKCIqKlRhYmVsIDI6ICoqIiwgc3RhdGdsX21ldGEoc3RhdGdsX3VybCgiVURYVU1HMyIsIGxhbmcgPSBsYW5ndWFnZSkpWzFdJHRpdGxlKSBgIDwvYnV0dG9uPiA8ZGl2IGNsYXNzPSJwYW5lbCI+DQoNCmBgYHtyIFVEWFVNRzN9DQoNClVEWFVNRzNfcmF3IDwtIA0KICBzdGF0Z2xfdXJsKCJVRFhVTUczIiwgbGFuZyA9IGxhbmd1YWdlKSB8PiANCiAgc3RhdGdsX2ZldGNoKA0KICAgIHJlZ2lzdHJlcmluZyA9IHB4X2FsbCgpLA0KICAgIEhGVSAgICAgICAgICA9IHB4X2FsbCgpLA0KICAgIGFhciAgICAgICAgICA9IHB4X3RvcCgpLA0KICAgIC5jb2xfY29kZSAgICA9IFQNCiAgKSB8PiANCiAgYXNfdGliYmxlKCkNCg0KVURYVU1HMyA8LSANCiAgVURYVU1HM19yYXcgfD4gDQogIG11dGF0ZShIRlUgPSBIRlUgfD4gZmN0X2lub3JkZXIoKSB8PiAgZmN0X3JldigpKSB8Pg0KICBzZWxlY3QoYWFyLCByZWdpc3RyZXJpbmcsIEhGVSwgdmFsdWUpIHw+IA0KICBzcHJlYWQoSEZVLCB2YWx1ZSkNCg0KVURYVU1HMyB8PiANCiAgc2VsZWN0KC0xKSB8PiANCiAgcmVuYW1lKCIgIiA9IDEpIHw+IA0KICBzdGF0Z2xfdGFibGUoKSB8PiANCiAgcm93X3NwZWMoMSwgYm9sZCA9IFQpIHw+IA0KICBjb2x1bW5fc3BlYygyLCBib2xkID0gVCkNCg0KYGBgDQo8YnI+DQpbIVtdKGByIGxvZ29gKXt3aWR0aD00MH1gciBwYXN0ZShzb3VyY2UsICJVRFhVTUczIilgXShgciBwYXN0ZTAoImh0dHBzOi8vYmFuay5zdGF0LmdsOjQ0My9zcS8xNTAyMDM4Ni1kODIzLTRlMzEtYmZiNC0xNTBlYjkxZDA4NWEiLCBvcHRpb24pYCl7dGFyZ2V0PSJfYmxhbmsifQ0KPC9kaXY+DQoNCjwvZGV0YWlscz4NCg0KPGRldGFpbHM+IDxzdW1tYXJ5PiBgciB0eHQkVUQkc3ViMltsYW5ndWFnZV1gIDwvc3VtbWFyeT4gDQo8YnI+DQoNCjxidXR0b24gY2xhc3M9ImFjY29yZGlvbiI+IGByIHBhc3RlMCgiKipUYWJlbCAzOiAqKiIsIHN0YXRnbF9tZXRhKHN0YXRnbF91cmwoIlVEWEVTRyIsIGxhbmcgPSBsYW5ndWFnZSkpWzFdJHRpdGxlKSBgIDwvYnV0dG9uPiA8ZGl2IGNsYXNzPSJwYW5lbCI+DQoNCmBgYHtyIFVEWEVTR30NCg0KVURYRVNHX3JhdyA8LSANCiAgc3RhdGdsX3VybCgiVURYRVNHIiwgbGFuZyA9IGxhbmd1YWdlKSB8PiANCiAgc3RhdGdsX2ZldGNoKA0KICAgIHVuaXQgICAgICAgPSAiYW5kZWwiLA0KICAgIHNleCAgICAgICAgPSBweF9hbGwoKSwNCiAgICBlZnRlcnNrb2xlID0gcHhfYWxsKCksDQogICAgc3RhdHVzICAgICA9IHB4X2FsbCgpLA0KICAgIHNrb2xlYWFyICAgPSBweF9hbGwoKSwNCiAgICAuY29sX2NvZGUgID0gVA0KICApIHw+IA0KICBhc190aWJibGUoKQ0KDQoNClVEWEVTRyA8LSANCiAgVURYRVNHX3JhdyB8PiANCiAgZmlsdGVyKHNrb2xlYWFyID09IG1heChza29sZWFhcikpIHw+IA0KICBtdXRhdGUoZWZ0ZXJza29sZSA9IGVmdGVyc2tvbGUgfD4gZmN0X2lub3JkZXIoKSB8PiBmY3RfcmV2KCksDQogICAgICAgICBzZXggPSBzZXggfD4gZmN0X2lub3JkZXIoKSB8PiBmY3RfcmV2KCkpIHw+IA0KICB1bml0ZShjb21iaSwgdW5pdCwgc2tvbGVhYXIsIHNlcCA9ICItIikNCg0KVURYRVNHIHw+IA0KICBzZWxlY3QoLWNvbWJpKSB8PiANCiAgc3ByZWFkKGVmdGVyc2tvbGUsIHZhbHVlKSB8PiANCiAgc2VsZWN0KHNleCwgc3RhdHVzLCAzOjYpIHw+IA0KICBhcnJhbmdlKHNleCwgZGVzYyhzdGF0dXMpKSB8PiANCiAgcmVuYW1lKCIgIiA9IDEpIHw+IA0KICBzdGF0Z2xfdGFibGUoKSB8PiANCiAgcm93X3NwZWMoMTozLCBib2xkID0gVCkgfD4gDQogIGNvbHVtbl9zcGVjKDMsIGJvbGQgPSBUKSB8PiANCiAgYWRkX2Zvb3Rub3RlKFVEWEVTR1tbMV1dWzFdLCBub3RhdGlvbiA9ICJzeW1ib2wiKQ0KDQpgYGANCjxicj4NClshW10oYHIgbG9nb2Ape3dpZHRoPTQwfWByIHBhc3RlKHNvdXJjZSwgIlVEWEVTRyIpYF0oYHIgcGFzdGUwKCJodHRwczovL2Jhbmsuc3RhdC5nbDo0NDMvc3EvNjNmYTFmMjAtNzkzMi00YzdhLTg2ZTMtYmY2ZmY1OWRiN2QzIiwgb3B0aW9uKWApe3RhcmdldD0iX2JsYW5rIn0NCjwvZGl2Pg0KDQoNCjxidXR0b24gY2xhc3M9ImFjY29yZGlvbiI+IGByIHBhc3RlMCgiKipUYWJlbCA0OiAqKiIsIHN0YXRnbF9tZXRhKHN0YXRnbF91cmwoIlVEWFRLSyIsIGxhbmcgPSBsYW5ndWFnZSkpWzFdJHRpdGxlKSBgIDwvYnV0dG9uPiA8ZGl2IGNsYXNzPSJwYW5lbCI+DQpgYGB7ciBVRFhUS0t9DQoNClVEWFRLS19yYXcgPC0gDQogIHN0YXRnbF91cmwoIlVEWFRLSyIsIGxhbmcgPSBsYW5ndWFnZSkgfD4gDQogIHN0YXRnbF9mZXRjaCgNCiAgICBzdWJqZWN0ICAgICAgPSBweF9hbGwoKSwNCiAgICBncmFkZSAgICAgICAgPSBweF9hbGwoKSwNCiAgICBtdW5pY2lwYWxpdHkgPSBweF9hbGwoKSwNCiAgICB1bml0ICAgICAgICAgPSAiQiIsDQogICAgdGltZSAgICAgICAgID0gcHhfdG9wKCksDQogICAgLmNvbF9jb2RlICAgID0gVA0KICApIHw+IA0KICBhc190aWJibGUoKQ0KDQpVRFhUS0sgPC0gDQogIFVEWFRLS19yYXcgfD4gDQogIHVuaXRlKGNvbWJpLCB1bml0LCB0aW1lLCBzZXAgPSAiICIpIHw+DQogIG11dGF0ZShtdW5pY2lwYWxpdHkgPSBtdW5pY2lwYWxpdHkgfD4gZmN0X2lub3JkZXIoKSkgfD4gDQogIHNwcmVhZChzdWJqZWN0LCB2YWx1ZSkNCg0KVURYVEtLIHw+IA0KICBzZWxlY3QoLTMpIHw+IA0KICByZW5hbWUoIiAiID0gMSkgfD4gDQogIHN0YXRnbF90YWJsZSgpIHw+IA0KICByb3dfc3BlYyhjKDEsIDcpLCBib2xkID0gVCkgfD4gDQogIHBhY2tfcm93cyhpbmRleCA9IHRhYmxlKFVEWFRLS1tbM11dKSkNCg0KDQoNCg0KYGBgDQo8YnI+DQpbIVtdKGByIGxvZ29gKXt3aWR0aD00MH1gciBwYXN0ZShzb3VyY2UsICJVRFhUS0siKWBdKGByIHBhc3RlMCgiaHR0cHM6Ly9iYW5rLnN0YXQuZ2w6NDQzL3NxLzBiM2NlNWQzLTdlOTctNDQzZi05ODFmLWY3ZDEyM2ZjZmI0MCIsIG9wdGlvbilgKXt0YXJnZXQ9Il9ibGFuayJ9DQo8L2Rpdj4NCg0KDQo8L2RldGFpbHM+DQoNCg0KPGRldGFpbHM+IDxzdW1tYXJ5PiBgciB0eHQkVUQkc3ViM1tsYW5ndWFnZV1gIDwvc3VtbWFyeT4gDQo8YnI+DQoNCjxidXR0b24gY2xhc3M9ImFjY29yZGlvbiI+IGByIHBhc3RlMCgiKipUYWJlbCA1OiAqKiIsIHN0YXRnbF9tZXRhKHN0YXRnbF91cmwoIlVEWElTQzExQSIsIGxhbmcgPSBsYW5ndWFnZSkpWzFdJHRpdGxlKSBgIDwvYnV0dG9uPiA8ZGl2IGNsYXNzPSJwYW5lbCI+DQpgYGB7ciBVRFhJU0MxMUF9DQoNClVEWElTQzExQV9yYXcgPC0gDQogIHN0YXRnbF91cmwoIlVEWElTQzExQSIsIGxhbmcgPSBsYW5ndWFnZSkgfD4gDQogIHN0YXRnbF9mZXRjaCgNCiAgICBJc2NlZCAgICAgPSBweF9hbGwoKSwNCiAgICBza29sZW9tciAgPSBweF9hbGwoKSwNCiAgICBzdGFydGFhciAgPSBweF90b3AoMSksDQogICAgLmNvbF9jb2RlID0gVA0KICApIHw+IA0KICBhc190aWJibGUoKQ0KDQpVRFhJU0MxMUEgPC0gDQogIFVEWElTQzExQV9yYXcgfD4gDQogIG11dGF0ZShzdGFydGFhciA9IHN0YXJ0YWFyIHw+IGZjdF9pbm9yZGVyKCksDQogICAgICAgICBza29sZW9tciA9IHNrb2xlb21yIHw+IGZjdF9pbm9yZGVyKCkpIHw+IA0KICBzcHJlYWQoc2tvbGVvbXIsIHZhbHVlKQ0KDQpVRFhJU0MxMUEgfD4gDQogIHNlbGVjdCgtc3RhcnRhYXIpIHw+IA0KICByZW5hbWUoIiAiID0gMSkgfD4gDQogIHN0YXRnbF90YWJsZSgpIHw+IA0KICBwYWNrX3Jvd3MoaW5kZXggPSB0YWJsZShVRFhJU0MxMUFbWzJdXSkpDQoNCg0KYGBgDQo8YnI+DQpbIVtdKGByIGxvZ29gKXt3aWR0aD00MH1gciBwYXN0ZShzb3VyY2UsICJVRFhJU0MxMUEiKWBdKGByIHBhc3RlMCgiaHR0cHM6Ly9iYW5rLnN0YXQuZ2w6NDQzL3NxLzE3ZTY5NTI2LTg4ODUtNGE0NS05MzZlLTMzYzYwZGNiYThiNCIsIG9wdGlvbilgKXt0YXJnZXQ9Il9ibGFuayJ9DQo8L2Rpdj4NCg0KDQo8YnV0dG9uIGNsYXNzPSJhY2NvcmRpb24iPiBgciBwYXN0ZTAoIioqVGFiZWwgNjogKioiLCBzdGF0Z2xfbWV0YShzdGF0Z2xfdXJsKCJVRFhJU0MxMUwiLCBsYW5nID0gbGFuZ3VhZ2UpKVsxXSR0aXRsZSkgYCA8L2J1dHRvbj4gPGRpdiBjbGFzcz0icGFuZWwiPg0KYGBge3IgVURYSVNDMTFMfQ0KDQpVRFhJU0MxMUxfcmF3IDwtIA0KICBzdGF0Z2xfdXJsKCJVRFhJU0MxMUwiLCBsYW5nID0gbGFuZ3VhZ2UpIHw+IA0KICBzdGF0Z2xfZmV0Y2goDQogICAgYWFyICAgICAgID0gMiwNCiAgICBpc2NlZCAgICAgPSBweF9hbGwoKSwNCiAgICBzdGF0dXMgICAgPSBweF9hbGwoKSwNCiAgICBzdGFydGFhciAgPSBweF90b3AoMyksDQogICAgLmNvbF9jb2RlID0gVA0KICApIHw+IA0KICBhc190aWJibGUoKQ0KDQpVRFhJU0MxMUwgPC0gDQogIFVEWElTQzExTF9yYXcgfD4gDQogIGZpbHRlcih2YWx1ZSA+IDApIHw+IA0KICBtdXRhdGUoc3RhdHVzID0gc3RhdHVzIHw+IGZjdF9pbm9yZGVyKCkpIHw+IA0KICBzcHJlYWQoc3RhdHVzLCB2YWx1ZSkgfD4gDQogIHVuaXRlKGNvbWJpLCBhYXIsIHN0YXJ0YWFyLCBzZXAgPSAiICIpDQoNClVEWElTQzExTCB8PiANCiAgc2VsZWN0KC0xKSB8PiANCiAgcmVuYW1lKCIgIiA9IDEpIHw+IA0KICBzdGF0Z2xfdGFibGUoKSB8PiANCiAgYWRkX2Zvb3Rub3RlKFVEWElTQzExTFtbMV1dWzFdLCBub3RhdGlvbiA9ICJzeW1ib2wiKQ0KDQoNCg0KYGBgDQo8YnI+DQpbIVtdKGByIGxvZ29gKXt3aWR0aD00MH1gciBwYXN0ZShzb3VyY2UsICJVRFhJU0MxMUwiKWBdKGByIHBhc3RlMCgiaHR0cHM6Ly9iYW5rLnN0YXQuZ2w6NDQzL3NxL2U0YjA3NmU4LWY3MDItNDZkOC1iZmVjLWJlZGQ1NjIxYzVkYSIsIG9wdGlvbilgKXt0YXJnZXQ9Il9ibGFuayJ9DQo8L2Rpdj4NCg0KPC9kZXRhaWxzPg0KDQoNCg0KPGRldGFpbHM+IDxzdW1tYXJ5PiBgciB0eHQkVUQkc3ViNFtsYW5ndWFnZV1gIDwvc3VtbWFyeT4gDQo8YnI+DQoNCjxidXR0b24gY2xhc3M9ImFjY29yZGlvbiI+IGByIHBhc3RlMCgiKipUYWJlbCA3OiAqKiIsIHN0YXRnbF9tZXRhKHN0YXRnbF91cmwoIlVEWFRSRkExIiwgbGFuZyA9IGxhbmd1YWdlKSlbMV0kdGl0bGUpIGAgPC9idXR0b24+IDxkaXYgY2xhc3M9InBhbmVsIj4NCmBgYHtyIFVEWFRSRkExfQ0KDQpVRFhUUkZBMV9yYXcgPC0gDQogIHN0YXRnbF91cmwoIlVEWFRSRkExIiwgbGFuZyA9IGxhbmd1YWdlKSB8PiANCiAgc3RhdGdsX2ZldGNoKA0KICAgIGFhciAgICAgICA9IDAsDQogICAgaXNjZWQgICAgID0gcHhfYWxsKCksDQogICAgc3RhdHVzICAgID0gcHhfYWxsKCksDQogICAgZGltX2FhciAgID0gcHhfdG9wKCksDQogICAgLmNvbF9jb2RlID0gVA0KICApIHw+IA0KICBhc190aWJibGUoKQ0KDQpVRFhUUkZBMSA8LSANCiAgVURYVFJGQTFfcmF3IHw+IA0KICB1bml0ZShjb21iaSwgYWFyLCBkaW1fYWFyLCBzZXAgPSAiICIpIHw+IA0KICBtdXRhdGUoaXNjZWQgPSBpc2NlZCB8PiBmY3RfaW5vcmRlcigpLA0KICAgICAgICAgc3RhdHVzID0gc3RhdHVzIHw+IGZjdF9pbm9yZGVyKCkpDQoNClVEWFRSRkExIHw+IA0KICBzZWxlY3QoLTEpIHw+IA0KICBzcHJlYWQoaXNjZWQsIHZhbHVlKSB8PiANCiAgcmVuYW1lKCIgIiA9IDEpIHw+IA0KICBzdGF0Z2xfdGFibGUoKSB8PiANCiAgYWRkX2Zvb3Rub3RlKFVEWFRSRkExW1sxXV1bMV0sIG5vdGF0aW9uID0gInN5bWJvbCIpDQoNCg0KDQpgYGANCjxicj4NClshW10oYHIgbG9nb2Ape3dpZHRoPTQwfWByIHBhc3RlKHNvdXJjZSwgIlVEWFRSRkExIilgXShgciBwYXN0ZTAoImh0dHBzOi8vYmFuay5zdGF0LmdsOjQ0My9zcS83ZWExNTZkZC01OWIxLTQxZTYtOWExMS05NGZmYzkxNTM4ZDIiLCBvcHRpb24pYCl7dGFyZ2V0PSJfYmxhbmsifQ0KPC9kaXY+DQoNCjwvZGV0YWlscz4NCg0KDQoNCg0KPGhyIHN0eWxlPSJib3JkZXI6MXB4IHJpZGdlIGxpZ2h0Z3JheSI+IDwvaHI+DQo8Y2VudGVyPiA8c3BhbiBzdHlsZT0nY29sb3I6I0QzRDNEMzsgZm9udC1zaXplOjkwJTsnPiBgciBwYXN0ZSh0eHQkdXBkYXRlW2xhbmd1YWdlXSwgZm9ybWF0KFN5cy5EYXRlKCksICIlZC4gJUIgJVkiKSlgIDwvc3Bhbj4gPC9jZW50ZXI+DQoNCg0KDQoNCjxzY3JpcHQ+DQp2YXIgYWNjID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiYWNjb3JkaW9uIik7DQp2YXIgaTsNCg0KZm9yIChpID0gMDsgaSA8IGFjYy5sZW5ndGg7IGkrKykgew0KICBhY2NbaV0uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbigpIHsNCiAgICB0aGlzLmNsYXNzTGlzdC50b2dnbGUoImFjdGl2ZSIpOw0KICAgIHZhciBwYW5lbCA9IHRoaXMubmV4dEVsZW1lbnRTaWJsaW5nOw0KICAgIGlmIChwYW5lbC5zdHlsZS5tYXhIZWlnaHQpIHsNCiAgICAgIHBhbmVsLnN0eWxlLm1heEhlaWdodCA9IG51bGw7DQogICAgfSBlbHNlIHsNCiAgICAgIHBhbmVsLnN0eWxlLm1heEhlaWdodCA9IHBhbmVsLnNjcm9sbEhlaWdodCArICJweCI7DQogICAgfSANCiAgfSk7DQp9DQo8L3NjcmlwdD4NCg0KDQoNCg0KDQoNCg==