<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>P3372R0: constexpr coroutines</title>
<link rel="stylesheet" href="data:text/css;base64,QG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyaykgewoJOnJvb3QgewoJCS0tdGV4dC1jb2xvcjogI0JCQjsKCQktLWZvdW5kLWhpZ2hsaWdodDogYmx1ZTsKCQktLWZvdW5kLXRleHQtY29sb3I6IHdoaXRlOwoJCS0tbWFpbi1iYWNrZ3JvdW5kOiAzMiwzMiwzMjsKCQktLWhlYWRlci1jb2xvcjogd2hpdGU7CgkJLS1ib3gtc2hhZG93LWNvbG9yOiByZ2JhKDAsMCwwLDAuNSk7CiAgICAtLXRoaW4tYm94LXNoYWRvdy1jb2xvcjogcmdiYSgwLDAsMCwwLjEpOwoJCS0tbmF2LWJhY2tncm91bmQtY29sb3I6ICMxMDEwMTA7CgkJLS1jb2RlLWZvcmVncm91bmQtY29sb3I6IHdoaXRlOwoJCS0tY29kZS1pbmZvLWNvbG9yOiByZ2JhKDI1NSwyNTUsMjU1LDAuMSk7CgkJLS1jb2RlLWJhY2tncm91bmQtY29sb3I6IHZhcigtLW5hdi1iYWNrZ3JvdW5kLWNvbG9yKTsKCQktLWxpbmstY29sb3I6ICM4ZWYzZmY7CgkJLS12aXNpdGVkLWxpbmstY29sb3I6ICNmMGZmODk7CgkJLS1ob3Zlci1saW5rLWNvbG9yOiAjYjNmN2ZmOwoJCS0taG92ZXItdmlzaXRlZC1saW5rLWNvbG9yOiAjYzhmZmIzOwoJCS0tbGluZS1jb2xvcjogMjU1LDI1NSwyNTU7CgkJLS1oZWFkZXItYmFja2dyb3VuZDogMCwwLDA7CgkJLS1xdW90ZS1sZWZ0LWNvbG9yOiByZ2JhKDI1NSwyNTUsMjU1LDAuNSk7CgkJLS1oaWdobGlnaHQ6IHJnYmEoMjU1LDI1MiwwLDAuMjUpOwoJfQoJOjpzZWxlY3Rpb24gewoJICBjb2xvcjogYmxhY2s7CgkgIGJhY2tncm91bmQ6IGxpZ2h0eWVsbG93OwoJfQp9CgpAbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOiBsaWdodCkgewoJOnJvb3QgewoJCS0tdGV4dC1jb2xvcjogYmxhY2s7CgkJLS1mb3VuZC1oaWdobGlnaHQ6IHllbGxvdzsKCQktLWZvdW5kLXRleHQtY29sb3I6IGJsYWNrOwoJCS0tbWFpbi1iYWNrZ3JvdW5kOiAyNTUsMjU1LDI1NTsKCQktLWhlYWRlci1jb2xvcjogYmxhY2s7CgkJLS1ib3gtc2hhZG93LWNvbG9yOiByZ2JhKDAsMCwwLDAuMyk7CiAgICAtLXRoaW4tYm94LXNoYWRvdy1jb2xvcjogcmdiYSgwLDAsMCwwLjEpOwoJCS0tbmF2LWJhY2tncm91bmQtY29sb3I6ICNGNUY1RjU7CgkJLS1jb2RlLWZvcmVncm91bmQtY29sb3I6IGJsYWNrOwoJCS0tY29kZS1pbmZvLWNvbG9yOiByZ2JhKDAsMCwwLDAuMSk7CgkJLS1jb2RlLWJhY2tncm91bmQtY29sb3I6IHZhcigtLW5hdi1iYWNrZ3JvdW5kLWNvbG9yKTsKCQktLWxpbmstY29sb3I6ICMwMDAwODI7CgkJLS12aXNpdGVkLWxpbmstY29sb3I6ICM1MDhkMGY7CgkJLS1ob3Zlci1saW5rLWNvbG9yOiAjNTc1N2MyOwoJCS0taG92ZXItdmlzaXRlZC1saW5rLWNvbG9yOiAjOTRjNTYwOwoJCS0tbGluZS1jb2xvcjogMTIsNDMsNzU7CgkJLS1oZWFkZXItYmFja2dyb3VuZDogMCwwLDA7CgkJLS1xdW90ZS1sZWZ0LWNvbG9yOiByZ2JhKDAsMCwwLDAuNSk7CgkJLS1oaWdobGlnaHQ6IHJnYmEoMjU1LDI1NCwyMDcsMC41KTsKCX0KCTo6c2VsZWN0aW9uIHsKCSAgY29sb3I6IGJsYWNrOwoJICBiYWNrZ3JvdW5kOiAjYTRjM2Y2OwoJfQp9CgpzcGFuOnRhcmdldCwgcDp0YXJnZXQsIGxpOnRhcmdldCwgZGl2OnRhcmdldCB7CiAgYmFja2dyb3VuZDogdmFyKC0taGlnaGxpZ2h0KTsKfQoKLm5hbWUtb2YtcGFwZXIgewoJZm9udC1zaXplOiAyOHB4OwoJcGFkZGluZy10b3A6IDAuNWVtOwp9CgpzcGFuLmZvdW5kIHsKCXRleHQtc2hhZG93OiAwIDAgMTBweCB2YXIoLS1mb3VuZC1oaWdobGlnaHQpLCAgMCAwIDEwcHggdmFyKC0tZm91bmQtaGlnaGxpZ2h0KSwgIDAgMCAxMHB4IHZhcigtLWZvdW5kLWhpZ2hsaWdodCksICAwIDAgMTBweCB2YXIoLS1mb3VuZC1oaWdobGlnaHQpOwoJY29sb3I6IHZhcigtLWZvdW5kLXRleHQtY29sb3IpICFpbXBvcnRhbnQ7Cn0KCmJvZHkgewoJZm9udC1mYW1pbHk6IEhlbHZldGljYTsKCXBhZGRpbmc6IDA7CgltYXJnaW46IDA7CglvdmVyZmxvdzogaGlkZGVuOwoJY29sb3I6IHZhcigtLXRleHQtY29sb3IpOwoJYmFja2dyb3VuZC1jb2xvcjogcmdiYSh2YXIoLS1tYWluLWJhY2tncm91bmQpLCAxKTsKfQoKYm9keSA+IGRpdiB7CglkaXNwbGF5OiBmbGV4OwoJcGFkZGluZzogMDsKCW1hcmdpbjogMDsKfQoKLmhpZGUtb24tbmFycm93IHsKCWRpc3BsYXk6IGluaGVyaXQ7Cn0KCi5oaWRlLW9uLXdpZGUgewoJZGlzcGxheTogbm9uZTsKfQoKQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAxMTAwcHgpIHsKCWJvZHkgewoJCW92ZXJmbG93OiBpbmhlcml0ICFpbXBvcnRhbnQ7Cgl9CgkuaGlkZS1vbi1uYXJyb3cgewoJCWRpc3BsYXk6IG5vbmU7Cgl9CgkuaGlkZS1vbi13aWRlIHsKCQlkaXNwbGF5OiBpbmhlcml0OwoJfQoJYm9keSA+IGRpdiB7CgkJZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDsKCX0KCWFydGljbGUgewoJCW92ZXJmbG93OiBpbmhlcml0ICFpbXBvcnRhbnQ7CgkJYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCB0cmFuc3BhcmVudCxyZ2JhKHZhcigtLW1haW4tYmFja2dyb3VuZCksMC42KSwgcmdiYSh2YXIoLS1tYWluLWJhY2tncm91bmQpLDAuOCksIHJnYmEodmFyKC0tbWFpbi1iYWNrZ3JvdW5kKSwwLjYpLCB0cmFuc3BhcmVudCkgIWltcG9ydGFudDsKCX0KCW5hdiwgYXJ0aWNsZSB7CgkJZmxleDogaW5pdGlhbCAhaW1wb3J0YW50OwoJfQoJbmF2IHsKCQltaW4td2lkdGg6IGluaXRpYWwgIWltcG9ydGFudDsKCQltYXgtd2lkdGg6IGluaXRpYWwgIWltcG9ydGFudDsKCQltaW4taGVpZ2h0OiBpbml0aWFsICFpbXBvcnRhbnQ7CgkJbWF4LWhlaWdodDogaW5pdGlhbCAhaW1wb3J0YW50OwoJCWJveC1zaGFkb3c6IDAgMTBweCAwIHZhcigtLWJveC1zaGFkb3ctY29sb3IpOwoJfQoJbmF2ID4gZGl2IHsKCQlvdmVyZmxvdzogaW5oZXJpdCAhaW1wb3J0YW50OwoJCXBvc2l0aW9uOiByZWxhdGl2ZSAhaW1wb3J0YW50OwoJCW1heC13aWR0aDogaW5pdGlhbCAhaW1wb3J0YW50OwoJCW1heC1oZWlnaHQ6IGluaXRpYWwgIWltcG9ydGFudDsKCX0KCWRpdjpoYXMoPiBpbnB1dFt0eXBlPXNlYXJjaF0pIHsKCQlkaXNwbGF5OiBub25lOwoJfQoJZGl2LnF1b3RlIHsKCQlvdmVyZmxvdy14OiBzY3JvbGw7CgkJb3ZlcmZsb3cteTogdmlzaWJsZTsKCX0KfQoKbmF2IHsKCXBhZGRpbmc6IDAgMC41ZW07CgltYXJnaW46IDA7CglmbGV4OiAxIDEgMDsKCW1pbi13aWR0aDogMzUwcHg7CgltYXgtd2lkdGg6IDM1MHB4OwoJYm94LXNoYWRvdzogMCAwIDEwcHggdmFyKC0tYm94LXNoYWRvdy1jb2xvcik7CgliYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1uYXYtYmFja2dyb3VuZC1jb2xvcik7Cn0KCm5hdiA+IGRpdiB7Cglwb3NpdGlvbjogZml4ZWQ7CgltYXgtd2lkdGg6IDM1MHB4OwoJbWF4LWhlaWdodDogMTAwJTsKCW92ZXJmbG93OiBzY3JvbGw7Cgl0b3A6IDA7CglsZWZ0OiAwOwoJcGFkZGluZzogMCAwLjVlbTsKCW1hcmdpbjogMDsKfQoKbmF2ID4gZGl2ID4gZGl2IHsKCXBhZGRpbmc6IDAuNWVtOwoJcGFkZGluZy10b3A6IDA7CglwYWRkaW5nLWJvdHRvbTogMWVtOwp9CgphcnRpY2xlIHsKCWZsZXg6IDMgMSAwOwogIHNjcm9sbC1iZWhhdmlvcjogc21vb3RoOwoJb3ZlcmZsb3c6IHNjcm9sbDsKCWhlaWdodDogMTAwdmg7Cgl0ZXh0LWFsaWduOiBqdXN0aWZ5OwoJYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgdHJhbnNwYXJlbnQscmdiYSh2YXIoLS1tYWluLWJhY2tncm91bmQpLDAuNiksIHJnYmEodmFyKC0tbWFpbi1iYWNrZ3JvdW5kKSwwLjgpLCByZ2JhKHZhcigtLW1haW4tYmFja2dyb3VuZCksMC42KSwgdHJhbnNwYXJlbnQpOwoJcGFkZGluZzogMDsKCW1hcmdpbjogMDsKfQoKYXJ0aWNsZSA+IGRpdiB7CglwYWRkaW5nLXJpZ2h0OiAxLjVlbTsKCXBhZGRpbmctbGVmdDogMS41ZW07CglwYWRkaW5nLWJvdHRvbTogMWVtOwp9Cgpjb2RlIHsKCQp9CgpkaXYucXVvdGUgewoJY29sb3I6IHZhcigtLWNvZGUtZm9yZWdyb3VuZC1jb2xvcik7CgliYWNrZ3JvdW5kOiB2YXIoLS1jb2RlLWJhY2tncm91bmQtY29sb3IpOwoJcGFkZGluZzogMWVtOwoJYm9yZGVyLXJhZGl1czogMHB4IDE1cHggMTVweCAwcHg7Cglib3JkZXItbGVmdDogNXB4IHNvbGlkIHZhcigtLXF1b3RlLWxlZnQtY29sb3IpOwoJZm9udC1zdHlsZTogaXRhbGljOwoJbWFyZ2luOiAxZW07Cn0KCmNvZGU6bm90KHByZSA+IGNvZGUpIHsKCWNvbG9yOiBpbmhlcml0OwoJYmFja2dyb3VuZDogdmFyKC0tY29kZS1iYWNrZ3JvdW5kLWNvbG9yKTsKCWJvcmRlci1yYWRpdXM6IDVweDsKCXBhZGRpbmc6IDAgMC4yZW07CgltYXJnaW46IDAgMnB4OwoJb3V0bGluZTogMnB4IHNvbGlkIHZhcigtLWNvZGUtYmFja2dyb3VuZC1jb2xvcik7Cn0KCnByZSA+IGNvZGUgewoJb3V0bGluZTogbm9uZTsKCWxpbmUtaGVpZ2h0OiAxLjQ7Cgl0YWItc2l6ZTogMjsKfQoKcHJlOmhhcyhjb2RlKSB7Cgljb2xvcjogdmFyKC0tY29kZS1mb3JlZ3JvdW5kLWNvbG9yKTsKCWJhY2tncm91bmQ6IHZhcigtLWNvZGUtYmFja2dyb3VuZC1jb2xvcik7CglwYWRkaW5nOiAxZW07Cglib3JkZXItcmFkaXVzOiAxNXB4OwoJcG9zaXRpb246IHJlbGF0aXZlOwoJei1pbmRleDogMTsKCW92ZXJmbG93LXg6IHNjcm9sbDsKCW92ZXJmbG93LXk6IHZpc2libGU7Cn0KCnByZTpoYXMoY29kZS5sYW5ndWFnZS1jYXJib24pOjpiZWZvcmUgewoJY29udGVudDogIkNhcmJvbiI7Cgl0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwoJcG9zaXRpb246IGFic29sdXRlOwoJdG9wOiAxZW07CglyaWdodDogMWVtOwoJY29sb3I6IHZhcigtLWNvZGUtaW5mby1jb2xvcik7Cglmb250LXdlaWdodDogYm9sZDsKfQoKcCwgdWwgPiBsaSB7Cgl0ZXh0LWFsaWduOiBqdXN0aWZ5OwoJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCWh5cGhlbnM6IGF1dG87Cn0KCmFydGljbGUgdWwgPiBsaSB7CglwYWRkaW5nLWJvdHRvbTogMC4yNWVtOwp9CgpkaXYuZGVzY3JpcHRpb24gdWwgewogIHBhZGRpbmctdG9wOiAwLjVlbTsKCXBhZGRpbmctYm90dG9tOiAwLjVlbTsKfQoKYSB7Cgljb2xvcjogdmFyKC0tbGluay1jb2xvcik7Cgl0ZXh0LWRlY29yYXRpb24tc3R5bGU6IGRvdHRlZDsKfQoKYTpob3ZlciB7Cgljb2xvcjogdmFyKC0taG92ZXItbGluay1jb2xvcik7Cgl0ZXh0LWRlY29yYXRpb24tc3R5bGU6IHNvbGlkOwp9CgphOnZpc2l0ZWQgewoJY29sb3I6IHZhcigtLXZpc2l0ZWQtbGluay1jb2xvcik7Cn0KCmE6dmlzaXRlZDpob3ZlciB7Cgljb2xvcjogdmFyKC0taG92ZXItdmlzaXRlZC1saW5rLWNvbG9yKTsKCXRleHQtZGVjb3JhdGlvbi1zdHlsZTogc29saWQ7Cn0KCmgxLCBoMiwgaDMsIGg0LCBoNSB7CgltYXJnaW46IDA7CgltYXJnaW4tYm90dG9tOiAxMHB4OwoJcGFkZGluZzogMC41ZW07CglwYWRkaW5nLXRvcDogMjBweDsKCXBhZGRpbmctYm90dG9tOiAycHg7Cgl6LWluZGV4OiAyOwoJY29sb3I6IHZhcigtLWhlYWRlci1jb2xvcik7Cn0KCmFydGljbGUgaDEsIGFydGljbGUgaDIsIGFydGljbGUgaDMsIGFydGljbGUgaDQsIGFydGljbGUgaDUgewovKglwb3NpdGlvbjogc3RpY2t5OwoJcG9zaXRpb246IC13ZWJraXQtc3RpY2t5OwoJdG9wOiAwOyovCgkKfQoKaDEgewoJZm9udC13ZWlnaHQ6IDgwMDsKCWJvcmRlci1ib3R0b206IHJnYmEodmFyKC0tbGluZS1jb2xvciksIDEpIGRvdHRlZCAycHg7Cn0KCmgyIHsKCWZvbnQtd2VpZ2h0OiA4MDA7Cglib3JkZXItYm90dG9tOiByZ2JhKHZhcigtLWxpbmUtY29sb3IpLCAwLjc1KSBkb3R0ZWQgMnB4Owp9CgpoMywgaDQsIGg1IHsKCWZvbnQtd2VpZ2h0OiA2MDA7Cglib3JkZXItYm90dG9tOiByZ2JhKHZhcigtLWxpbmUtY29sb3IpLCAwLjMzKSBkb3R0ZWQgMnB4Owp9CgpoMSA+IGEsIGgyID4gYSwgaDMgPiBhLCBoNCA+IGEsIGg1ID4gYSB7Cgljb2xvcjogaW5oZXJpdCAhaW1wb3J0YW50OwoJdGV4dC1kZWNvcmF0aW9uOiBpbmhlcml0Owp9CgpoMTp0YXJnZXQ6OmFmdGVyLCBoMjp0YXJnZXQ6OmFmdGVyLCBoMzp0YXJnZXQ6OmFmdGVyLCBoNDp0YXJnZXQ6OmFmdGVyLCBoNTp0YXJnZXQ6OmFmdGVyIHsKCXRleHQtZGVjb3JhdGlvbjogaW5oZXJpdDsKCWNvbnRlbnQ6ICIg4pqT77iOIjsKICBmb250LXNpemU6IDE0cHg7Cn0KCmgxID4gYTpob3ZlciwgaDIgPiBhOmhvdmVyLCBoMyA+IGE6aG92ZXIsIGg0ID4gYTpob3ZlciwgaDUgPiBhOmhvdmVyIHsKCWNvbG9yOiB2YXIoLS1ob3Zlci1saW5rLWNvbG9yKTsKfQoKZGl2Omhhcyg+IGlucHV0W3R5cGU9c2VhcmNoXSkgewoJcG9zaXRpb246IGZpeGVkOwoJdG9wOiAwOwoJcmlnaHQ6IDA7Cgl6LWluZGV4OiAxMDAwOwoJcGFkZGluZzogMC41ZW07CgliYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1uYXYtYmFja2dyb3VuZC1jb2xvcik7Cglib3gtc2hhZG93OiAwIDAgMTBweCByZ2JhKDAsMCwwLDAuMyk7Cglib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAxMHB4Owp9CgpkaXYgPiBpbnB1dFt0eXBlPXNlYXJjaF0gewoJYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbmF2LWJhY2tncm91bmQtY29sb3IpOwoJYm9yZGVyOiAycHggc29saWQgdmFyKC0tdGV4dC1jb2xvcik7Cgljb2xvcjogdmFyKC0tdGV4dC1jb2xvcik7Cgl3aWR0aDogMzAwcHg7Cn0KCmRpdi5wYXBlci1pbmZvIHsKCXBhZGRpbmc6IDA7CglwYWRkaW5nLXRvcDogMWVtOwoJCgkua2V5IHsKCQlmb250LXdlaWdodDogYm9sZDsKCX0KCQoJZGl2IHsKCX0KfQoKdWwgewoJcGFkZGluZzogMDsKCW1hcmdpbjogMDsKCXBhZGRpbmctbGVmdDogMmVtOwp9CgpsaSA+IHVsIHsKCXBhZGRpbmctbGVmdDogMC41ZW07Cn0KCnVsID4gbGkgewoJcGFkZGluZy1sZWZ0OiAwLjVlbTsKfQoKY29kZSAuZXJyb3IsIGNvZGUgLmJlZm9yZSB7CgkJbGluZS1oZWlnaHQ6IDEuOTsKfQoKY29kZSAuZXJyb3IgPiAqLCBjb2RlIC5iZWZvcmUgPiAqIHsKCWJhY2tncm91bmQtY29sb3I6ICNGRjg4ODggIWltcG9ydGFudDsKCWNvbG9yOiBibGFjayAhaW1wb3J0YW50OwoJQG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyaykgewoJCWNvbG9yOiB3aGl0ZTsKCX0KCWJvcmRlcjogM3B4IHNvbGlkICNGRjg4ODg7Cglmb250LXdlaWdodDogYm9sZDsKfQoKY29kZSAuYWZ0ZXIgPiAqIHsKCWJhY2tncm91bmQtY29sb3I6IGxpZ2h0Z3JlZW4gIWltcG9ydGFudDsKCWNvbG9yOiBibGFjayAhaW1wb3J0YW50OwoJQG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyaykgewoJCWNvbG9yOiB3aGl0ZTsKCX0KCWJvcmRlcjogM3B4IHNvbGlkIGxpZ2h0Z3JlZW47Cglmb250LXdlaWdodDogYm9sZDsKfQoKY29kZSAudW5jaGFuZ2VkID4gKiB7CgliYWNrZ3JvdW5kLWNvbG9yOiBsaWdodHllbGxvdyAhaW1wb3J0YW50OwoJY29sb3I6IGJsYWNrICFpbXBvcnRhbnQ7CglAbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKSB7CgkJY29sb3I6IHdoaXRlOwoJfQoJYm9yZGVyOiAzcHggc29saWQgbGlnaHR5ZWxsb3c7Cglmb250LXdlaWdodDogYm9sZDsKfQoKY29kZSAuaW52aXNpYmxlIHsKCXZpc2liaWxpdHk6IGhpZGRlbjsKfQoKLmNoYW5nZXMgewoJZGlzcGxheTogaW5saW5lLWJsb2NrOwp9Cgoud29yZGluZyBoMSwgLndvcmRpbmcgaDIgewoJZm9udC1zaXplOiBpbmhlcml0OwoJdGV4dC1kZWNvcmF0aW9uOiBub25lOwoJYm9yZGVyOiBub25lOwoJcGFkZGluZzogMDsKCW1hcmdpbjogMDsKfQoKLndvcmRpbmcgcCB7CglwYWRkaW5nOiAwOwoJcGFkZGluZy10b3A6IDAuNWVtOwoJbWFyZ2luOiAwOwp9Cgoud29yZGluZyBhIHsKCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKCWNvbG9yOiBpbmhlcml0Owp9Cgoud29yZGluZyBhOmhvdmVyIHsKCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwoJY29sb3I6IHZhcigtLWxpbmstY29sb3IpOwp9Cgoud29yZGluZyBjb2RlIHsKCWJhY2tncm91bmQ6IGluaGVyaXQgIWltcG9ydGFudDsKCWJvcmRlcjogbm9uZTsKCW91dGxpbmU6IG5vbmU7Cn0KCQoud29yZGluZyB7Cglmb250LWZhbWlseTogIk5vdG8gU2VyaWYiOwoJCglwYWRkaW5nOiAwLjVlbSAxZW07CglwYWRkaW5nLWJvdHRvbTogMWVtOwoJY29sb3I6IHZhcigtLWNvZGUtZm9yZWdyb3VuZC1jb2xvcik7CgliYWNrZ3JvdW5kOiB2YXIoLS1jb2RlLWJhY2tncm91bmQtY29sb3IpOwoJbGluZS1oZWlnaHQ6IDEuNTU7CgkKCWJvcmRlci1yYWRpdXM6IDE1cHg7Cglwb3NpdGlvbjogcmVsYXRpdmU7Cgl6LWluZGV4OiAxOwoJb3ZlcmZsb3cteDogdmlzaWJsZTsKCW92ZXJmbG93LXk6IHZpc2libGU7Cn0KCQoud29yZGluZyAuYWRkZWQsIHByZSAuYWRkZWQgewoJYmFja2dyb3VuZC1jb2xvcjogbGlnaHRncmVlbjsKICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICB0ZXh0LWRlY29yYXRpb24tY29sb3I6IGdyZWVuOwogIHRleHQtZGVjb3JhdGlvbi10aGlja25lc3M6IDJweCAhaW1wb3J0YW50OwoJei1pbmRleDogODA7CglwYWRkaW5nOiAzcHg7CglAbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKSB7CgkJY29sb3I6IGJsYWNrOwoJfQp9CgkKLndvcmRpbmcgLnJlbW92ZWQgewoJYmFja2dyb3VuZC1jb2xvcjogI0ZGODg4ODsKCXotaW5kZXg6IDUwOwoJcGFkZGluZzogM3B4OwogIHRleHQtZGVjb3JhdGlvbjogbGluZS10aHJvdWdoOwogIHRleHQtZGVjb3JhdGlvbi1jb2xvcjogcmVkOwogIHRleHQtZGVjb3JhdGlvbi10aGlja25lc3M6IDJweCAhaW1wb3J0YW50OwoJQG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyaykgewoJCWNvbG9yOiBibGFjazsKCX0KfQoJCi53b3JkaW5nIC5ub3RlIHsKCWZvbnQtc2l6ZTogMC44ZW07Cn0KCQoud29yZGluZwkrIC53b3JkaW5nIHsKCW1hcmdpbi10b3A6IDAuNWVtOwp9CgkKLndvcmRpbmcgcHJlOmhhcyhjb2RlKSB7Cglib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1jb2RlLWluZm8tY29sb3IpOwoJYm9yZGVyLXJhZGl1czogMDsKCXBhZGRpbmc6IDBlbTsKCXotaW5kZXg6IDE7CglvdmVyZmxvdy14OiBzY3JvbGw7Cn0KCQoud29yZGluZwljb2RlIC5hZGRlZGVkIHNwYW4gewoJY29sb3I6IGJsYWNrICFpbXBvcnRhbnQ7Cn0KCnRhYmxlLnBvbGwgewogIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7CiAgbWFyZ2luLXRvcDogMjBweDsKfQoKdGFibGUucG9sbCB0aCwgdGFibGUucG9sbCB0ZCB7CiAgYm9yZGVyOiAwOwogIHBhZGRpbmc6IDAgMTBweDsKICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgYm9yZGVyOiAycHggc29saWQgcmdiYSgxMjgsMTI4LDEyOCwwLjIpOwp9Cgp0YWJsZS5wb2xsIHRkOmZpcnN0LWNoaWxkLCB0YWJsZS5wb2xsIHRoOmZpcnN0LWNoaWxkIHsKIGJvcmRlci1sZWZ0OiBub25lOwp9Cgp0YWJsZS5wb2xsIHRkOmxhc3QtY2hpbGQsIHRhYmxlLnBvbGwgdGg6bGFzdC1jaGlsZCB7CiBib3JkZXItcmlnaHQ6IG5vbmU7Cn0KCnRhYmxlLnBvbGwgdHI6Zmlyc3QtY2hpbGQgdGgsIHRhYmxlLnBvbGwgdHI6Zmlyc3QtY2hpbGQgdGQgewogIGJvcmRlci10b3A6IG5vbmU7Cn0KCnRhYmxlLnBvbGwgdHI6bGFzdC1jaGlsZCB0aCwgdGFibGUucG9sbCB0cjpsYXN0LWNoaWxkIHRkIHsKICBib3JkZXItYm90dG9tOiBub25lOwp9Cgoud29yZGluZyAuZGVzY3JpcHRpb24gewogIHBhZGRpbmctYm90dG9tOiAxZW07Cn0KCi53b3JkaW5nIC5jYXBzIHsKICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwp9Cgp0YWJsZSB0aC50YWJsZS1ncm91cCB7CgltYXgtd2lkdGg6IDJlbTsKfQoKdGFibGUgdGgudGFibGUtZ3JvdXAgPiBzcGFuIHsKCW1heC13aWR0aDogMmVtOwoJZGlzcGxheTogYmxvY2s7CglvdmVyZmxvdzogdmlzaWJsZTsKCXRleHQtYWxpZ246IGNlbnRlcjsKCXRyYW5zZm9ybTogdHJhbnNsYXRlWCgxZW0pOwp9Cgp0YWJsZSB0aC50YWJsZS1ncm91cCA+IHNwYW4gPiBzcGFuIHsKCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCXRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKSByb3RhdGUoLTkwZGVnKTsKCXdpZHRoOiBhdXRvOwp9Cgp0YWJsZS5iZWZvcmUtYWZ0ZXIgdGgsIHRhYmxlLmJlZm9yZS1hZnRlciB0ZCAgewogIGhlaWdodDogMzBweDsKfQoKCgp0YWJsZS5iZWZvcmUtYWZ0ZXIgLmdyZWVuIHsKICBjb2xvcjogZ3JlZW47Cn0KCnRhYmxlLmJlZm9yZS1hZnRlciAub3JhbmdlIHsKICBjb2xvcjogb3JhbmdlOwp9Cgp0YWJsZS5iZWZvcmUtYWZ0ZXIgLnJlZC1ub3JtYWwgewogIGNvbG9yOiByZWQ7Cn0KCnRhYmxlLmJlZm9yZS1hZnRlciAuaW4tcHJvZ3Jlc3MgewoJY29sb3I6IGJsdWU7CgliYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsMjMxLDI1NSwwLjUpOwp9Cgp0YWJsZS5iZWZvcmUtYWZ0ZXIgLnByb3Bvc2luZyB7Cgljb2xvcjogZ3JlZW47CgliYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsMjU1LDAsMC41KTsKfQoKdGFibGUuYmVmb3JlLWFmdGVyIC5ub3QtcHJvcG9zaW5nIHsKCWNvbG9yOiByZWQ7CgliYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI1NSwwLDAsMC4yNSk7Cn0KCnRhYmxlLmJlZm9yZS1hZnRlciAubmV2ZXItcHJvcG9zaW5nIHsKCWNvbG9yOiByZWQ7CgliYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI1NSwwLDAsMC4yNSk7Cn0KCnRhYmxlLmJlZm9yZS1hZnRlciAucHJvcG9zZWQtcmVhZHktZm9yLWZ1dHVyZSB7Cgljb2xvcjogZ3JlZW47CgliYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDIwMywyMjksNywwLjUpOwp9Cgp0YWJsZS5iZWZvcmUtYWZ0ZXIgLnByb3Bvc2VkLXJlYWR5LWZvci1mdXR1cmUyIHsKCWNvbG9yOiBncmVlbjsKCWJhY2tncm91bmQtY29sb3I6IHJnYmEoMjU1LDE5OCwwLDAuNSk7Cn0KCnRhYmxlLmJlZm9yZS1hZnRlciAucmVkIHsKICBjb2xvcjogcmVkOwogIGZvbnQtc2l6ZTogMjRweDsKICBsaW5lLWhlaWdodDogMTZweDsKfQoKdGQgYSwgdGQgYTp2aXNpdGVkLCB0ZCBhOmhvdmVyIHsKCWNvbG9yOiBpbmhlcml0Owp9CgpkaXYud29yZGluZy1ub3RlIHsKICBiYWNrZ3JvdW5kOiByZ2IodmFyKC0tbWFpbi1iYWNrZ3JvdW5kKSk7CiAgYm94LXNoYWRvdzogNXB4IDAgMTBweCB2YXIoLS10aGluLWJveC1zaGFkb3ctY29sb3IpIGluc2V0OwogIGJvcmRlci1yYWRpdXM6IDE1cHg7CiAgY29sb3I6IHZhcigtLXRleHQtY29sb3IpOwogIHBhZGRpbmc6IDEwcHg7CiAgbWFyZ2luOiAxMHB4IDIwcHg7CiAgZm9udC1zaXplOiAxMnB4Owp9CgoucGFybnVtIHsKCWZvbnQtc2l6ZTogMTJweDsKCW1hcmdpbi1yaWdodDogMC4yNWVtOwoJZGlzcGxheTogaW5saW5lLWJsb2NrOwp9CgpsaTpoYXMoPiAucGFybnVtKSB7CglsaXN0LXN0eWxlLXBvc2l0aW9uOiBpbnNpZGU7Cglwb3NpdGlvbjogcmVsYXRpdmU7Cn0KCmxpID4gLnBhcm51bSB7Cglwb3NpdGlvbjogYWJzb2x1dGU7CglsZWZ0OiAtMzBweDsKCWJvdHRvbTogMnB4Owp9Cgp0YWJsZS5iZWZvcmUtYWZ0ZXIgdGQuZGlzYWJsZS1ib3R0b20sIHRhYmxlLmJlZm9yZS1hZnRlciB0aC5kaXNhYmxlLWJvdHRvbSB7Cglib3JkZXItYm90dG9tOiBub25lOwp9CnRhYmxlLmJlZm9yZS1hZnRlciB0aC5sZWZ0LCB0YWJsZS5iZWZvcmUtYWZ0ZXIgdGQubGVmdCB7Cgl0ZXh0LWFsaWduOiBsZWZ0Owp9Cgp0ZCBhLm5vdGU6YWZ0ZXIgewoJdmVydGljYWwtYWxpZ246IHN1cGVyOwoJZm9udC1zaXplOiA3NSU7CgltYXJnaW4tbGVmdDogMC41ZW07Cn0KCnRkIGEubm90ZS5uMTphZnRlciB7Cgljb250ZW50OiAiMSI7Cn0KCnRkIGEubm90ZS5uMjphZnRlciB7Cgljb250ZW50OiAiMiI7Cn0KCnRkIGEubm90ZS5uMzphZnRlciB7Cgljb250ZW50OiAiMyI7Cn0KCnRkIGEubm90ZS5uNDphZnRlciB7Cgljb250ZW50OiAiNCI7Cn0KCnRkIGEubm90ZS5uNTphZnRlciB7Cgljb250ZW50OiAiNSI7Cn0=">
<link rel="stylesheet" href="data:text/css;base64,QG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTogbGlnaHQpIHsKCnByZSBjb2RlLmhsanMgewoKfQpjb2RlLmhsanMgewoKfQovKgoKWENvZGUgc3R5bGUgKGMpIEFuZ2VsIEdhcmNpYSA8YW5nZWxnYXJjaWEubWFpbEBnbWFpbC5jb20+CgoqLwouaGxqcyB7CiAgY29sb3I6IGluaGVyaXQKfQovKiBHcmF5IERPQ1RZUEUgc2VsZWN0b3JzIGxpa2UgV2ViS2l0ICovCi54bWwgLmhsanMtbWV0YSB7CiAgY29sb3I6ICNjMGMwYzAKfQouaGxqcy1jb21tZW50LAouaGxqcy1xdW90ZSB7CiAgY29sb3I6ICMwMDc0MDAKfQouaGxqcy10YWcsCi5obGpzLWF0dHJpYnV0ZSwKLmhsanMta2V5d29yZCwKLmhsanMtc2VsZWN0b3ItdGFnLAouaGxqcy1saXRlcmFsLAouaGxqcy1uYW1lIHsKICBjb2xvcjogI2FhMGQ5MQp9Ci5obGpzLXZhcmlhYmxlLAouaGxqcy10ZW1wbGF0ZS12YXJpYWJsZSB7CiAgY29sb3I6ICMzRjZFNzQKfQouaGxqcy1jb2RlLAouaGxqcy1zdHJpbmcsCi5obGpzLW1ldGEgLmhsanMtc3RyaW5nIHsKICBjb2xvcjogI2M0MWExNgp9Ci5obGpzLXJlZ2V4cCwKLmhsanMtbGluayB7CiAgY29sb3I6ICMwRTBFRkYKfQouaGxqcy10aXRsZSwKLmhsanMtc3ltYm9sLAouaGxqcy1idWxsZXQsCi5obGpzLW51bWJlciB7CiAgY29sb3I6ICMxYzAwY2YKfQouaGxqcy1zZWN0aW9uLAouaGxqcy1tZXRhIHsKICBjb2xvcjogIzY0MzgyMAp9Ci5obGpzLXRpdGxlLmNsYXNzXywKLmhsanMtY2xhc3MgLmhsanMtdGl0bGUsCi5obGpzLXR5cGUsCi5obGpzLWJ1aWx0X2luLAouaGxqcy1wYXJhbXMgewogIGNvbG9yOiAjNWMyNjk5Cn0KLmhsanMtYXR0ciB7CiAgY29sb3I6ICM4MzZDMjgKfQouaGxqcy1zdWJzdCB7CiAgY29sb3I6ICMwMDAKfQouaGxqcy1mb3JtdWxhIHsKICBmb250LXN0eWxlOiBpdGFsaWMKfQouaGxqcy1hZGRpdGlvbiB7Cgp9Ci5obGpzLWRlbGV0aW9uIHsKCn0KLmhsanMtc2VsZWN0b3ItaWQsCi5obGpzLXNlbGVjdG9yLWNsYXNzIHsKICBjb2xvcjogIzliNzAzZgp9Ci5obGpzLWRvY3RhZywKLmhsanMtc3Ryb25nIHsKICBmb250LXdlaWdodDogYm9sZAp9Ci5obGpzLWVtcGhhc2lzIHsKICBmb250LXN0eWxlOiBpdGFsaWMKfQoKfQoKQG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyaykgewoKcHJlIGNvZGUuaGxqcyB7Cgp9CmNvZGUuaGxqcyB7Cgp9Ci8qCgpYQ29kZSBzdHlsZSAoYykgQW5nZWwgR2FyY2lhIDxhbmdlbGdhcmNpYS5tYWlsQGdtYWlsLmNvbT4KCiovCi5obGpzIHsKICBjb2xvcjogaW5oZXJpdAp9Ci8qIEdyYXkgRE9DVFlQRSBzZWxlY3RvcnMgbGlrZSBXZWJLaXQgKi8KLnhtbCAuaGxqcy1tZXRhIHsKICBjb2xvcjogI2MwYzBjMAp9Ci5obGpzLWNvbW1lbnQsCi5obGpzLXF1b3RlIHsKICBjb2xvcjogIzAwNzQwMAp9Ci5obGpzLXRhZywKLmhsanMtYXR0cmlidXRlLAouaGxqcy1rZXl3b3JkLAouaGxqcy1zZWxlY3Rvci10YWcsCi5obGpzLWxpdGVyYWwsCi5obGpzLW5hbWUgewogIGNvbG9yOiAjYWEwZDkxCn0KLmhsanMtdmFyaWFibGUsCi5obGpzLXRlbXBsYXRlLXZhcmlhYmxlIHsKICBjb2xvcjogIzNGNkU3NAp9Ci5obGpzLWNvZGUsCi5obGpzLXN0cmluZywKLmhsanMtbWV0YSAuaGxqcy1zdHJpbmcgewogIGNvbG9yOiAjYzQxYTE2Cn0KLmhsanMtcmVnZXhwLAouaGxqcy1saW5rIHsKICBjb2xvcjogIzBFMEVGRgp9Ci5obGpzLXRpdGxlLAouaGxqcy1zeW1ib2wsCi5obGpzLWJ1bGxldCwKLmhsanMtbnVtYmVyIHsKICBjb2xvcjogIzkzODJmZgp9Ci5obGpzLXNlY3Rpb24sCi5obGpzLW1ldGEgewogIGNvbG9yOiAjNjQzODIwCn0KLmhsanMtdGl0bGUuY2xhc3NfLAouaGxqcy1jbGFzcyAuaGxqcy10aXRsZSwKLmhsanMtdHlwZSwKLmhsanMtYnVpbHRfaW4sCi5obGpzLXBhcmFtcyB7CiAgY29sb3I6ICNiODc5ZmYKfQouaGxqcy1hdHRyIHsKICBjb2xvcjogIzgzNkMyOAp9Ci5obGpzLXN1YnN0IHsKICBjb2xvcjogIzAwMAp9Ci5obGpzLWZvcm11bGEgewogIGZvbnQtc3R5bGU6IGl0YWxpYwp9Ci5obGpzLWFkZGl0aW9uIHsKCn0KLmhsanMtZGVsZXRpb24gewoKfQouaGxqcy1zZWxlY3Rvci1pZCwKLmhsanMtc2VsZWN0b3ItY2xhc3MgewogIGNvbG9yOiAjOWI3MDNmCn0KLmhsanMtZG9jdGFnLAouaGxqcy1zdHJvbmcgewogIGZvbnQtd2VpZ2h0OiBib2xkCn0KLmhsanMtZW1waGFzaXMgewogIGZvbnQtc3R5bGU6IGl0YWxpYwp9Cgp9CgoK">
<link rel="stylesheet" href="data:text/css;base64,LndvcmRpbmcgIHsKICAgIGZvbnQtZmFtaWx5OiAnTm90byBTZXJpZic7CiAgICBoeXBoZW5zOiBhdXRvOwogICAgbGluZS1oZWlnaHQ6IDEuNTsKICAgIGZvbnQtc2l6ZTogMTBwdDsKICAgIHBhZGRpbmctbGVmdDogM2VtOwp9Cgoud29yZGluZyBkaXYgewogICAgYmFja2dyb3VuZDogaW5oZXJpdDsKfQoKLndvcmRpbmcgZGl2LndyYXBwZXIgewogICAgbWF4LXdpZHRoOiAyMGNtOwogICAgbWFyZ2luOiBhdXRvOwp9Cgoud29yZGluZyBkaXYudGV4cGFyYSB7CiAgICBtYXJnaW4tdG9wOiAzcHQ7CiAgICBtYXJnaW4tYm90dG9tOiAzcHQ7Cn0KCi53b3JkaW5nIHRhYmxlIGRpdi50ZXhwYXJhIHsKICAgIG1hcmdpbi10b3A6IDA7CiAgICBtYXJnaW4tYm90dG9tOiAwOwp9Cgoud29yZGluZyB0YWJsZS5lbnVtZXJhdGUgZGl2LnRleHBhcmEgewogICAgbWFyZ2luLXRvcDogM3B0OwogICAgbWFyZ2luLWJvdHRvbTogM3B0Owp9Cgoud29yZGluZyB1bCB7CiAgICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7CiAgICBwYWRkaW5nLWxlZnQ6IDltbTsKICAgIG1hcmdpbi10b3A6IDA7CiAgICBtYXJnaW4tYm90dG9tOiAwOwp9Cgoud29yZGluZyBvbCB7CiAgICBtYXJnaW4tdG9wOiAwOwogICAgbWFyZ2luLWJvdHRvbTogMDsKfQoKLndvcmRpbmcgYSB7CiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Cn0KCi53b3JkaW5nIGEuaGlkZGVuX2xpbmsgewogICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogICAgY29sb3I6IGluaGVyaXQ7Cn0KCi53b3JkaW5nIGxpIHsKICAgIG1hcmdpbi10b3A6IDNwdDsKICAgIG1hcmdpbi1ib3R0b206IDNwdDsKfQoKLndvcmRpbmcgaDEgewogICAgbGluZS1oZWlnaHQ6IDE7CiAgICBtYXJnaW4tdG9wOiAxMHB0OwogICAgbWFyZ2luLWJvdHRvbTogMTBwdDsKfQoKLndvcmRpbmcgaDIgewogICAgbGluZS1oZWlnaHQ6IDE7CiAgICBmb250LXNpemU6IDE0cHQ7CiAgICBtYXJnaW4tdG9wOiAxMHB0OwogICAgbWFyZ2luLWJvdHRvbTogMTBwdDsKfQoKLndvcmRpbmcgaDI6OmFmdGVyIHsKICAgIGNvbnRlbnQ6ICIiOwogICAgY2xlYXI6IGJvdGg7CiAgICBkaXNwbGF5OiB0YWJsZTsKfQoKLndvcmRpbmcgaDMgewogICAgbGluZS1oZWlnaHQ6IDE7CiAgICBtYXJnaW4tdG9wOiAxMHB0OwogICAgbWFyZ2luLWJvdHRvbTogMTBwdDsKfQoKLndvcmRpbmcgaDM6OmFmdGVyIHsKICAgIGNvbnRlbnQ6ICIiOwogICAgY2xlYXI6IGJvdGg7CiAgICBkaXNwbGF5OiB0YWJsZTsKfQoKLndvcmRpbmcgaDQgewogICAgbGluZS1oZWlnaHQ6IDE7CiAgICBtYXJnaW4tdG9wOiAxMHB0OwogICAgbWFyZ2luLWJvdHRvbTogMTBwdDsKfQoKLndvcmRpbmcgaDQ6OmFmdGVyIHsKICAgIGNvbnRlbnQ6ICIiOwogICAgY2xlYXI6IGJvdGg7CiAgICBkaXNwbGF5OiB0YWJsZTsKfQoKLndvcmRpbmcgdWwgPiBsaTpiZWZvcmUgewogICAgY29udGVudDogIlwyMDE0IjsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIG1hcmdpbi1sZWZ0OiAtMS41ZW07Cn0KCi53b3JkaW5nIC5zaHk6YmVmb3JlIHsKICAgIGNvbnRlbnQ6ICJcMDBhZCI7CiAgICAvKiBUaGlzIGlzIFUrMDBBRCBTT0ZUIEhZUEhFTiwgc2FtZSBhcyAmc2h5LCBidXQgd2UgcHV0IGl0IGluIDpiZWZvcmUKICAgIAl0byBzdG9wIGl0IGZyb20gYmVpbmcgaW5jbHVkZWQgd2hlbiB0aGUgdGV4dCBpcyBjb3BpZWQgdG8gdGhlIGNsaXBib2FyZAogICAgCXdpdGggRmlyZWZveCwgd2hpY2ggaXMgZXNwZWNpYWxseSBhbm5veWluZyB3aGVuIGNvcHlpbmcgdG8gYSB0ZXJtaW5hbCwKICAgIAl3aGVyZSB0aGUgaHlwaGVuIGNoYXJhY3RlcnMgd2lsbCBzaG93IHVwLiAqLwp9CgoKLndvcmRpbmcgLmFiYnJfcmVmIHsKICAgIGZsb2F0OiByaWdodDsKfQoKLndvcmRpbmcgLmZvbGRlZF9hYmJyX3JlZiB7CiAgICBmbG9hdDogcmlnaHQ7Cn0KCi53b3JkaW5nIC51bmZvbGRlZF9hYmJyX3JlZiB7CiAgICBkaXNwbGF5OiBub25lOwp9Cgoud29yZGluZyAuc2VjbnVtIHsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgIG1pbi13aWR0aDogMzVwdDsKfQoKLndvcmRpbmcgLmFubmV4bnVtIHsKICAgIGRpc3BsYXk6IGJsb2NrOwp9Cgoud29yZGluZyBkaXYuc291cmNlTGlua1BhcmVudCB7CiAgICBmbG9hdDogcmlnaHQ7Cn0KCi53b3JkaW5nIGEuc291cmNlTGluayB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBvcGFjaXR5OiAwOwogICAgbWFyZ2luLWxlZnQ6IDEwcHQ7Cn0KCi53b3JkaW5nIGEuc291cmNlTGluazpob3ZlciB7CiAgICBvcGFjaXR5OiAxOwp9Cgoud29yZGluZyBhLml0ZW1EZWNsTGluayB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBmb250LXNpemU6IDc1JTsKICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgd2lkdGg6IDVlbTsKICAgIG9wYWNpdHk6IDA7Cn0KCi53b3JkaW5nIGEuaXRlbURlY2xMaW5rOmhvdmVyIHsKICAgIG9wYWNpdHk6IDE7Cn0KCi53b3JkaW5nIGRpdi5tYXJnaW5hbGl6ZWRwYXJlbnQgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgbGVmdDogLTE4bW07Cn0KCi53b3JkaW5nIGEubWFyZ2luYWxpemVkIHsKICAgIHdpZHRoOiAxNW1tOwogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgZm9udC1zaXplOiA3cHQ7CiAgICB0ZXh0LWFsaWduOiByaWdodDsKfQoKLndvcmRpbmcgYS5lbnVtZXJhdGVkX2l0ZW1fbnVtIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgbWFyZ2luLXRvcDogM3B0OwogICAgbWFyZ2luLWJvdHRvbTogM3B0OwogICAgbWFyZ2luLXJpZ2h0OiA2cHQ7Cn0KCi53b3JkaW5nIGRpdi5wYXJhIHsKICAgIG1hcmdpbi1ib3R0b206IDZwdDsKICAgIG1hcmdpbi10b3A6IDZwdDsKICAgIHRleHQtYWxpZ246IGp1c3RpZnk7CiAgICBtaW4taGVpZ2h0OiAxLjJlbTsKfQoKLndvcmRpbmcgZGl2LnNlY3Rpb24gewogICAgdGV4dC1hbGlnbjoganVzdGlmeTsKfQoKLndvcmRpbmcgZGl2LnNlbnRlbmNlIHsKICAgIGRpc3BsYXk6IGlubGluZTsKfQoKLndvcmRpbmcgYS5pbmRleCB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBmbG9hdDogcmlnaHQ7CiAgICByaWdodDogLTFlbTsKICAgIGRpc3BsYXk6IG5vbmU7Cn0KCi53b3JkaW5nIGEuaW5kZXg6YmVmb3JlIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGNvbnRlbnQ6ICLin7UiOwogICAgYmFja2dyb3VuZC1jb2xvcjogI0M5RkJDOTsKfQoKCi53b3JkaW5nIC5pbmRleGl0ZW1zIHsKICAgIG1hcmdpbi1sZWZ0OiAyZW07CiAgICB0ZXh0LWluZGVudDogLTJlbTsKfQoKLndvcmRpbmcgZGl2Lml0ZW1kZXNjciB7CiAgICBtYXJnaW4tbGVmdDogMTJtbTsKfQoKLndvcmRpbmcgLmJuZiB7CiAgICBmb250LWZhbWlseTogJ05vdG8gU2Fucyc7CiAgICBmb250LXNpemU6IDEwcHQ7CiAgICBmb250LXN0eWxlOiBpdGFsaWM7CiAgICBtYXJnaW4tbGVmdDogMjVwdDsKICAgIG1hcmdpbi1yaWdodDogLTE1bW07CiAgICBtYXJnaW4tdG9wOiAwLjVlbTsKICAgIG1hcmdpbi1ib3R0b206IDAuNWVtOwogICAgdGV4dC1pbmRlbnQ6IC0zZW07CiAgICBwYWRkaW5nLWxlZnQ6IDNlbTsKICAgIGxpbmUtaGVpZ2h0OiAxLjU7Cn0KCi53b3JkaW5nIGRpdi5ibmYgc3Bhbi50ZXh0dHQgewogICAgZm9udC1mYW1pbHk6ICdOb3RvIFNhbnMgTW9ubyc7CiAgICBmb250LXN0eWxlOiBub3JtYWw7Cn0KCi53b3JkaW5nIC5yZWJuZiB7CiAgICBmb250LWZhbWlseTogJ05vdG8gU2VyaWYnOwogICAgZm9udC1zdHlsZTogaXRhbGljOwogICAgbWFyZ2luLXRvcDogMC41ZW07CiAgICBtYXJnaW4tYm90dG9tOiAwLjVlbTsKICAgIG1hcmdpbi1sZWZ0OiAzMHB0OwogICAgdGV4dC1pbmRlbnQ6IC0zZW07CiAgICBwYWRkaW5nLWxlZnQ6IDNlbTsKICAgIGxpbmUtaGVpZ2h0OiAxLjU7Cn0KCi53b3JkaW5nIC5zaW1wbGVibmYgewogICAgZm9udC1mYW1pbHk6ICdOb3RvIFNlcmlmJzsKICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKICAgIGZvbnQtc2l6ZTogMTBwdDsKICAgIG1hcmdpbi10b3A6IDAuNWVtOwogICAgbWFyZ2luLWJvdHRvbTogMC41ZW07CiAgICBtYXJnaW4tbGVmdDogMzBwdDsKICAgIGxpbmUtaGVpZ2h0OiAxLjU7Cn0KCi53b3JkaW5nIHNwYW4udGV4dG5vcm1hbCB7CiAgICBmb250LXN0eWxlOiBub3JtYWw7CiAgICBmb250LWZhbWlseTogJ05vdG8gU2VyaWYnOwogICAgZm9udC1zaXplOiAxMHB0OwogICAgd2hpdGUtc3BhY2U6IG5vcm1hbDsKfQoKLndvcmRpbmcgLmJuZiBzcGFuLnRleHRub3JtYWwgewogICAgZm9udC1zdHlsZTogbm9ybWFsOwogICAgZm9udC1mYW1pbHk6ICdOb3RvIFNlcmlmJzsKICAgIGZvbnQtc2l6ZTogMTBwdDsKICAgIHdoaXRlLXNwYWNlOiBub3JtYWw7Cn0KCi53b3JkaW5nIHAgewogICAgbWFyZ2luLXRvcDogNHB0OwogICAgbWFyZ2luLWJvdHRvbTogNHB0Owp9Cgoud29yZGluZyBzcGFuLnJsYXAgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgd2lkdGg6IDBweDsKICAgIHRleHQtaW5kZW50OiAwOwp9Cgoud29yZGluZyBzcGFuLnRlcm1pbmFsIHsKICAgIGZvbnQtZmFtaWx5OiAnTm90byBTYW5zIE1vbm8nOwogICAgZm9udC1zdHlsZTogbm9ybWFsOwogICAgZm9udC1zaXplOiA5cHQ7CiAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7Cn0KCi53b3JkaW5nIHNwYW4ubm9uY3h4dGVybWluYWwgewogICAgZm9udC1mYW1pbHk6ICdOb3RvIFNhbnMgTW9ubyc7CiAgICBmb250LXN0eWxlOiBub3JtYWw7CiAgICBmb250LXNpemU6IDlwdDsKfQoKLndvcmRpbmcgc3Bhbi50ZXJtIHsKICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKfQoKLndvcmRpbmcgc3Bhbi50Y29kZSB7CiAgICBmb250LWZhbWlseTogJ05vdG8gU2FucyBNb25vJzsKICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKfQoKLndvcmRpbmcgc3Bhbi50ZXh0YmYgewogICAgZm9udC13ZWlnaHQ6IGJvbGQ7Cn0KCi53b3JkaW5nIHNwYW4udGV4dHNmIHsKICAgIGZvbnQtZmFtaWx5OiAnTm90byBTYW5zJzsKICAgIGZvbnQtc2l6ZTogMTBwdDsKfQoKLndvcmRpbmcgZGl2LmZvb3Rub3RlIHNwYW4udGV4dHNmIHsKICAgIGZvbnQtZmFtaWx5OiAnTm90byBTYW5zJzsKICAgIGZvbnQtc2l6ZTogOHB0Owp9Cgoud29yZGluZyAuYm5mIHNwYW4udGV4dHNmIHsKICAgIGZvbnQtZmFtaWx5OiAnTm90byBTYW5zJzsKICAgIGZvbnQtc2l6ZTogMTBwdDsKfQoKLndvcmRpbmcgLnNpbXBsZWJuZiBzcGFuLnRleHRzZiB7CiAgICBmb250LWZhbWlseTogJ05vdG8gU2Fucyc7CiAgICBmb250LXNpemU6IDEwcHQ7Cn0KCi53b3JkaW5nIC5leGFtcGxlIHNwYW4udGV4dHNmIHsKICAgIGZvbnQtZmFtaWx5OiAnTm90byBTYW5zJzsKICAgIGZvbnQtc2l6ZTogMTBwdDsKfQoKLndvcmRpbmcgc3Bhbi50ZXh0c2MgewogICAgZm9udC12YXJpYW50OiBzbWFsbC1jYXBzOwp9Cgoud29yZGluZyBzcGFuLm5vbnRlcm1kZWYgewogICAgZm9udC1zdHlsZTogaXRhbGljOwogICAgZm9udC1mYW1pbHk6ICdOb3RvIFNhbnMnOwogICAgZm9udC1zaXplOiAxMHB0Owp9Cgoud29yZGluZyAucmVibmYgYS5ub250ZXJtZGVmIHsKICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKICAgIGZvbnQtZmFtaWx5OiAnTm90byBTZXJpZic7Cn0KCi53b3JkaW5nIHNwYW4uZW1waCB7CiAgICBmb250LXN0eWxlOiBpdGFsaWM7Cn0KCi53b3JkaW5nIHNwYW4udGVjaHRlcm0gewogICAgZm9udC1zdHlsZTogaXRhbGljOwp9Cgoud29yZGluZyBzcGFuLm1hdGhpdCB7CiAgICBmb250LXN0eWxlOiBpdGFsaWM7Cn0KCi53b3JkaW5nIHNwYW4ubWF0aHNmIHsKICAgIGZvbnQtZmFtaWx5OiAnTm90byBTYW5zJzsKfQoKLndvcmRpbmcgc3Bhbi5tYXRocm0gewogICAgZm9udC1mYW1pbHk6ICdOb3RvIFNlcmlmJzsKICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKfQoKLndvcmRpbmcgc3Bhbi50ZXh0cm0gewogICAgZm9udC1mYW1pbHk6ICdOb3RvIFNlcmlmJzsKICAgIGZvbnQtc2l6ZTogMTBwdDsKfQoKLndvcmRpbmcgc3Bhbi50ZXh0c2wgewogICAgZm9udC1zdHlsZTogaXRhbGljOwp9Cgoud29yZGluZyBzcGFuLm1hdGh0dCB7CiAgICBmb250LWZhbWlseTogJ05vdG8gU2FucyBNb25vJzsKICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKfQoKLndvcmRpbmcgc3Bhbi5tYm94IHsKICAgIGZvbnQtZmFtaWx5OiAnTm90byBTZXJpZic7CiAgICBmb250LXN0eWxlOiBub3JtYWw7Cn0KCi53b3JkaW5nIHNwYW4udW5nYXAgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgd2lkdGg6IDJwdDsKfQoKLndvcmRpbmcgc3Bhbi50ZXh0dHQgewogICAgZm9udC1mYW1pbHk6ICdOb3RvIFNhbnMgTW9ubyc7Cn0KCi53b3JkaW5nIHNwYW4udGV4dGl0IHsKICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKfQoKLndvcmRpbmcgZGl2LmZvb3Rub3RlIHNwYW4udGV4dHR0IHsKICAgIGZvbnQtZmFtaWx5OiAnTm90byBTYW5zIE1vbm8nOwp9Cgoud29yZGluZyBzcGFuLnRjb2RlX2luX2NvZGVibG9jayB7CiAgICBmb250LWZhbWlseTogJ05vdG8gU2FucyBNb25vJzsKICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKICAgIGZvbnQtc2l6ZTogOXB0Owp9Cgoud29yZGluZyBzcGFuLnBoYW50b20gewogICAgY29sb3I6IHdoaXRlOwp9Ci8qIFVuZm9ydHVuYXRlbHksIHRoaXMgd2F5IHRoZSB0ZXh0IGlzIHN0aWxsIHNlbGVjdGFibGUuIEFub3RoZXIKCW9wdGlvbiBpcyBkaXNwbGF5Om5vbmUsIGJ1dCB0aGVuIHdlIGxvc2UgdGhlIG5pY2UgbGF5b3V0LgoJVG9kbzogZmluZCBwcm9wZXIgc29sdXRpb24uICovCgoud29yZGluZyBzcGFuLm1hdGggewogICAgZm9udC1zdHlsZTogbm9ybWFsOwogICAgZm9udC1mYW1pbHk6ICdOb3RvIFNlcmlmJzsKICAgIGZvbnQtc2l6ZTogMTBwdDsKfQoKLndvcmRpbmcgc3Bhbi5tYXRoYmxvY2sgewogICAgZGlzcGxheTogYmxvY2s7CiAgICBtYXJnaW4tbGVmdDogYXV0bzsKICAgIG1hcmdpbi1yaWdodDogYXV0bzsKICAgIG1hcmdpbi10b3A6IDEuMmVtOwogICAgbWFyZ2luLWJvdHRvbTogMS4yZW07CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KCi53b3JkaW5nIHNwYW4ubWF0aGFscGhhIHsKICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKfQoKLndvcmRpbmcgc3Bhbi5zeW5vcHNpcyB7CiAgICBmb250LXdlaWdodDogYm9sZDsKICAgIG1hcmdpbi10b3A6IDAuNWVtOwogICAgZGlzcGxheTogYmxvY2s7Cn0KCi53b3JkaW5nIHNwYW4uZGVmaW5pdGlvbiB7CiAgICBmb250LXdlaWdodDogYm9sZDsKICAgIGRpc3BsYXk6IGJsb2NrOwp9Cgoud29yZGluZyAuY29kZWJsb2NrIHsKICAgIGZvbnQtZmFtaWx5OiAnTm90byBTYW5zIE1vbm8nOwogICAgbWFyZ2luLWxlZnQ6IDEuMmVtOwogICAgbGluZS1oZWlnaHQ6IDEuNTsKICAgIGZvbnQtc2l6ZTogOXB0OwogICAgd2hpdGUtc3BhY2U6IHByZTsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgbWFyZ2luLXRvcDogM3B0OwogICAgbWFyZ2luLWJvdHRvbTogM3B0OwoJCW92ZXJmbG93LXg6IHNjcm9sbDsKICAgIG92ZXJmbG93LXk6IHZpc2libGU7CiAgICBtYXJnaW4tcmlnaHQ6IC0xNW1tOwp9Cgoud29yZGluZyB0YWJsZSAuY29kZWJsb2NrIHsKICAgIG1hcmdpbi1yaWdodDogMDsKfQoKLndvcmRpbmcgLm91dHB1dGJsb2NrIHsKICAgIG1hcmdpbi1sZWZ0OiAxLjJlbTsKICAgIGxpbmUtaGVpZ2h0OiAxLjU7CiAgICBmb250LWZhbWlseTogJ05vdG8gU2FucyBNb25vJzsKICAgIGZvbnQtc2l6ZTogOXB0Owp9Cgoud29yZGluZyBjb2RlIHsKICAgIGZvbnQtZmFtaWx5OiAnTm90byBTYW5zIE1vbm8nOwogICAgZm9udC1zdHlsZTogbm9ybWFsOwp9Cgoud29yZGluZyBkaXYuaXRlbWRlY2wgewogICAgbWFyZ2luLXRvcDogMmV4Owp9Cgoud29yZGluZyBjb2RlLml0ZW1kZWNsY29kZSB7CiAgICB3aGl0ZS1zcGFjZTogcHJlOwogICAgZm9udC1mYW1pbHk6ICdOb3RvIFNhbnMgTW9ubyc7CiAgICBmb250LXNpemU6IDlwdDsKICAgIGRpc3BsYXk6IGJsb2NrOwoJCW92ZXJmbG93LXg6IHNjcm9sbDsKICAgIG92ZXJmbG93LXk6IHZpc2libGU7CiAgICBtYXJnaW4tcmlnaHQ6IC0xNW1tOwp9Cgoud29yZGluZyAuY29tbWVudCB7CiAgICBjb2xvcjogZ3JlZW47CiAgICBmb250LXN0eWxlOiBpdGFsaWM7CiAgICBmb250LWZhbWlseTogJ05vdG8gU2VyaWYnOwogICAgZm9udC1zaXplOiAxMHB0Owp9Cgoud29yZGluZyAuZm9vdG5vdGUgLmNvbW1lbnQgewogICAgY29sb3I6IGdyZWVuOwogICAgZm9udC1zdHlsZTogaXRhbGljOwogICAgZm9udC1mYW1pbHk6ICdOb3RvIFNlcmlmJzsKICAgIGZvbnQtc2l6ZTogOHB0Owp9Cgoud29yZGluZyAuZXhhbXBsZSAuY29tbWVudCB7CiAgICBjb2xvcjogZ3JlZW47CiAgICBmb250LXN0eWxlOiBpdGFsaWM7CiAgICBmb250LWZhbWlseTogJ05vdG8gU2VyaWYnOwogICAgZm9udC1zaXplOiA5cHQ7Cn0KCi53b3JkaW5nIC5ub3RlIC5jb21tZW50IHsKICAgIGNvbG9yOiBncmVlbjsKICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKICAgIGZvbnQtZmFtaWx5OiAnTm90byBTZXJpZic7CiAgICBmb250LXNpemU6IDlwdDsKfQoKLndvcmRpbmcgc3Bhbi5rZXl3b3JkIHsKICAgIGNvbG9yOiAjMDA2MDdjOwogICAgZm9udC1zdHlsZTogbm9ybWFsOwp9Cgoud29yZGluZyBzcGFuLnBhcmVudGhlc2lzIHsKICAgIGNvbG9yOiAjYWYxOTE1Owp9Cgoud29yZGluZyBzcGFuLmN1cmx5YnJhY2tldCB7CiAgICBjb2xvcjogI2FmMTkxNTsKfQoKLndvcmRpbmcgc3Bhbi5zcXVhcmVicmFja2V0IHsKICAgIGNvbG9yOiAjYWYxOTE1Owp9Cgoud29yZGluZyBzcGFuLmxpdGVyYWwgewogICAgY29sb3I6ICM5RjY4MDc7Cn0KCi53b3JkaW5nIHNwYW4ubGl0ZXJhbHRlcm1pbmFsIHsKICAgIGNvbG9yOiAjOUY2ODA3OwogICAgZm9udC1mYW1pbHk6ICdOb3RvIFNhbnMgTW9ubyc7CiAgICBmb250LXN0eWxlOiBub3JtYWw7Cn0KCi53b3JkaW5nIHNwYW4ub3BlcmF0b3IgewogICAgY29sb3I6ICM1NzAwNTc7Cn0KCi53b3JkaW5nIHNwYW4uYW5nbGVicmFja2V0IHsKICAgIGNvbG9yOiAjNTcwMDU3Owp9Cgoud29yZGluZyBzcGFuLnByZXByb2Nlc3NvcmRpcmVjdGl2ZSB7CiAgICBjb2xvcjogIzZGNEUzNzsKfQoKLndvcmRpbmcgc3Bhbi50ZXh0c3VwZXJzY3JpcHQgewogICAgdmVydGljYWwtYWxpZ246IHN1cGVyOwogICAgZm9udC1zaXplOiBzbWFsbGVyOwogICAgbGluZS1oZWlnaHQ6IDA7Cn0KCi53b3JkaW5nIC5mb290bm90ZXJlZiB7CiAgICB2ZXJ0aWNhbC1hbGlnbjogc3VwZXI7CiAgICBmb250LXNpemU6IHNtYWxsZXI7CiAgICBsaW5lLWhlaWdodDogMDsKfQoKLndvcmRpbmcgLmZvb3Rub3RlIHsKICAgIGZvbnQtc2l6ZTogOHB0Owp9Cgoud29yZGluZyAuZm9vdG5vdGUgLm1hdGggewogICAgZm9udC1zaXplOiA4cHQ7Cn0KCi53b3JkaW5nIC5mb290bm90ZW51bSB7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgIG1hcmdpbi1yaWdodDogMW1tOwogICAgd2lkdGg6IDRjaDsKfQoKLndvcmRpbmcgLmZvb3Rub3RlQmFja2xpbmsgewogICAgZGlzcGxheTogbm9uZTsKfQoKLndvcmRpbmcgLmZvb3Rub3RlU2VwYXJhdG9yIHsKICAgIGJhY2tncm91bmQ6IGJsYWNrOwogICAgbWFyZ2luLXRvcDogNW1tOwogICAgaGVpZ2h0OiAxcHg7CiAgICB3aWR0aDogNmNtOwp9Cgoud29yZGluZyBkaXYubWluaXBhZ2UgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgbWFyZ2luLXJpZ2h0OiAzZW07Cn0KCi53b3JkaW5nIGRpdi5udW1iZXJlZFRhYmxlIHsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIG1hcmdpbi1sZWZ0OiAxZW07CiAgICBtYXJnaW4tcmlnaHQ6IDFlbTsKICAgIG1hcmdpbi1ib3R0b206IDEycHQ7CiAgICBtYXJnaW4tdG9wOiA4cHQ7Cn0KCi53b3JkaW5nIGRpdi5maWd1cmUgewogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgbWFyZ2luLWxlZnQ6IDJlbTsKICAgIG1hcmdpbi1yaWdodDogMmVtOwogICAgbWFyZ2luLWJvdHRvbTogMTJwdDsKICAgIG1hcmdpbi10b3A6IDNwdDsKfQoKLndvcmRpbmcgdGFibGUgewogICAgYm9yZGVyOiAxcHggc29saWQgYmxhY2s7CiAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwogICAgbWFyZ2luLWxlZnQ6IGF1dG87CiAgICBtYXJnaW4tcmlnaHQ6IGF1dG87CiAgICBtYXJnaW4tdG9wOiA3cHQ7CiAgICB0ZXh0LWFsaWduOiBsZWZ0Owp9Cgoud29yZGluZyB0ZCwgLndvcmRpbmcgdGggewogICAgcGFkZGluZy1sZWZ0OiA4cHQ7CiAgICBwYWRkaW5nLXJpZ2h0OiA4cHQ7CiAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwp9Cgoud29yZGluZyB0ZC5lbXB0eSB7CiAgICBwYWRkaW5nOiAwcHg7CiAgICBwYWRkaW5nLWxlZnQ6IDFweDsKfQoKLndvcmRpbmcgdGQubGVmdCB7CiAgICB0ZXh0LWFsaWduOiBsZWZ0Owp9Cgoud29yZGluZyB0ZC5oaWRkZW4gewogICAgcGFkZGluZzogMDsKICAgIHdpZHRoOiAwOwp9Cgoud29yZGluZyB0ZC5yaWdodCB7CiAgICB0ZXh0LWFsaWduOiByaWdodDsKfQoKLndvcmRpbmcgdGQuY2VudGVyIHsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKfQoKLndvcmRpbmcgdGQuanVzdGlmeSB7CiAgICB0ZXh0LWFsaWduOiBqdXN0aWZ5Owp9Cgoud29yZGluZyB0ZC5ib3JkZXIgewogICAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCBibGFjazsKfQoKLndvcmRpbmcgdHIucm93c2VwLCAud29yZGluZyB0ZC5jbGluZSB7CiAgICBib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7Cn0KCi53b3JkaW5nIHRyLmNhcHNlcCB7CiAgICBib3JkZXItdG9wOiAzcHggc29saWQgYmxhY2s7CiAgICBib3JkZXItdG9wLXN0eWxlOiBkb3VibGU7Cn0KCi53b3JkaW5nIHRoIHsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjazsKfQoKLndvcmRpbmcgc3Bhbi5jZW50cnkgewogICAgZm9udC13ZWlnaHQ6IGJvbGQ7Cn0KCi53b3JkaW5nIGRpdi50YWJsZSB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIG1hcmdpbi1sZWZ0OiBhdXRvOwogICAgbWFyZ2luLXJpZ2h0OiBhdXRvOwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgd2lkdGg6IDkwJTsKfQoKLndvcmRpbmcgc3Bhbi5pbmRlbnRlZCB7CiAgICBiYWNrZ3JvdW5kOiBpbmhlcml0OwogICAgZGlzcGxheTogYmxvY2s7CiAgICBtYXJnaW4tbGVmdDogMmVtOwogICAgbWFyZ2luLWJvdHRvbTogMWVtOwogICAgbWFyZ2luLXRvcDogMWVtOwp9Cgoud29yZGluZyBzcGFuLnVwcGVyY2FzZSB7CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwp9Cgoud29yZGluZyBzcGFuLnVjb2RlIHsKICAgIGZvbnQtdmFyaWFudDogc21hbGwtY2FwczsKICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICBmb250LXNpemU6IDkwJTsKfQoKLndvcmRpbmcgc3Bhbi51bmFtZSB7CiAgICBmb250LXZhcmlhbnQ6IHNtYWxsLWNhcHM7CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgZm9udC1zaXplOiA5MCU7Cn0KCi53b3JkaW5nIHRhYmxlLmVudW1lcmF0ZSB7CiAgICBib3JkZXI6IDA7CiAgICBtYXJnaW46IDA7Cn0KCi53b3JkaW5nIHRhYmxlLmVudW1lcmF0ZSB0ZCB7CiAgICBwYWRkaW5nOiAwOwp9Cgoud29yZGluZyB0YWJsZS5lbnVtZXJhdGUgdGQ6Zmlyc3QtY2hpbGQgewogICAgd2lkdGg6IDFjbTsKICAgIHRleHQtYWxpZ246IHJpZ2h0Owp9CgpAbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKSB7CiAgICAud29yZGluZyB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzE3MTcxNzsKICAgICAgICBjb2xvcjogI2QwZDBkMDsKICAgIH0KCiAgICAud29yZGluZyBzcGFuLm1qeC1tc3R5bGUgewogICAgICAgIGNvbG9yOiAjZDBkMGQwICFpbXBvcnRhbnQKICAgIH0KCiAgICAud29yZGluZyBhOmxpbmsgewogICAgICAgIGNvbG9yOiAjNjRhZGZmOwogICAgfQoKICAgIC53b3JkaW5nIGE6dmlzaXRlZCB7CiAgICAgICAgY29sb3I6ICNhMzZhZTY7CiAgICB9CgogICAgLndvcmRpbmcgYS5oaWRkZW5fbGluayB7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogICAgICAgIGNvbG9yOiBpbmhlcml0OwogICAgfQoKICAgIC53b3JkaW5nIHNwYW4ucGhhbnRvbSB7CiAgICAgICAgY29sb3I6ICMxNzE3MTc7CiAgICB9CgogICAgLndvcmRpbmcgYS5pbmRleDpiZWZvcmUgewogICAgICAgIGNvbG9yOiAjZDBkMGQwOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICM0YjYzNTM7CiAgICB9CgogICAgLndvcmRpbmcgLmNvbW1lbnQgewogICAgICAgIGNvbG9yOiAjMzVkYTAwOwogICAgfQoKICAgIC53b3JkaW5nIC5mb290bm90ZSAuY29tbWVudCB7CiAgICAgICAgY29sb3I6ICMzNWRhMDA7CiAgICB9CgogICAgLndvcmRpbmcgLmV4YW1wbGUgLmNvbW1lbnQgewogICAgICAgIGNvbG9yOiAjMzVkYTAwOwogICAgfQoKICAgIC53b3JkaW5nIC5ub3RlIC5jb21tZW50IHsKICAgICAgICBjb2xvcjogIzM1ZGEwMDsKICAgIH0KCiAgICAud29yZGluZyBzcGFuLmtleXdvcmQgewogICAgICAgIGNvbG9yOiAjMTJjYWJlOwogICAgfQoKICAgIC53b3JkaW5nIHNwYW4ucGFyZW50aGVzaXMgewogICAgICAgIGNvbG9yOiAjZmYxNTE1OwogICAgfQoKICAgIC53b3JkaW5nIHNwYW4uY3VybHlicmFja2V0IHsKICAgICAgICBjb2xvcjogI2ZmMTUxNTsKICAgIH0KCiAgICAud29yZGluZyBzcGFuLnNxdWFyZWJyYWNrZXQgewogICAgICAgIGNvbG9yOiAjZmYxNTE1OwogICAgfQoKICAgIC53b3JkaW5nIHNwYW4ubGl0ZXJhbCB7CiAgICAgICAgY29sb3I6ICNkZmE4Mzc7CiAgICB9CgogICAgLndvcmRpbmcgc3Bhbi5saXRlcmFsdGVybWluYWwgewogICAgICAgIGNvbG9yOiAjZGZhODM3OwogICAgfQoKICAgIC53b3JkaW5nIHNwYW4ub3BlcmF0b3IgewogICAgICAgIGNvbG9yOiAjYmFhNmI5OwogICAgfQoKICAgIC53b3JkaW5nIHNwYW4uYW5nbGVicmFja2V0IHsKICAgICAgICBjb2xvcjogI2JhYTZiOTsKICAgIH0KCiAgICAud29yZGluZyBzcGFuLnByZXByb2Nlc3NvcmRpcmVjdGl2ZSB7CiAgICAgICAgY29sb3I6ICNiMjdjNTg7CiAgICB9CgogICAgLndvcmRpbmcgdGFibGUgewogICAgICAgIGJvcmRlci1jb2xvcjogI2QwZDBkMDsKICAgIH0KCiAgICAud29yZGluZyB0ZC5ib3JkZXIgewogICAgICAgIGJvcmRlci1jb2xvcjogI2QwZDBkMDsKICAgIH0KCiAgICAud29yZGluZyB0ZC5ib3JkZXIgewogICAgICAgIGJvcmRlci1sZWZ0LWNvbG9yOiAjZDBkMGQwOwogICAgfQoKICAgIC53b3JkaW5nIHRyLnJvd3NlcCwgdGQuY2xpbmUgewogICAgICAgIGJvcmRlci10b3AtY29sb3I6ICNkMGQwZDA7CiAgICB9CgogICAgLndvcmRpbmcgdHIuY2Fwc2VwIHsKICAgICAgICBib3JkZXItdG9wLWNvbG9yOiAjZDBkMGQwOwogICAgfQoKICAgIC53b3JkaW5nIHRoIHsKICAgICAgICBib3JkZXItYm90dG9tLWNvbG9yOiAjZDBkMGQwOwogICAgfQoKICAgIC53b3JkaW5nIC5mb290bm90ZVNlcGFyYXRvciB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2QwZDBkMDsKICAgIH0KCiAgICAud29yZGluZyB0ZXh0IHsKICAgICAgICBmaWxsOiAjZDBkMGQwOwogICAgfQoKICAgIC53b3JkaW5nIHBhdGggewogICAgICAgIHN0cm9rZTogI2QwZDBkMDsKICAgIH0KCiAgICAud29yZGluZyBwb2x5Z29uIHsKICAgICAgICBzdHJva2U6ICNkMGQwZDA7CiAgICAgICAgZmlsbDogI2QwZDBkMDsKICAgIH0KCiAgICAud29yZGluZyBlbGxpcHNlIHsKICAgICAgICBzdHJva2U6ICNkMGQwZDA7CiAgICB9Cgp9Cgoud29yZGluZyAubWp4LWNodG1sIHsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgIGxpbmUtaGVpZ2h0OiAwOwogICAgdGV4dC1pbmRlbnQ6IDA7CiAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgdGV4dC10cmFuc2Zvcm06IG5vbmU7CiAgICBmb250LXN0eWxlOiBub3JtYWw7CiAgICBmb250LXdlaWdodDogbm9ybWFsOwogICAgZm9udC1zaXplOiAxMDAlOwogICAgZm9udC1zaXplLWFkanVzdDogbm9uZTsKICAgIGxldHRlci1zcGFjaW5nOiBub3JtYWw7CiAgICB3b3JkLXdyYXA6IG5vcm1hbDsKICAgIHdvcmQtc3BhY2luZzogbm9ybWFsOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIGZsb2F0OiBub25lOwogICAgZGlyZWN0aW9uOiBsdHI7CiAgICBtYXgtd2lkdGg6IG5vbmU7CiAgICBtYXgtaGVpZ2h0OiBub25lOwogICAgbWluLXdpZHRoOiAwOwogICAgbWluLWhlaWdodDogMDsKICAgIGJvcmRlcjogMDsKICAgIG1hcmdpbjogMDsKICAgIHBhZGRpbmc6IDFweCAwCn0KCi53b3JkaW5nIC5NSlhjLWRpc3BsYXkgewogICAgZGlzcGxheTogYmxvY2s7CiAgICBiYWNrZ3JvdW5kOiBpbmhlcml0OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgbWFyZ2luOiAxZW0gMDsKICAgIHBhZGRpbmc6IDAKfQoKLndvcmRpbmcgLm1qeC1jaHRtbFt0YWJpbmRleF06Zm9jdXMsIC53b3JkaW5nICA6Zm9jdXMgLm1qeC1jaHRtbFt0YWJpbmRleF0gewogICAgZGlzcGxheTogaW5saW5lLXRhYmxlCn0KCi53b3JkaW5nIC5tangtZnVsbC13aWR0aCB7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICBkaXNwbGF5OiB0YWJsZS1jZWxsICFpbXBvcnRhbnQ7CiAgICB3aWR0aDogMTAwMDBlbQp9Cgoud29yZGluZyAubWp4LW1hdGggewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgYm9yZGVyLWNvbGxhcHNlOiBzZXBhcmF0ZTsKICAgIGJvcmRlci1zcGFjaW5nOiAwCn0KCi53b3JkaW5nIC5tangtbWF0aCAqIHsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgIC13ZWJraXQtYm94LXNpemluZzogY29udGVudC1ib3ggIWltcG9ydGFudDsKICAgIC1tb3otYm94LXNpemluZzogY29udGVudC1ib3ggIWltcG9ydGFudDsKICAgIGJveC1zaXppbmc6IGNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7CiAgICB0ZXh0LWFsaWduOiBsZWZ0Cn0KCi53b3JkaW5nIC5tangtbnVtZXJhdG9yIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgYmFja2dyb3VuZDogaW5oZXJpdDsKICAgIHRleHQtYWxpZ246IGNlbnRlcgp9Cgoud29yZGluZyAubWp4LWRlbm9taW5hdG9yIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgYmFja2dyb3VuZDogaW5oZXJpdDsKICAgIHRleHQtYWxpZ246IGNlbnRlcgp9Cgoud29yZGluZyAuTUpYYy1zdGFja2VkIHsKICAgIGhlaWdodDogMDsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZQp9Cgoud29yZGluZyAuTUpYYy1zdGFja2VkID4gKiB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGUKfQoKLndvcmRpbmcgLk1KWGMtYmV2ZWxsZWQgPiAqIHsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jawp9Cgoud29yZGluZyAubWp4LXN0YWNrIHsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jawp9Cgoud29yZGluZyAubWp4LW9wIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgYmFja2dyb3VuZDogaW5oZXJpdAp9Cgoud29yZGluZyAubWp4LXVuZGVyIHsKICAgIGRpc3BsYXk6IHRhYmxlLWNlbGwKfQoKLndvcmRpbmcgLm1qeC1vdmVyIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgYmFja2dyb3VuZDogaW5oZXJpdAp9Cgoud29yZGluZyAubWp4LW92ZXIgPiAqIHsKICAgIHBhZGRpbmctbGVmdDogMHB4ICFpbXBvcnRhbnQ7CiAgICBwYWRkaW5nLXJpZ2h0OiAwcHggIWltcG9ydGFudAp9Cgoud29yZGluZyAubWp4LXVuZGVyID4gKiB7CiAgICBwYWRkaW5nLWxlZnQ6IDBweCAhaW1wb3J0YW50OwogICAgcGFkZGluZy1yaWdodDogMHB4ICFpbXBvcnRhbnQKfQoKLndvcmRpbmcgLm1qeC1zdGFjayA+IC5tangtc3VwIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgYmFja2dyb3VuZDogaW5oZXJpdAp9Cgoud29yZGluZyAubWp4LXN0YWNrID4gLm1qeC1zdWIgewogICAgZGlzcGxheTogYmxvY2s7CiAgICBiYWNrZ3JvdW5kOiBpbmhlcml0Cn0KCi53b3JkaW5nIC5tangtcHJlc3RhY2sgPiAubWp4LXByZXN1cCB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGJhY2tncm91bmQ6IGluaGVyaXQKfQoKLndvcmRpbmcgLm1qeC1wcmVzdGFjayA+IC5tangtcHJlc3ViIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgYmFja2dyb3VuZDogaW5oZXJpdAp9Cgoud29yZGluZyAubWp4LWRlbGltLWggPiAubWp4LWNoYXIgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrCn0KCi53b3JkaW5nIC5tangtc3VyZCB7CiAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wCn0KCi53b3JkaW5nIC5tangtbXBoYW50b20gKiB7CiAgICB2aXNpYmlsaXR5OiBoaWRkZW4KfQoKLndvcmRpbmcgLm1qeC1tZXJyb3IgewogICAgYmFja2dyb3VuZC1jb2xvcjogI0ZGRkY4ODsKICAgIGNvbG9yOiAjQ0MwMDAwOwogICAgYm9yZGVyOiAxcHggc29saWQgI0NDMDAwMDsKICAgIHBhZGRpbmc6IDJweCAzcHg7CiAgICBmb250LXN0eWxlOiBub3JtYWw7CiAgICBmb250LXNpemU6IDkwJQp9Cgoud29yZGluZyAubWp4LWFubm90YXRpb24teG1sIHsKICAgIGxpbmUtaGVpZ2h0OiBub3JtYWwKfQoKLndvcmRpbmcgLm1qeC1tZW5jbG9zZSA+IHN2ZyB7CiAgICBmaWxsOiBub25lOwogICAgc3Ryb2tlOiBjdXJyZW50Q29sb3IKfQoKLndvcmRpbmcgLm1qeC1tdHIgewogICAgZGlzcGxheTogdGFibGUtcm93Cn0KCi53b3JkaW5nIC5tangtbWxhYmVsZWR0ciB7CiAgICBkaXNwbGF5OiB0YWJsZS1yb3cKfQoKLndvcmRpbmcgLm1qeC1tdGQgewogICAgZGlzcGxheTogdGFibGUtY2VsbDsKICAgIHRleHQtYWxpZ246IGNlbnRlcgp9Cgoud29yZGluZyAubWp4LWxhYmVsIHsKICAgIGRpc3BsYXk6IHRhYmxlLXJvdwp9Cgoud29yZGluZyAubWp4LWJveCB7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2sKfQoKLndvcmRpbmcgLm1qeC1ibG9jayB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGJhY2tncm91bmQ6IGluaGVyaXQKfQoKLndvcmRpbmcgLm1qeC1zcGFuIHsKICAgIGRpc3BsYXk6IGlubGluZQp9Cgoud29yZGluZyAubWp4LWNoYXIgewogICAgZGlzcGxheTogYmxvY2s7CiAgICBiYWNrZ3JvdW5kOiBpbmhlcml0OwogICAgd2hpdGUtc3BhY2U6IHByZQp9Cgoud29yZGluZyAubWp4LWl0YWJsZSB7CiAgICBkaXNwbGF5OiBpbmxpbmUtdGFibGU7CiAgICB3aWR0aDogYXV0bwp9Cgoud29yZGluZyAubWp4LXJvdyB7CiAgICBkaXNwbGF5OiB0YWJsZS1yb3cKfQoKLndvcmRpbmcgLm1qeC1jZWxsIHsKICAgIGRpc3BsYXk6IHRhYmxlLWNlbGwKfQoKLndvcmRpbmcgLm1qeC10YWJsZSB7CiAgICBkaXNwbGF5OiB0YWJsZTsKICAgIHdpZHRoOiAxMDAlCn0KCi53b3JkaW5nIC5tangtbGluZSB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGJhY2tncm91bmQ6IGluaGVyaXQ7CiAgICBoZWlnaHQ6IDAKfQoKLndvcmRpbmcgLm1qeC1zdHJ1dCB7CiAgICB3aWR0aDogMDsKICAgIHBhZGRpbmctdG9wOiAxZW0KfQoKLndvcmRpbmcgLm1qeC12c2l6ZSB7CiAgICB3aWR0aDogMAp9Cgoud29yZGluZyAuTUpYYy1zcGFjZTEgewogICAgbWFyZ2luLWxlZnQ6IC4xNjdlbQp9Cgoud29yZGluZyAuTUpYYy1zcGFjZTIgewogICAgbWFyZ2luLWxlZnQ6IC4yMjJlbQp9Cgoud29yZGluZyAuTUpYYy1zcGFjZTMgewogICAgbWFyZ2luLWxlZnQ6IC4yNzhlbQp9Cgoud29yZGluZyAubWp4LWV4LWJveC10ZXN0IHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKCQlvdmVyZmxvdy14OiBzY3JvbGw7CiAgICBvdmVyZmxvdy15OiB2aXNpYmxlOwogICAgd2lkdGg6IDFweDsKICAgIGhlaWdodDogNjBleAp9Cgoud29yZGluZyAubWp4LWxpbmUtYm94LXRlc3QgewogICAgZGlzcGxheTogdGFibGUgIWltcG9ydGFudAp9Cgoud29yZGluZyAubWp4LWxpbmUtYm94LXRlc3Qgc3BhbiB7CiAgICBkaXNwbGF5OiB0YWJsZS1jZWxsICFpbXBvcnRhbnQ7CiAgICB3aWR0aDogMTAwMDBlbSAhaW1wb3J0YW50OwogICAgbWluLXdpZHRoOiAwOwogICAgbWF4LXdpZHRoOiBub25lOwogICAgcGFkZGluZzogMDsKICAgIGJvcmRlcjogMDsKICAgIG1hcmdpbjogMAp9Cgoud29yZGluZyAuTUpYYy1UZVgtdW5rbm93bi1SIHsKICAgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7CiAgICBmb250LXN0eWxlOiBub3JtYWw7CiAgICBmb250LXdlaWdodDogbm9ybWFsCn0KCi53b3JkaW5nIC5NSlhjLVRlWC11bmtub3duLUkgewogICAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKICAgIGZvbnQtd2VpZ2h0OiBub3JtYWwKfQoKLndvcmRpbmcgLk1KWGMtVGVYLXVua25vd24tQiB7CiAgICBmb250LWZhbWlseTogbW9ub3NwYWNlOwogICAgZm9udC1zdHlsZTogbm9ybWFsOwogICAgZm9udC13ZWlnaHQ6IGJvbGQKfQoKLndvcmRpbmcgLk1KWGMtVGVYLXVua25vd24tQkkgewogICAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKICAgIGZvbnQtd2VpZ2h0OiBib2xkCn0KCi53b3JkaW5nIC5NSlhjLVRlWC1hbXMtUiB7CiAgICBmb250LWZhbWlseTogTUpYYy1UZVgtYW1zLVIsIE1KWGMtVGVYLWFtcy1Sdwp9Cgoud29yZGluZyAuTUpYYy1UZVgtY2FsLUIgewogICAgZm9udC1mYW1pbHk6IE1KWGMtVGVYLWNhbC1CLCBNSlhjLVRlWC1jYWwtQngsIE1KWGMtVGVYLWNhbC1Cdwp9Cgoud29yZGluZyAuTUpYYy1UZVgtZnJhay1SIHsKICAgIGZvbnQtZmFtaWx5OiBNSlhjLVRlWC1mcmFrLVIsIE1KWGMtVGVYLWZyYWstUncKfQoKLndvcmRpbmcgLk1KWGMtVGVYLWZyYWstQiB7CiAgICBmb250LWZhbWlseTogTUpYYy1UZVgtZnJhay1CLCBNSlhjLVRlWC1mcmFrLUJ4LCBNSlhjLVRlWC1mcmFrLUJ3Cn0KCi53b3JkaW5nIC5NSlhjLVRlWC1tYXRoLUJJIHsKICAgIGZvbnQtZmFtaWx5OiBNSlhjLVRlWC1tYXRoLUJJLCBNSlhjLVRlWC1tYXRoLUJJeCwgTUpYYy1UZVgtbWF0aC1CSXcKfQoKLndvcmRpbmcgLk1KWGMtVGVYLXNhbnMtUiB7CiAgICBmb250LWZhbWlseTogJ05vdG8gU2Fucyc7CiAgICBmb250LXNpemU6IDEwcHQ7Cn0KCi53b3JkaW5nIC5NSlhjLVRlWC1zYW5zLUIgewogICAgZm9udC1mYW1pbHk6IE1KWGMtVGVYLXNhbnMtQiwgTUpYYy1UZVgtc2Fucy1CeCwgTUpYYy1UZVgtc2Fucy1Cdwp9Cgoud29yZGluZyAuTUpYYy1UZVgtc2Fucy1JIHsKICAgIGZvbnQtZmFtaWx5OiBNSlhjLVRlWC1zYW5zLUksIE1KWGMtVGVYLXNhbnMtSXgsIE1KWGMtVGVYLXNhbnMtSXcKfQoKLndvcmRpbmcgLk1KWGMtVGVYLXNjcmlwdC1SIHsKICAgIGZvbnQtZmFtaWx5OiBNSlhjLVRlWC1zY3JpcHQtUiwgTUpYYy1UZVgtc2NyaXB0LVJ3Cn0KCi53b3JkaW5nIC5NSlhjLVRlWC10eXBlLVIgewogICAgZm9udC1mYW1pbHk6ICdOb3RvIFNhbnMgTW9ubyc7CiAgICBmb250LXNpemU6IDEwcHQ7Cn0KCi53b3JkaW5nIC5NSlhjLVRlWC1jYWwtUiB7CiAgICBmb250LWZhbWlseTogTUpYYy1UZVgtY2FsLVIsIE1KWGMtVGVYLWNhbC1Sdwp9Cgoud29yZGluZyAuTUpYYy1UZVgtbWFpbi1CIHsKICAgIGZvbnQtZmFtaWx5OiBNSlhjLVRlWC1tYWluLUIsIE1KWGMtVGVYLW1haW4tQngsIE1KWGMtVGVYLW1haW4tQncKfQoKLndvcmRpbmcgLk1KWGMtVGVYLW1haW4tSSB7CiAgICBmb250LXN0eWxlOiBpdGFsaWMKfQoKLndvcmRpbmcgLk1KWGMtVGVYLW1haW4tUiB7Cn0KCi53b3JkaW5nIC5NSlhjLVRlWC1tYXRoLUkgewogICAgZm9udC1zdHlsZTogaXRhbGljCn0KCi53b3JkaW5nIC5NSlhjLVRlWC1zaXplMS1SIHsKICAgIGZvbnQtZmFtaWx5OiBNSlhjLVRlWC1zaXplMS1SLCBNSlhjLVRlWC1zaXplMS1Sdwp9Cgoud29yZGluZyAuTUpYYy1UZVgtc2l6ZTItUiB7CiAgICBmb250LWZhbWlseTogTUpYYy1UZVgtc2l6ZTItUiwgTUpYYy1UZVgtc2l6ZTItUncKfQoKLndvcmRpbmcgLk1KWGMtVGVYLXNpemUzLVIgewogICAgZm9udC1mYW1pbHk6IE1KWGMtVGVYLXNpemUzLVIsIE1KWGMtVGVYLXNpemUzLVJ3Cn0KCi53b3JkaW5nIC5NSlhjLVRlWC1zaXplNC1SIHsKICAgIGZvbnQtZmFtaWx5OiBNSlhjLVRlWC1zaXplNC1SLCBNSlhjLVRlWC1zaXplNC1Sdwp9Cgoud29yZGluZyAuTUpYYy1UZVgtdmVjLVIgewogICAgZm9udC1mYW1pbHk6IE1KWGMtVGVYLXZlYy1SLCBNSlhjLVRlWC12ZWMtUncKfQoKLndvcmRpbmcgLk1KWGMtVGVYLXZlYy1CIHsKICAgIGZvbnQtZmFtaWx5OiBNSlhjLVRlWC12ZWMtQiwgTUpYYy1UZVgtdmVjLUJ4LCBNSlhjLVRlWC12ZWMtQncKfQoKQGZvbnQtZmFjZSB7CiAgICBmb250LWZhbWlseTogTUpYYy1UZVgtYW1zLVI7CiAgICBzcmM6IGxvY2FsKCdNYXRoSmF4X0FNUycpLCBsb2NhbCgnTWF0aEpheF9BTVMtUmVndWxhcicpCn0KCkBmb250LWZhY2UgewogICAgZm9udC1mYW1pbHk6IE1KWGMtVGVYLWFtcy1SdzsKICAgIHNyYyAvKjEqLzogdXJsKCdodHRwczovL2Nkbi5tYXRoamF4Lm9yZy9tYXRoamF4L2xhdGVzdC9mb250cy9IVE1MLUNTUy9UZVgvZW90L01hdGhKYXhfQU1TLVJlZ3VsYXIuZW90Jyk7CiAgICBzcmMgLyoyKi86IHVybCgnaHR0cHM6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QvZm9udHMvSFRNTC1DU1MvVGVYL3dvZmYvTWF0aEpheF9BTVMtUmVndWxhci53b2ZmJykgZm9ybWF0KCd3b2ZmJyksIHVybCgnaHR0cHM6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QvZm9udHMvSFRNTC1DU1MvVGVYL290Zi9NYXRoSmF4X0FNUy1SZWd1bGFyLm90ZicpIGZvcm1hdCgnb3BlbnR5cGUnKQp9CgpAZm9udC1mYWNlIHsKICAgIGZvbnQtZmFtaWx5OiBNSlhjLVRlWC1jYWwtQjsKICAgIHNyYzogbG9jYWwoJ01hdGhKYXhfQ2FsaWdyYXBoaWMgQm9sZCcpLCBsb2NhbCgnTWF0aEpheF9DYWxpZ3JhcGhpYy1Cb2xkJykKfQoKQGZvbnQtZmFjZSB7CiAgICBmb250LWZhbWlseTogTUpYYy1UZVgtY2FsLUJ4OwogICAgc3JjOiBsb2NhbCgnTWF0aEpheF9DYWxpZ3JhcGhpYycpOwogICAgZm9udC13ZWlnaHQ6IGJvbGQKfQoKQGZvbnQtZmFjZSB7CiAgICBmb250LWZhbWlseTogTUpYYy1UZVgtY2FsLUJ3OwogICAgc3JjIC8qMSovOiB1cmwoJ2h0dHBzOi8vY2RuLm1hdGhqYXgub3JnL21hdGhqYXgvbGF0ZXN0L2ZvbnRzL0hUTUwtQ1NTL1RlWC9lb3QvTWF0aEpheF9DYWxpZ3JhcGhpYy1Cb2xkLmVvdCcpOwogICAgc3JjIC8qMiovOiB1cmwoJ2h0dHBzOi8vY2RuLm1hdGhqYXgub3JnL21hdGhqYXgvbGF0ZXN0L2ZvbnRzL0hUTUwtQ1NTL1RlWC93b2ZmL01hdGhKYXhfQ2FsaWdyYXBoaWMtQm9sZC53b2ZmJykgZm9ybWF0KCd3b2ZmJyksIHVybCgnaHR0cHM6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QvZm9udHMvSFRNTC1DU1MvVGVYL290Zi9NYXRoSmF4X0NhbGlncmFwaGljLUJvbGQub3RmJykgZm9ybWF0KCdvcGVudHlwZScpCn0KCkBmb250LWZhY2UgewogICAgZm9udC1mYW1pbHk6IE1KWGMtVGVYLWZyYWstUjsKICAgIHNyYzogbG9jYWwoJ01hdGhKYXhfRnJha3R1cicpLCBsb2NhbCgnTWF0aEpheF9GcmFrdHVyLVJlZ3VsYXInKQp9CgpAZm9udC1mYWNlIHsKICAgIGZvbnQtZmFtaWx5OiBNSlhjLVRlWC1mcmFrLVJ3OwogICAgc3JjIC8qMSovOiB1cmwoJ2h0dHBzOi8vY2RuLm1hdGhqYXgub3JnL21hdGhqYXgvbGF0ZXN0L2ZvbnRzL0hUTUwtQ1NTL1RlWC9lb3QvTWF0aEpheF9GcmFrdHVyLVJlZ3VsYXIuZW90Jyk7CiAgICBzcmMgLyoyKi86IHVybCgnaHR0cHM6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QvZm9udHMvSFRNTC1DU1MvVGVYL3dvZmYvTWF0aEpheF9GcmFrdHVyLVJlZ3VsYXIud29mZicpIGZvcm1hdCgnd29mZicpLCB1cmwoJ2h0dHBzOi8vY2RuLm1hdGhqYXgub3JnL21hdGhqYXgvbGF0ZXN0L2ZvbnRzL0hUTUwtQ1NTL1RlWC9vdGYvTWF0aEpheF9GcmFrdHVyLVJlZ3VsYXIub3RmJykgZm9ybWF0KCdvcGVudHlwZScpCn0KCkBmb250LWZhY2UgewogICAgZm9udC1mYW1pbHk6IE1KWGMtVGVYLWZyYWstQjsKICAgIHNyYzogbG9jYWwoJ01hdGhKYXhfRnJha3R1ciBCb2xkJyksIGxvY2FsKCdNYXRoSmF4X0ZyYWt0dXItQm9sZCcpCn0KCkBmb250LWZhY2UgewogICAgZm9udC1mYW1pbHk6IE1KWGMtVGVYLWZyYWstQng7CiAgICBzcmM6IGxvY2FsKCdNYXRoSmF4X0ZyYWt0dXInKTsKICAgIGZvbnQtd2VpZ2h0OiBib2xkCn0KCkBmb250LWZhY2UgewogICAgZm9udC1mYW1pbHk6IE1KWGMtVGVYLWZyYWstQnc7CiAgICBzcmMgLyoxKi86IHVybCgnaHR0cHM6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QvZm9udHMvSFRNTC1DU1MvVGVYL2VvdC9NYXRoSmF4X0ZyYWt0dXItQm9sZC5lb3QnKTsKICAgIHNyYyAvKjIqLzogdXJsKCdodHRwczovL2Nkbi5tYXRoamF4Lm9yZy9tYXRoamF4L2xhdGVzdC9mb250cy9IVE1MLUNTUy9UZVgvd29mZi9NYXRoSmF4X0ZyYWt0dXItQm9sZC53b2ZmJykgZm9ybWF0KCd3b2ZmJyksIHVybCgnaHR0cHM6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QvZm9udHMvSFRNTC1DU1MvVGVYL290Zi9NYXRoSmF4X0ZyYWt0dXItQm9sZC5vdGYnKSBmb3JtYXQoJ29wZW50eXBlJykKfQoKQGZvbnQtZmFjZSB7CiAgICBmb250LWZhbWlseTogTUpYYy1UZVgtbWF0aC1CSTsKICAgIHNyYzogbG9jYWwoJ01hdGhKYXhfTWF0aCBCb2xkSXRhbGljJyksIGxvY2FsKCdNYXRoSmF4X01hdGgtQm9sZEl0YWxpYycpCn0KCkBmb250LWZhY2UgewogICAgZm9udC1mYW1pbHk6IE1KWGMtVGVYLW1hdGgtQkl4OwogICAgc3JjOiBsb2NhbCgnTWF0aEpheF9NYXRoJyk7CiAgICBmb250LXdlaWdodDogYm9sZDsKICAgIGZvbnQtc3R5bGU6IGl0YWxpYwp9CgpAZm9udC1mYWNlIHsKICAgIGZvbnQtZmFtaWx5OiBNSlhjLVRlWC1tYXRoLUJJdzsKICAgIHNyYyAvKjEqLzogdXJsKCdodHRwczovL2Nkbi5tYXRoamF4Lm9yZy9tYXRoamF4L2xhdGVzdC9mb250cy9IVE1MLUNTUy9UZVgvZW90L01hdGhKYXhfTWF0aC1Cb2xkSXRhbGljLmVvdCcpOwogICAgc3JjIC8qMiovOiB1cmwoJ2h0dHBzOi8vY2RuLm1hdGhqYXgub3JnL21hdGhqYXgvbGF0ZXN0L2ZvbnRzL0hUTUwtQ1NTL1RlWC93b2ZmL01hdGhKYXhfTWF0aC1Cb2xkSXRhbGljLndvZmYnKSBmb3JtYXQoJ3dvZmYnKSwgdXJsKCdodHRwczovL2Nkbi5tYXRoamF4Lm9yZy9tYXRoamF4L2xhdGVzdC9mb250cy9IVE1MLUNTUy9UZVgvb3RmL01hdGhKYXhfTWF0aC1Cb2xkSXRhbGljLm90ZicpIGZvcm1hdCgnb3BlbnR5cGUnKQp9CgpAZm9udC1mYWNlIHsKICAgIGZvbnQtZmFtaWx5OiBNSlhjLVRlWC1zYW5zLVI7CiAgICBzcmM6IGxvY2FsKCdNYXRoSmF4X1NhbnNTZXJpZicpLCBsb2NhbCgnTWF0aEpheF9TYW5zU2VyaWYtUmVndWxhcicpCn0KCkBmb250LWZhY2UgewogICAgZm9udC1mYW1pbHk6IE1KWGMtVGVYLXNhbnMtUnc7CiAgICBzcmMgLyoxKi86IHVybCgnaHR0cHM6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QvZm9udHMvSFRNTC1DU1MvVGVYL2VvdC9NYXRoSmF4X1NhbnNTZXJpZi1SZWd1bGFyLmVvdCcpOwogICAgc3JjIC8qMiovOiB1cmwoJ2h0dHBzOi8vY2RuLm1hdGhqYXgub3JnL21hdGhqYXgvbGF0ZXN0L2ZvbnRzL0hUTUwtQ1NTL1RlWC93b2ZmL01hdGhKYXhfU2Fuc1NlcmlmLVJlZ3VsYXIud29mZicpIGZvcm1hdCgnd29mZicpLCB1cmwoJ2h0dHBzOi8vY2RuLm1hdGhqYXgub3JnL21hdGhqYXgvbGF0ZXN0L2ZvbnRzL0hUTUwtQ1NTL1RlWC9vdGYvTWF0aEpheF9TYW5zU2VyaWYtUmVndWxhci5vdGYnKSBmb3JtYXQoJ29wZW50eXBlJykKfQoKQGZvbnQtZmFjZSB7CiAgICBmb250LWZhbWlseTogTUpYYy1UZVgtc2Fucy1COwogICAgc3JjOiBsb2NhbCgnTWF0aEpheF9TYW5zU2VyaWYgQm9sZCcpLCBsb2NhbCgnTWF0aEpheF9TYW5zU2VyaWYtQm9sZCcpCn0KCkBmb250LWZhY2UgewogICAgZm9udC1mYW1pbHk6IE1KWGMtVGVYLXNhbnMtQng7CiAgICBzcmM6IGxvY2FsKCdNYXRoSmF4X1NhbnNTZXJpZicpOwogICAgZm9udC13ZWlnaHQ6IGJvbGQKfQoKQGZvbnQtZmFjZSB7CiAgICBmb250LWZhbWlseTogTUpYYy1UZVgtc2Fucy1CdzsKICAgIHNyYyAvKjEqLzogdXJsKCdodHRwczovL2Nkbi5tYXRoamF4Lm9yZy9tYXRoamF4L2xhdGVzdC9mb250cy9IVE1MLUNTUy9UZVgvZW90L01hdGhKYXhfU2Fuc1NlcmlmLUJvbGQuZW90Jyk7CiAgICBzcmMgLyoyKi86IHVybCgnaHR0cHM6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QvZm9udHMvSFRNTC1DU1MvVGVYL3dvZmYvTWF0aEpheF9TYW5zU2VyaWYtQm9sZC53b2ZmJykgZm9ybWF0KCd3b2ZmJyksIHVybCgnaHR0cHM6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QvZm9udHMvSFRNTC1DU1MvVGVYL290Zi9NYXRoSmF4X1NhbnNTZXJpZi1Cb2xkLm90ZicpIGZvcm1hdCgnb3BlbnR5cGUnKQp9CgpAZm9udC1mYWNlIHsKICAgIGZvbnQtZmFtaWx5OiBNSlhjLVRlWC1zYW5zLUk7CiAgICBzcmM6IGxvY2FsKCdNYXRoSmF4X1NhbnNTZXJpZiBJdGFsaWMnKSwgbG9jYWwoJ01hdGhKYXhfU2Fuc1NlcmlmLUl0YWxpYycpCn0KCkBmb250LWZhY2UgewogICAgZm9udC1mYW1pbHk6IE1KWGMtVGVYLXNhbnMtSXg7CiAgICBzcmM6IGxvY2FsKCdNYXRoSmF4X1NhbnNTZXJpZicpOwogICAgZm9udC1zdHlsZTogaXRhbGljCn0KCkBmb250LWZhY2UgewogICAgZm9udC1mYW1pbHk6IE1KWGMtVGVYLXNhbnMtSXc7CiAgICBzcmMgLyoxKi86IHVybCgnaHR0cHM6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QvZm9udHMvSFRNTC1DU1MvVGVYL2VvdC9NYXRoSmF4X1NhbnNTZXJpZi1JdGFsaWMuZW90Jyk7CiAgICBzcmMgLyoyKi86IHVybCgnaHR0cHM6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QvZm9udHMvSFRNTC1DU1MvVGVYL3dvZmYvTWF0aEpheF9TYW5zU2VyaWYtSXRhbGljLndvZmYnKSBmb3JtYXQoJ3dvZmYnKSwgdXJsKCdodHRwczovL2Nkbi5tYXRoamF4Lm9yZy9tYXRoamF4L2xhdGVzdC9mb250cy9IVE1MLUNTUy9UZVgvb3RmL01hdGhKYXhfU2Fuc1NlcmlmLUl0YWxpYy5vdGYnKSBmb3JtYXQoJ29wZW50eXBlJykKfQoKQGZvbnQtZmFjZSB7CiAgICBmb250LWZhbWlseTogTUpYYy1UZVgtc2NyaXB0LVI7CiAgICBzcmM6IGxvY2FsKCdNYXRoSmF4X1NjcmlwdCcpLCBsb2NhbCgnTWF0aEpheF9TY3JpcHQtUmVndWxhcicpCn0KCkBmb250LWZhY2UgewogICAgZm9udC1mYW1pbHk6IE1KWGMtVGVYLXNjcmlwdC1SdzsKICAgIHNyYyAvKjEqLzogdXJsKCdodHRwczovL2Nkbi5tYXRoamF4Lm9yZy9tYXRoamF4L2xhdGVzdC9mb250cy9IVE1MLUNTUy9UZVgvZW90L01hdGhKYXhfU2NyaXB0LVJlZ3VsYXIuZW90Jyk7CiAgICBzcmMgLyoyKi86IHVybCgnaHR0cHM6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QvZm9udHMvSFRNTC1DU1MvVGVYL3dvZmYvTWF0aEpheF9TY3JpcHQtUmVndWxhci53b2ZmJykgZm9ybWF0KCd3b2ZmJyksIHVybCgnaHR0cHM6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QvZm9udHMvSFRNTC1DU1MvVGVYL290Zi9NYXRoSmF4X1NjcmlwdC1SZWd1bGFyLm90ZicpIGZvcm1hdCgnb3BlbnR5cGUnKQp9CgpAZm9udC1mYWNlIHsKICAgIGZvbnQtZmFtaWx5OiBNSlhjLVRlWC10eXBlLVI7CiAgICBzcmM6IGxvY2FsKCdNYXRoSmF4X1R5cGV3cml0ZXInKSwgbG9jYWwoJ01hdGhKYXhfVHlwZXdyaXRlci1SZWd1bGFyJykKfQoKQGZvbnQtZmFjZSB7CiAgICBmb250LWZhbWlseTogTUpYYy1UZVgtdHlwZS1SdzsKICAgIHNyYyAvKjEqLzogdXJsKCdodHRwczovL2Nkbi5tYXRoamF4Lm9yZy9tYXRoamF4L2xhdGVzdC9mb250cy9IVE1MLUNTUy9UZVgvZW90L01hdGhKYXhfVHlwZXdyaXRlci1SZWd1bGFyLmVvdCcpOwogICAgc3JjIC8qMiovOiB1cmwoJ2h0dHBzOi8vY2RuLm1hdGhqYXgub3JnL21hdGhqYXgvbGF0ZXN0L2ZvbnRzL0hUTUwtQ1NTL1RlWC93b2ZmL01hdGhKYXhfVHlwZXdyaXRlci1SZWd1bGFyLndvZmYnKSBmb3JtYXQoJ3dvZmYnKSwgdXJsKCdodHRwczovL2Nkbi5tYXRoamF4Lm9yZy9tYXRoamF4L2xhdGVzdC9mb250cy9IVE1MLUNTUy9UZVgvb3RmL01hdGhKYXhfVHlwZXdyaXRlci1SZWd1bGFyLm90ZicpIGZvcm1hdCgnb3BlbnR5cGUnKQp9CgpAZm9udC1mYWNlIHsKICAgIGZvbnQtZmFtaWx5OiBNSlhjLVRlWC1jYWwtUjsKICAgIHNyYzogbG9jYWwoJ01hdGhKYXhfQ2FsaWdyYXBoaWMnKSwgbG9jYWwoJ01hdGhKYXhfQ2FsaWdyYXBoaWMtUmVndWxhcicpCn0KCkBmb250LWZhY2UgewogICAgZm9udC1mYW1pbHk6IE1KWGMtVGVYLWNhbC1SdzsKICAgIHNyYyAvKjEqLzogdXJsKCdodHRwczovL2Nkbi5tYXRoamF4Lm9yZy9tYXRoamF4L2xhdGVzdC9mb250cy9IVE1MLUNTUy9UZVgvZW90L01hdGhKYXhfQ2FsaWdyYXBoaWMtUmVndWxhci5lb3QnKTsKICAgIHNyYyAvKjIqLzogdXJsKCdodHRwczovL2Nkbi5tYXRoamF4Lm9yZy9tYXRoamF4L2xhdGVzdC9mb250cy9IVE1MLUNTUy9UZVgvd29mZi9NYXRoSmF4X0NhbGlncmFwaGljLVJlZ3VsYXIud29mZicpIGZvcm1hdCgnd29mZicpLCB1cmwoJ2h0dHBzOi8vY2RuLm1hdGhqYXgub3JnL21hdGhqYXgvbGF0ZXN0L2ZvbnRzL0hUTUwtQ1NTL1RlWC9vdGYvTWF0aEpheF9DYWxpZ3JhcGhpYy1SZWd1bGFyLm90ZicpIGZvcm1hdCgnb3BlbnR5cGUnKQp9CgpAZm9udC1mYWNlIHsKICAgIGZvbnQtZmFtaWx5OiBNSlhjLVRlWC1tYWluLUI7CiAgICBzcmM6IGxvY2FsKCdNYXRoSmF4X01haW4gQm9sZCcpLCBsb2NhbCgnTWF0aEpheF9NYWluLUJvbGQnKQp9CgpAZm9udC1mYWNlIHsKICAgIGZvbnQtZmFtaWx5OiBNSlhjLVRlWC1tYWluLUJ4OwogICAgc3JjOiBsb2NhbCgnTWF0aEpheF9NYWluJyk7CiAgICBmb250LXdlaWdodDogYm9sZAp9CgpAZm9udC1mYWNlIHsKICAgIGZvbnQtZmFtaWx5OiBNSlhjLVRlWC1tYWluLUJ3OwogICAgc3JjIC8qMSovOiB1cmwoJ2h0dHBzOi8vY2RuLm1hdGhqYXgub3JnL21hdGhqYXgvbGF0ZXN0L2ZvbnRzL0hUTUwtQ1NTL1RlWC9lb3QvTWF0aEpheF9NYWluLUJvbGQuZW90Jyk7CiAgICBzcmMgLyoyKi86IHVybCgnaHR0cHM6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QvZm9udHMvSFRNTC1DU1MvVGVYL3dvZmYvTWF0aEpheF9NYWluLUJvbGQud29mZicpIGZvcm1hdCgnd29mZicpLCB1cmwoJ2h0dHBzOi8vY2RuLm1hdGhqYXgub3JnL21hdGhqYXgvbGF0ZXN0L2ZvbnRzL0hUTUwtQ1NTL1RlWC9vdGYvTWF0aEpheF9NYWluLUJvbGQub3RmJykgZm9ybWF0KCdvcGVudHlwZScpCn0KCkBmb250LWZhY2UgewogICAgZm9udC1mYW1pbHk6IE1KWGMtVGVYLW1haW4tSTsKICAgIHNyYzogbG9jYWwoJ01hdGhKYXhfTWFpbiBJdGFsaWMnKSwgbG9jYWwoJ01hdGhKYXhfTWFpbi1JdGFsaWMnKQp9CgpAZm9udC1mYWNlIHsKICAgIGZvbnQtZmFtaWx5OiBNSlhjLVRlWC1tYWluLUl4OwogICAgc3JjOiBsb2NhbCgnTWF0aEpheF9NYWluJyk7CiAgICBmb250LXN0eWxlOiBpdGFsaWMKfQoKQGZvbnQtZmFjZSB7CiAgICBmb250LWZhbWlseTogTUpYYy1UZVgtbWFpbi1JdzsKICAgIHNyYyAvKjEqLzogdXJsKCdodHRwczovL2Nkbi5tYXRoamF4Lm9yZy9tYXRoamF4L2xhdGVzdC9mb250cy9IVE1MLUNTUy9UZVgvZW90L01hdGhKYXhfTWFpbi1JdGFsaWMuZW90Jyk7CiAgICBzcmMgLyoyKi86IHVybCgnaHR0cHM6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QvZm9udHMvSFRNTC1DU1MvVGVYL3dvZmYvTWF0aEpheF9NYWluLUl0YWxpYy53b2ZmJykgZm9ybWF0KCd3b2ZmJyksIHVybCgnaHR0cHM6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QvZm9udHMvSFRNTC1DU1MvVGVYL290Zi9NYXRoSmF4X01haW4tSXRhbGljLm90ZicpIGZvcm1hdCgnb3BlbnR5cGUnKQp9CgpAZm9udC1mYWNlIHsKICAgIGZvbnQtZmFtaWx5OiBNSlhjLVRlWC1tYWluLVI7CiAgICBzcmM6IGxvY2FsKCdNYXRoSmF4X01haW4nKSwgbG9jYWwoJ01hdGhKYXhfTWFpbi1SZWd1bGFyJykKfQoKQGZvbnQtZmFjZSB7CiAgICBmb250LWZhbWlseTogTUpYYy1UZVgtbWFpbi1SdzsKICAgIHNyYyAvKjEqLzogdXJsKCdodHRwczovL2Nkbi5tYXRoamF4Lm9yZy9tYXRoamF4L2xhdGVzdC9mb250cy9IVE1MLUNTUy9UZVgvZW90L01hdGhKYXhfTWFpbi1SZWd1bGFyLmVvdCcpOwogICAgc3JjIC8qMiovOiB1cmwoJ2h0dHBzOi8vY2RuLm1hdGhqYXgub3JnL21hdGhqYXgvbGF0ZXN0L2ZvbnRzL0hUTUwtQ1NTL1RlWC93b2ZmL01hdGhKYXhfTWFpbi1SZWd1bGFyLndvZmYnKSBmb3JtYXQoJ3dvZmYnKSwgdXJsKCdodHRwczovL2Nkbi5tYXRoamF4Lm9yZy9tYXRoamF4L2xhdGVzdC9mb250cy9IVE1MLUNTUy9UZVgvb3RmL01hdGhKYXhfTWFpbi1SZWd1bGFyLm90ZicpIGZvcm1hdCgnb3BlbnR5cGUnKQp9CgpAZm9udC1mYWNlIHsKICAgIGZvbnQtZmFtaWx5OiBNSlhjLVRlWC1tYXRoLUk7CiAgICBzcmM6IGxvY2FsKCdNYXRoSmF4X01hdGggSXRhbGljJyksIGxvY2FsKCdNYXRoSmF4X01hdGgtSXRhbGljJykKfQoKQGZvbnQtZmFjZSB7CiAgICBmb250LWZhbWlseTogTUpYYy1UZVgtbWF0aC1JeDsKICAgIHNyYzogbG9jYWwoJ01hdGhKYXhfTWF0aCcpOwogICAgZm9udC1zdHlsZTogaXRhbGljCn0KCkBmb250LWZhY2UgewogICAgZm9udC1mYW1pbHk6IE1KWGMtVGVYLW1hdGgtSXc7CiAgICBzcmMgLyoxKi86IHVybCgnaHR0cHM6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QvZm9udHMvSFRNTC1DU1MvVGVYL2VvdC9NYXRoSmF4X01hdGgtSXRhbGljLmVvdCcpOwogICAgc3JjIC8qMiovOiB1cmwoJ2h0dHBzOi8vY2RuLm1hdGhqYXgub3JnL21hdGhqYXgvbGF0ZXN0L2ZvbnRzL0hUTUwtQ1NTL1RlWC93b2ZmL01hdGhKYXhfTWF0aC1JdGFsaWMud29mZicpIGZvcm1hdCgnd29mZicpLCB1cmwoJ2h0dHBzOi8vY2RuLm1hdGhqYXgub3JnL21hdGhqYXgvbGF0ZXN0L2ZvbnRzL0hUTUwtQ1NTL1RlWC9vdGYvTWF0aEpheF9NYXRoLUl0YWxpYy5vdGYnKSBmb3JtYXQoJ29wZW50eXBlJykKfQoKQGZvbnQtZmFjZSB7CiAgICBmb250LWZhbWlseTogTUpYYy1UZVgtc2l6ZTEtUjsKICAgIHNyYzogbG9jYWwoJ01hdGhKYXhfU2l6ZTEnKSwgbG9jYWwoJ01hdGhKYXhfU2l6ZTEtUmVndWxhcicpCn0KCkBmb250LWZhY2UgewogICAgZm9udC1mYW1pbHk6IE1KWGMtVGVYLXNpemUxLVJ3OwogICAgc3JjIC8qMSovOiB1cmwoJ2h0dHBzOi8vY2RuLm1hdGhqYXgub3JnL21hdGhqYXgvbGF0ZXN0L2ZvbnRzL0hUTUwtQ1NTL1RlWC9lb3QvTWF0aEpheF9TaXplMS1SZWd1bGFyLmVvdCcpOwogICAgc3JjIC8qMiovOiB1cmwoJ2h0dHBzOi8vY2RuLm1hdGhqYXgub3JnL21hdGhqYXgvbGF0ZXN0L2ZvbnRzL0hUTUwtQ1NTL1RlWC93b2ZmL01hdGhKYXhfU2l6ZTEtUmVndWxhci53b2ZmJykgZm9ybWF0KCd3b2ZmJyksIHVybCgnaHR0cHM6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QvZm9udHMvSFRNTC1DU1MvVGVYL290Zi9NYXRoSmF4X1NpemUxLVJlZ3VsYXIub3RmJykgZm9ybWF0KCdvcGVudHlwZScpCn0KCkBmb250LWZhY2UgewogICAgZm9udC1mYW1pbHk6IE1KWGMtVGVYLXNpemUyLVI7CiAgICBzcmM6IGxvY2FsKCdNYXRoSmF4X1NpemUyJyksIGxvY2FsKCdNYXRoSmF4X1NpemUyLVJlZ3VsYXInKQp9CgpAZm9udC1mYWNlIHsKICAgIGZvbnQtZmFtaWx5OiBNSlhjLVRlWC1zaXplMi1SdzsKICAgIHNyYyAvKjEqLzogdXJsKCdodHRwczovL2Nkbi5tYXRoamF4Lm9yZy9tYXRoamF4L2xhdGVzdC9mb250cy9IVE1MLUNTUy9UZVgvZW90L01hdGhKYXhfU2l6ZTItUmVndWxhci5lb3QnKTsKICAgIHNyYyAvKjIqLzogdXJsKCdodHRwczovL2Nkbi5tYXRoamF4Lm9yZy9tYXRoamF4L2xhdGVzdC9mb250cy9IVE1MLUNTUy9UZVgvd29mZi9NYXRoSmF4X1NpemUyLVJlZ3VsYXIud29mZicpIGZvcm1hdCgnd29mZicpLCB1cmwoJ2h0dHBzOi8vY2RuLm1hdGhqYXgub3JnL21hdGhqYXgvbGF0ZXN0L2ZvbnRzL0hUTUwtQ1NTL1RlWC9vdGYvTWF0aEpheF9TaXplMi1SZWd1bGFyLm90ZicpIGZvcm1hdCgnb3BlbnR5cGUnKQp9CgpAZm9udC1mYWNlIHsKICAgIGZvbnQtZmFtaWx5OiBNSlhjLVRlWC1zaXplMy1SOwogICAgc3JjOiBsb2NhbCgnTWF0aEpheF9TaXplMycpLCBsb2NhbCgnTWF0aEpheF9TaXplMy1SZWd1bGFyJykKfQoKQGZvbnQtZmFjZSB7CiAgICBmb250LWZhbWlseTogTUpYYy1UZVgtc2l6ZTMtUnc7CiAgICBzcmMgLyoxKi86IHVybCgnaHR0cHM6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QvZm9udHMvSFRNTC1DU1MvVGVYL2VvdC9NYXRoSmF4X1NpemUzLVJlZ3VsYXIuZW90Jyk7CiAgICBzcmMgLyoyKi86IHVybCgnaHR0cHM6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QvZm9udHMvSFRNTC1DU1MvVGVYL3dvZmYvTWF0aEpheF9TaXplMy1SZWd1bGFyLndvZmYnKSBmb3JtYXQoJ3dvZmYnKSwgdXJsKCdodHRwczovL2Nkbi5tYXRoamF4Lm9yZy9tYXRoamF4L2xhdGVzdC9mb250cy9IVE1MLUNTUy9UZVgvb3RmL01hdGhKYXhfU2l6ZTMtUmVndWxhci5vdGYnKSBmb3JtYXQoJ29wZW50eXBlJykKfQoKQGZvbnQtZmFjZSB7CiAgICBmb250LWZhbWlseTogTUpYYy1UZVgtc2l6ZTQtUjsKICAgIHNyYzogbG9jYWwoJ01hdGhKYXhfU2l6ZTQnKSwgbG9jYWwoJ01hdGhKYXhfU2l6ZTQtUmVndWxhcicpCn0KCkBmb250LWZhY2UgewogICAgZm9udC1mYW1pbHk6IE1KWGMtVGVYLXNpemU0LVJ3OwogICAgc3JjIC8qMSovOiB1cmwoJ2h0dHBzOi8vY2RuLm1hdGhqYXgub3JnL21hdGhqYXgvbGF0ZXN0L2ZvbnRzL0hUTUwtQ1NTL1RlWC9lb3QvTWF0aEpheF9TaXplNC1SZWd1bGFyLmVvdCcpOwogICAgc3JjIC8qMiovOiB1cmwoJ2h0dHBzOi8vY2RuLm1hdGhqYXgub3JnL21hdGhqYXgvbGF0ZXN0L2ZvbnRzL0hUTUwtQ1NTL1RlWC93b2ZmL01hdGhKYXhfU2l6ZTQtUmVndWxhci53b2ZmJykgZm9ybWF0KCd3b2ZmJyksIHVybCgnaHR0cHM6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QvZm9udHMvSFRNTC1DU1MvVGVYL290Zi9NYXRoSmF4X1NpemU0LVJlZ3VsYXIub3RmJykgZm9ybWF0KCdvcGVudHlwZScpCn0KCkBmb250LWZhY2UgewogICAgZm9udC1mYW1pbHk6IE1KWGMtVGVYLXZlYy1SOwogICAgc3JjOiBsb2NhbCgnTWF0aEpheF9WZWN0b3InKSwgbG9jYWwoJ01hdGhKYXhfVmVjdG9yLVJlZ3VsYXInKQp9CgpAZm9udC1mYWNlIHsKICAgIGZvbnQtZmFtaWx5OiBNSlhjLVRlWC12ZWMtUnc7CiAgICBzcmMgLyoxKi86IHVybCgnaHR0cHM6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QvZm9udHMvSFRNTC1DU1MvVGVYL2VvdC9NYXRoSmF4X1ZlY3Rvci1SZWd1bGFyLmVvdCcpOwogICAgc3JjIC8qMiovOiB1cmwoJ2h0dHBzOi8vY2RuLm1hdGhqYXgub3JnL21hdGhqYXgvbGF0ZXN0L2ZvbnRzL0hUTUwtQ1NTL1RlWC93b2ZmL01hdGhKYXhfVmVjdG9yLVJlZ3VsYXIud29mZicpIGZvcm1hdCgnd29mZicpLCB1cmwoJ2h0dHBzOi8vY2RuLm1hdGhqYXgub3JnL21hdGhqYXgvbGF0ZXN0L2ZvbnRzL0hUTUwtQ1NTL1RlWC9vdGYvTWF0aEpheF9WZWN0b3ItUmVndWxhci5vdGYnKSBmb3JtYXQoJ29wZW50eXBlJykKfQoKQGZvbnQtZmFjZSB7CiAgICBmb250LWZhbWlseTogTUpYYy1UZVgtdmVjLUI7CiAgICBzcmM6IGxvY2FsKCdNYXRoSmF4X1ZlY3RvciBCb2xkJyksIGxvY2FsKCdNYXRoSmF4X1ZlY3Rvci1Cb2xkJykKfQoKQGZvbnQtZmFjZSB7CiAgICBmb250LWZhbWlseTogTUpYYy1UZVgtdmVjLUJ4OwogICAgc3JjOiBsb2NhbCgnTWF0aEpheF9WZWN0b3InKTsKICAgIGZvbnQtd2VpZ2h0OiBib2xkCn0KCkBmb250LWZhY2UgewogICAgZm9udC1mYW1pbHk6IE1KWGMtVGVYLXZlYy1CdzsKICAgIHNyYyAvKjEqLzogdXJsKCdodHRwczovL2Nkbi5tYXRoamF4Lm9yZy9tYXRoamF4L2xhdGVzdC9mb250cy9IVE1MLUNTUy9UZVgvZW90L01hdGhKYXhfVmVjdG9yLUJvbGQuZW90Jyk7CiAgICBzcmMgLyoyKi86IHVybCgnaHR0cHM6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QvZm9udHMvSFRNTC1DU1MvVGVYL3dvZmYvTWF0aEpheF9WZWN0b3ItQm9sZC53b2ZmJykgZm9ybWF0KCd3b2ZmJyksIHVybCgnaHR0cHM6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QvZm9udHMvSFRNTC1DU1MvVGVYL290Zi9NYXRoSmF4X1ZlY3Rvci1Cb2xkLm90ZicpIGZvcm1hdCgnb3BlbnR5cGUnKQp9Cgoud29yZGluZyBkaXYuZXhhbXBsZSB7CglkaXNwbGF5OiBibG9jazsKCW1hcmdpbi10b3A6IDVwdDsKCW1hcmdpbi1ib3R0b206IDVwdDsKCWZvbnQtc2l6ZTogMTFwdDsKCWNvbG9yOiAjYmIwMGJiOwp9Cgoud29yZGluZyBkaXYubm90ZSB7CglkaXNwbGF5OiBibG9jazsKCW1hcmdpbi10b3A6IDVwdDsKCW1hcmdpbi1ib3R0b206IDVwdDsKCWZvbnQtc2l6ZTogMTFwdDsKCWNvbG9yOiAjYmIwMGJiOwp9Cgoud29yZGluZyBkaXYuZXhhbXBsZSB7CglkaXNwbGF5OiBibG9jazsKCW1hcmdpbi10b3A6IDVwdDsKCW1hcmdpbi1ib3R0b206IDVwdDsKCWZvbnQtc2l6ZTogOXB0Owp9Cgoud29yZGluZyBkaXYubm90ZSB7CglkaXNwbGF5OiBibG9jazsKCW1hcmdpbi10b3A6IDVwdDsKCW1hcmdpbi1ib3R0b206IDVwdDsKCWZvbnQtc2l6ZTogOXB0Owp9Cgoud29yZGluZyBkaXYubm90ZSAudGV4dHR0IHsgZm9udC1zaXplOiA5cHQ7IH0KLndvcmRpbmcgZGl2LmV4YW1wbGUgLnRleHR0dCB7IGZvbnQtc2l6ZTogOXB0OyB9Cgoud29yZGluZyBkaXYubm90ZSAudGV4dHNmIHsgZm9udC1mYW1pbHk6ICdOb3RvIFNhbnMnOyBmb250LXNpemU6IDlwdDsgfQoud29yZGluZyBkaXYuZXhhbXBsZSAudGV4dHNmIHsgZm9udC1mYW1pbHk6ICdOb3RvIFNhbnMnOyBmb250LXNpemU6IDlwdDsgfQoKLndvcmRpbmcgZGl2Lm5vdGUgLm1hdGggeyBmb250LXNpemU6IDlwdDsgfQoud29yZGluZyBkaXYuZXhhbXBsZSAubWF0aCB7IGZvbnQtc2l6ZTogOXB0OyB9Cgoud29yZGluZyBkaXYuZXhhbXBsZSB7IGRpc3BsYXk6IG5vbmU7IH0KLndvcmRpbmcgZGl2Lm5vdGUgeyBkaXNwbGF5OiBub25lOyB9Cgoud29yZGluZyBhLmZvb3Rub3RlbnVtIHsgZGlzcGxheTogbm9uZTsgfQoud29yZGluZyBkaXYuZm9vdG5vdGUgeyBkaXNwbGF5OiBub25lOyB9Ci53b3JkaW5nIGRpdi5mb290bm90ZVNlcGFyYXRvciB7IGRpc3BsYXk6IG5vbmU7IH0KLndvcmRpbmcgLmZvb3Rub3RlcmVmIHsgZGlzcGxheTogbm9uZTsgfQoKLndvcmRpbmcgZGl2Lm5vbk5vcm1hdGl2ZU9ubHkgeyBkaXNwbGF5OiBub25lOyB9Cgo=">
<link href="https://fonts.googleapis.com/css?family=Noto+Serif" rel='stylesheet'>
<link href="https://fonts.googleapis.com/css?family=Noto+Sans" rel='stylesheet'>
<link href="https://fonts.googleapis.com/css?family=Noto+Sans+Mono" rel='stylesheet'>
<script src="data:text/javascript;base64,LyohCiAgSGlnaGxpZ2h0LmpzIHYxMS45LjAgKGdpdDogYjdlYzRiZmFmYykKICAoYykgMjAwNi0yMDI0IHVuZGVmaW5lZCBhbmQgb3RoZXIgY29udHJpYnV0b3JzCiAgTGljZW5zZTogQlNELTMtQ2xhdXNlCiAqLwp2YXIgaGxqcz1mdW5jdGlvbigpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBlKHQpewpyZXR1cm4gdCBpbnN0YW5jZW9mIE1hcD90LmNsZWFyPXQuZGVsZXRlPXQuc2V0PSgpPT57CnRocm93IEVycm9yKCJtYXAgaXMgcmVhZC1vbmx5Iil9OnQgaW5zdGFuY2VvZiBTZXQmJih0LmFkZD10LmNsZWFyPXQuZGVsZXRlPSgpPT57CnRocm93IEVycm9yKCJzZXQgaXMgcmVhZC1vbmx5IikKfSksT2JqZWN0LmZyZWV6ZSh0KSxPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0KS5mb3JFYWNoKChuPT57CmNvbnN0IGk9dFtuXSxzPXR5cGVvZiBpOyJvYmplY3QiIT09cyYmImZ1bmN0aW9uIiE9PXN8fE9iamVjdC5pc0Zyb3plbihpKXx8ZShpKQp9KSksdH1jbGFzcyB0e2NvbnN0cnVjdG9yKGUpewp2b2lkIDA9PT1lLmRhdGEmJihlLmRhdGE9e30pLHRoaXMuZGF0YT1lLmRhdGEsdGhpcy5pc01hdGNoSWdub3JlZD0hMX0KaWdub3JlTWF0Y2goKXt0aGlzLmlzTWF0Y2hJZ25vcmVkPSEwfX1mdW5jdGlvbiBuKGUpewpyZXR1cm4gZS5yZXBsYWNlKC8mL2csIiZhbXA7IikucmVwbGFjZSgvPC9nLCImbHQ7IikucmVwbGFjZSgvPi9nLCImZ3Q7IikucmVwbGFjZSgvIi9nLCImcXVvdDsiKS5yZXBsYWNlKC8nL2csIiYjeDI3OyIpCn1mdW5jdGlvbiBpKGUsLi4udCl7Y29uc3Qgbj1PYmplY3QuY3JlYXRlKG51bGwpO2Zvcihjb25zdCB0IGluIGUpblt0XT1lW3RdCjtyZXR1cm4gdC5mb3JFYWNoKChlPT57Zm9yKGNvbnN0IHQgaW4gZSluW3RdPWVbdF19KSksbn1jb25zdCBzPWU9PiEhZS5zY29wZQo7Y2xhc3Mgb3tjb25zdHJ1Y3RvcihlLHQpewp0aGlzLmJ1ZmZlcj0iIix0aGlzLmNsYXNzUHJlZml4PXQuY2xhc3NQcmVmaXgsZS53YWxrKHRoaXMpfWFkZFRleHQoZSl7CnRoaXMuYnVmZmVyKz1uKGUpfW9wZW5Ob2RlKGUpe2lmKCFzKGUpKXJldHVybjtjb25zdCB0PSgoZSx7cHJlZml4OnR9KT0+ewppZihlLnN0YXJ0c1dpdGgoImxhbmd1YWdlOiIpKXJldHVybiBlLnJlcGxhY2UoImxhbmd1YWdlOiIsImxhbmd1YWdlLSIpCjtpZihlLmluY2x1ZGVzKCIuIikpe2NvbnN0IG49ZS5zcGxpdCgiLiIpCjtyZXR1cm5bYCR7dH0ke24uc2hpZnQoKX1gLC4uLm4ubWFwKCgoZSx0KT0+YCR7ZX0keyJfIi5yZXBlYXQodCsxKX1gKSldLmpvaW4oIiAiKQp9cmV0dXJuYCR7dH0ke2V9YH0pKGUuc2NvcGUse3ByZWZpeDp0aGlzLmNsYXNzUHJlZml4fSk7dGhpcy5zcGFuKHQpfQpjbG9zZU5vZGUoZSl7cyhlKSYmKHRoaXMuYnVmZmVyKz0iPC9zcGFuPiIpfXZhbHVlKCl7cmV0dXJuIHRoaXMuYnVmZmVyfXNwYW4oZSl7CnRoaXMuYnVmZmVyKz1gPHNwYW4gY2xhc3M9IiR7ZX0iPmB9fWNvbnN0IHI9KGU9e30pPT57Y29uc3QgdD17Y2hpbGRyZW46W119CjtyZXR1cm4gT2JqZWN0LmFzc2lnbih0LGUpLHR9O2NsYXNzIGF7Y29uc3RydWN0b3IoKXsKdGhpcy5yb290Tm9kZT1yKCksdGhpcy5zdGFjaz1bdGhpcy5yb290Tm9kZV19Z2V0IHRvcCgpewpyZXR1cm4gdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aC0xXX1nZXQgcm9vdCgpe3JldHVybiB0aGlzLnJvb3ROb2RlfWFkZChlKXsKdGhpcy50b3AuY2hpbGRyZW4ucHVzaChlKX1vcGVuTm9kZShlKXtjb25zdCB0PXIoe3Njb3BlOmV9KQo7dGhpcy5hZGQodCksdGhpcy5zdGFjay5wdXNoKHQpfWNsb3NlTm9kZSgpewppZih0aGlzLnN0YWNrLmxlbmd0aD4xKXJldHVybiB0aGlzLnN0YWNrLnBvcCgpfWNsb3NlQWxsTm9kZXMoKXsKZm9yKDt0aGlzLmNsb3NlTm9kZSgpOyk7fXRvSlNPTigpe3JldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLnJvb3ROb2RlLG51bGwsNCl9CndhbGsoZSl7cmV0dXJuIHRoaXMuY29uc3RydWN0b3IuX3dhbGsoZSx0aGlzLnJvb3ROb2RlKX1zdGF0aWMgX3dhbGsoZSx0KXsKcmV0dXJuInN0cmluZyI9PXR5cGVvZiB0P2UuYWRkVGV4dCh0KTp0LmNoaWxkcmVuJiYoZS5vcGVuTm9kZSh0KSwKdC5jaGlsZHJlbi5mb3JFYWNoKCh0PT50aGlzLl93YWxrKGUsdCkpKSxlLmNsb3NlTm9kZSh0KSksZX1zdGF0aWMgX2NvbGxhcHNlKGUpewoic3RyaW5nIiE9dHlwZW9mIGUmJmUuY2hpbGRyZW4mJihlLmNoaWxkcmVuLmV2ZXJ5KChlPT4ic3RyaW5nIj09dHlwZW9mIGUpKT9lLmNoaWxkcmVuPVtlLmNoaWxkcmVuLmpvaW4oIiIpXTplLmNoaWxkcmVuLmZvckVhY2goKGU9PnsKYS5fY29sbGFwc2UoZSl9KSkpfX1jbGFzcyBjIGV4dGVuZHMgYXtjb25zdHJ1Y3RvcihlKXtzdXBlcigpLHRoaXMub3B0aW9ucz1lfQphZGRUZXh0KGUpeyIiIT09ZSYmdGhpcy5hZGQoZSl9c3RhcnRTY29wZShlKXt0aGlzLm9wZW5Ob2RlKGUpfWVuZFNjb3BlKCl7CnRoaXMuY2xvc2VOb2RlKCl9X19hZGRTdWJsYW5ndWFnZShlLHQpe2NvbnN0IG49ZS5yb290Cjt0JiYobi5zY29wZT0ibGFuZ3VhZ2U6Iit0KSx0aGlzLmFkZChuKX10b0hUTUwoKXsKcmV0dXJuIG5ldyBvKHRoaXMsdGhpcy5vcHRpb25zKS52YWx1ZSgpfWZpbmFsaXplKCl7CnJldHVybiB0aGlzLmNsb3NlQWxsTm9kZXMoKSwhMH19ZnVuY3Rpb24gbChlKXsKcmV0dXJuIGU/InN0cmluZyI9PXR5cGVvZiBlP2U6ZS5zb3VyY2U6bnVsbH1mdW5jdGlvbiBnKGUpe3JldHVybiBoKCIoPz0iLGUsIikiKX0KZnVuY3Rpb24gdShlKXtyZXR1cm4gaCgiKD86IixlLCIpKiIpfWZ1bmN0aW9uIGQoZSl7cmV0dXJuIGgoIig/OiIsZSwiKT8iKX0KZnVuY3Rpb24gaCguLi5lKXtyZXR1cm4gZS5tYXAoKGU9PmwoZSkpKS5qb2luKCIiKX1mdW5jdGlvbiBmKC4uLmUpe2NvbnN0IHQ9KGU9PnsKY29uc3QgdD1lW2UubGVuZ3RoLTFdCjtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIHQmJnQuY29uc3RydWN0b3I9PT1PYmplY3Q/KGUuc3BsaWNlKGUubGVuZ3RoLTEsMSksdCk6e30KfSkoZSk7cmV0dXJuIigiKyh0LmNhcHR1cmU/IiI6Ij86IikrZS5tYXAoKGU9PmwoZSkpKS5qb2luKCJ8IikrIikifQpmdW5jdGlvbiBwKGUpe3JldHVybiBSZWdFeHAoZS50b1N0cmluZygpKyJ8IikuZXhlYygiIikubGVuZ3RoLTF9CmNvbnN0IGI9L1xbKD86W15cXFxdXXxcXC4pKlxdfFwoXD8/fFxcKFsxLTldWzAtOV0qKXxcXC4vCjtmdW5jdGlvbiBtKGUse2pvaW5XaXRoOnR9KXtsZXQgbj0wO3JldHVybiBlLm1hcCgoZT0+e24rPTE7Y29uc3QgdD1uCjtsZXQgaT1sKGUpLHM9IiI7Zm9yKDtpLmxlbmd0aD4wOyl7Y29uc3QgZT1iLmV4ZWMoaSk7aWYoIWUpe3MrPWk7YnJlYWt9CnMrPWkuc3Vic3RyaW5nKDAsZS5pbmRleCksCmk9aS5zdWJzdHJpbmcoZS5pbmRleCtlWzBdLmxlbmd0aCksIlxcIj09PWVbMF1bMF0mJmVbMV0/cys9IlxcIisoTnVtYmVyKGVbMV0pK3QpOihzKz1lWzBdLAoiKCI9PT1lWzBdJiZuKyspfXJldHVybiBzfSkpLm1hcCgoZT0+YCgke2V9KWApKS5qb2luKHQpfQpjb25zdCBFPSJbYS16QS1aXVxcdyoiLHg9IlthLXpBLVpfXVxcdyoiLHc9IlxcYlxcZCsoXFwuXFxkKyk/Iix5PSIoLT8pKFxcYjBbeFhdW2EtZkEtRjAtOV0rfChcXGJcXGQrKFxcLlxcZCopP3xcXC5cXGQrKShbZUVdWy0rXT9cXGQrKT8pIixfPSJcXGIoMGJbMDFdKykiLE89ewpiZWdpbjoiXFxcXFtcXHNcXFNdIixyZWxldmFuY2U6MH0sdj17c2NvcGU6InN0cmluZyIsYmVnaW46IiciLGVuZDoiJyIsCmlsbGVnYWw6IlxcbiIsY29udGFpbnM6W09dfSxrPXtzY29wZToic3RyaW5nIixiZWdpbjonIicsZW5kOiciJyxpbGxlZ2FsOiJcXG4iLApjb250YWluczpbT119LE49KGUsdCxuPXt9KT0+e2NvbnN0IHM9aSh7c2NvcGU6ImNvbW1lbnQiLGJlZ2luOmUsZW5kOnQsCmNvbnRhaW5zOltdfSxuKTtzLmNvbnRhaW5zLnB1c2goe3Njb3BlOiJkb2N0YWciLApiZWdpbjoiWyBdKig/PShUT0RPfEZJWE1FfE5PVEV8QlVHfE9QVElNSVpFfEhBQ0t8WFhYKTopIiwKZW5kOi8oVE9ET3xGSVhNRXxOT1RFfEJVR3xPUFRJTUlaRXxIQUNLfFhYWCk6LyxleGNsdWRlQmVnaW46ITAscmVsZXZhbmNlOjB9KQo7Y29uc3Qgbz1mKCJJIiwiYSIsImlzIiwic28iLCJ1cyIsInRvIiwiYXQiLCJpZiIsImluIiwiaXQiLCJvbiIsL1tBLVphLXpdK1snXShkfHZlfHJlfGxsfHR8c3xuKS8sL1tBLVphLXpdK1stXVthLXpdKy8sL1tBLVphLXpdW2Etel17Mix9LykKO3JldHVybiBzLmNvbnRhaW5zLnB1c2goe2JlZ2luOmgoL1sgXSsvLCIoIixvLC9bLl0/WzpdPyhbLl1bIF18WyBdKS8sIil7M30iKX0pLHMKfSxTPU4oIi8vIiwiJCIpLE09TigiL1xcKiIsIlxcKi8iKSxSPU4oIiMiLCIkIik7dmFyIGo9T2JqZWN0LmZyZWV6ZSh7Cl9fcHJvdG9fXzpudWxsLEFQT1NfU1RSSU5HX01PREU6dixCQUNLU0xBU0hfRVNDQVBFOk8sQklOQVJZX05VTUJFUl9NT0RFOnsKc2NvcGU6Im51bWJlciIsYmVnaW46XyxyZWxldmFuY2U6MH0sQklOQVJZX05VTUJFUl9SRTpfLENPTU1FTlQ6TiwKQ19CTE9DS19DT01NRU5UX01PREU6TSxDX0xJTkVfQ09NTUVOVF9NT0RFOlMsQ19OVU1CRVJfTU9ERTp7c2NvcGU6Im51bWJlciIsCmJlZ2luOnkscmVsZXZhbmNlOjB9LENfTlVNQkVSX1JFOnksRU5EX1NBTUVfQVNfQkVHSU46ZT0+T2JqZWN0LmFzc2lnbihlLHsKIm9uOmJlZ2luIjooZSx0KT0+e3QuZGF0YS5fYmVnaW5NYXRjaD1lWzFdfSwib246ZW5kIjooZSx0KT0+ewp0LmRhdGEuX2JlZ2luTWF0Y2ghPT1lWzFdJiZ0Lmlnbm9yZU1hdGNoKCl9fSksSEFTSF9DT01NRU5UX01PREU6UixJREVOVF9SRTpFLApNQVRDSF9OT1RISU5HX1JFOi9cYlxCLyxNRVRIT0RfR1VBUkQ6e2JlZ2luOiJcXC5cXHMqIit4LHJlbGV2YW5jZTowfSwKTlVNQkVSX01PREU6e3Njb3BlOiJudW1iZXIiLGJlZ2luOncscmVsZXZhbmNlOjB9LE5VTUJFUl9SRTp3LApQSFJBU0FMX1dPUkRTX01PREU6ewpiZWdpbjovXGIoYXxhbnx0aGV8YXJlfEknbXxpc24ndHxkb24ndHxkb2Vzbid0fHdvbid0fGJ1dHxqdXN0fHNob3VsZHxwcmV0dHl8c2ltcGx5fGVub3VnaHxnb25uYXxnb2luZ3x3dGZ8c298c3VjaHx3aWxsfHlvdXx5b3VyfHRoZXl8bGlrZXxtb3JlKVxiLwp9LFFVT1RFX1NUUklOR19NT0RFOmssUkVHRVhQX01PREU6e3Njb3BlOiJyZWdleHAiLGJlZ2luOi9cLyg/PVteL1xuXSpcLykvLAplbmQ6L1wvW2dpbXV5XSovLGNvbnRhaW5zOltPLHtiZWdpbjovXFsvLGVuZDovXF0vLHJlbGV2YW5jZTowLGNvbnRhaW5zOltPXX1dfSwKUkVfU1RBUlRFUlNfUkU6IiF8IT18IT09fCV8JT18JnwmJnwmPXxcXCp8XFwqPXxcXCt8XFwrPXwsfC18LT18Lz18L3w6fDt8PDx8PDw9fDw9fDx8PT09fD09fD18Pj4+PXw+Pj18Pj18Pj4+fD4+fD58XFw/fFxcW3xcXHt8XFwofFxcXnxcXF49fFxcfHxcXHw9fFxcfFxcfHx+IiwKU0hFQkFORzooZT17fSk9Pntjb25zdCB0PS9eIyFbIF0qXC8vCjtyZXR1cm4gZS5iaW5hcnkmJihlLmJlZ2luPWgodCwvLipcYi8sZS5iaW5hcnksL1xiLiovKSksaSh7c2NvcGU6Im1ldGEiLGJlZ2luOnQsCmVuZDovJC8scmVsZXZhbmNlOjAsIm9uOmJlZ2luIjooZSx0KT0+ezAhPT1lLmluZGV4JiZ0Lmlnbm9yZU1hdGNoKCl9fSxlKX0sClRJVExFX01PREU6e3Njb3BlOiJ0aXRsZSIsYmVnaW46RSxyZWxldmFuY2U6MH0sVU5ERVJTQ09SRV9JREVOVF9SRTp4LApVTkRFUlNDT1JFX1RJVExFX01PREU6e3Njb3BlOiJ0aXRsZSIsYmVnaW46eCxyZWxldmFuY2U6MH19KTtmdW5jdGlvbiBBKGUsdCl7CiIuIj09PWUuaW5wdXRbZS5pbmRleC0xXSYmdC5pZ25vcmVNYXRjaCgpfWZ1bmN0aW9uIEkoZSx0KXsKdm9pZCAwIT09ZS5jbGFzc05hbWUmJihlLnNjb3BlPWUuY2xhc3NOYW1lLGRlbGV0ZSBlLmNsYXNzTmFtZSl9ZnVuY3Rpb24gVChlLHQpewp0JiZlLmJlZ2luS2V5d29yZHMmJihlLmJlZ2luPSJcXGIoIitlLmJlZ2luS2V5d29yZHMuc3BsaXQoIiAiKS5qb2luKCJ8IikrIikoPyFcXC4pKD89XFxifFxccykiLAplLl9fYmVmb3JlQmVnaW49QSxlLmtleXdvcmRzPWUua2V5d29yZHN8fGUuYmVnaW5LZXl3b3JkcyxkZWxldGUgZS5iZWdpbktleXdvcmRzLAp2b2lkIDA9PT1lLnJlbGV2YW5jZSYmKGUucmVsZXZhbmNlPTApKX1mdW5jdGlvbiBMKGUsdCl7CkFycmF5LmlzQXJyYXkoZS5pbGxlZ2FsKSYmKGUuaWxsZWdhbD1mKC4uLmUuaWxsZWdhbCkpfWZ1bmN0aW9uIEIoZSx0KXsKaWYoZS5tYXRjaCl7CmlmKGUuYmVnaW58fGUuZW5kKXRocm93IEVycm9yKCJiZWdpbiAmIGVuZCBhcmUgbm90IHN1cHBvcnRlZCB3aXRoIG1hdGNoIikKO2UuYmVnaW49ZS5tYXRjaCxkZWxldGUgZS5tYXRjaH19ZnVuY3Rpb24gUChlLHQpewp2b2lkIDA9PT1lLnJlbGV2YW5jZSYmKGUucmVsZXZhbmNlPTEpfWNvbnN0IEQ9KGUsdCk9PntpZighZS5iZWZvcmVNYXRjaClyZXR1cm4KO2lmKGUuc3RhcnRzKXRocm93IEVycm9yKCJiZWZvcmVNYXRjaCBjYW5ub3QgYmUgdXNlZCB3aXRoIHN0YXJ0cyIpCjtjb25zdCBuPU9iamVjdC5hc3NpZ24oe30sZSk7T2JqZWN0LmtleXMoZSkuZm9yRWFjaCgodD0+e2RlbGV0ZSBlW3RdCn0pKSxlLmtleXdvcmRzPW4ua2V5d29yZHMsZS5iZWdpbj1oKG4uYmVmb3JlTWF0Y2gsZyhuLmJlZ2luKSksZS5zdGFydHM9ewpyZWxldmFuY2U6MCxjb250YWluczpbT2JqZWN0LmFzc2lnbihuLHtlbmRzUGFyZW50OiEwfSldCn0sZS5yZWxldmFuY2U9MCxkZWxldGUgbi5iZWZvcmVNYXRjaAp9LEg9WyJvZiIsImFuZCIsImZvciIsImluIiwibm90Iiwib3IiLCJpZiIsInRoZW4iLCJwYXJlbnQiLCJsaXN0IiwidmFsdWUiXSxDPSJrZXl3b3JkIgo7ZnVuY3Rpb24gJChlLHQsbj1DKXtjb25zdCBpPU9iamVjdC5jcmVhdGUobnVsbCkKO3JldHVybiJzdHJpbmciPT10eXBlb2YgZT9zKG4sZS5zcGxpdCgiICIpKTpBcnJheS5pc0FycmF5KGUpP3MobixlKTpPYmplY3Qua2V5cyhlKS5mb3JFYWNoKChuPT57Ck9iamVjdC5hc3NpZ24oaSwkKGVbbl0sdCxuKSl9KSksaTtmdW5jdGlvbiBzKGUsbil7CnQmJihuPW4ubWFwKChlPT5lLnRvTG93ZXJDYXNlKCkpKSksbi5mb3JFYWNoKCh0PT57Y29uc3Qgbj10LnNwbGl0KCJ8IikKO2lbblswXV09W2UsVShuWzBdLG5bMV0pXX0pKX19ZnVuY3Rpb24gVShlLHQpewpyZXR1cm4gdD9OdW1iZXIodCk6KGU9PkguaW5jbHVkZXMoZS50b0xvd2VyQ2FzZSgpKSkoZSk/MDoxfWNvbnN0IHo9e30sVz1lPT57CmNvbnNvbGUuZXJyb3IoZSl9LFg9KGUsLi4udCk9Pntjb25zb2xlLmxvZygiV0FSTjogIitlLC4uLnQpfSxHPShlLHQpPT57CnpbYCR7ZX0vJHt0fWBdfHwoY29uc29sZS5sb2coYERlcHJlY2F0ZWQgYXMgb2YgJHtlfS4gJHt0fWApLHpbYCR7ZX0vJHt0fWBdPSEwKQp9LEs9RXJyb3IoKTtmdW5jdGlvbiBGKGUsdCx7a2V5Om59KXtsZXQgaT0wO2NvbnN0IHM9ZVtuXSxvPXt9LHI9e30KO2ZvcihsZXQgZT0xO2U8PXQubGVuZ3RoO2UrKylyW2UraV09c1tlXSxvW2UraV09ITAsaSs9cCh0W2UtMV0pCjtlW25dPXIsZVtuXS5fZW1pdD1vLGVbbl0uX211bHRpPSEwfWZ1bmN0aW9uIFooZSl7KGU9PnsKZS5zY29wZSYmIm9iamVjdCI9PXR5cGVvZiBlLnNjb3BlJiZudWxsIT09ZS5zY29wZSYmKGUuYmVnaW5TY29wZT1lLnNjb3BlLApkZWxldGUgZS5zY29wZSl9KShlKSwic3RyaW5nIj09dHlwZW9mIGUuYmVnaW5TY29wZSYmKGUuYmVnaW5TY29wZT17Cl93cmFwOmUuYmVnaW5TY29wZX0pLCJzdHJpbmciPT10eXBlb2YgZS5lbmRTY29wZSYmKGUuZW5kU2NvcGU9e193cmFwOmUuZW5kU2NvcGUKfSksKGU9PntpZihBcnJheS5pc0FycmF5KGUuYmVnaW4pKXsKaWYoZS5za2lwfHxlLmV4Y2x1ZGVCZWdpbnx8ZS5yZXR1cm5CZWdpbil0aHJvdyBXKCJza2lwLCBleGNsdWRlQmVnaW4sIHJldHVybkJlZ2luIG5vdCBjb21wYXRpYmxlIHdpdGggYmVnaW5TY29wZToge30iKSwKSwo7aWYoIm9iamVjdCIhPXR5cGVvZiBlLmJlZ2luU2NvcGV8fG51bGw9PT1lLmJlZ2luU2NvcGUpdGhyb3cgVygiYmVnaW5TY29wZSBtdXN0IGJlIG9iamVjdCIpLApLO0YoZSxlLmJlZ2luLHtrZXk6ImJlZ2luU2NvcGUifSksZS5iZWdpbj1tKGUuYmVnaW4se2pvaW5XaXRoOiIifSl9fSkoZSksKGU9PnsKaWYoQXJyYXkuaXNBcnJheShlLmVuZCkpewppZihlLnNraXB8fGUuZXhjbHVkZUVuZHx8ZS5yZXR1cm5FbmQpdGhyb3cgVygic2tpcCwgZXhjbHVkZUVuZCwgcmV0dXJuRW5kIG5vdCBjb21wYXRpYmxlIHdpdGggZW5kU2NvcGU6IHt9IiksCksKO2lmKCJvYmplY3QiIT10eXBlb2YgZS5lbmRTY29wZXx8bnVsbD09PWUuZW5kU2NvcGUpdGhyb3cgVygiZW5kU2NvcGUgbXVzdCBiZSBvYmplY3QiKSwKSztGKGUsZS5lbmQse2tleToiZW5kU2NvcGUifSksZS5lbmQ9bShlLmVuZCx7am9pbldpdGg6IiJ9KX19KShlKX1mdW5jdGlvbiBWKGUpewpmdW5jdGlvbiB0KHQsbil7CnJldHVybiBSZWdFeHAobCh0KSwibSIrKGUuY2FzZV9pbnNlbnNpdGl2ZT8iaSI6IiIpKyhlLnVuaWNvZGVSZWdleD8idSI6IiIpKyhuPyJnIjoiIikpCn1jbGFzcyBue2NvbnN0cnVjdG9yKCl7CnRoaXMubWF0Y2hJbmRleGVzPXt9LHRoaXMucmVnZXhlcz1bXSx0aGlzLm1hdGNoQXQ9MSx0aGlzLnBvc2l0aW9uPTB9CmFkZFJ1bGUoZSx0KXsKdC5wb3NpdGlvbj10aGlzLnBvc2l0aW9uKyssdGhpcy5tYXRjaEluZGV4ZXNbdGhpcy5tYXRjaEF0XT10LHRoaXMucmVnZXhlcy5wdXNoKFt0LGVdKSwKdGhpcy5tYXRjaEF0Kz1wKGUpKzF9Y29tcGlsZSgpezA9PT10aGlzLnJlZ2V4ZXMubGVuZ3RoJiYodGhpcy5leGVjPSgpPT5udWxsKQo7Y29uc3QgZT10aGlzLnJlZ2V4ZXMubWFwKChlPT5lWzFdKSk7dGhpcy5tYXRjaGVyUmU9dChtKGUse2pvaW5XaXRoOiJ8Igp9KSwhMCksdGhpcy5sYXN0SW5kZXg9MH1leGVjKGUpe3RoaXMubWF0Y2hlclJlLmxhc3RJbmRleD10aGlzLmxhc3RJbmRleAo7Y29uc3QgdD10aGlzLm1hdGNoZXJSZS5leGVjKGUpO2lmKCF0KXJldHVybiBudWxsCjtjb25zdCBuPXQuZmluZEluZGV4KCgoZSx0KT0+dD4wJiZ2b2lkIDAhPT1lKSksaT10aGlzLm1hdGNoSW5kZXhlc1tuXQo7cmV0dXJuIHQuc3BsaWNlKDAsbiksT2JqZWN0LmFzc2lnbih0LGkpfX1jbGFzcyBze2NvbnN0cnVjdG9yKCl7CnRoaXMucnVsZXM9W10sdGhpcy5tdWx0aVJlZ2V4ZXM9W10sCnRoaXMuY291bnQ9MCx0aGlzLmxhc3RJbmRleD0wLHRoaXMucmVnZXhJbmRleD0wfWdldE1hdGNoZXIoZSl7CmlmKHRoaXMubXVsdGlSZWdleGVzW2VdKXJldHVybiB0aGlzLm11bHRpUmVnZXhlc1tlXTtjb25zdCB0PW5ldyBuCjtyZXR1cm4gdGhpcy5ydWxlcy5zbGljZShlKS5mb3JFYWNoKCgoW2Usbl0pPT50LmFkZFJ1bGUoZSxuKSkpLAp0LmNvbXBpbGUoKSx0aGlzLm11bHRpUmVnZXhlc1tlXT10LHR9cmVzdW1pbmdTY2FuQXRTYW1lUG9zaXRpb24oKXsKcmV0dXJuIDAhPT10aGlzLnJlZ2V4SW5kZXh9Y29uc2lkZXJBbGwoKXt0aGlzLnJlZ2V4SW5kZXg9MH1hZGRSdWxlKGUsdCl7CnRoaXMucnVsZXMucHVzaChbZSx0XSksImJlZ2luIj09PXQudHlwZSYmdGhpcy5jb3VudCsrfWV4ZWMoZSl7CmNvbnN0IHQ9dGhpcy5nZXRNYXRjaGVyKHRoaXMucmVnZXhJbmRleCk7dC5sYXN0SW5kZXg9dGhpcy5sYXN0SW5kZXgKO2xldCBuPXQuZXhlYyhlKQo7aWYodGhpcy5yZXN1bWluZ1NjYW5BdFNhbWVQb3NpdGlvbigpKWlmKG4mJm4uaW5kZXg9PT10aGlzLmxhc3RJbmRleCk7ZWxzZXsKY29uc3QgdD10aGlzLmdldE1hdGNoZXIoMCk7dC5sYXN0SW5kZXg9dGhpcy5sYXN0SW5kZXgrMSxuPXQuZXhlYyhlKX0KcmV0dXJuIG4mJih0aGlzLnJlZ2V4SW5kZXgrPW4ucG9zaXRpb24rMSwKdGhpcy5yZWdleEluZGV4PT09dGhpcy5jb3VudCYmdGhpcy5jb25zaWRlckFsbCgpKSxufX0KaWYoZS5jb21waWxlckV4dGVuc2lvbnN8fChlLmNvbXBpbGVyRXh0ZW5zaW9ucz1bXSksCmUuY29udGFpbnMmJmUuY29udGFpbnMuaW5jbHVkZXMoInNlbGYiKSl0aHJvdyBFcnJvcigiRVJSOiBjb250YWlucyBgc2VsZmAgaXMgbm90IHN1cHBvcnRlZCBhdCB0aGUgdG9wLWxldmVsIG9mIGEgbGFuZ3VhZ2UuICBTZWUgZG9jdW1lbnRhdGlvbi4iKQo7cmV0dXJuIGUuY2xhc3NOYW1lQWxpYXNlcz1pKGUuY2xhc3NOYW1lQWxpYXNlc3x8e30pLGZ1bmN0aW9uIG4obyxyKXtjb25zdCBhPW8KO2lmKG8uaXNDb21waWxlZClyZXR1cm4gYQo7W0ksQixaLERdLmZvckVhY2goKGU9PmUobyxyKSkpLGUuY29tcGlsZXJFeHRlbnNpb25zLmZvckVhY2goKGU9PmUobyxyKSkpLApvLl9fYmVmb3JlQmVnaW49bnVsbCxbVCxMLFBdLmZvckVhY2goKGU9PmUobyxyKSkpLG8uaXNDb21waWxlZD0hMDtsZXQgYz1udWxsCjtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIG8ua2V5d29yZHMmJm8ua2V5d29yZHMuJHBhdHRlcm4mJihvLmtleXdvcmRzPU9iamVjdC5hc3NpZ24oe30sby5rZXl3b3JkcyksCmM9by5rZXl3b3Jkcy4kcGF0dGVybiwKZGVsZXRlIG8ua2V5d29yZHMuJHBhdHRlcm4pLGM9Y3x8L1x3Ky8sby5rZXl3b3JkcyYmKG8ua2V5d29yZHM9JChvLmtleXdvcmRzLGUuY2FzZV9pbnNlbnNpdGl2ZSkpLAphLmtleXdvcmRQYXR0ZXJuUmU9dChjLCEwKSwKciYmKG8uYmVnaW58fChvLmJlZ2luPS9cQnxcYi8pLGEuYmVnaW5SZT10KGEuYmVnaW4pLG8uZW5kfHxvLmVuZHNXaXRoUGFyZW50fHwoby5lbmQ9L1xCfFxiLyksCm8uZW5kJiYoYS5lbmRSZT10KGEuZW5kKSksCmEudGVybWluYXRvckVuZD1sKGEuZW5kKXx8IiIsby5lbmRzV2l0aFBhcmVudCYmci50ZXJtaW5hdG9yRW5kJiYoYS50ZXJtaW5hdG9yRW5kKz0oby5lbmQ/InwiOiIiKStyLnRlcm1pbmF0b3JFbmQpKSwKby5pbGxlZ2FsJiYoYS5pbGxlZ2FsUmU9dChvLmlsbGVnYWwpKSwKby5jb250YWluc3x8KG8uY29udGFpbnM9W10pLG8uY29udGFpbnM9W10uY29uY2F0KC4uLm8uY29udGFpbnMubWFwKChlPT4oZT0+KGUudmFyaWFudHMmJiFlLmNhY2hlZFZhcmlhbnRzJiYoZS5jYWNoZWRWYXJpYW50cz1lLnZhcmlhbnRzLm1hcCgodD0+aShlLHsKdmFyaWFudHM6bnVsbH0sdCkpKSksZS5jYWNoZWRWYXJpYW50cz9lLmNhY2hlZFZhcmlhbnRzOnEoZSk/aShlLHsKc3RhcnRzOmUuc3RhcnRzP2koZS5zdGFydHMpOm51bGwKfSk6T2JqZWN0LmlzRnJvemVuKGUpP2koZSk6ZSkpKCJzZWxmIj09PWU/bzplKSkpKSxvLmNvbnRhaW5zLmZvckVhY2goKGU9PntuKGUsYSkKfSkpLG8uc3RhcnRzJiZuKG8uc3RhcnRzLHIpLGEubWF0Y2hlcj0oZT0+e2NvbnN0IHQ9bmV3IHMKO3JldHVybiBlLmNvbnRhaW5zLmZvckVhY2goKGU9PnQuYWRkUnVsZShlLmJlZ2luLHtydWxlOmUsdHlwZToiYmVnaW4iCn0pKSksZS50ZXJtaW5hdG9yRW5kJiZ0LmFkZFJ1bGUoZS50ZXJtaW5hdG9yRW5kLHt0eXBlOiJlbmQiCn0pLGUuaWxsZWdhbCYmdC5hZGRSdWxlKGUuaWxsZWdhbCx7dHlwZToiaWxsZWdhbCJ9KSx0fSkoYSksYX0oZSl9ZnVuY3Rpb24gcShlKXsKcmV0dXJuISFlJiYoZS5lbmRzV2l0aFBhcmVudHx8cShlLnN0YXJ0cykpfWNsYXNzIEogZXh0ZW5kcyBFcnJvcnsKY29uc3RydWN0b3IoZSx0KXtzdXBlcihlKSx0aGlzLm5hbWU9IkhUTUxJbmplY3Rpb25FcnJvciIsdGhpcy5odG1sPXR9fQpjb25zdCBZPW4sUT1pLGVlPVN5bWJvbCgibm9tYXRjaCIpLHRlPW49PnsKY29uc3QgaT1PYmplY3QuY3JlYXRlKG51bGwpLHM9T2JqZWN0LmNyZWF0ZShudWxsKSxvPVtdO2xldCByPSEwCjtjb25zdCBhPSJDb3VsZCBub3QgZmluZCB0aGUgbGFuZ3VhZ2UgJ3t9JywgZGlkIHlvdSBmb3JnZXQgdG8gbG9hZC9pbmNsdWRlIGEgbGFuZ3VhZ2UgbW9kdWxlPyIsbD17CmRpc2FibGVBdXRvZGV0ZWN0OiEwLG5hbWU6IlBsYWluIHRleHQiLGNvbnRhaW5zOltdfTtsZXQgcD17Cmlnbm9yZVVuZXNjYXBlZEhUTUw6ITEsdGhyb3dVbmVzY2FwZWRIVE1MOiExLG5vSGlnaGxpZ2h0UmU6L14obm8tP2hpZ2hsaWdodCkkL2ksCmxhbmd1YWdlRGV0ZWN0UmU6L1xibGFuZyg/OnVhZ2UpPy0oW1x3LV0rKVxiL2ksY2xhc3NQcmVmaXg6ImhsanMtIiwKY3NzU2VsZWN0b3I6InByZSBjb2RlIixsYW5ndWFnZXM6bnVsbCxfX2VtaXR0ZXI6Y307ZnVuY3Rpb24gYihlKXsKcmV0dXJuIHAubm9IaWdobGlnaHRSZS50ZXN0KGUpfWZ1bmN0aW9uIG0oZSx0LG4pe2xldCBpPSIiLHM9IiIKOyJvYmplY3QiPT10eXBlb2YgdD8oaT1lLApuPXQuaWdub3JlSWxsZWdhbHMscz10Lmxhbmd1YWdlKTooRygiMTAuNy4wIiwiaGlnaGxpZ2h0KGxhbmcsIGNvZGUsIC4uLmFyZ3MpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIiksCkcoIjEwLjcuMCIsIlBsZWFzZSB1c2UgaGlnaGxpZ2h0KGNvZGUsIG9wdGlvbnMpIGluc3RlYWQuXG5odHRwczovL2dpdGh1Yi5jb20vaGlnaGxpZ2h0anMvaGlnaGxpZ2h0LmpzL2lzc3Vlcy8yMjc3IiksCnM9ZSxpPXQpLHZvaWQgMD09PW4mJihuPSEwKTtjb25zdCBvPXtjb2RlOmksbGFuZ3VhZ2U6c307TigiYmVmb3JlOmhpZ2hsaWdodCIsbykKO2NvbnN0IHI9by5yZXN1bHQ/by5yZXN1bHQ6RShvLmxhbmd1YWdlLG8uY29kZSxuKQo7cmV0dXJuIHIuY29kZT1vLmNvZGUsTigiYWZ0ZXI6aGlnaGxpZ2h0IixyKSxyfWZ1bmN0aW9uIEUoZSxuLHMsbyl7CmNvbnN0IGM9T2JqZWN0LmNyZWF0ZShudWxsKTtmdW5jdGlvbiBsKCl7aWYoIU4ua2V5d29yZHMpcmV0dXJuIHZvaWQgTS5hZGRUZXh0KFIpCjtsZXQgZT0wO04ua2V5d29yZFBhdHRlcm5SZS5sYXN0SW5kZXg9MDtsZXQgdD1OLmtleXdvcmRQYXR0ZXJuUmUuZXhlYyhSKSxuPSIiCjtmb3IoO3Q7KXtuKz1SLnN1YnN0cmluZyhlLHQuaW5kZXgpCjtjb25zdCBzPV8uY2FzZV9pbnNlbnNpdGl2ZT90WzBdLnRvTG93ZXJDYXNlKCk6dFswXSxvPShpPXMsTi5rZXl3b3Jkc1tpXSk7aWYobyl7CmNvbnN0W2UsaV09bwo7aWYoTS5hZGRUZXh0KG4pLG49IiIsY1tzXT0oY1tzXXx8MCkrMSxjW3NdPD03JiYoais9aSksZS5zdGFydHNXaXRoKCJfIikpbis9dFswXTtlbHNlewpjb25zdCBuPV8uY2xhc3NOYW1lQWxpYXNlc1tlXXx8ZTt1KHRbMF0sbil9fWVsc2Ugbis9dFswXQo7ZT1OLmtleXdvcmRQYXR0ZXJuUmUubGFzdEluZGV4LHQ9Ti5rZXl3b3JkUGF0dGVyblJlLmV4ZWMoUil9dmFyIGkKO24rPVIuc3Vic3RyaW5nKGUpLE0uYWRkVGV4dChuKX1mdW5jdGlvbiBnKCl7bnVsbCE9Ti5zdWJMYW5ndWFnZT8oKCk9PnsKaWYoIiI9PT1SKXJldHVybjtsZXQgZT1udWxsO2lmKCJzdHJpbmciPT10eXBlb2YgTi5zdWJMYW5ndWFnZSl7CmlmKCFpW04uc3ViTGFuZ3VhZ2VdKXJldHVybiB2b2lkIE0uYWRkVGV4dChSKQo7ZT1FKE4uc3ViTGFuZ3VhZ2UsUiwhMCxTW04uc3ViTGFuZ3VhZ2VdKSxTW04uc3ViTGFuZ3VhZ2VdPWUuX3RvcAp9ZWxzZSBlPXgoUixOLnN1Ykxhbmd1YWdlLmxlbmd0aD9OLnN1Ykxhbmd1YWdlOm51bGwpCjtOLnJlbGV2YW5jZT4wJiYoais9ZS5yZWxldmFuY2UpLE0uX19hZGRTdWJsYW5ndWFnZShlLl9lbWl0dGVyLGUubGFuZ3VhZ2UpCn0pKCk6bCgpLFI9IiJ9ZnVuY3Rpb24gdShlLHQpewoiIiE9PWUmJihNLnN0YXJ0U2NvcGUodCksTS5hZGRUZXh0KGUpLE0uZW5kU2NvcGUoKSl9ZnVuY3Rpb24gZChlLHQpe2xldCBuPTEKO2NvbnN0IGk9dC5sZW5ndGgtMTtmb3IoO248PWk7KXtpZighZS5fZW1pdFtuXSl7bisrO2NvbnRpbnVlfQpjb25zdCBpPV8uY2xhc3NOYW1lQWxpYXNlc1tlW25dXXx8ZVtuXSxzPXRbbl07aT91KHMsaSk6KFI9cyxsKCksUj0iIiksbisrfX0KZnVuY3Rpb24gaChlLHQpewpyZXR1cm4gZS5zY29wZSYmInN0cmluZyI9PXR5cGVvZiBlLnNjb3BlJiZNLm9wZW5Ob2RlKF8uY2xhc3NOYW1lQWxpYXNlc1tlLnNjb3BlXXx8ZS5zY29wZSksCmUuYmVnaW5TY29wZSYmKGUuYmVnaW5TY29wZS5fd3JhcD8odShSLF8uY2xhc3NOYW1lQWxpYXNlc1tlLmJlZ2luU2NvcGUuX3dyYXBdfHxlLmJlZ2luU2NvcGUuX3dyYXApLApSPSIiKTplLmJlZ2luU2NvcGUuX211bHRpJiYoZChlLmJlZ2luU2NvcGUsdCksUj0iIikpLE49T2JqZWN0LmNyZWF0ZShlLHtwYXJlbnQ6ewp2YWx1ZTpOfX0pLE59ZnVuY3Rpb24gZihlLG4saSl7bGV0IHM9KChlLHQpPT57Y29uc3Qgbj1lJiZlLmV4ZWModCkKO3JldHVybiBuJiYwPT09bi5pbmRleH0pKGUuZW5kUmUsaSk7aWYocyl7aWYoZVsib246ZW5kIl0pe2NvbnN0IGk9bmV3IHQoZSkKO2VbIm9uOmVuZCJdKG4saSksaS5pc01hdGNoSWdub3JlZCYmKHM9ITEpfWlmKHMpewpmb3IoO2UuZW5kc1BhcmVudCYmZS5wYXJlbnQ7KWU9ZS5wYXJlbnQ7cmV0dXJuIGV9fQppZihlLmVuZHNXaXRoUGFyZW50KXJldHVybiBmKGUucGFyZW50LG4saSl9ZnVuY3Rpb24gYihlKXsKcmV0dXJuIDA9PT1OLm1hdGNoZXIucmVnZXhJbmRleD8oUis9ZVswXSwxKTooVD0hMCwwKX1mdW5jdGlvbiBtKGUpewpjb25zdCB0PWVbMF0saT1uLnN1YnN0cmluZyhlLmluZGV4KSxzPWYoTixlLGkpO2lmKCFzKXJldHVybiBlZTtjb25zdCBvPU4KO04uZW5kU2NvcGUmJk4uZW5kU2NvcGUuX3dyYXA/KGcoKSwKdSh0LE4uZW5kU2NvcGUuX3dyYXApKTpOLmVuZFNjb3BlJiZOLmVuZFNjb3BlLl9tdWx0aT8oZygpLApkKE4uZW5kU2NvcGUsZSkpOm8uc2tpcD9SKz10OihvLnJldHVybkVuZHx8by5leGNsdWRlRW5kfHwoUis9dCksCmcoKSxvLmV4Y2x1ZGVFbmQmJihSPXQpKTtkb3sKTi5zY29wZSYmTS5jbG9zZU5vZGUoKSxOLnNraXB8fE4uc3ViTGFuZ3VhZ2V8fChqKz1OLnJlbGV2YW5jZSksTj1OLnBhcmVudAp9d2hpbGUoTiE9PXMucGFyZW50KTtyZXR1cm4gcy5zdGFydHMmJmgocy5zdGFydHMsZSksby5yZXR1cm5FbmQ/MDp0Lmxlbmd0aH0KbGV0IHc9e307ZnVuY3Rpb24geShpLG8pe2NvbnN0IGE9byYmb1swXTtpZihSKz1pLG51bGw9PWEpcmV0dXJuIGcoKSwwCjtpZigiYmVnaW4iPT09dy50eXBlJiYiZW5kIj09PW8udHlwZSYmdy5pbmRleD09PW8uaW5kZXgmJiIiPT09YSl7CmlmKFIrPW4uc2xpY2Uoby5pbmRleCxvLmluZGV4KzEpLCFyKXtjb25zdCB0PUVycm9yKGAwIHdpZHRoIG1hdGNoIHJlZ2V4ICgke2V9KWApCjt0aHJvdyB0Lmxhbmd1YWdlTmFtZT1lLHQuYmFkUnVsZT13LnJ1bGUsdH1yZXR1cm4gMX0KaWYodz1vLCJiZWdpbiI9PT1vLnR5cGUpcmV0dXJuKGU9PnsKY29uc3Qgbj1lWzBdLGk9ZS5ydWxlLHM9bmV3IHQoaSksbz1baS5fX2JlZm9yZUJlZ2luLGlbIm9uOmJlZ2luIl1dCjtmb3IoY29uc3QgdCBvZiBvKWlmKHQmJih0KGUscykscy5pc01hdGNoSWdub3JlZCkpcmV0dXJuIGIobikKO3JldHVybiBpLnNraXA/Uis9bjooaS5leGNsdWRlQmVnaW4mJihSKz1uKSwKZygpLGkucmV0dXJuQmVnaW58fGkuZXhjbHVkZUJlZ2lufHwoUj1uKSksaChpLGUpLGkucmV0dXJuQmVnaW4/MDpuLmxlbmd0aH0pKG8pCjtpZigiaWxsZWdhbCI9PT1vLnR5cGUmJiFzKXsKY29uc3QgZT1FcnJvcignSWxsZWdhbCBsZXhlbWUgIicrYSsnIiBmb3IgbW9kZSAiJysoTi5zY29wZXx8Ijx1bm5hbWVkPiIpKyciJykKO3Rocm93IGUubW9kZT1OLGV9aWYoImVuZCI9PT1vLnR5cGUpe2NvbnN0IGU9bShvKTtpZihlIT09ZWUpcmV0dXJuIGV9CmlmKCJpbGxlZ2FsIj09PW8udHlwZSYmIiI9PT1hKXJldHVybiAxCjtpZihJPjFlNSYmST4zKm8uaW5kZXgpdGhyb3cgRXJyb3IoInBvdGVudGlhbCBpbmZpbml0ZSBsb29wLCB3YXkgbW9yZSBpdGVyYXRpb25zIHRoYW4gbWF0Y2hlcyIpCjtyZXR1cm4gUis9YSxhLmxlbmd0aH1jb25zdCBfPU8oZSkKO2lmKCFfKXRocm93IFcoYS5yZXBsYWNlKCJ7fSIsZSkpLEVycm9yKCdVbmtub3duIGxhbmd1YWdlOiAiJytlKyciJykKO2NvbnN0IHY9VihfKTtsZXQgaz0iIixOPW98fHY7Y29uc3QgUz17fSxNPW5ldyBwLl9fZW1pdHRlcihwKTsoKCk9Pntjb25zdCBlPVtdCjtmb3IobGV0IHQ9Tjt0IT09Xzt0PXQucGFyZW50KXQuc2NvcGUmJmUudW5zaGlmdCh0LnNjb3BlKQo7ZS5mb3JFYWNoKChlPT5NLm9wZW5Ob2RlKGUpKSl9KSgpO2xldCBSPSIiLGo9MCxBPTAsST0wLFQ9ITE7dHJ5ewppZihfLl9fZW1pdFRva2VucylfLl9fZW1pdFRva2VucyhuLE0pO2Vsc2V7Zm9yKE4ubWF0Y2hlci5jb25zaWRlckFsbCgpOzspewpJKyssVD9UPSExOk4ubWF0Y2hlci5jb25zaWRlckFsbCgpLE4ubWF0Y2hlci5sYXN0SW5kZXg9QQo7Y29uc3QgZT1OLm1hdGNoZXIuZXhlYyhuKTtpZighZSlicmVhaztjb25zdCB0PXkobi5zdWJzdHJpbmcoQSxlLmluZGV4KSxlKQo7QT1lLmluZGV4K3R9eShuLnN1YnN0cmluZyhBKSl9cmV0dXJuIE0uZmluYWxpemUoKSxrPU0udG9IVE1MKCkse2xhbmd1YWdlOmUsCnZhbHVlOmsscmVsZXZhbmNlOmosaWxsZWdhbDohMSxfZW1pdHRlcjpNLF90b3A6Tn19Y2F0Y2godCl7CmlmKHQubWVzc2FnZSYmdC5tZXNzYWdlLmluY2x1ZGVzKCJJbGxlZ2FsIikpcmV0dXJue2xhbmd1YWdlOmUsdmFsdWU6WShuKSwKaWxsZWdhbDohMCxyZWxldmFuY2U6MCxfaWxsZWdhbEJ5OnttZXNzYWdlOnQubWVzc2FnZSxpbmRleDpBLApjb250ZXh0Om4uc2xpY2UoQS0xMDAsQSsxMDApLG1vZGU6dC5tb2RlLHJlc3VsdFNvRmFyOmt9LF9lbWl0dGVyOk19O2lmKHIpcmV0dXJuewpsYW5ndWFnZTplLHZhbHVlOlkobiksaWxsZWdhbDohMSxyZWxldmFuY2U6MCxlcnJvclJhaXNlZDp0LF9lbWl0dGVyOk0sX3RvcDpOfQo7dGhyb3cgdH19ZnVuY3Rpb24geChlLHQpe3Q9dHx8cC5sYW5ndWFnZXN8fE9iamVjdC5rZXlzKGkpO2NvbnN0IG49KGU9PnsKY29uc3QgdD17dmFsdWU6WShlKSxpbGxlZ2FsOiExLHJlbGV2YW5jZTowLF90b3A6bCxfZW1pdHRlcjpuZXcgcC5fX2VtaXR0ZXIocCl9CjtyZXR1cm4gdC5fZW1pdHRlci5hZGRUZXh0KGUpLHR9KShlKSxzPXQuZmlsdGVyKE8pLmZpbHRlcihrKS5tYXAoKHQ9PkUodCxlLCExKSkpCjtzLnVuc2hpZnQobik7Y29uc3Qgbz1zLnNvcnQoKChlLHQpPT57CmlmKGUucmVsZXZhbmNlIT09dC5yZWxldmFuY2UpcmV0dXJuIHQucmVsZXZhbmNlLWUucmVsZXZhbmNlCjtpZihlLmxhbmd1YWdlJiZ0Lmxhbmd1YWdlKXtpZihPKGUubGFuZ3VhZ2UpLnN1cGVyc2V0T2Y9PT10Lmxhbmd1YWdlKXJldHVybiAxCjtpZihPKHQubGFuZ3VhZ2UpLnN1cGVyc2V0T2Y9PT1lLmxhbmd1YWdlKXJldHVybi0xfXJldHVybiAwfSkpLFtyLGFdPW8sYz1yCjtyZXR1cm4gYy5zZWNvbmRCZXN0PWEsY31mdW5jdGlvbiB3KGUpe2xldCB0PW51bGw7Y29uc3Qgbj0oZT0+ewpsZXQgdD1lLmNsYXNzTmFtZSsiICI7dCs9ZS5wYXJlbnROb2RlP2UucGFyZW50Tm9kZS5jbGFzc05hbWU6IiIKO2NvbnN0IG49cC5sYW5ndWFnZURldGVjdFJlLmV4ZWModCk7aWYobil7Y29uc3QgdD1PKG5bMV0pCjtyZXR1cm4gdHx8KFgoYS5yZXBsYWNlKCJ7fSIsblsxXSkpLApYKCJGYWxsaW5nIGJhY2sgdG8gbm8taGlnaGxpZ2h0IG1vZGUgZm9yIHRoaXMgYmxvY2suIixlKSksdD9uWzFdOiJuby1oaWdobGlnaHQifQpyZXR1cm4gdC5zcGxpdCgvXHMrLykuZmluZCgoZT0+YihlKXx8TyhlKSkpfSkoZSk7aWYoYihuKSlyZXR1cm4KO2lmKE4oImJlZm9yZTpoaWdobGlnaHRFbGVtZW50Iix7ZWw6ZSxsYW5ndWFnZTpuCn0pLGUuZGF0YXNldC5oaWdobGlnaHRlZClyZXR1cm4gdm9pZCBjb25zb2xlLmxvZygiRWxlbWVudCBwcmV2aW91c2x5IGhpZ2hsaWdodGVkLiBUbyBoaWdobGlnaHQgYWdhaW4sIGZpcnN0IHVuc2V0IGBkYXRhc2V0LmhpZ2hsaWdodGVkYC4iLGUpCjtpZihlLmNoaWxkcmVuLmxlbmd0aD4wJiYocC5pZ25vcmVVbmVzY2FwZWRIVE1MfHwoY29uc29sZS53YXJuKCJPbmUgb2YgeW91ciBjb2RlIGJsb2NrcyBpbmNsdWRlcyB1bmVzY2FwZWQgSFRNTC4gVGhpcyBpcyBhIHBvdGVudGlhbGx5IHNlcmlvdXMgc2VjdXJpdHkgcmlzay4iKSwKY29uc29sZS53YXJuKCJodHRwczovL2dpdGh1Yi5jb20vaGlnaGxpZ2h0anMvaGlnaGxpZ2h0LmpzL3dpa2kvc2VjdXJpdHkiKSwKY29uc29sZS53YXJuKCJUaGUgZWxlbWVudCB3aXRoIHVuZXNjYXBlZCBIVE1MOiIpLApjb25zb2xlLndhcm4oZSkpLHAudGhyb3dVbmVzY2FwZWRIVE1MKSl0aHJvdyBuZXcgSigiT25lIG9mIHlvdXIgY29kZSBibG9ja3MgaW5jbHVkZXMgdW5lc2NhcGVkIEhUTUwuIixlLmlubmVySFRNTCkKO3Q9ZTtjb25zdCBpPXQudGV4dENvbnRlbnQsbz1uP20oaSx7bGFuZ3VhZ2U6bixpZ25vcmVJbGxlZ2FsczohMH0pOngoaSkKO2UuaW5uZXJIVE1MPW8udmFsdWUsZS5kYXRhc2V0LmhpZ2hsaWdodGVkPSJ5ZXMiLCgoZSx0LG4pPT57Y29uc3QgaT10JiZzW3RdfHxuCjtlLmNsYXNzTGlzdC5hZGQoImhsanMiKSxlLmNsYXNzTGlzdC5hZGQoImxhbmd1YWdlLSIraSkKfSkoZSxuLG8ubGFuZ3VhZ2UpLGUucmVzdWx0PXtsYW5ndWFnZTpvLmxhbmd1YWdlLHJlOm8ucmVsZXZhbmNlLApyZWxldmFuY2U6by5yZWxldmFuY2V9LG8uc2Vjb25kQmVzdCYmKGUuc2Vjb25kQmVzdD17Cmxhbmd1YWdlOm8uc2Vjb25kQmVzdC5sYW5ndWFnZSxyZWxldmFuY2U6by5zZWNvbmRCZXN0LnJlbGV2YW5jZQp9KSxOKCJhZnRlcjpoaWdobGlnaHRFbGVtZW50Iix7ZWw6ZSxyZXN1bHQ6byx0ZXh0Oml9KX1sZXQgeT0hMTtmdW5jdGlvbiBfKCl7CiJsb2FkaW5nIiE9PWRvY3VtZW50LnJlYWR5U3RhdGU/ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChwLmNzc1NlbGVjdG9yKS5mb3JFYWNoKHcpOnk9ITAKfWZ1bmN0aW9uIE8oZSl7cmV0dXJuIGU9KGV8fCIiKS50b0xvd2VyQ2FzZSgpLGlbZV18fGlbc1tlXV19CmZ1bmN0aW9uIHYoZSx7bGFuZ3VhZ2VOYW1lOnR9KXsic3RyaW5nIj09dHlwZW9mIGUmJihlPVtlXSksZS5mb3JFYWNoKChlPT57CnNbZS50b0xvd2VyQ2FzZSgpXT10fSkpfWZ1bmN0aW9uIGsoZSl7Y29uc3QgdD1PKGUpCjtyZXR1cm4gdCYmIXQuZGlzYWJsZUF1dG9kZXRlY3R9ZnVuY3Rpb24gTihlLHQpe2NvbnN0IG49ZTtvLmZvckVhY2goKGU9PnsKZVtuXSYmZVtuXSh0KX0pKX0KInVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cmJndpbmRvdy5hZGRFdmVudExpc3RlbmVyJiZ3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsKCgpPT57CnkmJl8oKX0pLCExKSxPYmplY3QuYXNzaWduKG4se2hpZ2hsaWdodDptLGhpZ2hsaWdodEF1dG86eCxoaWdobGlnaHRBbGw6XywKaGlnaGxpZ2h0RWxlbWVudDp3LApoaWdobGlnaHRCbG9jazplPT4oRygiMTAuNy4wIiwiaGlnaGxpZ2h0QmxvY2sgd2lsbCBiZSByZW1vdmVkIGVudGlyZWx5IGluIHYxMi4wIiksCkcoIjEwLjcuMCIsIlBsZWFzZSB1c2UgaGlnaGxpZ2h0RWxlbWVudCBub3cuIiksdyhlKSksY29uZmlndXJlOmU9PntwPVEocCxlKX0sCmluaXRIaWdobGlnaHRpbmc6KCk9PnsKXygpLEcoIjEwLjYuMCIsImluaXRIaWdobGlnaHRpbmcoKSBkZXByZWNhdGVkLiAgVXNlIGhpZ2hsaWdodEFsbCgpIG5vdy4iKX0sCmluaXRIaWdobGlnaHRpbmdPbkxvYWQ6KCk9PnsKXygpLEcoIjEwLjYuMCIsImluaXRIaWdobGlnaHRpbmdPbkxvYWQoKSBkZXByZWNhdGVkLiAgVXNlIGhpZ2hsaWdodEFsbCgpIG5vdy4iKQp9LHJlZ2lzdGVyTGFuZ3VhZ2U6KGUsdCk9PntsZXQgcz1udWxsO3RyeXtzPXQobil9Y2F0Y2godCl7CmlmKFcoIkxhbmd1YWdlIGRlZmluaXRpb24gZm9yICd7fScgY291bGQgbm90IGJlIHJlZ2lzdGVyZWQuIi5yZXBsYWNlKCJ7fSIsZSkpLAohcil0aHJvdyB0O1codCkscz1sfQpzLm5hbWV8fChzLm5hbWU9ZSksaVtlXT1zLHMucmF3RGVmaW5pdGlvbj10LmJpbmQobnVsbCxuKSxzLmFsaWFzZXMmJnYocy5hbGlhc2VzLHsKbGFuZ3VhZ2VOYW1lOmV9KX0sdW5yZWdpc3Rlckxhbmd1YWdlOmU9PntkZWxldGUgaVtlXQo7Zm9yKGNvbnN0IHQgb2YgT2JqZWN0LmtleXMocykpc1t0XT09PWUmJmRlbGV0ZSBzW3RdfSwKbGlzdExhbmd1YWdlczooKT0+T2JqZWN0LmtleXMoaSksZ2V0TGFuZ3VhZ2U6TyxyZWdpc3RlckFsaWFzZXM6diwKYXV0b0RldGVjdGlvbjprLGluaGVyaXQ6USxhZGRQbHVnaW46ZT0+eyhlPT57CmVbImJlZm9yZTpoaWdobGlnaHRCbG9jayJdJiYhZVsiYmVmb3JlOmhpZ2hsaWdodEVsZW1lbnQiXSYmKGVbImJlZm9yZTpoaWdobGlnaHRFbGVtZW50Il09dD0+ewplWyJiZWZvcmU6aGlnaGxpZ2h0QmxvY2siXShPYmplY3QuYXNzaWduKHtibG9jazp0LmVsfSx0KSkKfSksZVsiYWZ0ZXI6aGlnaGxpZ2h0QmxvY2siXSYmIWVbImFmdGVyOmhpZ2hsaWdodEVsZW1lbnQiXSYmKGVbImFmdGVyOmhpZ2hsaWdodEVsZW1lbnQiXT10PT57CmVbImFmdGVyOmhpZ2hsaWdodEJsb2NrIl0oT2JqZWN0LmFzc2lnbih7YmxvY2s6dC5lbH0sdCkpfSl9KShlKSxvLnB1c2goZSl9LApyZW1vdmVQbHVnaW46ZT0+e2NvbnN0IHQ9by5pbmRleE9mKGUpOy0xIT09dCYmby5zcGxpY2UodCwxKX19KSxuLmRlYnVnTW9kZT0oKT0+ewpyPSExfSxuLnNhZmVNb2RlPSgpPT57cj0hMH0sbi52ZXJzaW9uU3RyaW5nPSIxMS45LjAiLG4ucmVnZXg9e2NvbmNhdDpoLApsb29rYWhlYWQ6ZyxlaXRoZXI6ZixvcHRpb25hbDpkLGFueU51bWJlck9mVGltZXM6dX0KO2Zvcihjb25zdCB0IGluIGopIm9iamVjdCI9PXR5cGVvZiBqW3RdJiZlKGpbdF0pO3JldHVybiBPYmplY3QuYXNzaWduKG4saiksbgp9LG5lPXRlKHt9KTtyZXR1cm4gbmUubmV3SW5zdGFuY2U9KCk9PnRlKHt9KSxuZX0oKQo7Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzJiYidW5kZWZpbmVkIiE9dHlwZW9mIG1vZHVsZSYmKG1vZHVsZS5leHBvcnRzPWhsanMpOy8qISBgY3BwYCBncmFtbWFyIGNvbXBpbGVkIGZvciBIaWdobGlnaHQuanMgMTEuOS4wICovCigoKT0+e3ZhciBlPSgoKT0+eyJ1c2Ugc3RyaWN0IjtyZXR1cm4gZT0+e2NvbnN0IHQ9ZS5yZWdleCxhPWUuQ09NTUVOVCgiLy8iLCIkIix7CmNvbnRhaW5zOlt7YmVnaW46L1xcXG4vfV0KfSksbj0iZGVjbHR5cGVcXChhdXRvXFwpIixyPSJbYS16QS1aX11cXHcqOjoiLGk9Iig/IXN0cnVjdCkoIituKyJ8Iit0Lm9wdGlvbmFsKHIpKyJbYS16QS1aX11cXHcqIit0Lm9wdGlvbmFsKCI8W148Pl0rPiIpKyIpIixzPXsKY2xhc3NOYW1lOiJ0eXBlIixiZWdpbjoiXFxiW2EtelxcZF9dKl90XFxiIn0sYz17Y2xhc3NOYW1lOiJzdHJpbmciLHZhcmlhbnRzOlt7CmJlZ2luOicodTg/fFV8TCk/IicsZW5kOiciJyxpbGxlZ2FsOiJcXG4iLGNvbnRhaW5zOltlLkJBQ0tTTEFTSF9FU0NBUEVdfSx7CmJlZ2luOiIodTg/fFV8TCk/JyhcXFxcKHhbMC05QS1GYS1mXXsyfXx1WzAtOUEtRmEtZl17NCw4fXxbMC03XXszfXxcXFMpfC4pIiwKZW5kOiInIixpbGxlZ2FsOiIuIn0sZS5FTkRfU0FNRV9BU19CRUdJTih7CmJlZ2luOi8oPzp1OD98VXxMKT9SIihbXigpXFwgXXswLDE2fSlcKC8sZW5kOi9cKShbXigpXFwgXXswLDE2fSkiL30pXX0sbz17CmNsYXNzTmFtZToibnVtYmVyIix2YXJpYW50czpbewpiZWdpbjoiWystXT8oPzooPzpbMC05XSg/Oic/WzAtOV0pKlxcLig/OlswLTldKD86Jz9bMC05XSkqKT98XFwuWzAtOV0oPzonP1swLTldKSopKD86W0VlXVsrLV0/WzAtOV0oPzonP1swLTldKSopP3xbMC05XSg/Oic/WzAtOV0pKltFZV1bKy1dP1swLTldKD86Jz9bMC05XSkqfDBbWHhdKD86WzAtOUEtRmEtZl0oPzonP1swLTlBLUZhLWZdKSooPzpcXC4oPzpbMC05QS1GYS1mXSg/Oic/WzAtOUEtRmEtZl0pKik/KT98XFwuWzAtOUEtRmEtZl0oPzonP1swLTlBLUZhLWZdKSopW1BwXVsrLV0/WzAtOV0oPzonP1swLTldKSopKD86W0ZmXSg/OjE2fDMyfDY0fDEyOCk/fChCRnxiZikxNnxbTGxdfCkiCn0sewpiZWdpbjoiWystXT9cXGIoPzowW0JiXVswMV0oPzonP1swMV0pKnwwW1h4XVswLTlBLUZhLWZdKD86Jz9bMC05QS1GYS1mXSkqfDAoPzonP1swLTddKSp8WzEtOV0oPzonP1swLTldKSopKD86W1V1XSg/OkxMP3xsbD8pfFtVdV1bWnpdP3woPzpMTD98bGw/KVtVdV0/fFtael1bVXVdfCkiCn1dLHJlbGV2YW5jZTowfSxsPXtjbGFzc05hbWU6Im1ldGEiLGJlZ2luOi8jXHMqW2Etel0rXGIvLGVuZDovJC8sa2V5d29yZHM6ewprZXl3b3JkOiJpZiBlbHNlIGVsaWYgZW5kaWYgZGVmaW5lIHVuZGVmIHdhcm5pbmcgZXJyb3IgbGluZSBwcmFnbWEgX1ByYWdtYSBpZmRlZiBpZm5kZWYgaW5jbHVkZSIKfSxjb250YWluczpbe2JlZ2luOi9cXFxuLyxyZWxldmFuY2U6MH0sZS5pbmhlcml0KGMse2NsYXNzTmFtZToic3RyaW5nIn0pLHsKY2xhc3NOYW1lOiJzdHJpbmciLGJlZ2luOi88Lio/Pi99LGEsZS5DX0JMT0NLX0NPTU1FTlRfTU9ERV19LHU9ewpjbGFzc05hbWU6InRpdGxlIixiZWdpbjp0Lm9wdGlvbmFsKHIpK2UuSURFTlRfUkUscmVsZXZhbmNlOjAKfSxkPXQub3B0aW9uYWwocikrZS5JREVOVF9SRSsiXFxzKlxcKCIscD17CnR5cGU6WyJib29sIiwiY2hhciIsImNoYXIxNl90IiwiY2hhcjMyX3QiLCJjaGFyOF90IiwiZG91YmxlIiwiZmxvYXQiLCJpbnQiLCJsb25nIiwic2hvcnQiLCJ2b2lkIiwid2NoYXJfdCIsInVuc2lnbmVkIiwic2lnbmVkIiwiY29uc3QiLCJzdGF0aWMiXSwKa2V5d29yZDpbImFsaWduYXMiLCJhbGlnbm9mIiwiYW5kIiwiYW5kX2VxIiwiYXNtIiwiYXRvbWljX2NhbmNlbCIsImF0b21pY19jb21taXQiLCJhdG9taWNfbm9leGNlcHQiLCJhdXRvIiwiYml0YW5kIiwiYml0b3IiLCJicmVhayIsImNhc2UiLCJjYXRjaCIsImNsYXNzIiwiY29fYXdhaXQiLCJjb19yZXR1cm4iLCJjb195aWVsZCIsImNvbXBsIiwiY29uY2VwdCIsImNvbnN0X2Nhc3R8MTAiLCJjb25zdGV2YWwiLCJjb25zdGV4cHIiLCJjb25zdGluaXQiLCJjb250aW51ZSIsImRlY2x0eXBlIiwiZGVmYXVsdCIsImRlbGV0ZSIsImRvIiwiZHluYW1pY19jYXN0fDEwIiwiZWxzZSIsImVudW0iLCJleHBsaWNpdCIsImV4cG9ydCIsImV4dGVybiIsImZhbHNlIiwiZmluYWwiLCJmb3IiLCJmcmllbmQiLCJnb3RvIiwiaWYiLCJpbXBvcnQiLCJpbmxpbmUiLCJtb2R1bGUiLCJtdXRhYmxlIiwibmFtZXNwYWNlIiwibmV3Iiwibm9leGNlcHQiLCJub3QiLCJub3RfZXEiLCJudWxscHRyIiwib3BlcmF0b3IiLCJvciIsIm9yX2VxIiwib3ZlcnJpZGUiLCJwcml2YXRlIiwicHJvdGVjdGVkIiwicHVibGljIiwicmVmbGV4cHIiLCJyZWdpc3RlciIsInJlaW50ZXJwcmV0X2Nhc3R8MTAiLCJyZXF1aXJlcyIsInJldHVybiIsInNpemVvZiIsInN0YXRpY19hc3NlcnQiLCJzdGF0aWNfY2FzdHwxMCIsInN0cnVjdCIsInN3aXRjaCIsInN5bmNocm9uaXplZCIsInRlbXBsYXRlIiwidGhpcyIsInRocmVhZF9sb2NhbCIsInRocm93IiwidHJhbnNhY3Rpb25fc2FmZSIsInRyYW5zYWN0aW9uX3NhZmVfZHluYW1pYyIsInRydWUiLCJ0cnkiLCJ0eXBlZGVmIiwidHlwZWlkIiwidHlwZW5hbWUiLCJ1bmlvbiIsInVzaW5nIiwidmlydHVhbCIsInZvbGF0aWxlIiwid2hpbGUiLCJ4b3IiLCJ4b3JfZXEiXSwKbGl0ZXJhbDpbIk5VTEwiLCJmYWxzZSIsIm51bGxvcHQiLCJudWxscHRyIiwidHJ1ZSJdLGJ1aWx0X2luOlsiX1ByYWdtYSJdLApfdHlwZV9oaW50czpbImFueSIsImF1dG9fcHRyIiwiYmFycmllciIsImJpbmFyeV9zZW1hcGhvcmUiLCJiaXRzZXQiLCJjb21wbGV4IiwiY29uZGl0aW9uX3ZhcmlhYmxlIiwiY29uZGl0aW9uX3ZhcmlhYmxlX2FueSIsImNvdW50aW5nX3NlbWFwaG9yZSIsImRlcXVlIiwiZmFsc2VfdHlwZSIsImZ1dHVyZSIsImltYWdpbmFyeSIsImluaXRpYWxpemVyX2xpc3QiLCJpc3RyaW5nc3RyZWFtIiwianRocmVhZCIsImxhdGNoIiwibG9ja19ndWFyZCIsIm11bHRpbWFwIiwibXVsdGlzZXQiLCJtdXRleCIsIm9wdGlvbmFsIiwib3N0cmluZ3N0cmVhbSIsInBhY2thZ2VkX3Rhc2siLCJwYWlyIiwicHJvbWlzZSIsInByaW9yaXR5X3F1ZXVlIiwicXVldWUiLCJyZWN1cnNpdmVfbXV0ZXgiLCJyZWN1cnNpdmVfdGltZWRfbXV0ZXgiLCJzY29wZWRfbG9jayIsInNldCIsInNoYXJlZF9mdXR1cmUiLCJzaGFyZWRfbG9jayIsInNoYXJlZF9tdXRleCIsInNoYXJlZF90aW1lZF9tdXRleCIsInNoYXJlZF9wdHIiLCJzdGFjayIsInN0cmluZ192aWV3Iiwic3RyaW5nc3RyZWFtIiwidGltZWRfbXV0ZXgiLCJ0aHJlYWQiLCJ0cnVlX3R5cGUiLCJ0dXBsZSIsInVuaXF1ZV9sb2NrIiwidW5pcXVlX3B0ciIsInVub3JkZXJlZF9tYXAiLCJ1bm9yZGVyZWRfbXVsdGltYXAiLCJ1bm9yZGVyZWRfbXVsdGlzZXQiLCJ1bm9yZGVyZWRfc2V0IiwidmFyaWFudCIsInZlY3RvciIsIndlYWtfcHRyIiwid3N0cmluZyIsIndzdHJpbmdfdmlldyJdCn0sXz17Y2xhc3NOYW1lOiJmdW5jdGlvbi5kaXNwYXRjaCIscmVsZXZhbmNlOjAsa2V5d29yZHM6ewpfaGludDpbImFib3J0IiwiYWJzIiwiYWNvcyIsImFwcGx5IiwiYXNfY29uc3QiLCJhc2luIiwiYXRhbiIsImF0YW4yIiwiY2FsbG9jIiwiY2VpbCIsImNlcnIiLCJjaW4iLCJjbG9nIiwiY29zIiwiY29zaCIsImNvdXQiLCJkZWNsdmFsIiwiZW5kbCIsImV4Y2hhbmdlIiwiZXhpdCIsImV4cCIsImZhYnMiLCJmbG9vciIsImZtb2QiLCJmb3J3YXJkIiwiZnByaW50ZiIsImZwdXRzIiwiZnJlZSIsImZyZXhwIiwiZnNjYW5mIiwiZnV0dXJlIiwiaW52b2tlIiwiaXNhbG51bSIsImlzYWxwaGEiLCJpc2NudHJsIiwiaXNkaWdpdCIsImlzZ3JhcGgiLCJpc2xvd2VyIiwiaXNwcmludCIsImlzcHVuY3QiLCJpc3NwYWNlIiwiaXN1cHBlciIsImlzeGRpZ2l0IiwibGFicyIsImxhdW5kZXIiLCJsZGV4cCIsImxvZyIsImxvZzEwIiwibWFrZV9wYWlyIiwibWFrZV9zaGFyZWQiLCJtYWtlX3NoYXJlZF9mb3Jfb3ZlcndyaXRlIiwibWFrZV90dXBsZSIsIm1ha2VfdW5pcXVlIiwibWFsbG9jIiwibWVtY2hyIiwibWVtY21wIiwibWVtY3B5IiwibWVtc2V0IiwibW9kZiIsIm1vdmUiLCJwb3ciLCJwcmludGYiLCJwdXRjaGFyIiwicHV0cyIsInJlYWxsb2MiLCJzY2FuZiIsInNpbiIsInNpbmgiLCJzbnByaW50ZiIsInNwcmludGYiLCJzcXJ0Iiwic3NjYW5mIiwic3RkIiwic3RkZXJyIiwic3RkaW4iLCJzdGRvdXQiLCJzdHJjYXQiLCJzdHJjaHIiLCJzdHJjbXAiLCJzdHJjcHkiLCJzdHJjc3BuIiwic3RybGVuIiwic3RybmNhdCIsInN0cm5jbXAiLCJzdHJuY3B5Iiwic3RycGJyayIsInN0cnJjaHIiLCJzdHJzcG4iLCJzdHJzdHIiLCJzd2FwIiwidGFuIiwidGFuaCIsInRlcm1pbmF0ZSIsInRvX3VuZGVybHlpbmciLCJ0b2xvd2VyIiwidG91cHBlciIsInZmcHJpbnRmIiwidmlzaXQiLCJ2cHJpbnRmIiwidnNwcmludGYiXQp9LApiZWdpbjp0LmNvbmNhdCgvXGIvLC8oPyFkZWNsdHlwZSkvLC8oPyFpZikvLC8oPyFmb3IpLywvKD8hc3dpdGNoKS8sLyg/IXdoaWxlKS8sZS5JREVOVF9SRSx0Lmxvb2thaGVhZCgvKDxbXjw+XSs+fClccypcKC8pKQp9LG09W18sbCxzLGEsZS5DX0JMT0NLX0NPTU1FTlRfTU9ERSxvLGNdLGY9e3ZhcmlhbnRzOlt7YmVnaW46Lz0vLGVuZDovOy99LHsKYmVnaW46L1woLyxlbmQ6L1wpL30se2JlZ2luS2V5d29yZHM6Im5ldyB0aHJvdyByZXR1cm4gZWxzZSIsZW5kOi87L31dLAprZXl3b3JkczpwLGNvbnRhaW5zOm0uY29uY2F0KFt7YmVnaW46L1woLyxlbmQ6L1wpLyxrZXl3b3JkczpwLApjb250YWluczptLmNvbmNhdChbInNlbGYiXSkscmVsZXZhbmNlOjB9XSkscmVsZXZhbmNlOjB9LGc9e2NsYXNzTmFtZToiZnVuY3Rpb24iLApiZWdpbjoiKCIraSsiW1xcKiZcXHNdKykrIitkLHJldHVybkJlZ2luOiEwLGVuZDovW3s7PV0vLGV4Y2x1ZGVFbmQ6ITAsCmtleXdvcmRzOnAsaWxsZWdhbDovW15cd1xzXComOjw+Ll0vLGNvbnRhaW5zOlt7YmVnaW46bixrZXl3b3JkczpwLHJlbGV2YW5jZTowfSx7CmJlZ2luOmQscmV0dXJuQmVnaW46ITAsY29udGFpbnM6W3VdLHJlbGV2YW5jZTowfSx7YmVnaW46Lzo6LyxyZWxldmFuY2U6MH0sewpiZWdpbjovOi8sZW5kc1dpdGhQYXJlbnQ6ITAsY29udGFpbnM6W2Msb119LHtyZWxldmFuY2U6MCxtYXRjaDovLC99LHsKY2xhc3NOYW1lOiJwYXJhbXMiLGJlZ2luOi9cKC8sZW5kOi9cKS8sa2V5d29yZHM6cCxyZWxldmFuY2U6MCwKY29udGFpbnM6W2EsZS5DX0JMT0NLX0NPTU1FTlRfTU9ERSxjLG8scyx7YmVnaW46L1woLyxlbmQ6L1wpLyxrZXl3b3JkczpwLApyZWxldmFuY2U6MCxjb250YWluczpbInNlbGYiLGEsZS5DX0JMT0NLX0NPTU1FTlRfTU9ERSxjLG8sc119XQp9LHMsYSxlLkNfQkxPQ0tfQ09NTUVOVF9NT0RFLGxdfTtyZXR1cm57bmFtZToiQysrIiwKYWxpYXNlczpbImNjIiwiYysrIiwiaCsrIiwiaHBwIiwiaGgiLCJoeHgiLCJjeHgiXSxrZXl3b3JkczpwLGlsbGVnYWw6IjwvIiwKY2xhc3NOYW1lQWxpYXNlczp7ImZ1bmN0aW9uLmRpc3BhdGNoIjoiYnVpbHRfaW4ifSwKY29udGFpbnM6W10uY29uY2F0KGYsZyxfLG0sW2wsewpiZWdpbjoiXFxiKGRlcXVlfGxpc3R8cXVldWV8cHJpb3JpdHlfcXVldWV8cGFpcnxzdGFja3x2ZWN0b3J8bWFwfHNldHxiaXRzZXR8bXVsdGlzZXR8bXVsdGltYXB8dW5vcmRlcmVkX21hcHx1bm9yZGVyZWRfc2V0fHVub3JkZXJlZF9tdWx0aXNldHx1bm9yZGVyZWRfbXVsdGltYXB8YXJyYXl8dHVwbGV8b3B0aW9uYWx8dmFyaWFudHxmdW5jdGlvbilcXHMqPCg/ITwpIiwKZW5kOiI+IixrZXl3b3JkczpwLGNvbnRhaW5zOlsic2VsZiIsc119LHtiZWdpbjplLklERU5UX1JFKyI6OiIsa2V5d29yZHM6cH0sewptYXRjaDpbL1xiKD86ZW51bSg/OlxzKyg/OmNsYXNzfHN0cnVjdCkpP3xjbGFzc3xzdHJ1Y3R8dW5pb24pLywvXHMrLywvXHcrL10sCmNsYXNzTmFtZTp7MToia2V5d29yZCIsMzoidGl0bGUuY2xhc3MifX1dKX19fSkoKTtobGpzLnJlZ2lzdGVyTGFuZ3VhZ2UoImNwcCIsZSkKfSkoKTs="></script>
<script src="data:text/javascript;base64,dmFyIG1lcmdlSFRNTFBsdWdpbiA9IChmdW5jdGlvbiAoKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICB2YXIgb3JpZ2luYWxTdHJlYW07CgogIC8qKgogICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZQogICAqIEByZXR1cm5zIHtzdHJpbmd9CiAgICovCiAgZnVuY3Rpb24gZXNjYXBlSFRNTCh2YWx1ZSkgewogICAgcmV0dXJuIHZhbHVlCiAgICAgIC5yZXBsYWNlKC8mL2csICcmYW1wOycpCiAgICAgIC5yZXBsYWNlKC88L2csICcmbHQ7JykKICAgICAgLnJlcGxhY2UoLz4vZywgJyZndDsnKQogICAgICAucmVwbGFjZSgvIi9nLCAnJnF1b3Q7JykKICAgICAgLnJlcGxhY2UoLycvZywgJyYjeDI3OycpOwogIH0KCiAgLyogcGx1Z2luIGl0c2VsZiAqLwoKICAvKiogQHR5cGUge0hMSlNQbHVnaW59ICovCiAgY29uc3QgbWVyZ2VIVE1MUGx1Z2luID0gewogICAgLy8gcHJlc2VydmUgdGhlIG9yaWdpbmFsIEhUTUwgdG9rZW4gc3RyZWFtCiAgICAiYmVmb3JlOmhpZ2hsaWdodEVsZW1lbnQiOiAoeyBlbCB9KSA9PiB7CiAgICAgIG9yaWdpbmFsU3RyZWFtID0gbm9kZVN0cmVhbShlbCk7CiAgICB9LAogICAgLy8gbWVyZ2UgaXQgYWZ0ZXJ3YXJkcyB3aXRoIHRoZSBoaWdobGlnaHRlZCB0b2tlbiBzdHJlYW0KICAgICJhZnRlcjpoaWdobGlnaHRFbGVtZW50IjogKHsgZWwsIHJlc3VsdCwgdGV4dCB9KSA9PiB7CiAgICAgIGlmICghb3JpZ2luYWxTdHJlYW0ubGVuZ3RoKSByZXR1cm47CgogICAgICBjb25zdCByZXN1bHROb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgIHJlc3VsdE5vZGUuaW5uZXJIVE1MID0gcmVzdWx0LnZhbHVlOwogICAgICByZXN1bHQudmFsdWUgPSBtZXJnZVN0cmVhbXMob3JpZ2luYWxTdHJlYW0sIG5vZGVTdHJlYW0ocmVzdWx0Tm9kZSksIHRleHQpOwogICAgICBlbC5pbm5lckhUTUwgPSByZXN1bHQudmFsdWU7CiAgICB9CiAgfTsKCiAgLyogU3RyZWFtIG1lcmdpbmcgc3VwcG9ydCBmdW5jdGlvbnMgKi8KCiAgLyoqCiAgICogQHR5cGVkZWYgRXZlbnQKICAgKiBAcHJvcGVydHkgeydzdGFydCd8J3N0b3AnfSBldmVudAogICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBvZmZzZXQKICAgKiBAcHJvcGVydHkge05vZGV9IG5vZGUKICAgKi8KCiAgLyoqCiAgICogQHBhcmFtIHtOb2RlfSBub2RlCiAgICovCiAgZnVuY3Rpb24gdGFnKG5vZGUpIHsKICAgIHJldHVybiBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7CiAgfQoKICAvKioKICAgKiBAcGFyYW0ge05vZGV9IG5vZGUKICAgKi8KICBmdW5jdGlvbiBub2RlU3RyZWFtKG5vZGUpIHsKICAgIC8qKiBAdHlwZSBFdmVudFtdICovCiAgICBjb25zdCByZXN1bHQgPSBbXTsKICAgIChmdW5jdGlvbiBfbm9kZVN0cmVhbShub2RlLCBvZmZzZXQpIHsKICAgICAgZm9yIChsZXQgY2hpbGQgPSBub2RlLmZpcnN0Q2hpbGQ7IGNoaWxkOyBjaGlsZCA9IGNoaWxkLm5leHRTaWJsaW5nKSB7CiAgICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlID09PSAzKSB7CiAgICAgICAgICBvZmZzZXQgKz0gY2hpbGQubm9kZVZhbHVlLmxlbmd0aDsKICAgICAgICB9IGVsc2UgaWYgKGNoaWxkLm5vZGVUeXBlID09PSAxKSB7CiAgICAgICAgICByZXN1bHQucHVzaCh7CiAgICAgICAgICAgIGV2ZW50OiAnc3RhcnQnLAogICAgICAgICAgICBvZmZzZXQ6IG9mZnNldCwKICAgICAgICAgICAgbm9kZTogY2hpbGQKICAgICAgICAgIH0pOwogICAgICAgICAgb2Zmc2V0ID0gX25vZGVTdHJlYW0oY2hpbGQsIG9mZnNldCk7CiAgICAgICAgICAvLyBQcmV2ZW50IHZvaWQgZWxlbWVudHMgZnJvbSBoYXZpbmcgYW4gZW5kIHRhZyB0aGF0IHdvdWxkIGFjdHVhbGx5CiAgICAgICAgICAvLyBkb3VibGUgdGhlbSBpbiB0aGUgb3V0cHV0LiBUaGVyZSBhcmUgbW9yZSB2b2lkIGVsZW1lbnRzIGluIEhUTUwKICAgICAgICAgIC8vIGJ1dCB3ZSBsaXN0IG9ubHkgdGhvc2UgcmVhbGlzdGljYWxseSBleHBlY3RlZCBpbiBjb2RlIGRpc3BsYXkuCiAgICAgICAgICBpZiAoIXRhZyhjaGlsZCkubWF0Y2goL2JyfGhyfGltZ3xpbnB1dC8pKSB7CiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHsKICAgICAgICAgICAgICBldmVudDogJ3N0b3AnLAogICAgICAgICAgICAgIG9mZnNldDogb2Zmc2V0LAogICAgICAgICAgICAgIG5vZGU6IGNoaWxkCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gb2Zmc2V0OwogICAgfSkobm9kZSwgMCk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLyoqCiAgICogQHBhcmFtIHthbnl9IG9yaWdpbmFsIC0gdGhlIG9yaWdpbmFsIHN0cmVhbQogICAqIEBwYXJhbSB7YW55fSBoaWdobGlnaHRlZCAtIHN0cmVhbSBvZiB0aGUgaGlnaGxpZ2h0ZWQgc291cmNlCiAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIC0gdGhlIG9yaWdpbmFsIHNvdXJjZSBpdHNlbGYKICAgKi8KICBmdW5jdGlvbiBtZXJnZVN0cmVhbXMob3JpZ2luYWwsIGhpZ2hsaWdodGVkLCB2YWx1ZSkgewogICAgbGV0IHByb2Nlc3NlZCA9IDA7CiAgICBsZXQgcmVzdWx0ID0gJyc7CiAgICBjb25zdCBub2RlU3RhY2sgPSBbXTsKCiAgICBmdW5jdGlvbiBzZWxlY3RTdHJlYW0oKSB7CiAgICAgIGlmICghb3JpZ2luYWwubGVuZ3RoIHx8ICFoaWdobGlnaHRlZC5sZW5ndGgpIHsKICAgICAgICByZXR1cm4gb3JpZ2luYWwubGVuZ3RoID8gb3JpZ2luYWwgOiBoaWdobGlnaHRlZDsKICAgICAgfQogICAgICBpZiAob3JpZ2luYWxbMF0ub2Zmc2V0ICE9PSBoaWdobGlnaHRlZFswXS5vZmZzZXQpIHsKICAgICAgICByZXR1cm4gKG9yaWdpbmFsWzBdLm9mZnNldCA8IGhpZ2hsaWdodGVkWzBdLm9mZnNldCkgPyBvcmlnaW5hbCA6IGhpZ2hsaWdodGVkOwogICAgICB9CgogICAgICAvKgogICAgICBUbyBhdm9pZCBzdGFydGluZyB0aGUgc3RyZWFtIGp1c3QgYmVmb3JlIGl0IHNob3VsZCBzdG9wIHRoZSBvcmRlciBpcwogICAgICBlbnN1cmVkIHRoYXQgb3JpZ2luYWwgYWx3YXlzIHN0YXJ0cyBmaXJzdCBhbmQgY2xvc2VzIGxhc3Q6CgogICAgICBpZiAoZXZlbnQxID09ICdzdGFydCcgJiYgZXZlbnQyID09ICdzdGFydCcpCiAgICAgICAgcmV0dXJuIG9yaWdpbmFsOwogICAgICBpZiAoZXZlbnQxID09ICdzdGFydCcgJiYgZXZlbnQyID09ICdzdG9wJykKICAgICAgICByZXR1cm4gaGlnaGxpZ2h0ZWQ7CiAgICAgIGlmIChldmVudDEgPT0gJ3N0b3AnICYmIGV2ZW50MiA9PSAnc3RhcnQnKQogICAgICAgIHJldHVybiBvcmlnaW5hbDsKICAgICAgaWYgKGV2ZW50MSA9PSAnc3RvcCcgJiYgZXZlbnQyID09ICdzdG9wJykKICAgICAgICByZXR1cm4gaGlnaGxpZ2h0ZWQ7CgogICAgICAuLi4gd2hpY2ggaXMgY29sbGFwc2VkIHRvOgogICAgICAqLwogICAgICByZXR1cm4gaGlnaGxpZ2h0ZWRbMF0uZXZlbnQgPT09ICdzdGFydCcgPyBvcmlnaW5hbCA6IGhpZ2hsaWdodGVkOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIHtOb2RlfSBub2RlCiAgICAgKi8KICAgIGZ1bmN0aW9uIG9wZW4obm9kZSkgewogICAgICAvKiogQHBhcmFtIHtBdHRyfSBhdHRyICovCiAgICAgIGZ1bmN0aW9uIGF0dHJpYnV0ZVN0cmluZyhhdHRyKSB7CiAgICAgICAgcmV0dXJuICcgJyArIGF0dHIubm9kZU5hbWUgKyAnPSInICsgZXNjYXBlSFRNTChhdHRyLnZhbHVlKSArICciJzsKICAgICAgfQogICAgICAvLyBAdHMtaWdub3JlCiAgICAgIHJlc3VsdCArPSAnPCcgKyB0YWcobm9kZSkgKyBbXS5tYXAuY2FsbChub2RlLmF0dHJpYnV0ZXMsIGF0dHJpYnV0ZVN0cmluZykuam9pbignJykgKyAnPic7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0ge05vZGV9IG5vZGUKICAgICAqLwogICAgZnVuY3Rpb24gY2xvc2Uobm9kZSkgewogICAgICByZXN1bHQgKz0gJzwvJyArIHRhZyhub2RlKSArICc+JzsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50CiAgICAgKi8KICAgIGZ1bmN0aW9uIHJlbmRlcihldmVudCkgewogICAgICAoZXZlbnQuZXZlbnQgPT09ICdzdGFydCcgPyBvcGVuIDogY2xvc2UpKGV2ZW50Lm5vZGUpOwogICAgfQoKICAgIHdoaWxlIChvcmlnaW5hbC5sZW5ndGggfHwgaGlnaGxpZ2h0ZWQubGVuZ3RoKSB7CiAgICAgIGxldCBzdHJlYW0gPSBzZWxlY3RTdHJlYW0oKTsKICAgICAgcmVzdWx0ICs9IGVzY2FwZUhUTUwodmFsdWUuc3Vic3RyaW5nKHByb2Nlc3NlZCwgc3RyZWFtWzBdLm9mZnNldCkpOwogICAgICBwcm9jZXNzZWQgPSBzdHJlYW1bMF0ub2Zmc2V0OwogICAgICBpZiAoc3RyZWFtID09PSBvcmlnaW5hbCkgewogICAgICAgIC8qCiAgICAgICAgT24gYW55IG9wZW5pbmcgb3IgY2xvc2luZyB0YWcgb2YgdGhlIG9yaWdpbmFsIG1hcmt1cCB3ZSBmaXJzdCBjbG9zZQogICAgICAgIHRoZSBlbnRpcmUgaGlnaGxpZ2h0ZWQgbm9kZSBzdGFjaywgdGhlbiByZW5kZXIgdGhlIG9yaWdpbmFsIHRhZyBhbG9uZwogICAgICAgIHdpdGggYWxsIHRoZSBmb2xsb3dpbmcgb3JpZ2luYWwgdGFncyBhdCB0aGUgc2FtZSBvZmZzZXQgYW5kIHRoZW4KICAgICAgICByZW9wZW4gYWxsIHRoZSB0YWdzIG9uIHRoZSBoaWdobGlnaHRlZCBzdGFjay4KICAgICAgICAqLwogICAgICAgIG5vZGVTdGFjay5yZXZlcnNlKCkuZm9yRWFjaChjbG9zZSk7CiAgICAgICAgZG8gewogICAgICAgICAgcmVuZGVyKHN0cmVhbS5zcGxpY2UoMCwgMSlbMF0pOwogICAgICAgICAgc3RyZWFtID0gc2VsZWN0U3RyZWFtKCk7CiAgICAgICAgfSB3aGlsZSAoc3RyZWFtID09PSBvcmlnaW5hbCAmJiBzdHJlYW0ubGVuZ3RoICYmIHN0cmVhbVswXS5vZmZzZXQgPT09IHByb2Nlc3NlZCk7CiAgICAgICAgbm9kZVN0YWNrLnJldmVyc2UoKS5mb3JFYWNoKG9wZW4pOwogICAgICB9IGVsc2UgewogICAgICAgIGlmIChzdHJlYW1bMF0uZXZlbnQgPT09ICdzdGFydCcpIHsKICAgICAgICAgIG5vZGVTdGFjay5wdXNoKHN0cmVhbVswXS5ub2RlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbm9kZVN0YWNrLnBvcCgpOwogICAgICAgIH0KICAgICAgICByZW5kZXIoc3RyZWFtLnNwbGljZSgwLCAxKVswXSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiByZXN1bHQgKyBlc2NhcGVIVE1MKHZhbHVlLnN1YnN0cihwcm9jZXNzZWQpKTsKICB9CgogIHJldHVybiBtZXJnZUhUTUxQbHVnaW47Cgp9KCkpOw=="></script>
</head>
<body><div>
<nav><div><div>
<h1 class="hide-on-wide name-of-paper">constexpr coroutines</h1>
<div class="paper-info">
	<div><span class="key">Number:</span> P3367R0</div>
	<div><span class="key">Date:</span> <time>2024-10-16</time></div>
	<div><span class="key">Audience:</span> EWG &amp; LEWG</div>
	<div><span class="key">Reply-to:</span> <a href="mailto:cpp@hanicka.net">Hana Dusíková</a></div>
</div>

<h2 id="table-of-contents"><a href="#table-of-contents">Table of contents</a></h2>
<ul>
  <li><a href="#quote">Why would you want to do this?</a></li>
	<li><a href="#example">Simple example</a></li>
	<li><a href="#implementation-experience">Implementation experience</a></li>
	<li><a href="#impact-on-existing-code">Impact on existing code</a></li>
	<li><a href="#intention">Intention for wording changes</a></li>
	<li><a href="#wording">Proposed changes to wording</a></li>
		<ul>
			<li><a href="#feature-test-macros">Feature test macros</a></li>
		</ul>
</ul>
</div></div></nav>
<article>
<div><div>
	<h1 class="hide-on-narrow name-of-paper">constexpr coroutines</h1>
	<p>This paper is proposing making coroutines functional during constant evaluation. Even when most of use-cases for coroutines are based on I/O and event based, coroutines are still useful for compile-time based computation, eg. <code>std::generator</code>.</p>
  <h2 id="quote"><a href="#quote">Why would you want to do this?</a></h2>
  <p>Well, you just told me coroutines are the best way to solve some problems, so wouldn't I also want to use the Best Way at compile time? (quote from Jason Turner, co-author of <em>"constexpr all the things"</em> talk)</p>
	<h2 id="example"><a href="#example">Simple example</a></h2>
  <p>When this paper is merged into the standard, users will be able to use <code>std::generator</code>-like coroutines to generate or calculate data.</p>
  <pre><code class="language-cpp">template &lt;typename T&gt; constexpr auto fib() -> std::generator&lt;T&gt; {
    T a = 0;
    T b = 1;
    co_yield a;
    do {
        co_yield b;
        auto tmp = b;
        b += a;
        a = tmp;
    } while (true);
}

template &lt;typename T, size_t N&gt; constexpr auto calculate_fibonnaci() {
    auto res = std::array&lt;T, N&gt;{};
    std::ranges::copy(fib&lt;T&gt;() | std::views::take(N), res.begin());
    return res;
}

constexpr auto cached_fibonnaci = calculate_fibonnaci&lt;unsigned, 20&gt;();</code></pre>
	<h2 id="implementation-experience"><a href="#implementation-experience">Implementation experience</a></h2>
  <p>Partially implemented in clang available on my <a href="https://github.com/hanickadot/llvm-project/tree/P3367-constexpr-coroutines">github</a>, implementation should be ready for its presentation at Wroclaw meeting, and also will be soon available on compiler explorer (thanks Matt!).</p>
  <p>Most of functionality needed was already present in Clang, it was mostly about removing checks in the parser.</p>
  <p>Another part was implementing the functionality in Clang's interpreter and there I needed to add fibers (stackfull coroutines) as the interpreter recursive walks over AST. Ability to save interpreter's stack content did minimize impact of the change to only resuming, suspending, and variable storage and life-time management.</p>
  <p>At the end of evaluation the interpret needs to check objects holding fibers if there is still any coroutine not released, if there is it report similar error as when there is an unreleased memory allocation.</p>
  <p>Hardest problem was implementing local "stack", as <code>createLocal</code> function was designed around idea of having only one branch of evaluation. This I solved by providing context of currently evaluated coroutine in <code>EvalInfo</code> and switching it on every suspension / resume of a coroutine.</p>
	<h2 id="impact-on-existing-code"><a href="#impact-on-existing-code">Impact on existing code</a></h2>
  <p>None, this is a pure extension, it allows code to be constexpr which wasn't case before.</p>
	<h2 id="intention"><a href="#intention">Intention for wording changes</a></h2>
  <p>Remove all obstacles blocking coroutines from being constant evaluatable. Make sure all coroutines are destroyed at end of constant evaluation.</p>
	<h2 id="wording"><a href="#wording">Proposed changes to wording</a></h2>
	<div class="wording">
    <h2 ><a class='secnum' style='min-width:65pt'>7.7</a> Constant expressions <a class='abbr_ref'>[expr.const]</a></h2><div class='texpara'><a class='index' id=':expression,constant'></a></div><div class='para' id='1'><div class='marginalizedparent'><a class='marginalized' href='#1'>1</a></div><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/expressions.tex#L7398'>#</a></div><div class='texpara'><div id='1.sentence-1' class='sentence'>Certain contexts require expressions that satisfy additional
requirements as detailed in this subclause; other contexts have different
semantics depending on whether or not an expression satisfies these requirements<a class='hidden_link' href='#1.sentence-1'>.</a></div> <div id='1.sentence-2' class='sentence'>Expressions that satisfy these requirements,
assuming that <a href='class.copy.elision' title='11.9.6&emsp;Copy/move elision&emsp;[class.copy.elision]'>copy elision</a> is not performed,
are called
<a class='index' id='def:expression,constant'></a><a class='hidden_link' href='#def:constant_expression' title='7.7&emsp;Constant expressions&emsp;[expr.const]'><span id='def:constant_expression'><i >constant expressions</i></span></a><a class='hidden_link' href='#1.sentence-2'>.</a></div> <div id='note-1' class='note'><div class='texpara'>[<i>Note&nbsp;<a href='#note-1'>1</a></i>:&ensp;<div id='1.sentence-3' class='sentence'>Constant expressions can be evaluated
during translation<a class='hidden_link' href='#1.sentence-3'>.</a></div> —&nbsp;<i>end note</i>]</div></div></div><div class='texpara'><div class='bnf' id='nt:constant-expression'>
<a class='hidden_link' href='#nt:constant-expression' title='7.7&emsp;Constant expressions&emsp;[expr.const]'><span id='nt:constant-expression'><span id=':constant-expression'>constant-expression<span class='textnormal'>:</span></span></span></a><br/><a href='expr.cond#nt:conditional-expression' title='7.6.16&emsp;Conditional operator&emsp;[expr.cond]'><span id='ntref:conditional-expression'><span class='textsf'><i >conditional-expression</i></span></span></a>
</div></div></div><div class='para' id='2'><div class='marginalizedparent'><a class='marginalized' href='#2'>2</a></div><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/expressions.tex#L7417'>#</a></div><div class='texpara'><div id='2.sentence-1' class='sentence'>A variable or temporary object <span class='texttt'>o</span> is <a class='hidden_link' href='#def:constant-initialized' title='7.7&emsp;Constant expressions&emsp;[expr.const]'><span id='def:constant-initialized'><i >constant-initialized</i></span></a> if
<ul class='itemize'><li id='2.1'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#2.1'>(2.1)</a></div>either it has an initializer or
  its default-initialization results in some initialization being performed, and</li><li id='2.2'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#2.2'>(2.2)</a></div>the full-expression of its initialization is a constant expression
  when interpreted as a <a href='#nt:constant-expression' title='7.7&emsp;Constant expressions&emsp;[expr.const]'><span id='ntref:constant-expression'><span class='textsf'><i >constant-expression</i></span></span></a>,
  except that if <span class='texttt'>o</span> is an object,
  that full-expression
  may also invoke constexpr constructors
  for <span class='texttt'>o</span> and its subobjects
  even if those objects are of non-literal class types<a class='hidden_link' href='#2.sentence-1'>.</a> <div class='texpara'><div id='note-2' class='note'><div class='texpara'>[<i>Note&nbsp;<a href='#note-2'>2</a></i>:&ensp;<div id='2.2.sentence-2' class='sentence'>Such a class can have a non-trivial destructor<a class='hidden_link' href='#2.2.sentence-2'>.</a></div> <div id='2.2.sentence-3' class='sentence'>Within this evaluation,
  <span class='texttt'>std<span class='operator'>&#x200b;::&#x200b;</span>is_<span class='shy'></span>constant_<span class='shy'></span>evaluated<span class='parenthesis'>(</span><span class='parenthesis'>)</span></span> (<a href='meta.const.eval' title='21.3.11&emsp;Constant evaluation context'>[meta.<span class='shy'></span>const.<span class='shy'></span>eval]</a>)
  returns <span id=':true'><span class='texttt'><span class='literal'>true</span></span></span><a class='hidden_link' href='#2.2.sentence-3'>.</a></div> —&nbsp;<i>end note</i>]</div></div></div></li></ul></div></div></div><div class='para' id='3'><div class='marginalizedparent'><a class='marginalized' href='#3'>3</a></div><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/expressions.tex#L7439'>#</a></div><div class='texpara'><div id='3.sentence-1' class='sentence'>A variable is <a class='hidden_link' href='#def:potentially-constant' title='7.7&emsp;Constant expressions&emsp;[expr.const]'><span id='def:potentially-constant'><i >potentially-constant</i></span></a> if
it is constexpr or
it has reference or non-volatile const-qualified integral or enumeration type<a class='hidden_link' href='#3.sentence-1'>.</a></div></div></div><div class='para' id='4'><div class='marginalizedparent'><a class='marginalized' href='#4'>4</a></div><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/expressions.tex#L7444'>#</a></div><div class='texpara'><div id='4.sentence-1' class='sentence'>A constant-initialized potentially-constant variable <span class='math'><span class='mathalpha'>V</span></span> is
<a class='hidden_link' href='#def:usable_in_constant_expressions' title='7.7&emsp;Constant expressions&emsp;[expr.const]'><span id='def:usable_in_constant_expressions'><i >usable in constant expressions</i></span></a> at a point <span class='math'><span class='mathalpha'>P</span></span> if
<span class='math'><span class='mathalpha'>V</span></span>'s initializing declaration <span class='math'><span class='mathalpha'>D</span></span> is reachable from <span class='math'><span class='mathalpha'>P</span></span> and
<ul class='itemize'><li id='4.1'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#4.1'>(4.1)</a></div><span class='math'><span class='mathalpha'>V</span></span> is constexpr,</li><li id='4.2'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#4.2'>(4.2)</a></div><span class='math'><span class='mathalpha'>V</span></span> is not initialized to a TU-local value, or</li><li id='4.3'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#4.3'>(4.3)</a></div><span class='math'><span class='mathalpha'>P</span></span> is in the same translation unit as <span class='math'><span class='mathalpha'>D</span></span><a class='hidden_link' href='#4.sentence-1'>.</a></li></ul></div> <div id='4.sentence-2' class='sentence'>
An object or reference is <a class='hidden_link' href='#def:usable_in_constant_expressions' title='7.7&emsp;Constant expressions&emsp;[expr.const]'><span id='def:usable_in_constant_expressions_'><i >usable in constant expressions</i></span></a> if it is
<ul class='itemize'><li id='4.4'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#4.4'>(4.4)</a></div>a variable that is usable in constant expressions, or</li><li id='4.5'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#4.5'>(4.5)</a></div>a <a href='temp.param' title='13.2&emsp;Template parameters&emsp;[temp.param]'>template parameter</a> object, or</li><li id='4.6'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#4.6'>(4.6)</a></div>a <a href='lex.string' title='5.13.5&emsp;String literals&emsp;[lex.string]'>string literal</a> object, or</li><li id='4.7'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#4.7'>(4.7)</a></div>a temporary object of non-volatile const-qualified literal type
  whose lifetime is extended (<a href='class.temporary' title='6.7.7&emsp;Temporary objects'>[class.<span class='shy'></span>temporary]</a>)
  to that of a variable that is usable in constant expressions, or</li><li id='4.8'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#4.8'>(4.8)</a></div>a non-mutable subobject or reference member of any of the above<a class='hidden_link' href='#4.sentence-2'>.</a></li></ul></div></div></div><div class='para' id='5'><div class='marginalizedparent'><a class='marginalized' href='#5'>5</a></div><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/expressions.tex#L7464'>#</a></div><div class='texpara'><div id='5.sentence-1' class='sentence'>An expression <span class='math'><span class='mathalpha'>E</span></span> is a <a class='hidden_link' href='#def:expression,core_constant' title='7.7&emsp;Constant expressions&emsp;[expr.const]'><span id='def:expression,core_constant'><i >core constant expression</i></span></a>
unless the evaluation of <span class='math'><span class='mathalpha'>E</span></span>, following the rules of the abstract
machine (<a href='intro.execution' title='6.9.1&emsp;Sequential execution'>[intro.<span class='shy'></span>execution]</a>), would evaluate one of the following:
<ul class='itemize'><li id='5.1'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#5.1'>(5.1)</a></div><span id=':this'><span class='texttt'><span class='keyword'>this</span></span></span> (<a href='expr.prim.this' title='7.5.3&emsp;This'>[expr.<span class='shy'></span>prim.<span class='shy'></span>this]</a>), except
<ul class='itemize'><li id='5.1.1'><div class='marginalizedparent' style='left:-36mm'><a class='marginalized' href='#5.1.1'>(5.1.1)</a></div>in a constexpr function (<a href='dcl.constexpr' title='9.2.6&emsp;The constexpr and consteval specifiers'>[dcl.<span class='shy'></span>constexpr]</a>)
that is being evaluated as part of <span class='math'><span class='mathalpha'>E</span></span> or</li><li id='5.1.2'><div class='marginalizedparent' style='left:-36mm'><a class='marginalized' href='#5.1.2'>(5.1.2)</a></div>when appearing as the <a href='expr.post.general#nt:postfix-expression' title='7.6.1.1&emsp;General&emsp;[expr.post.general]'><span id='ntref:postfix-expression'><span class='textsf'><i >postfix-expression</i></span></span></a> of
an implicit or explicit class member access expression (<a href='expr.ref' title='7.6.1.5&emsp;Class member access'>[expr.<span class='shy'></span>ref]</a>);</li></ul></li><li id='5.2'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#5.2'>(5.2)</a></div>a control flow that passes through
a declaration of a block variable (<a href='basic.scope.block' title='6.4.3&emsp;Block scope'>[basic.<span class='shy'></span>scope.<span class='shy'></span>block]</a>) with
static (<a href='basic.stc.static' title='6.7.5.2&emsp;Static storage duration'>[basic.<span class='shy'></span>stc.<span class='shy'></span>static]</a>) or
thread (<a href='basic.stc.thread' title='6.7.5.3&emsp;Thread storage duration'>[basic.<span class='shy'></span>stc.<span class='shy'></span>thread]</a>) storage duration,
unless that variable is usable in constant expressions;
<div id='example-1' class='example'><div class='texpara'>[<i>Example&nbsp;<a href='#example-1'>1</a></i>:&ensp;<span class='codeblock'><span class='keyword'>constexpr</span> <span class='keyword'>char</span> test<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='curlybracket'>{</span>
  <span class='keyword'>static</span> <span class='keyword'>const</span> <span class='keyword'>int</span> x <span class='operator'>=</span> <span class='literal'>5</span>;
  <span class='keyword'>static</span> <span class='keyword'>constexpr</span> <span class='keyword'>char</span> c<span class='squarebracket'>[</span><span class='squarebracket'>]</span> <span class='operator'>=</span> <span class='literal'>"Hello World"</span>;
  <span class='keyword'>return</span> <span class='operator'>*</span><span class='parenthesis'>(</span>c <span class='operator'>+</span> x<span class='parenthesis'>)</span>;
<span class='curlybracket'>}</span>
<span class='keyword'>static_assert</span><span class='parenthesis'>(</span><span class='literal'>' '</span> <span class='operator'>=</span><span class='operator'>=</span> test<span class='parenthesis'>(</span><span class='parenthesis'>)</span><span class='parenthesis'>)</span>;
</span> —&nbsp;<i>end example</i>]</div></div></li><li id='5.3'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#5.3'>(5.3)</a></div>an invocation of a non-constexpr function;<a class='footnoteref' href='#footnote-68' id='footnoteref-68' title='Overload resolution ([over.match]) is applied as usual.'>68</a></li><li id='5.4'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#5.4'>(5.4)</a></div>an invocation of an undefined constexpr function;</li><li id='5.5'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#5.5'>(5.5)</a></div>an invocation of an instantiated constexpr function
that is not constexpr-suitable;</li><li id='5.6'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#5.6'>(5.6)</a></div>an invocation of a virtual function (<a href='class.virtual' title='11.7.3&emsp;Virtual functions'>[class.<span class='shy'></span>virtual]</a>)
for an object whose dynamic type is constexpr-unknown;</li><li id='5.7'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#5.7'>(5.7)</a></div>an expression that would exceed the implementation-defined
limits (see <a href='implimits' title='Annex B&emsp;(informative)&emsp;Implementation quantities'>[implimits]</a>);</li><li id='5.8'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#5.8'>(5.8)</a></div>an operation that would have undefined or erroneous behavior
as specified in <a href='intro' title='4&emsp;General principles'>[intro]</a> through <a href='cpp' title='15&emsp;Preprocessing directives'>[cpp]</a>,
excluding <a href='dcl.attr.assume' title='9.12.3&emsp;Assumption attribute'>[dcl.<span class='shy'></span>attr.<span class='shy'></span>assume]</a> and <a href='dcl.attr.noreturn' title='9.12.11&emsp;Noreturn attribute'>[dcl.<span class='shy'></span>attr.<span class='shy'></span>noreturn]</a>;<a class='footnoteref' href='#footnote-69' id='footnoteref-69' title='This includes, for example, signed integer overflow ([expr.pre]), certain pointer arithmetic ([expr.add]), division by zero ([expr.mul]), or certain shift operations ([expr.shift]).'>69</a></li><li id='5.9'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#5.9'>(5.9)</a></div>an <a href='conv.lval' title='7.3.2&emsp;Lvalue-to-rvalue conversion&emsp;[conv.lval]'>lvalue-to-rvalue conversion</a> unless
it is applied to
<ul class='itemize'><li id='5.9.1'><div class='marginalizedparent' style='left:-36mm'><a class='marginalized' href='#5.9.1'>(5.9.1)</a></div>a non-volatile glvalue that refers to an object that is
  usable in constant expressions, or</li><li id='5.9.2'><div class='marginalizedparent' style='left:-36mm'><a class='marginalized' href='#5.9.2'>(5.9.2)</a></div>a non-volatile glvalue of literal type that refers to a non-volatile object
  whose lifetime began within the evaluation of <span class='math'><span class='mathalpha'>E</span></span>;</li></ul></li><li id='5.10'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#5.10'>(5.10)</a></div>an lvalue-to-rvalue conversion
that is applied to a glvalue
that refers to a non-active member of a union or a subobject thereof;</li><li id='5.11'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#5.11'>(5.11)</a></div>an lvalue-to-rvalue conversion that is applied to
an object with an <a href='basic.indet#def:value,indeterminate' title='6.7.4&emsp;Indeterminate and erroneous values&emsp;[basic.indet]'>indeterminate value</a>;</li><li id='5.12'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#5.12'>(5.12)</a></div>an invocation of an implicitly-defined copy/move constructor or
copy/move assignment operator
for a union whose active member (if any) is mutable,
unless the lifetime of the union object began within the evaluation of <span class='math'><span class='mathalpha'>E</span></span>;</li><li id='5.13'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#5.13'>(5.13)</a></div>in a <a href='expr.prim.lambda.general#nt:lambda-expression' title='7.5.6.1&emsp;General&emsp;[expr.prim.lambda.general]'><span id='ntref:lambda-expression'><span class='textsf'><i >lambda-expression</i></span></span></a>,
a reference to <span id=':this_'><span class='texttt'><span class='keyword'>this</span></span></span> or to a variable with
automatic storage duration defined outside that
<a href='expr.prim.lambda.general#nt:lambda-expression' title='7.5.6.1&emsp;General&emsp;[expr.prim.lambda.general]'><span id='ntref:lambda-expression_'><span class='textsf'><i >lambda-expression</i></span></span></a>, where
the reference would be an odr-use (<a href='basic.def.odr#term.odr.use' title='6.3&emsp;One-definition rule'>[basic.<span class='shy'></span>def.<span class='shy'></span>odr]</a>, <a href='expr.prim.lambda' title='7.5.6&emsp;Lambda expressions'>[expr.<span class='shy'></span>prim.<span class='shy'></span>lambda]</a>);
<div id='example-2' class='example'><div class='texpara'>[<i>Example&nbsp;<a href='#example-2'>2</a></i>:&ensp;<span class='codeblock'><span class='keyword'>void</span> g<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='curlybracket'>{</span>
  <span class='keyword'>const</span> <span class='keyword'>int</span> n <span class='operator'>=</span> <span class='literal'>0</span>;
  <span class='squarebracket'>[</span><span class='operator'>=</span><span class='squarebracket'>]</span> <span class='curlybracket'>{</span>
    <span class='keyword'>constexpr</span> <span class='keyword'>int</span> i <span class='operator'>=</span> n;        <span class='comment'>// OK, <span class='tcode_in_codeblock'>n</span> is not odr-used here</span>
    <span class='keyword'>constexpr</span> <span class='keyword'>int</span> j <span class='operator'>=</span> <span class='operator'>*</span><span class='operator'>&amp;</span>n;      <span class='comment'>// error: <span class='tcode_in_codeblock'>&amp;n</span> would be an odr-use of <span class='tcode_in_codeblock'>n</span></span>
  <span class='curlybracket'>}</span>;
<span class='curlybracket'>}</span>
</span> —&nbsp;<i>end example</i>]</div></div>
<div id='note-3' class='note'><div class='texpara'>[<i>Note&nbsp;<a href='#note-3'>3</a></i>:&ensp;<div id='5.13.sentence-1' class='sentence'>If the odr-use occurs in an invocation
of a function call operator of a closure type,
it no longer refers to <span id=':this__'><span class='texttt'><span class='keyword'>this</span></span></span> or to an enclosing automatic variable
due to the transformation (<a href='expr.prim.lambda.capture' title='7.5.6.3&emsp;Captures'>[expr.<span class='shy'></span>prim.<span class='shy'></span>lambda.<span class='shy'></span>capture]</a>)
of the <a href='expr.prim.id.general#nt:id-expression' title='7.5.5.1&emsp;General&emsp;[expr.prim.id.general]'><span id='ntref:id-expression'><span class='textsf'><i >id-expression</i></span></span></a> into
an access of the corresponding data member<a class='hidden_link' href='#5.13.sentence-1'>.</a></div> <div id='example-3' class='example'><div class='texpara'>[<i>Example&nbsp;<a href='#example-3'>3</a></i>:&ensp;<span class='codeblock'><span class='keyword'>auto</span> monad <span class='operator'>=</span> <span class='squarebracket'>[</span><span class='squarebracket'>]</span><span class='parenthesis'>(</span><span class='keyword'>auto</span> v<span class='parenthesis'>)</span> <span class='curlybracket'>{</span> <span class='keyword'>return</span> <span class='squarebracket'>[</span><span class='operator'>=</span><span class='squarebracket'>]</span> <span class='curlybracket'>{</span> <span class='keyword'>return</span> v; <span class='curlybracket'>}</span>; <span class='curlybracket'>}</span>;
<span class='keyword'>auto</span> bind <span class='operator'>=</span> <span class='squarebracket'>[</span><span class='squarebracket'>]</span><span class='parenthesis'>(</span><span class='keyword'>auto</span> m<span class='parenthesis'>)</span> <span class='curlybracket'>{</span>
  <span class='keyword'>return</span> <span class='squarebracket'>[</span><span class='operator'>=</span><span class='squarebracket'>]</span><span class='parenthesis'>(</span><span class='keyword'>auto</span> fvm<span class='parenthesis'>)</span> <span class='curlybracket'>{</span> <span class='keyword'>return</span> fvm<span class='parenthesis'>(</span>m<span class='parenthesis'>(</span><span class='parenthesis'>)</span><span class='parenthesis'>)</span>; <span class='curlybracket'>}</span>;
<span class='curlybracket'>}</span>;

<span class='comment'>// OK to capture objects with automatic storage duration created during constant expression evaluation.</span>
<span class='keyword'>static_assert</span><span class='parenthesis'>(</span>bind<span class='parenthesis'>(</span>monad<span class='parenthesis'>(</span><span class='literal'>2</span><span class='parenthesis'>)</span><span class='parenthesis'>)</span><span class='parenthesis'>(</span>monad<span class='parenthesis'>)</span><span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='operator'>=</span><span class='operator'>=</span> monad<span class='parenthesis'>(</span><span class='literal'>2</span><span class='parenthesis'>)</span><span class='parenthesis'>(</span><span class='parenthesis'>)</span><span class='parenthesis'>)</span>;
</span> —&nbsp;<i>end example</i>]</div></div> —&nbsp;<i>end note</i>]</div></div></li><li id='5.14'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#5.14'>(5.14)</a></div>a conversion
from a prvalue <span class='texttt'>P</span> of type “pointer to <span class='mathit'>cv</span> <span id=':void'><span class='texttt'><span class='keyword'>void</span></span></span>”
to a type “<i >cv1</i> pointer to  <span class='texttt'>T</span>”,
where  <span class='texttt'>T</span> is not <i >cv2</i> <span id=':void_'><span class='texttt'><span class='keyword'>void</span></span></span>,
unless <span class='texttt'>P</span>
is a null pointer value or
points to an object whose type is similar to <span class='texttt'>T</span>;</li><li id='5.15'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#5.15'>(5.15)</a></div>a <span id=':reinterpret_cast'><span class='texttt'><span class='keyword'>reinterpret_<span class='shy'></span>cast</span></span></span> (<a href='expr.reinterpret.cast' title='7.6.1.10&emsp;Reinterpret cast'>[expr.<span class='shy'></span>reinterpret.<span class='shy'></span>cast]</a>);</li><li id='5.16'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#5.16'>(5.16)</a></div>a modification of an object (<a href='expr.ass' title='7.6.19&emsp;Assignment and compound assignment operators'>[expr.<span class='shy'></span>ass]</a>, <a href='expr.post.incr' title='7.6.1.6&emsp;Increment and decrement'>[expr.<span class='shy'></span>post.<span class='shy'></span>incr]</a>, <a href='expr.pre.incr' title='7.6.2.3&emsp;Increment and decrement'>[expr.<span class='shy'></span>pre.<span class='shy'></span>incr]</a>)
unless it is applied to a non-volatile lvalue of literal type
that refers to a non-volatile object
whose lifetime began within the evaluation of <span class='math'><span class='mathalpha'>E</span></span>;</li><li id='5.17'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#5.17'>(5.17)</a></div>an invocation of a destructor (<a href='class.dtor' title='11.4.7&emsp;Destructors'>[class.<span class='shy'></span>dtor]</a>) or a function call
whose <a href='expr.post.general#nt:postfix-expression' title='7.6.1.1&emsp;General&emsp;[expr.post.general]'><span id='ntref:postfix-expression_'><span class='textsf'><i >postfix-expression</i></span></span></a> names a pseudo-destructor (<a href='expr.call' title='7.6.1.3&emsp;Function call'>[expr.<span class='shy'></span>call]</a>),
in either case for an object whose lifetime did not begin within the evaluation of <span class='math'><span class='mathalpha'>E</span></span>;</li><li id='5.18'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#5.18'>(5.18)</a></div>a <a href='expr.new#nt:new-expression' title='7.6.2.8&emsp;New&emsp;[expr.new]'><span id='ntref:new-expression'><span class='textsf'><i >new-expression</i></span></span></a> (<a href='expr.new' title='7.6.2.8&emsp;New'>[expr.<span class='shy'></span>new]</a>),
unless either
<ul class='itemize'><li id='5.18.1'><div class='marginalizedparent' style='left:-36mm'><a class='marginalized' href='#5.18.1'>(5.18.1)</a></div>the selected allocation function is
a replaceable global allocation function (<a href='new.delete.single' title='17.6.3.2&emsp;Single-object forms'>[new.<span class='shy'></span>delete.<span class='shy'></span>single]</a>, <a href='new.delete.array' title='17.6.3.3&emsp;Array forms'>[new.<span class='shy'></span>delete.<span class='shy'></span>array]</a>) and
the allocated storage is deallocated within the evaluation of <span class='math'><span class='mathalpha'>E</span></span>, or</li><li id='5.18.2'><div class='marginalizedparent' style='left:-36mm'><a class='marginalized' href='#5.18.2'>(5.18.2)</a></div>the selected allocation function is
a non-allocating form (<a href='new.delete.placement' title='17.6.3.4&emsp;Non-allocating forms'>[new.<span class='shy'></span>delete.<span class='shy'></span>placement]</a>)
with an allocated type <span class='texttt'>T</span>, where
<ul class='itemize'><li id='5.18.2.1'><div class='marginalizedparent' style='left:-45mm'><a class='marginalized' href='#5.18.2.1'>(5.18.2.1)</a></div>the placement argument to the <a href='expr.new#nt:new-expression' title='7.6.2.8&emsp;New&emsp;[expr.new]'><span id='ntref:new-expression_'><span class='textsf'><i >new-expression</i></span></span></a> points to
an object that is pointer-interconvertible with an object of type <span class='texttt'>T</span> or,
if T is an array type,
with the first element of an object of type <span class='texttt'>T</span>, and</li><li id='5.18.2.2'><div class='marginalizedparent' style='left:-45mm'><a class='marginalized' href='#5.18.2.2'>(5.18.2.2)</a></div>the placement argument points to storage
whose duration began within the evaluation of <span class='math'><span class='mathalpha'>E</span></span>;</li></ul></li></ul></li><li id='5.19'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#5.19'>(5.19)</a></div>a <a href='expr.delete#nt:delete-expression' title='7.6.2.9&emsp;Delete&emsp;[expr.delete]'><span id='ntref:delete-expression'><span class='textsf'><i >delete-expression</i></span></span></a> (<a href='expr.delete' title='7.6.2.9&emsp;Delete'>[expr.<span class='shy'></span>delete]</a>),
unless it deallocates a region of storage
allocated within the evaluation of <span class='math'><span class='mathalpha'>E</span></span>;</li><li id='5.20'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#5.20'>(5.20)</a></div>a call to an instance of
<span class='texttt'>std<span class='operator'>&#x200b;::&#x200b;</span>allocator<span class='anglebracket'>&lt;</span>T<span class='anglebracket'>&gt;</span><span class='operator'>&#x200b;::&#x200b;</span>allocate</span> (<a href='allocator.members' title='20.2.10.2&emsp;Members'>[allocator.<span class='shy'></span>members]</a>),
unless the allocated storage is deallocated within the evaluation of <span class='math'><span class='mathalpha'>E</span></span>;</li><li id='5.21'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#5.21'>(5.21)</a></div>a call to an instance of
<span class='texttt'>std<span class='operator'>&#x200b;::&#x200b;</span>allocator<span class='anglebracket'>&lt;</span>T<span class='anglebracket'>&gt;</span><span class='operator'>&#x200b;::&#x200b;</span>deallocate</span> (<a href='allocator.members' title='20.2.10.2&emsp;Members'>[allocator.<span class='shy'></span>members]</a>),
unless it deallocates a region of storage
allocated within the evaluation of <span class='math'><span class='mathalpha'>E</span></span>;</li><li id='5.22'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#5.22'><span class="removed">(5.22)</span></a></div><span class="removed">an <a href='expr.await#nt:await-expression' title='7.6.2.4&emsp;Await&emsp;[expr.await]'><span id='ntref:await-expression'><span class='textsf'><i >await-expression</i></span></span></a> (<a href='expr.await' title='7.6.2.4&emsp;Await'>[expr.<span class='shy'></span>await]</a>);</span></li><li id='5.23'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#5.23'><span class="removed">(5.23)</span></a></div><span class="removed">a <a href='expr.yield#nt:yield-expression' title='7.6.17&emsp;Yielding a value&emsp;[expr.yield]'><span id='ntref:yield-expression'><span class='textsf'><i >yield-expression</i></span></span></a> (<a href='expr.yield' title='7.6.17&emsp;Yielding a value'>[expr.<span class='shy'></span>yield]</a>);</span></li><li id='5.24'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#5.24'>(5.24)</a></div>a three-way comparison (<a href='expr.spaceship' title='7.6.8&emsp;Three-way comparison operator'>[expr.<span class='shy'></span>spaceship]</a>),
relational (<a href='expr.rel' title='7.6.9&emsp;Relational operators'>[expr.<span class='shy'></span>rel]</a>), or equality (<a href='expr.eq' title='7.6.10&emsp;Equality operators'>[expr.<span class='shy'></span>eq]</a>)
operator where the result is unspecified;</li><li id='5.25'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#5.25'>(5.25)</a></div>a <a href='expr.throw#nt:throw-expression' title='7.6.18&emsp;Throwing an exception&emsp;[expr.throw]'><span id='ntref:throw-expression'><span class='textsf'><i >throw-expression</i></span></span></a> (<a href='expr.throw' title='7.6.18&emsp;Throwing an exception'>[expr.<span class='shy'></span>throw]</a>);</li><li id='5.26'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#5.26'>(5.26)</a></div>a <span id=':dynamic_cast'><span class='texttt'><span class='keyword'>dynamic_<span class='shy'></span>cast</span></span></span> (<a href='expr.dynamic.cast' title='7.6.1.7&emsp;Dynamic cast'>[expr.<span class='shy'></span>dynamic.<span class='shy'></span>cast]</a>) or
<span id=':typeid'><span class='texttt'><span class='keyword'>typeid</span></span></span> (<a href='expr.typeid' title='7.6.1.8&emsp;Type identification'>[expr.<span class='shy'></span>typeid]</a>) expression
on a glvalue that refers to an object
whose dynamic type is constexpr-unknown or
that would throw an exception;</li><li id='5.27'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#5.27'>(5.27)</a></div>an <a href='dcl.asm#nt:asm-declaration' title='9.10&emsp;The asm declaration&emsp;[dcl.asm]'><span id='ntref:asm-declaration'><span class='textsf'><i >asm-declaration</i></span></span></a> (<a href='dcl.asm' title='9.10&emsp;The asm declaration'>[dcl.<span class='shy'></span>asm]</a>);</li><li id='5.28'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#5.28'>(5.28)</a></div>an invocation of the <span class='texttt'>va_<span class='shy'></span>arg</span> macro (<a href='cstdarg.syn' title='17.13.2&emsp;Header &lt;cstdarg&gt; synopsis'>[cstdarg.<span class='shy'></span>syn]</a>);</li><li id='5.29'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#5.29'>(5.29)</a></div>a non-constant library call (<a href='defns.nonconst.libcall' title='3.34&emsp;non-constant library call'>[defns.<span class='shy'></span>nonconst.<span class='shy'></span>libcall]</a>);
or</li><li id='5.30'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#5.30'>(5.30)</a></div>a <span id=':goto'><span class='texttt'><span class='keyword'>goto</span></span></span> statement (<a href='stmt.goto' title='8.7.6&emsp;The goto statement'>[stmt.<span class='shy'></span>goto]</a>)<a class='hidden_link' href='#5.sentence-1'>.</a> <div class='texpara'><div id='note-4' class='note'><div class='texpara'>[<i>Note&nbsp;<a href='#note-4'>4</a></i>:&ensp;<div id='5.30.sentence-2' class='sentence'>A <span id=':goto_'><span class='texttt'><span class='keyword'>goto</span></span></span> statement introduced by equivalence (<a href='stmt.stmt' title='8&emsp;Statements'>[stmt.<span class='shy'></span>stmt]</a>)
is not in scope<a class='hidden_link' href='#5.30.sentence-2'>.</a></div> <div id='5.30.sentence-3' class='sentence'>For example, a <span id=':while'><span class='texttt'><span class='keyword'>while</span></span></span> statement (<a href='stmt.while' title='8.6.2&emsp;The while statement'>[stmt.<span class='shy'></span>while]</a>)
can be executed during constant evaluation<a class='hidden_link' href='#5.30.sentence-3'>.</a></div> —&nbsp;<i>end note</i>]</div></div></div></li></ul></div></div></div><div class='para' id='6'><div class='marginalizedparent'><a class='marginalized' href='#6'>6</a></div><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/expressions.tex#L7699'>#</a></div><div class='texpara'><div id='6.sentence-1' class='sentence'>It is unspecified whether <span class='math'><span class='mathalpha'>E</span></span> is a core constant expression
if <span class='math'><span class='mathalpha'>E</span></span> satisfies the constraints of a core constant expression, but
evaluation of <span class='math'><span class='mathalpha'>E</span></span> would evaluate
<ul class='itemize'><li id='6.1'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#6.1'>(6.1)</a></div>an operation that has undefined behavior
as specified in <a href='library' title='16&emsp;Library introduction'>[library]</a> through <a href='exec' title='34&emsp;Execution control library'>[exec]</a>,</li><li id='6.2'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#6.2'>(6.2)</a></div>an invocation of the <span class='texttt'>va_<span class='shy'></span>start</span> macro (<a href='cstdarg.syn' title='17.13.2&emsp;Header &lt;cstdarg&gt; synopsis'>[cstdarg.<span class='shy'></span>syn]</a>),</li><li id='6.3'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#6.3'>(6.3)</a></div>a call to a function
that was previously declared
with the <span class='texttt'>noreturn</span> attribute (<a href='dcl.attr.noreturn' title='9.12.11&emsp;Noreturn attribute'>[dcl.<span class='shy'></span>attr.<span class='shy'></span>noreturn]</a>) and
that call returns to its caller, or</li><li id='6.4'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#6.4'>(6.4)</a></div>a statement with an assumption (<a href='dcl.attr.assume' title='9.12.3&emsp;Assumption attribute'>[dcl.<span class='shy'></span>attr.<span class='shy'></span>assume]</a>)
whose converted <a href='expr.cond#nt:conditional-expression' title='7.6.16&emsp;Conditional operator&emsp;[expr.cond]'><span id='ntref:conditional-expression_'><span class='textsf'><i >conditional-expression</i></span></span></a>,
if evaluated where the assumption appears,
would not disqualify <span class='math'><span class='mathalpha'>E</span></span> from being a core constant expression and
would not evaluate to <span class='texttt'><span class='literal'>true</span></span><a class='hidden_link' href='#6.sentence-1'>.</a> <div class='texpara'><div id='note-5' class='note'><div class='texpara'>[<i>Note&nbsp;<a href='#note-5'>5</a></i>:&ensp;<div id='6.4.sentence-2' class='sentence'><span class='math'><span class='mathalpha'>E</span></span> is not disqualified from being a core constant expression
if the hypothetical evaluation of
the converted <a href='expr.cond#nt:conditional-expression' title='7.6.16&emsp;Conditional operator&emsp;[expr.cond]'><span id='ntref:conditional-expression__'><span class='textsf'><i >conditional-expression</i></span></span></a>
would disqualify <span class='math'><span class='mathalpha'>E</span></span> from being a core constant expression<a class='hidden_link' href='#6.4.sentence-2'>.</a></div> —&nbsp;<i>end note</i>]</div></div></div></li></ul></div> <div id='example-4' class='example'><div class='texpara'>[<i>Example&nbsp;<a href='#example-4'>4</a></i>:&ensp;<span class='codeblock'><span class='keyword'>int</span> x;                              <span class='comment'>// not constant</span>
<span class='keyword'>struct</span> A <span class='curlybracket'>{</span>
  <span class='keyword'>constexpr</span> A<span class='parenthesis'>(</span><span class='keyword'>bool</span> b<span class='parenthesis'>)</span> <span class='operator'>:</span> m<span class='parenthesis'>(</span>b<span class='operator'>?</span><span class='literal'>42</span><span class='operator'>:</span>x<span class='parenthesis'>)</span> <span class='curlybracket'>{</span> <span class='curlybracket'>}</span>
  <span class='keyword'>int</span> m;
<span class='curlybracket'>}</span>;
<span class='keyword'>constexpr</span> <span class='keyword'>int</span> v <span class='operator'>=</span> A<span class='parenthesis'>(</span><span class='literal'>true</span><span class='parenthesis'>)</span><span class='operator'>.</span>m;        <span class='comment'>// OK, constructor call initializes <span class='tcode_in_codeblock'>m</span> with the value <span class='tcode_in_codeblock'>42</span></span>

<span class='keyword'>constexpr</span> <span class='keyword'>int</span> w <span class='operator'>=</span> A<span class='parenthesis'>(</span><span class='literal'>false</span><span class='parenthesis'>)</span><span class='operator'>.</span>m;       <span class='comment'>// error: initializer for <span class='tcode_in_codeblock'>m</span> is <span class='tcode_in_codeblock'>x</span>, which is non-constant</span>

<span class='keyword'>constexpr</span> <span class='keyword'>int</span> f1<span class='parenthesis'>(</span><span class='keyword'>int</span> k<span class='parenthesis'>)</span> <span class='curlybracket'>{</span>
  <span class='keyword'>constexpr</span> <span class='keyword'>int</span> x <span class='operator'>=</span> k;              <span class='comment'>// error: <span class='tcode_in_codeblock'>x</span> is not initialized by a constant expression</span>
                                    <span class='comment'>// because lifetime of <span class='tcode_in_codeblock'>k</span> began outside the initializer of <span class='tcode_in_codeblock'>x</span></span>
  <span class='keyword'>return</span> x;
<span class='curlybracket'>}</span>
<span class='keyword'>constexpr</span> <span class='keyword'>int</span> f2<span class='parenthesis'>(</span><span class='keyword'>int</span> k<span class='parenthesis'>)</span> <span class='curlybracket'>{</span>
  <span class='keyword'>int</span> x <span class='operator'>=</span> k;                        <span class='comment'>// OK, not required to be a constant expression</span>
                                    <span class='comment'>// because <span class='tcode_in_codeblock'>x</span> is not <span id=':constexpr'><span class='tcode_in_codeblock'>constexpr</span></span></span>
  <span class='keyword'>return</span> x;
<span class='curlybracket'>}</span>

<span class='keyword'>constexpr</span> <span class='keyword'>int</span> incr<span class='parenthesis'>(</span><span class='keyword'>int</span> <span class='operator'>&amp;</span>n<span class='parenthesis'>)</span> <span class='curlybracket'>{</span>
  <span class='keyword'>return</span> <span class='operator'>+</span><span class='operator'>+</span>n;
<span class='curlybracket'>}</span>
<span class='keyword'>constexpr</span> <span class='keyword'>int</span> g<span class='parenthesis'>(</span><span class='keyword'>int</span> k<span class='parenthesis'>)</span> <span class='curlybracket'>{</span>
  <span class='keyword'>constexpr</span> <span class='keyword'>int</span> x <span class='operator'>=</span> incr<span class='parenthesis'>(</span>k<span class='parenthesis'>)</span>;        <span class='comment'>// error: <span class='tcode_in_codeblock'>incr(k)</span> is not a core constant expression</span>
                                    <span class='comment'>// because lifetime of <span class='tcode_in_codeblock'>k</span> began outside the expression <span class='tcode_in_codeblock'>incr(k)</span></span>
  <span class='keyword'>return</span> x;
<span class='curlybracket'>}</span>
<span class='keyword'>constexpr</span> <span class='keyword'>int</span> h<span class='parenthesis'>(</span><span class='keyword'>int</span> k<span class='parenthesis'>)</span> <span class='curlybracket'>{</span>
  <span class='keyword'>int</span> x <span class='operator'>=</span> incr<span class='parenthesis'>(</span>k<span class='parenthesis'>)</span>;                  <span class='comment'>// OK, <span class='tcode_in_codeblock'>incr(k)</span> is not required to be a core constant expression</span>
  <span class='keyword'>return</span> x;
<span class='curlybracket'>}</span>
<span class='keyword'>constexpr</span> <span class='keyword'>int</span> y <span class='operator'>=</span> h<span class='parenthesis'>(</span><span class='literal'>1</span><span class='parenthesis'>)</span>;             <span class='comment'>// OK, initializes <span class='tcode_in_codeblock'>y</span> with the value <span class='tcode_in_codeblock'>2</span></span>
                                    <span class='comment'>// <span class='tcode_in_codeblock'>h(1)</span> is a core constant expression because</span>
                                    <span class='comment'>// the lifetime of <span class='tcode_in_codeblock'>k</span> begins inside <span class='tcode_in_codeblock'>h(1)</span></span>
</span> —&nbsp;<i>end example</i>]</div></div></div></div>


<div class='para' id='7'><div class='marginalizedparent'><a class='marginalized' href='#7'>7</a></div><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/expressions.tex#L7767'>#</a></div><div class='texpara'><div id='7.sentence-1' class='sentence'>For the purposes of determining
whether an expression <span class='math'><span class='mathalpha'>E</span></span> is a core constant expression,
the evaluation of the body of a member function of <span class='texttt'>std<span class='operator'>&#x200b;::&#x200b;</span>allocator<span class='anglebracket'>&lt;</span>T<span class='anglebracket'>&gt;</span></span>
as defined in <a href='allocator.members' title='20.2.10.2&emsp;Members'>[allocator.<span class='shy'></span>members]</a>, where <span class='texttt'>T</span> is a literal type,
is ignored<a class='hidden_link' href='#7.sentence-1'>.</a></div></div></div>

<div class='para added' id='new-coroutine-constexpr'><div class='marginalizedparent'><a class='marginalized' href='#new-coroutine-constexpr'>�</a></div><div class='sourceLinkParent'>#</div><div class='texpara'><div id='7.sentence-1' class='sentence'>
  
  For the purposes of determining whether an expression E is a core constant expression, lifetimes of all coroutines created during evaluation of E shall end within the evaluation of E.
  
</div></div></div>



<div class='para' id='8'><div class='marginalizedparent'><a class='marginalized' href='#8'>8</a></div><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/expressions.tex#L7774'>#</a></div><div class='texpara'><div id='8.sentence-1' class='sentence'>For the purposes of determining whether <span class='math'><span class='mathalpha'>E</span></span> is a core constant expression,
the evaluation of a call to
a trivial copy/move constructor or copy/move assignment operator of a union
is considered to copy/move the active member of the union, if any<a class='hidden_link' href='#8.sentence-1'>.</a></div> <div id='note-6' class='note'><div class='texpara'>[<i>Note&nbsp;<a href='#note-6'>6</a></i>:&ensp;<div id='8.sentence-2' class='sentence'>The copy/move of the active member is trivial<a class='hidden_link' href='#8.sentence-2'>.</a></div> —&nbsp;<i>end note</i>]</div></div></div></div><div class='para' id='9'><div class='marginalizedparent'><a class='marginalized' href='#9'>9</a></div><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/expressions.tex#L7783'>#</a></div><div class='texpara'><div id='9.sentence-1' class='sentence'>During the evaluation of an expression <span class='math'><span class='mathalpha'>E</span></span> as a core constant expression,
all <a href='expr.prim.id.general#nt:id-expression' title='7.5.5.1&emsp;General&emsp;[expr.prim.id.general]'><span id='ntref:id-expression_'><span class='textsf'><i >id-expression</i></span></span></a><i >s</i> and uses of <span class='texttt'><span class='operator'>*</span><span id=':this___'><span class='texttt'><span class='keyword'>this</span></span></span></span>
that refer to an object or reference
whose lifetime did not begin with the evaluation of <span class='math'><span class='mathalpha'>E</span></span>
are treated as referring to a specific instance of that object or reference
whose lifetime and that of all subobjects (including all union members)
includes the entire constant evaluation<a class='hidden_link' href='#9.sentence-1'>.</a></div> <div id='9.sentence-2' class='sentence'>For such an object that is not usable in constant expressions,
the dynamic type of the object is <a class='hidden_link' href='#def:constexpr-unknown' title='7.7&emsp;Constant expressions&emsp;[expr.const]'><span id='def:constexpr-unknown'><i >constexpr-unknown</i></span></a><a class='hidden_link' href='#9.sentence-2'>.</a></div> <div id='9.sentence-3' class='sentence'>For such a reference that is not usable in constant expressions,
the reference is treated as binding to
an unspecified object of the referenced type
whose lifetime and that of all subobjects includes
the entire constant evaluation and whose dynamic type is constexpr-unknown<a class='hidden_link' href='#9.sentence-3'>.</a></div> <div id='example-5' class='example'><div class='texpara'>[<i>Example&nbsp;<a href='#example-5'>5</a></i>:&ensp;<span class='codeblock'><span class='keyword'>template</span> <span class='anglebracket'>&lt;</span><span class='keyword'>typename</span> T, size_t N<span class='anglebracket'>&gt;</span>
<span class='keyword'>constexpr</span> size_t array_size<span class='parenthesis'>(</span>T <span class='parenthesis'>(</span><span class='operator'>&amp;</span><span class='parenthesis'>)</span><span class='squarebracket'>[</span>N<span class='squarebracket'>]</span><span class='parenthesis'>)</span> <span class='curlybracket'>{</span>
  <span class='keyword'>return</span> N;
<span class='curlybracket'>}</span>

<span class='keyword'>void</span> use_array<span class='parenthesis'>(</span><span class='keyword'>int</span> <span class='keyword'>const</span> <span class='parenthesis'>(</span><span class='operator'>&amp;</span>gold_medal_mel<span class='parenthesis'>)</span><span class='squarebracket'>[</span><span class='literal'>2</span><span class='squarebracket'>]</span><span class='parenthesis'>)</span> <span class='curlybracket'>{</span>
  <span class='keyword'>constexpr</span> <span class='keyword'>auto</span> gold <span class='operator'>=</span> array_size<span class='parenthesis'>(</span>gold_medal_mel<span class='parenthesis'>)</span>;     <span class='comment'>// OK</span>
<span class='curlybracket'>}</span>

<span class='keyword'>constexpr</span> <span class='keyword'>auto</span> olympic_mile<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='curlybracket'>{</span>
  <span class='keyword'>const</span> <span class='keyword'>int</span> ledecky <span class='operator'>=</span> <span class='literal'>1500</span>;
  <span class='keyword'>return</span> <span class='squarebracket'>[</span><span class='squarebracket'>]</span><span class='curlybracket'>{</span> <span class='keyword'>return</span> ledecky; <span class='curlybracket'>}</span>;
<span class='curlybracket'>}</span>
<span class='keyword'>static_assert</span><span class='parenthesis'>(</span>olympic_mile<span class='parenthesis'>(</span><span class='parenthesis'>)</span><span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='operator'>=</span><span class='operator'>=</span> <span class='literal'>1500</span><span class='parenthesis'>)</span>;                <span class='comment'>// OK</span>

<span class='keyword'>struct</span> Swim <span class='curlybracket'>{</span>
  <span class='keyword'>constexpr</span> <span class='keyword'>int</span> phelps<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='curlybracket'>{</span> <span class='keyword'>return</span> <span class='literal'>28</span>; <span class='curlybracket'>}</span>
  <span class='keyword'>virtual</span> <span class='keyword'>constexpr</span> <span class='keyword'>int</span> lochte<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='curlybracket'>{</span> <span class='keyword'>return</span> <span class='literal'>12</span>; <span class='curlybracket'>}</span>
  <span class='keyword'>int</span> coughlin <span class='operator'>=</span> <span class='literal'>12</span>;
<span class='curlybracket'>}</span>;

<span class='keyword'>constexpr</span> <span class='keyword'>int</span> how_many<span class='parenthesis'>(</span>Swim<span class='operator'>&amp;</span> swam<span class='parenthesis'>)</span> <span class='curlybracket'>{</span>
  Swim<span class='operator'>*</span> p <span class='operator'>=</span> <span class='operator'>&amp;</span>swam;
  <span class='keyword'>return</span> <span class='parenthesis'>(</span>p <span class='operator'>+</span> <span class='literal'>1</span> <span class='operator'>-</span> <span class='literal'>1</span><span class='parenthesis'>)</span><span class='operator'>-</span><span class='anglebracket'>&gt;</span>phelps<span class='parenthesis'>(</span><span class='parenthesis'>)</span>;
<span class='curlybracket'>}</span>

<span class='keyword'>void</span> splash<span class='parenthesis'>(</span>Swim<span class='operator'>&amp;</span> swam<span class='parenthesis'>)</span> <span class='curlybracket'>{</span>
  <span class='keyword'>static_assert</span><span class='parenthesis'>(</span>swam<span class='operator'>.</span>phelps<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='operator'>=</span><span class='operator'>=</span> <span class='literal'>28</span><span class='parenthesis'>)</span>;           <span class='comment'>// OK</span>
  <span class='keyword'>static_assert</span><span class='parenthesis'>(</span><span class='parenthesis'>(</span><span class='operator'>&amp;</span>swam<span class='parenthesis'>)</span><span class='operator'>-</span><span class='anglebracket'>&gt;</span>phelps<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='operator'>=</span><span class='operator'>=</span> <span class='literal'>28</span><span class='parenthesis'>)</span>;       <span class='comment'>// OK</span>

  Swim<span class='operator'>*</span> pswam <span class='operator'>=</span> <span class='operator'>&amp;</span>swam;
  <span class='keyword'>static_assert</span><span class='parenthesis'>(</span>pswam<span class='operator'>-</span><span class='anglebracket'>&gt;</span>phelps<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='operator'>=</span><span class='operator'>=</span> <span class='literal'>28</span><span class='parenthesis'>)</span>;         <span class='comment'>// error: lvalue-to-rvalue conversion on a pointer</span>
                                                <span class='comment'>// not usable in constant expressions</span>

  <span class='keyword'>static_assert</span><span class='parenthesis'>(</span>how_many<span class='parenthesis'>(</span>swam<span class='parenthesis'>)</span> <span class='operator'>=</span><span class='operator'>=</span> <span class='literal'>28</span><span class='parenthesis'>)</span>;          <span class='comment'>// OK</span>
  <span class='keyword'>static_assert</span><span class='parenthesis'>(</span>Swim<span class='parenthesis'>(</span><span class='parenthesis'>)</span><span class='operator'>.</span>lochte<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='operator'>=</span><span class='operator'>=</span> <span class='literal'>12</span><span class='parenthesis'>)</span>;         <span class='comment'>// OK</span>

  <span class='keyword'>static_assert</span><span class='parenthesis'>(</span>swam<span class='operator'>.</span>lochte<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='operator'>=</span><span class='operator'>=</span> <span class='literal'>12</span><span class='parenthesis'>)</span>;           <span class='comment'>// error: invoking virtual function on reference</span>
                                                <span class='comment'>// with constexpr-unknown dynamic type</span>

  <span class='keyword'>static_assert</span><span class='parenthesis'>(</span>swam<span class='operator'>.</span>coughlin <span class='operator'>=</span><span class='operator'>=</span> <span class='literal'>12</span><span class='parenthesis'>)</span>;           <span class='comment'>// error: lvalue-to-rvalue conversion on an object</span>
                                                <span class='comment'>// not usable in constant expressions</span>
<span class='curlybracket'>}</span>

<span class='keyword'>extern</span> Swim dc;
<span class='keyword'>extern</span> Swim<span class='operator'>&amp;</span> trident;

<span class='keyword'>constexpr</span> <span class='keyword'>auto</span><span class='operator'>&amp;</span> sandeno   <span class='operator'>=</span> <span class='keyword'>typeid</span><span class='parenthesis'>(</span>dc<span class='parenthesis'>)</span>;         <span class='comment'>// OK, can only be <span class='tcode_in_codeblock'>typeid(Swim)</span></span>
<span class='keyword'>constexpr</span> <span class='keyword'>auto</span><span class='operator'>&amp;</span> gallagher <span class='operator'>=</span> <span class='keyword'>typeid</span><span class='parenthesis'>(</span>trident<span class='parenthesis'>)</span>;    <span class='comment'>// error: constexpr-unknown dynamic type</span>
</span> —&nbsp;<i>end example</i>]</div></div></div></div><div class='para' id='10'><div class='marginalizedparent'><a class='marginalized' href='#10'>10</a></div><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/expressions.tex#L7852'>#</a></div><div class='texpara'><div id='10.sentence-1' class='sentence'>An object <span class='texttt'>a</span> is said to have <a class='hidden_link' href='#def:destruction,constant' title='7.7&emsp;Constant expressions&emsp;[expr.const]'><span id='def:destruction,constant'><i >constant destruction</i></span></a> if
<ul class='itemize'><li id='10.1'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#10.1'>(10.1)</a></div>it is not of class type nor (possibly multidimensional) array thereof, or</li><li id='10.2'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#10.2'>(10.2)</a></div>it is of class type or (possibly multidimensional) array thereof,
  that class type has a constexpr destructor, and
  for a hypothetical expression <span class='math'><span class='mathalpha'>E</span></span>
  whose only effect is to destroy <span class='texttt'>a</span>,
  <span class='math'><span class='mathalpha'>E</span></span> would be a core constant expression
  if the lifetime of <span class='texttt'>a</span> and its non-mutable subobjects
  (but not its mutable subobjects) were considered to start within <span class='math'><span class='mathalpha'>E</span></span><a class='hidden_link' href='#10.sentence-1'>.</a></li></ul></div></div></div><div class='para' id='11'><div class='marginalizedparent'><a class='marginalized' href='#11'>11</a></div><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/expressions.tex#L7867'>#</a></div><div class='texpara'><div id='11.sentence-1' class='sentence'>An <a class='hidden_link' href='#def:expression,integral_constant' title='7.7&emsp;Constant expressions&emsp;[expr.const]'><span id='def:expression,integral_constant'><i >integral constant expression</i></span></a>
is an expression of integral or
unscoped enumeration type, implicitly converted to a prvalue, where the converted expression is a core constant expression<a class='hidden_link' href='#11.sentence-1'>.</a></div> <div id='note-7' class='note'><div class='texpara'>[<i>Note&nbsp;<a href='#note-7'>7</a></i>:&ensp;<div id='11.sentence-2' class='sentence'>Such expressions can be
used as bit-field lengths (<a href='class.bit' title='11.4.10&emsp;Bit-fields'>[class.<span class='shy'></span>bit]</a>), as enumerator
initializers if the underlying type is not fixed (<a href='dcl.enum' title='9.7.1&emsp;Enumeration declarations'>[dcl.<span class='shy'></span>enum]</a>),
and as <a href='dcl.align' title='9.12.2&emsp;Alignment specifier&emsp;[dcl.align]'>alignments</a><a class='hidden_link' href='#11.sentence-2'>.</a></div> —&nbsp;<i>end note</i>]</div></div></div></div><div class='para' id='12'><div class='marginalizedparent'><a class='marginalized' href='#12'>12</a></div><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/expressions.tex#L7878'>#</a></div><div class='texpara'><div id='12.sentence-1' class='sentence'>If an expression of literal class type is used in a context where an
integral constant expression is required, then that expression is
contextually implicitly converted (<a href='conv' title='7.3&emsp;Standard conversions'>[conv]</a>) to an integral or unscoped
enumeration type
and the selected conversion function shall be <span id=':constexpr_'><span class='texttt'><span class='keyword'>constexpr</span></span></span><a class='hidden_link' href='#12.sentence-1'>.</a></div> <div id='example-6' class='example'><div class='texpara'>[<i>Example&nbsp;<a href='#example-6'>6</a></i>:&ensp;<span class='codeblock'><span class='keyword'>struct</span> A <span class='curlybracket'>{</span>
  <span class='keyword'>constexpr</span> A<span class='parenthesis'>(</span><span class='keyword'>int</span> i<span class='parenthesis'>)</span> <span class='operator'>:</span> val<span class='parenthesis'>(</span>i<span class='parenthesis'>)</span> <span class='curlybracket'>{</span> <span class='curlybracket'>}</span>
  <span class='keyword'>constexpr</span> <span class='keyword'>operator</span> <span class='keyword'>int</span><span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span> <span class='curlybracket'>{</span> <span class='keyword'>return</span> val; <span class='curlybracket'>}</span>
  <span class='keyword'>constexpr</span> <span class='keyword'>operator</span> <span class='keyword'>long</span><span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span> <span class='curlybracket'>{</span> <span class='keyword'>return</span> <span class='literal'>42</span>; <span class='curlybracket'>}</span>
<span class='keyword'>private</span><span class='operator'>:</span>
  <span class='keyword'>int</span> val;
<span class='curlybracket'>}</span>;
<span class='keyword'>constexpr</span> A a <span class='operator'>=</span> <span class='keyword'>alignof</span><span class='parenthesis'>(</span><span class='keyword'>int</span><span class='parenthesis'>)</span>;
<span class='keyword'>alignas</span><span class='parenthesis'>(</span>a<span class='parenthesis'>)</span> <span class='keyword'>int</span> n;               <span class='comment'>// error: ambiguous conversion</span>
<span class='keyword'>struct</span> B <span class='curlybracket'>{</span> <span class='keyword'>int</span> n <span class='operator'>:</span> a; <span class='curlybracket'>}</span>;        <span class='comment'>// error: ambiguous conversion</span>
</span> —&nbsp;<i>end example</i>]</div></div></div></div><div class='para' id='13'><div class='marginalizedparent'><a class='marginalized' href='#13'>13</a></div><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/expressions.tex#L7899'>#</a></div><div class='texpara'><div id='13.sentence-1' class='sentence'>A <a class='hidden_link' href='#def:expression,converted_constant' title='7.7&emsp;Constant expressions&emsp;[expr.const]'><span id='def:expression,converted_constant'><i >converted constant expression</i></span></a>
of type <span class='texttt'>T</span> is an
expression, implicitly converted to type <span class='texttt'>T</span>, where
the converted expression is a constant expression and the
implicit conversion sequence contains only
<ul class='itemize'><li id='13.1'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#13.1'>(13.1)</a></div>user-defined conversions,</li><li id='13.2'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#13.2'>(13.2)</a></div>lvalue-to-rvalue conversions (<a href='conv.lval' title='7.3.2&emsp;Lvalue-to-rvalue conversion'>[conv.<span class='shy'></span>lval]</a>),</li><li id='13.3'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#13.3'>(13.3)</a></div>array-to-pointer conversions (<a href='conv.array' title='7.3.3&emsp;Array-to-pointer conversion'>[conv.<span class='shy'></span>array]</a>),</li><li id='13.4'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#13.4'>(13.4)</a></div>function-to-pointer conversions (<a href='conv.func' title='7.3.4&emsp;Function-to-pointer conversion'>[conv.<span class='shy'></span>func]</a>),</li><li id='13.5'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#13.5'>(13.5)</a></div>qualification conversions (<a href='conv.qual' title='7.3.6&emsp;Qualification conversions'>[conv.<span class='shy'></span>qual]</a>),</li><li id='13.6'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#13.6'>(13.6)</a></div>integral promotions (<a href='conv.prom' title='7.3.7&emsp;Integral promotions'>[conv.<span class='shy'></span>prom]</a>),</li><li id='13.7'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#13.7'>(13.7)</a></div>integral conversions (<a href='conv.integral' title='7.3.9&emsp;Integral conversions'>[conv.<span class='shy'></span>integral]</a>) other than narrowing conversions (<a href='dcl.init.list' title='9.4.5&emsp;List-initialization'>[dcl.<span class='shy'></span>init.<span class='shy'></span>list]</a>),</li><li id='13.8'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#13.8'>(13.8)</a></div>floating-point promotions (<a href='conv.fpprom' title='7.3.8&emsp;Floating-point promotion'>[conv.<span class='shy'></span>fpprom]</a>),</li><li id='13.9'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#13.9'>(13.9)</a></div>floating-point conversions (<a href='conv.double' title='7.3.10&emsp;Floating-point conversions'>[conv.<span class='shy'></span>double]</a>) where
  the source value can be represented exactly in the destination type,</li><li id='13.10'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#13.10'>(13.10)</a></div>null pointer conversions (<a href='conv.ptr' title='7.3.12&emsp;Pointer conversions'>[conv.<span class='shy'></span>ptr]</a>) from <span class='texttt'>std<span class='operator'>&#x200b;::&#x200b;</span>nullptr_<span class='shy'></span>t</span>,</li><li id='13.11'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#13.11'>(13.11)</a></div>null member pointer conversions (<a href='conv.mem' title='7.3.13&emsp;Pointer-to-member conversions'>[conv.<span class='shy'></span>mem]</a>) from <span class='texttt'>std<span class='operator'>&#x200b;::&#x200b;</span>nullptr_<span class='shy'></span>t</span>, and</li><li id='13.12'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#13.12'>(13.12)</a></div>function pointer conversions (<a href='conv.fctptr' title='7.3.14&emsp;Function pointer conversions'>[conv.<span class='shy'></span>fctptr]</a>),</li></ul>
and where the reference binding (if any) binds directly<a class='hidden_link' href='#13.sentence-1'>.</a></div> <div id='note-8' class='note'><div class='texpara'>[<i>Note&nbsp;<a href='#note-8'>8</a></i>:&ensp;<div id='13.sentence-2' class='sentence'>Such expressions can be used in <span id=':new'><span class='texttt'><span class='keyword'>new</span></span></span>
expressions (<a href='expr.new' title='7.6.2.8&emsp;New'>[expr.<span class='shy'></span>new]</a>), as case expressions (<a href='stmt.switch' title='8.5.3&emsp;The switch statement'>[stmt.<span class='shy'></span>switch]</a>),
as enumerator initializers if the underlying type is
<a href='dcl.enum#def:type,underlying,fixed' title='9.7.1&emsp;Enumeration declarations&emsp;[dcl.enum]'>fixed</a>, as <a href='dcl.array' title='9.3.4.5&emsp;Arrays&emsp;[dcl.array]'>array</a> bounds, and
as non-type <a href='temp.arg' title='13.4&emsp;Template arguments&emsp;[temp.arg]'>template arguments</a><a class='hidden_link' href='#13.sentence-2'>.</a></div> —&nbsp;<i>end note</i>]</div></div> <div id='13.sentence-3' class='sentence'><a class='index' id=':conversion,contextual_to_constant_expression_of_type_bool'></a>A <a class='hidden_link' href='#def:contextually_converted_constant_expression_of_type_bool' id='def:contextually_converted_constant_expression_of_type_bool'><i>contextually converted constant expression of type <span class='texttt'><span class='keyword'>bool</span></span></i></a> is
an expression, contextually converted to <span id=':bool'><span class='texttt'><span class='keyword'>bool</span></span></span> (<a href='conv' title='7.3&emsp;Standard conversions'>[conv]</a>),
where the converted expression is a constant expression and
the conversion sequence contains only the conversions above<a class='hidden_link' href='#13.sentence-3'>.</a></div></div></div><div class='para' id='14'><div class='marginalizedparent'><a class='marginalized' href='#14'>14</a></div><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/expressions.tex#L7935'>#</a></div><div class='texpara'><div id='14.sentence-1' class='sentence'>A <a class='hidden_link' href='#def:expression,constant' title='7.7&emsp;Constant expressions&emsp;[expr.const]'><span id='def:expression,constant_'><i >constant expression</i></span></a> is either
a glvalue core constant expression that refers to
an entity that is a permitted result of a constant expression (as defined below), or
a prvalue core constant expression whose value
satisfies the following constraints:
<ul class='itemize'><li id='14.1'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#14.1'>(14.1)</a></div>if the value is an object of class type,
  each non-static data member of reference type refers to
  an entity that is a permitted result of a constant expression,</li><li id='14.2'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#14.2'>(14.2)</a></div>if the value is an object of scalar type,
  it does not have an indeterminate or erroneous value (<a href='basic.indet' title='6.7.4&emsp;Indeterminate and erroneous values'>[basic.<span class='shy'></span>indet]</a>),</li><li id='14.3'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#14.3'>(14.3)</a></div>if the value is of pointer type, it contains
  the address of an object with static storage duration,
  the address past the end of such an object (<a href='expr.add' title='7.6.6&emsp;Additive operators'>[expr.<span class='shy'></span>add]</a>),
  the address of a non-immediate function,
  or a null pointer value,</li><li id='14.4'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#14.4'>(14.4)</a></div>if the value is of pointer-to-member-function type,
  it does not designate an immediate function, and</li><li id='14.5'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#14.5'>(14.5)</a></div>if the value is an object of class or array type,
  each subobject satisfies these constraints for the value<a class='hidden_link' href='#14.sentence-1'>.</a></li></ul></div> <div id='14.sentence-2' class='sentence'>
An entity is a
<a class='hidden_link' href='#def:constant_expression,permitted_result_of' title='7.7&emsp;Constant expressions&emsp;[expr.const]'><span id='def:constant_expression,permitted_result_of'><i >permitted result of a constant expression</i></span></a>
if it is an
object with static storage duration that either is not a temporary object or is
a temporary object whose value satisfies the above constraints, or if
it is a non-immediate function<a class='hidden_link' href='#14.sentence-2'>.</a></div> <div id='note-9' class='note'><div class='texpara'>[<i>Note&nbsp;<a href='#note-9'>9</a></i>:&ensp;<div id='14.sentence-3' class='sentence'>A glvalue core constant expression
that either refers to or points to an unspecified object
is not a constant expression<a class='hidden_link' href='#14.sentence-3'>.</a></div> —&nbsp;<i>end note</i>]</div></div> <div id='example-7' class='example'><div class='texpara'>[<i>Example&nbsp;<a href='#example-7'>7</a></i>:&ensp;<span class='codeblock'><span class='keyword'>consteval</span> <span class='keyword'>int</span> f<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='curlybracket'>{</span> <span class='keyword'>return</span> <span class='literal'>42</span>; <span class='curlybracket'>}</span>
<span class='keyword'>consteval</span> <span class='keyword'>auto</span> g<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='curlybracket'>{</span> <span class='keyword'>return</span> f; <span class='curlybracket'>}</span>
<span class='keyword'>consteval</span> <span class='keyword'>int</span> h<span class='parenthesis'>(</span><span class='keyword'>int</span> <span class='parenthesis'>(</span><span class='operator'>*</span>p<span class='parenthesis'>)</span><span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='operator'>=</span> g<span class='parenthesis'>(</span><span class='parenthesis'>)</span><span class='parenthesis'>)</span> <span class='curlybracket'>{</span> <span class='keyword'>return</span> p<span class='parenthesis'>(</span><span class='parenthesis'>)</span>; <span class='curlybracket'>}</span>
<span class='keyword'>constexpr</span> <span class='keyword'>int</span> r <span class='operator'>=</span> h<span class='parenthesis'>(</span><span class='parenthesis'>)</span>;                          <span class='comment'>// OK</span>
<span class='keyword'>constexpr</span> <span class='keyword'>auto</span> e <span class='operator'>=</span> g<span class='parenthesis'>(</span><span class='parenthesis'>)</span>;                         <span class='comment'>// error: a pointer to an immediate function is</span>
                                                <span class='comment'>// not a permitted result of a constant expression</span>

<span class='keyword'>struct</span> S <span class='curlybracket'>{</span>
  <span class='keyword'>int</span> x;
  <span class='keyword'>constexpr</span> S<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='curlybracket'>{</span><span class='curlybracket'>}</span>
<span class='curlybracket'>}</span>;
<span class='keyword'>int</span> i<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='curlybracket'>{</span>
  <span class='keyword'>constexpr</span> S s;                                <span class='comment'>// error: <span class='tcode_in_codeblock'>s.x</span> has erroneous value</span>
<span class='curlybracket'>}</span>
</span> —&nbsp;<i>end example</i>]</div></div></div></div><div class='para' id='15'><div class='marginalizedparent'><a class='marginalized' href='#15'>15</a></div><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/expressions.tex#L7996'>#</a></div><div class='texpara'><div id='15.sentence-1' class='sentence'><i >Recommended practice</i>: Implementations should provide consistent results of floating-point evaluations,
irrespective of whether the evaluation is performed
during translation or during program execution<a class='hidden_link' href='#15.sentence-1'>.</a></div> <div id='note-10' class='note'><div class='texpara'>[<i>Note&nbsp;<a href='#note-10'>10</a></i>:&ensp;<div id='15.sentence-2' class='sentence'>Since this document
imposes no restrictions on the accuracy of floating-point operations, it is unspecified whether the
evaluation of a floating-point expression during translation yields the same result as the
evaluation of the same expression (or the same operations on the same values) during program
execution<a class='hidden_link' href='#15.sentence-2'>.</a></div> <div id='example-8' class='example'><div class='texpara'>[<i>Example&nbsp;<a href='#example-8'>8</a></i>:&ensp;<span class='codeblock'><span class='keyword'>bool</span> f<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='curlybracket'>{</span>
    <span class='keyword'>char</span> array<span class='squarebracket'>[</span><span class='literal'>1</span> <span class='operator'>+</span> <span class='keyword'>int</span><span class='parenthesis'>(</span><span class='literal'>1</span> <span class='operator'>+</span> <span class='literal'>0.2</span> <span class='operator'>-</span> <span class='literal'>0.1</span> <span class='operator'>-</span> <span class='literal'>0.1</span><span class='parenthesis'>)</span><span class='squarebracket'>]</span>;   <span class='comment'>// Must be evaluated during translation</span>
    <span class='keyword'>int</span> size <span class='operator'>=</span> <span class='literal'>1</span> <span class='operator'>+</span> <span class='keyword'>int</span><span class='parenthesis'>(</span><span class='literal'>1</span> <span class='operator'>+</span> <span class='literal'>0.2</span> <span class='operator'>-</span> <span class='literal'>0.1</span> <span class='operator'>-</span> <span class='literal'>0.1</span><span class='parenthesis'>)</span>;    <span class='comment'>// May be evaluated at runtime</span>
    <span class='keyword'>return</span> <span class='keyword'>sizeof</span><span class='parenthesis'>(</span>array<span class='parenthesis'>)</span> <span class='operator'>=</span><span class='operator'>=</span> size;
<span class='curlybracket'>}</span>
</span> <div id='15.sentence-3' class='sentence'>
It is unspecified whether the value of <span class='texttt'>f<span class='parenthesis'>(</span><span class='parenthesis'>)</span></span> will be <span class='texttt'><span class='literal'>true</span></span> or <span class='texttt'><span class='literal'>false</span></span><a class='hidden_link' href='#15.sentence-3'>.</a></div> —&nbsp;<i>end example</i>]</div></div> —&nbsp;<i>end note</i>]</div></div></div></div><div class='para' id='16'><div class='marginalizedparent'><a class='marginalized' href='#16'>16</a></div><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/expressions.tex#L8019'>#</a></div><div class='texpara'><div id='16.sentence-1' class='sentence'>An expression or conversion is in an <a class='hidden_link' href='#def:immediate_function_context' title='7.7&emsp;Constant expressions&emsp;[expr.const]'><span id='def:immediate_function_context'><i >immediate function context</i></span></a>
if it is potentially evaluated and either:
<ul class='itemize'><li id='16.1'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#16.1'>(16.1)</a></div>its innermost enclosing non-block scope is
a function parameter scope of an immediate function,</li><li id='16.2'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#16.2'>(16.2)</a></div>it is a subexpression of a manifestly constant-evaluated expression
or conversion, or</li><li id='16.3'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#16.3'>(16.3)</a></div>its enclosing statement is enclosed (<a href='stmt.pre' title='8.1&emsp;Preamble'>[stmt.<span class='shy'></span>pre]</a>) by
the <a href='stmt.block#nt:compound-statement' title='8.4&emsp;Compound statement or block&emsp;[stmt.block]'><span id='ntref:compound-statement'><span class='textsf'><i >compound-statement</i></span></span></a> of a consteval if statement (<a href='stmt.if' title='8.5.2&emsp;The if statement'>[stmt.<span class='shy'></span>if]</a>)<a class='hidden_link' href='#16.sentence-1'>.</a></li></ul></div> <div id='16.sentence-2' class='sentence'>
An invocation is an <a class='hidden_link' href='#def:immediate_invocation' title='7.7&emsp;Constant expressions&emsp;[expr.const]'><span id='def:immediate_invocation'><i >immediate invocation</i></span></a>
if it is a potentially-evaluated explicit or implicit invocation of
an immediate function and
is not in an immediate function context<a class='hidden_link' href='#16.sentence-2'>.</a></div> <div id='16.sentence-3' class='sentence'>An aggregate initialization is an immediate invocation
if it evaluates a default member initializer
that has a subexpression that is an immediate-escalating expression<a class='hidden_link' href='#16.sentence-3'>.</a></div></div></div><div class='para' id='17'><div class='marginalizedparent'><a class='marginalized' href='#17'>17</a></div><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/expressions.tex#L8041'>#</a></div><div class='texpara'><div id='17.sentence-1' class='sentence'><a class='index' id='def:expression,immediate-escalating'></a><a class='index' id='def:conversion,immediate-escalating'></a><a class='index' id='def:immediate-escalating,expression|seeexpression,_immediate-escalating'></a><a class='index' id='def:immediate-escalating,conversion|seeconversion,_immediate-escalating'></a>An expression or conversion is <a class='hidden_link' href='#def:immediate-escalating' title='7.7&emsp;Constant expressions&emsp;[expr.const]'><span id='def:immediate-escalating'><i >immediate-escalating</i></span></a>
if it is not initially in an immediate function context
and it is either
<ul class='itemize'><li id='17.1'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#17.1'>(17.1)</a></div>a potentially-evaluated <a href='expr.prim.id.general#nt:id-expression' title='7.5.5.1&emsp;General&emsp;[expr.prim.id.general]'><span id='ntref:id-expression__'><span class='textsf'><i >id-expression</i></span></span></a>
that denotes an immediate function
that is not a subexpression of an immediate invocation, or</li><li id='17.2'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#17.2'>(17.2)</a></div>an immediate invocation that is not a constant expression
and is not a subexpression of an immediate invocation<a class='hidden_link' href='#17.sentence-1'>.</a></li></ul></div></div></div><div class='para' id='18'><div class='marginalizedparent'><a class='marginalized' href='#18'>18</a></div><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/expressions.tex#L8059'>#</a></div><div class='texpara'><div id='18.sentence-1' class='sentence'><a class='index' id='def:immediate-escalating,function|seefunction,_immediate-escalating'></a>An <a class='hidden_link' href='#def:function,immediate-escalating' title='7.7&emsp;Constant expressions&emsp;[expr.const]'><span id='def:function,immediate-escalating'><i >immediate-escalating</i></span></a> function is
<ul class='itemize'><li id='18.1'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#18.1'>(18.1)</a></div>the call operator of a lambda that is not declared
with the <span id=':consteval'><span class='texttt'><span class='keyword'>consteval</span></span></span> specifier,</li><li id='18.2'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#18.2'>(18.2)</a></div>a defaulted special member function
that is not declared with the <span id=':consteval_'><span class='texttt'><span class='keyword'>consteval</span></span></span> specifier, or</li><li id='18.3'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#18.3'>(18.3)</a></div>a function that results from the instantiation
of a templated entity defined with the <span id=':constexpr__'><span class='texttt'><span class='keyword'>constexpr</span></span></span> specifier<a class='hidden_link' href='#18.sentence-1'>.</a></li></ul></div> <div id='18.sentence-2' class='sentence'>
An immediate-escalating expression shall appear only
in an immediate-escalating function<a class='hidden_link' href='#18.sentence-2'>.</a></div></div></div><div class='para' id='19'><div class='marginalizedparent'><a class='marginalized' href='#19'>19</a></div><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/expressions.tex#L8076'>#</a></div><div class='texpara'><div id='19.sentence-1' class='sentence'>An <a class='hidden_link' href='#def:function,immediate' title='7.7&emsp;Constant expressions&emsp;[expr.const]'><span id='def:function,immediate'><i >immediate function</i></span></a> is a function or constructor that is
<ul class='itemize'><li id='19.1'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#19.1'>(19.1)</a></div>declared with the <span id=':consteval__'><span class='texttt'><span class='keyword'>consteval</span></span></span> specifier, or</li><li id='19.2'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#19.2'>(19.2)</a></div>an immediate-escalating function <span class='texttt'><i >F</i></span>
whose function body contains an immediate-escalating expression <span class='texttt'><i >E</i></span>
such that <span class='texttt'><i >E</i></span>'s innermost enclosing non-block scope
is <span class='texttt'><i >F</i></span>'s function parameter scope<a class='hidden_link' href='#19.sentence-1'>.</a> <div class='texpara'><div id='note-11' class='note'><div class='texpara'>[<i>Note&nbsp;<a href='#note-11'>11</a></i>:&ensp;<div id='19.2.sentence-2' class='sentence'>Default member initializers used to initialize
a base or member subobject (<a href='class.base.init' title='11.9.3&emsp;Initializing bases and members'>[class.<span class='shy'></span>base.<span class='shy'></span>init]</a>)
are considered to be part of the function body (<a href='dcl.fct.def.general' title='9.5.1&emsp;General'>[dcl.<span class='shy'></span>fct.<span class='shy'></span>def.<span class='shy'></span>general]</a>)<a class='hidden_link' href='#19.2.sentence-2'>.</a></div> —&nbsp;<i>end note</i>]</div></div></div></li></ul></div> <div id='example-9' class='example'><div class='texpara'>[<i>Example&nbsp;<a href='#example-9'>9</a></i>:&ensp;<span class='codeblock'><span class='keyword'>consteval</span> <span class='keyword'>int</span> id<span class='parenthesis'>(</span><span class='keyword'>int</span> i<span class='parenthesis'>)</span> <span class='curlybracket'>{</span> <span class='keyword'>return</span> i; <span class='curlybracket'>}</span>
<span class='keyword'>constexpr</span> <span class='keyword'>char</span> id<span class='parenthesis'>(</span><span class='keyword'>char</span> c<span class='parenthesis'>)</span> <span class='curlybracket'>{</span> <span class='keyword'>return</span> c; <span class='curlybracket'>}</span>

<span class='keyword'>template</span><span class='anglebracket'>&lt;</span><span class='keyword'>class</span> T<span class='anglebracket'>&gt;</span>
<span class='keyword'>constexpr</span> <span class='keyword'>int</span> f<span class='parenthesis'>(</span>T t<span class='parenthesis'>)</span> <span class='curlybracket'>{</span>
  <span class='keyword'>return</span> t <span class='operator'>+</span> id<span class='parenthesis'>(</span>t<span class='parenthesis'>)</span>;
<span class='curlybracket'>}</span>

<span class='keyword'>auto</span> a <span class='operator'>=</span> <span class='operator'>&amp;</span>f<span class='anglebracket'>&lt;</span><span class='keyword'>char</span><span class='anglebracket'>&gt;</span>;              <span class='comment'>// OK, <span class='tcode_in_codeblock'>f&lt;char&gt;</span> is not an immediate function</span>
<span class='keyword'>auto</span> b <span class='operator'>=</span> <span class='operator'>&amp;</span>f<span class='anglebracket'>&lt;</span><span class='keyword'>int</span><span class='anglebracket'>&gt;</span>;               <span class='comment'>// error: <span class='tcode_in_codeblock'>f&lt;int&gt;</span> is an immediate function</span>

<span class='keyword'>static_assert</span><span class='parenthesis'>(</span>f<span class='parenthesis'>(</span><span class='literal'>3</span><span class='parenthesis'>)</span> <span class='operator'>=</span><span class='operator'>=</span> <span class='literal'>6</span><span class='parenthesis'>)</span>;       <span class='comment'>// OK</span>

<span class='keyword'>template</span><span class='anglebracket'>&lt;</span><span class='keyword'>class</span> T<span class='anglebracket'>&gt;</span>
<span class='keyword'>constexpr</span> <span class='keyword'>int</span> g<span class='parenthesis'>(</span>T t<span class='parenthesis'>)</span> <span class='curlybracket'>{</span>          <span class='comment'>// <span class='tcode_in_codeblock'>g&lt;int&gt;</span> is not an immediate function</span>
  <span class='keyword'>return</span> t <span class='operator'>+</span> id<span class='parenthesis'>(</span><span class='literal'>42</span><span class='parenthesis'>)</span>;            <span class='comment'>// because <span class='tcode_in_codeblock'>id(42)</span> is already a constant</span>
<span class='curlybracket'>}</span>

<span class='keyword'>template</span><span class='anglebracket'>&lt;</span><span class='keyword'>class</span> T, <span class='keyword'>class</span> F<span class='anglebracket'>&gt;</span>
<span class='keyword'>constexpr</span> <span class='keyword'>bool</span> is_not<span class='parenthesis'>(</span>T t, F f<span class='parenthesis'>)</span> <span class='curlybracket'>{</span>
  <span class='keyword'>return</span> not f<span class='parenthesis'>(</span>t<span class='parenthesis'>)</span>;
<span class='curlybracket'>}</span>

<span class='keyword'>consteval</span> <span class='keyword'>bool</span> is_even<span class='parenthesis'>(</span><span class='keyword'>int</span> i<span class='parenthesis'>)</span> <span class='curlybracket'>{</span> <span class='keyword'>return</span> i <span class='operator'>%</span> <span class='literal'>2</span> <span class='operator'>=</span><span class='operator'>=</span> <span class='literal'>0</span>; <span class='curlybracket'>}</span>

<span class='keyword'>static_assert</span><span class='parenthesis'>(</span>is_not<span class='parenthesis'>(</span><span class='literal'>5</span>, is_even<span class='parenthesis'>)</span><span class='parenthesis'>)</span>;      <span class='comment'>// OK</span>

<span class='keyword'>int</span> x <span class='operator'>=</span> <span class='literal'>0</span>;

<span class='keyword'>template</span><span class='anglebracket'>&lt;</span><span class='keyword'>class</span> T<span class='anglebracket'>&gt;</span>
<span class='keyword'>constexpr</span> T h<span class='parenthesis'>(</span>T t <span class='operator'>=</span> id<span class='parenthesis'>(</span>x<span class='parenthesis'>)</span><span class='parenthesis'>)</span> <span class='curlybracket'>{</span>    <span class='comment'>// <span class='tcode_in_codeblock'>h&lt;int&gt;</span> is not an immediate function</span>
                                <span class='comment'>// <span class='tcode_in_codeblock'>id(x)</span> is not evaluated when parsing the default argument (<a href='dcl.fct.default' title='9.3.4.7&emsp;Default arguments'>[dcl.<span class='shy'></span>fct.<span class='shy'></span>default]</a>, <a href='temp.inst' title='13.9.2&emsp;Implicit instantiation'>[temp.<span class='shy'></span>inst]</a>)</span>
    <span class='keyword'>return</span> t;
<span class='curlybracket'>}</span>

<span class='keyword'>template</span><span class='anglebracket'>&lt;</span><span class='keyword'>class</span> T<span class='anglebracket'>&gt;</span>
<span class='keyword'>constexpr</span> T hh<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='curlybracket'>{</span>              <span class='comment'>// <span class='tcode_in_codeblock'>hh&lt;int&gt;</span> is an immediate function because of the invocation</span>
  <span class='keyword'>return</span> h<span class='anglebracket'>&lt;</span>T<span class='anglebracket'>&gt;</span><span class='parenthesis'>(</span><span class='parenthesis'>)</span>;                <span class='comment'>// of the immediate function <span class='tcode_in_codeblock'>id</span> in the default argument of <span class='tcode_in_codeblock'>h&lt;int&gt;</span></span>
<span class='curlybracket'>}</span>

<span class='keyword'>int</span> i <span class='operator'>=</span> hh<span class='anglebracket'>&lt;</span><span class='keyword'>int</span><span class='anglebracket'>&gt;</span><span class='parenthesis'>(</span><span class='parenthesis'>)</span>;              <span class='comment'>// error: <span class='tcode_in_codeblock'>hh&lt;int&gt;()</span> is an immediate-escalating expression</span>
                                <span class='comment'>// outside of an immediate-escalating function</span>

<span class='keyword'>struct</span> A <span class='curlybracket'>{</span>
  <span class='keyword'>int</span> x;
  <span class='keyword'>int</span> y <span class='operator'>=</span> id<span class='parenthesis'>(</span>x<span class='parenthesis'>)</span>;
<span class='curlybracket'>}</span>;

<span class='keyword'>template</span><span class='anglebracket'>&lt;</span><span class='keyword'>class</span> T<span class='anglebracket'>&gt;</span>
<span class='keyword'>constexpr</span> <span class='keyword'>int</span> k<span class='parenthesis'>(</span><span class='keyword'>int</span><span class='parenthesis'>)</span> <span class='curlybracket'>{</span>          <span class='comment'>// <span class='tcode_in_codeblock'>k&lt;int&gt;</span> is not an immediate function because <span class='tcode_in_codeblock'>A(42)</span> is a</span>
  <span class='keyword'>return</span> A<span class='parenthesis'>(</span><span class='literal'>42</span><span class='parenthesis'>)</span><span class='operator'>.</span>y;               <span class='comment'>// constant expression and thus not immediate-escalating</span>
<span class='curlybracket'>}</span>
</span> —&nbsp;<i>end example</i>]</div></div></div></div><div class='para' id='20'><div class='marginalizedparent'><a class='marginalized' href='#20'>20</a></div><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/expressions.tex#L8150'>#</a></div><div class='texpara'><div id='20.sentence-1' class='sentence'>An expression or conversion is <a class='hidden_link' href='#def:manifestly_constant-evaluated' title='7.7&emsp;Constant expressions&emsp;[expr.const]'><span id='def:manifestly_constant-evaluated'><i >manifestly constant-evaluated</i></span></a>
if it is:
<ul class='itemize'><li id='20.1'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#20.1'>(20.1)</a></div>a <a href='#nt:constant-expression' title='7.7&emsp;Constant expressions&emsp;[expr.const]'><span id='ntref:constant-expression_'><span class='textsf'><i >constant-expression</i></span></span></a>, or</li><li id='20.2'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#20.2'>(20.2)</a></div>the condition of a constexpr if statement (<a href='stmt.if' title='8.5.2&emsp;The if statement'>[stmt.<span class='shy'></span>if]</a>), or</li><li id='20.3'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#20.3'>(20.3)</a></div>an immediate invocation, or</li><li id='20.4'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#20.4'>(20.4)</a></div>the result of substitution into an atomic constraint expression
to determine whether it is satisfied (<a href='temp.constr.atomic' title='13.5.2.3&emsp;Atomic constraints'>[temp.<span class='shy'></span>constr.<span class='shy'></span>atomic]</a>), or</li><li id='20.5'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#20.5'>(20.5)</a></div>the initializer of a variable
that is usable in constant expressions or
has constant initialization (<a href='basic.start.static' title='6.9.3.2&emsp;Static initialization'>[basic.<span class='shy'></span>start.<span class='shy'></span>static]</a>)<a class='hidden_link' href='#20.sentence-1'>.</a><a class='footnoteref' href='#footnote-70' id='footnoteref-70' title='Testing this condition can involve a trial evaluation of its initializer as described above.'>70</a> <div class='texpara'><div id='example-10' class='example'><div class='texpara'>[<i>Example&nbsp;<a href='#example-10'>10</a></i>:&ensp;<span class='codeblock'><span class='keyword'>template</span><span class='anglebracket'>&lt;</span><span class='keyword'>bool</span><span class='anglebracket'>&gt;</span> <span class='keyword'>struct</span> X <span class='curlybracket'>{</span><span class='curlybracket'>}</span>;
X<span class='anglebracket'>&lt;</span>std<span class='operator'>::</span>is_constant_evaluated<span class='parenthesis'>(</span><span class='parenthesis'>)</span><span class='anglebracket'>&gt;</span> x;                      <span class='comment'>// type <span class='tcode_in_codeblock'>X&lt;true&gt;</span></span>
<span class='keyword'>int</span> y;
<span class='keyword'>const</span> <span class='keyword'>int</span> a <span class='operator'>=</span> std<span class='operator'>::</span>is_constant_evaluated<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='operator'>?</span> y <span class='operator'>:</span> <span class='literal'>1</span>;     <span class='comment'>// dynamic initialization to 1</span>
<span class='keyword'>double</span> z<span class='squarebracket'>[</span>a<span class='squarebracket'>]</span>;                                            <span class='comment'>// error: <span class='tcode_in_codeblock'>a</span> is not usable</span>
                                                        <span class='comment'>// in constant expressions</span>
<span class='keyword'>const</span> <span class='keyword'>int</span> b <span class='operator'>=</span> std<span class='operator'>::</span>is_constant_evaluated<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='operator'>?</span> <span class='literal'>2</span> <span class='operator'>:</span> y;     <span class='comment'>// static initialization to 2</span>
<span class='keyword'>int</span> c <span class='operator'>=</span> y <span class='operator'>+</span> <span class='parenthesis'>(</span>std<span class='operator'>::</span>is_constant_evaluated<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='operator'>?</span> <span class='literal'>2</span> <span class='operator'>:</span> y<span class='parenthesis'>)</span>;     <span class='comment'>// dynamic initialization to <span class='tcode_in_codeblock'>y+y</span></span>

<span class='keyword'>constexpr</span> <span class='keyword'>int</span> f<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='curlybracket'>{</span>
  <span class='keyword'>const</span> <span class='keyword'>int</span> n <span class='operator'>=</span> std<span class='operator'>::</span>is_constant_evaluated<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='operator'>?</span> <span class='literal'>13</span> <span class='operator'>:</span> <span class='literal'>17</span>; <span class='comment'>// <span class='tcode_in_codeblock'>n</span> is 13</span>
  <span class='keyword'>int</span> m <span class='operator'>=</span> std<span class='operator'>::</span>is_constant_evaluated<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='operator'>?</span> <span class='literal'>13</span> <span class='operator'>:</span> <span class='literal'>17</span>;       <span class='comment'>// <span class='tcode_in_codeblock'>m</span> can be 13 or 17 (see below)</span>
  <span class='keyword'>char</span> arr<span class='squarebracket'>[</span>n<span class='squarebracket'>]</span> <span class='operator'>=</span> <span class='curlybracket'>{</span><span class='curlybracket'>}</span>; <span class='comment'>// char[13]</span>
  <span class='keyword'>return</span> m <span class='operator'>+</span> <span class='keyword'>sizeof</span><span class='parenthesis'>(</span>arr<span class='parenthesis'>)</span>;
<span class='curlybracket'>}</span>
<span class='keyword'>int</span> p <span class='operator'>=</span> f<span class='parenthesis'>(</span><span class='parenthesis'>)</span>;                                            <span class='comment'>// <span class='tcode_in_codeblock'>m</span> is 13; initialized to 26</span>
<span class='keyword'>int</span> q <span class='operator'>=</span> p <span class='operator'>+</span> f<span class='parenthesis'>(</span><span class='parenthesis'>)</span>;                                        <span class='comment'>// <span class='tcode_in_codeblock'>m</span> is 17 for this call; initialized to 56</span>
</span> —&nbsp;<i>end example</i>]</div></div></div></li></ul></div> <div id='note-12' class='note'><div class='texpara'>[<i>Note&nbsp;<a href='#note-12'>12</a></i>:&ensp;<div id='20.sentence-2' class='sentence'>Except for a <a href='dcl.pre#nt:static_assert-message' title='9.1&emsp;Preamble&emsp;[dcl.pre]'><span id='ntref:static_assert-message'><span class='textsf'><i >static_assert-message</i></span></span></a>,
a manifestly constant-evaluated expression
is evaluated even in an unevaluated operand (<a href='expr.context#term.unevaluated.operand' title='7.2.3&emsp;Context dependence'>[expr.<span class='shy'></span>context]</a>)<a class='hidden_link' href='#20.sentence-2'>.</a></div> —&nbsp;<i>end note</i>]</div></div></div></div><div class='para' id='21'><div class='marginalizedparent'><a class='marginalized' href='#21'>21</a></div><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/expressions.tex#L8194'>#</a></div><div class='texpara'><div id='21.sentence-1' class='sentence'><a class='index' id=':expression,potentially_constant_evaluated'></a>An expression or conversion is <a class='hidden_link' href='#def:potentially_constant_evaluated' title='7.7&emsp;Constant expressions&emsp;[expr.const]'><span id='def:potentially_constant_evaluated'><i >potentially constant evaluated</i></span></a>
if it is:
<ul class='itemize'><li id='21.1'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#21.1'>(21.1)</a></div>a manifestly constant-evaluated expression,</li><li id='21.2'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#21.2'>(21.2)</a></div>a <a href='basic.def.odr#def:potentially_evaluated' title='6.3&emsp;One-definition rule&emsp;[basic.def.odr]'>potentially-evaluated</a> expression,</li><li id='21.3'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#21.3'>(21.3)</a></div>an immediate subexpression of a <a href='dcl.init.general#nt:braced-init-list' title='9.4.1&emsp;General&emsp;[dcl.init.general]'><span id='ntref:braced-init-list'><span class='textsf'><i >braced-init-list</i></span></span></a>,<a class='footnoteref' href='#footnote-71' id='footnoteref-71' title='In some cases, constant evaluation is needed to determine whether a narrowing conversion is performed ([dcl.init.list]).'>71</a></li><li id='21.4'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#21.4'>(21.4)</a></div>an expression of the form <span class='texttt'><span class='operator'>&amp;</span></span> <a href='expr.cast#nt:cast-expression' title='7.6.3&emsp;Explicit type conversion (cast notation)&emsp;[expr.cast]'><span id='ntref:cast-expression'><span class='textsf'><i >cast-expression</i></span></span></a>
that occurs within a templated entity,<a class='footnoteref' href='#footnote-72' id='footnoteref-72' title='In some cases, constant evaluation is needed to determine whether such an expression is value-dependent ([temp.dep.constexpr]).'>72</a>
or</li><li id='21.5'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#21.5'>(21.5)</a></div>a potentially-evaluated subexpression (<a href='intro.execution' title='6.9.1&emsp;Sequential execution'>[intro.<span class='shy'></span>execution]</a>) of one of the above<a class='hidden_link' href='#21.sentence-1'>.</a></li></ul></div></div><div class='texpara'><div id='21.sentence-2' class='sentence'><a class='index' id=':function,needed_for_constant_evaluation'></a><a class='index' id=':variable,needed_for_constant_evaluation'></a>A function or variable is
<a class='hidden_link' href='#def:needed_for_constant_evaluation' title='7.7&emsp;Constant expressions&emsp;[expr.const]'><span id='def:needed_for_constant_evaluation'><i >needed for constant evaluation</i></span></a>
if it is:
<ul class='itemize'><li id='21.6'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#21.6'>(21.6)</a></div>a constexpr function that
<a href='basic.def.odr#def:function,named_by_expression_or_conversion' title='6.3&emsp;One-definition rule&emsp;[basic.def.odr]'>is named by</a>
an expression
that is potentially constant evaluated, or</li><li id='21.7'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#21.7'>(21.7)</a></div>a potentially-constant variable named by a potentially constant evaluated expression<a class='hidden_link' href='#21.sentence-2'>.</a></li></ul></div></div><div class='texpara'></div></div><div class='footnoteSeparator'></div><div class='footnote' id='footnote-68'><div class='texpara'><a class='footnotenum' href='#footnote-68'>68)</a><a class='footnoteBacklink' href='#footnoteref-68'>68)</a> <div id='footnote-68.sentence-1' class='sentence'>Overload resolution (<a href='over.match' title='12.2&emsp;Overload resolution'>[over.<span class='shy'></span>match]</a>)
is applied as usual<a class='hidden_link' href='#footnote-68.sentence-1'>.</a></div></div></div><div class='footnote' id='footnote-69'><div class='texpara'><a class='footnotenum' href='#footnote-69'>69)</a><a class='footnoteBacklink' href='#footnoteref-69'>69)</a> <div id='footnote-69.sentence-1' class='sentence'>This includes,
for example, signed integer overflow (<a href='expr.pre' title='7.1&emsp;Preamble'>[expr.<span class='shy'></span>pre]</a>), certain
pointer arithmetic (<a href='expr.add' title='7.6.6&emsp;Additive operators'>[expr.<span class='shy'></span>add]</a>), division by
zero (<a href='expr.mul' title='7.6.5&emsp;Multiplicative operators'>[expr.<span class='shy'></span>mul]</a>), or certain shift operations (<a href='expr.shift' title='7.6.7&emsp;Shift operators'>[expr.<span class='shy'></span>shift]</a>)<a class='hidden_link' href='#footnote-69.sentence-1'>.</a></div></div></div><div class='footnote' id='footnote-70'><div class='texpara'><a class='footnotenum' href='#footnote-70'>70)</a><a class='footnoteBacklink' href='#footnoteref-70'>70)</a> <div id='footnote-70.sentence-1' class='sentence'>Testing this condition
can involve a trial evaluation of its initializer as described above<a class='hidden_link' href='#footnote-70.sentence-1'>.</a></div></div></div><div class='footnote' id='footnote-71'><div class='texpara'><a class='footnotenum' href='#footnote-71'>71)</a><a class='footnoteBacklink' href='#footnoteref-71'>71)</a> <div id='footnote-71.sentence-1' class='sentence'>In some cases, constant evaluation is needed to determine whether a narrowing conversion is performed (<a href='dcl.init.list' title='9.4.5&emsp;List-initialization'>[dcl.<span class='shy'></span>init.<span class='shy'></span>list]</a>)<a class='hidden_link' href='#footnote-71.sentence-1'>.</a></div></div></div><div class='footnote' id='footnote-72'><div class='texpara'><a class='footnotenum' href='#footnote-72'>72)</a><a class='footnoteBacklink' href='#footnoteref-72'>72)</a> <div id='footnote-72.sentence-1' class='sentence'>In some cases, constant evaluation is needed to determine whether such an expression is value-dependent (<a href='temp.dep.constexpr' title='13.8.3.4&emsp;Value-dependent expressions'>[temp.<span class='shy'></span>dep.<span class='shy'></span>constexpr]</a>)<a class='hidden_link' href='#footnote-72.sentence-1'>.</a></div></div></div>
  </div>
  <div class="wording">
    <h3 ><a class='secnum' style='min-width:80pt'>9.2.6</a> The <span class='texttt'>constexpr</span> and <span class='texttt'>consteval</span> specifiers <a class='abbr_ref'>[dcl.constexpr]</a></h3><div class='texpara'><a class='index' id=':specifier,constexpr'></a>
<a class='index' id=':specifier,consteval'></a></div><div class='para' id='1'><div class='marginalizedparent'><a class='marginalized' href='#1'>1</a></div><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/declarations.tex#L851'>#</a></div><div class='texpara'><div id='1.sentence-1' class='sentence'>The <span id=':constexpr'><span class='texttt'><span class='keyword'>constexpr</span></span></span> specifier shall be applied only to
the definition of a variable or variable template or
the declaration of a function or function template<a class='hidden_link' href='#1.sentence-1'>.</a></div> <div id='1.sentence-2' class='sentence'>The <span id=':consteval'><span class='texttt'><span class='keyword'>consteval</span></span></span> specifier shall be applied only to
the declaration of a function or function template<a class='hidden_link' href='#1.sentence-2'>.</a></div> <div id='1.sentence-3' class='sentence'>A function or static data member
declared with the <span id=':constexpr_'><span class='texttt'><span class='keyword'>constexpr</span></span></span> or <span id=':consteval_'><span class='texttt'><span class='keyword'>consteval</span></span></span> specifier
on its first declaration
is implicitly an inline function or variable (<a href='dcl.inline' title='9.2.8&emsp;The inline specifier'>[dcl.<span class='shy'></span>inline]</a>)<a class='hidden_link' href='#1.sentence-3'>.</a></div> <div id='1.sentence-4' class='sentence'>If any declaration of a function or function template has
a <span id=':constexpr__'><span class='texttt'><span class='keyword'>constexpr</span></span></span> or <span id=':consteval__'><span class='texttt'><span class='keyword'>consteval</span></span></span> specifier,
then all its declarations shall contain the same specifier<a class='hidden_link' href='#1.sentence-4'>.</a></div> <div id='note-1' class='note'><div class='texpara'>[<i>Note&nbsp;<a href='#note-1'>1</a></i>:&ensp;<div id='1.sentence-5' class='sentence'>An explicit specialization can differ from the template declaration
with respect to the <span id=':constexpr___'><span class='texttt'><span class='keyword'>constexpr</span></span></span> or <span id=':consteval___'><span class='texttt'><span class='keyword'>consteval</span></span></span> specifier<a class='hidden_link' href='#1.sentence-5'>.</a></div> —&nbsp;<i>end note</i>]</div></div> <div id='note-2' class='note'><div class='texpara'>[<i>Note&nbsp;<a href='#note-2'>2</a></i>:&ensp;<div id='1.sentence-6' class='sentence'>Function parameters cannot be declared <span id=':constexpr____'><span class='texttt'><span class='keyword'>constexpr</span></span></span><a class='hidden_link' href='#1.sentence-6'>.</a></div> —&nbsp;<i>end note</i>]</div></div> <div id='example-1' class='example'><div class='texpara'>[<i>Example&nbsp;<a href='#example-1'>1</a></i>:&ensp;<span class='codeblock'><span class='keyword'>constexpr</span> <span class='keyword'>void</span> square<span class='parenthesis'>(</span><span class='keyword'>int</span> <span class='operator'>&amp;</span>x<span class='parenthesis'>)</span>;  <span class='comment'>// OK, declaration</span>
<span class='keyword'>constexpr</span> <span class='keyword'>int</span> bufsz <span class='operator'>=</span> <span class='literal'>1024</span>;     <span class='comment'>// OK, definition</span>
<span class='keyword'>constexpr</span> <span class='keyword'>struct</span> pixel <span class='curlybracket'>{</span>        <span class='comment'>// error: <span class='tcode_in_codeblock'>pixel</span> is a type</span>
  <span class='keyword'>int</span> x;
  <span class='keyword'>int</span> y;
  <span class='keyword'>constexpr</span> pixel<span class='parenthesis'>(</span><span class='keyword'>int</span><span class='parenthesis'>)</span>;         <span class='comment'>// OK, declaration</span>
<span class='curlybracket'>}</span>;
<span class='keyword'>constexpr</span> pixel<span class='operator'>::</span>pixel<span class='parenthesis'>(</span><span class='keyword'>int</span> a<span class='parenthesis'>)</span>
  <span class='operator'>:</span> x<span class='parenthesis'>(</span>a<span class='parenthesis'>)</span>, y<span class='parenthesis'>(</span>x<span class='parenthesis'>)</span>                  <span class='comment'>// OK, definition</span>
  <span class='curlybracket'>{</span> square<span class='parenthesis'>(</span>x<span class='parenthesis'>)</span>; <span class='curlybracket'>}</span>
<span class='keyword'>constexpr</span> pixel small<span class='parenthesis'>(</span><span class='literal'>2</span><span class='parenthesis'>)</span>;       <span class='comment'>// error: <span class='tcode_in_codeblock'>square</span> not defined, so <span class='tcode_in_codeblock'>small(2)</span></span>
                                <span class='comment'>// not constant (<a href='expr.const' title='7.7&emsp;Constant expressions'>[expr.<span class='shy'></span>const]</a>) so <span id=':constexpr_____'><span class='tcode_in_codeblock'>constexpr</span></span> not satisfied</span>

<span class='keyword'>constexpr</span> <span class='keyword'>void</span> square<span class='parenthesis'>(</span><span class='keyword'>int</span> <span class='operator'>&amp;</span>x<span class='parenthesis'>)</span> <span class='curlybracket'>{</span> <span class='comment'>// OK, definition</span>
  x <span class='operator'>*</span><span class='operator'>=</span> x;
<span class='curlybracket'>}</span>
<span class='keyword'>constexpr</span> pixel large<span class='parenthesis'>(</span><span class='literal'>4</span><span class='parenthesis'>)</span>;       <span class='comment'>// OK, <span class='tcode_in_codeblock'>square</span> defined</span>
<span class='keyword'>int</span> next<span class='parenthesis'>(</span><span class='keyword'>constexpr</span> <span class='keyword'>int</span> x<span class='parenthesis'>)</span> <span class='curlybracket'>{</span>     <span class='comment'>// error: not for parameters</span>
     <span class='keyword'>return</span> x <span class='operator'>+</span> <span class='literal'>1</span>;
<span class='curlybracket'>}</span>
<span class='keyword'>extern</span> <span class='keyword'>constexpr</span> <span class='keyword'>int</span> memsz;     <span class='comment'>// error: not a definition</span>
</span> —&nbsp;<i>end example</i>]</div></div></div></div><div class='para' id='2'><div class='marginalizedparent'><a class='marginalized' href='#2'>2</a></div><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/declarations.tex#L897'>#</a></div><div class='texpara'><div id='2.sentence-1' class='sentence'>A <span id=':constexpr______'><span class='texttt'><span class='keyword'>constexpr</span></span></span> or <span id=':consteval____'><span class='texttt'><span class='keyword'>consteval</span></span></span> specifier
used in the declaration of a function
declares that function to be
a <a class='hidden_link' href='#def:specifier,constexpr,function' title='9.2.6&emsp;The constexpr and consteval specifiers&emsp;[dcl.constexpr]'><span id='def:specifier,constexpr,function'><i >constexpr function</i></span></a><a class='hidden_link' href='#2.sentence-1'>.</a></div> <div id='note-3' class='note'><div class='texpara'>[<i>Note&nbsp;<a href='#note-3'>3</a></i>:&ensp;<div id='2.sentence-2' class='sentence'>A function or constructor declared with the <span id=':consteval_____'><span class='texttt'><span class='keyword'>consteval</span></span></span> specifier
is an immediate function (<a href='expr.const' title='7.7&emsp;Constant expressions'>[expr.<span class='shy'></span>const]</a>)<a class='hidden_link' href='#2.sentence-2'>.</a></div> —&nbsp;<i>end note</i>]</div></div> <div id='2.sentence-3' class='sentence'>
A destructor, an allocation function, or a deallocation function
shall not be declared with the <span id=':consteval______'><span class='texttt'><span class='keyword'>consteval</span></span></span> specifier<a class='hidden_link' href='#2.sentence-3'>.</a></div></div></div><div class='para' id='3'><div class='marginalizedparent'><a class='marginalized' href='#3'>3</a></div><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/declarations.tex#L909'>#</a></div><div class='texpara'><div id='3.sentence-1' class='sentence'><a class='index' id=':specifier,constexpr,function'></a><a class='index' id=':constexpr_function'></a>A function is <span class='added'>not</span> <a class='hidden_link' href='#def:constexpr-suitable' title='9.2.6&emsp;The constexpr and consteval specifiers&emsp;[dcl.constexpr]'><span id='def:constexpr-suitable'><i >constexpr-suitable</i></span></a> <span class="removed">if</span>
<ul class='itemize'><li id='3.1'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#3.1'><span class="removed">(3.1)</span></a></div><span class='removed'>it is not a coroutine (<a href='dcl.fct.def.coroutine' title='9.5.4&emsp;Coroutine definitions'>[dcl.<span class='shy'></span>fct.<span class='shy'></span>def.<span class='shy'></span>coroutine]</a>), and</span></li><li id='3.2'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#3.2'><span class="removed">(3.2)</span></a></div>if the function is a constructor or destructor, <span class="added">and</span>
its class <span class="removed">does not have </span><span class="added">has</span> any virtual base classes<a class='hidden_link' href='#3.sentence-1'>.</a></li></ul></div> <div id='3.sentence-2' class='sentence'>
Except for instantiated constexpr functions,
non-templated constexpr functions shall be constexpr-suitable<a class='hidden_link' href='#3.sentence-2'>.</a></div></div><div class='texpara'><div id='example-2' class='example'><div class='texpara'>[<i>Example&nbsp;<a href='#example-2'>2</a></i>:&ensp;<span class='codeblock'><span class='keyword'>constexpr</span> <span class='keyword'>int</span> square<span class='parenthesis'>(</span><span class='keyword'>int</span> x<span class='parenthesis'>)</span>
  <span class='curlybracket'>{</span> <span class='keyword'>return</span> x <span class='operator'>*</span> x; <span class='curlybracket'>}</span>             <span class='comment'>// OK</span>
<span class='keyword'>constexpr</span> <span class='keyword'>long</span> long_max<span class='parenthesis'>(</span><span class='parenthesis'>)</span>
  <span class='curlybracket'>{</span> <span class='keyword'>return</span> <span class='literal'>2147483647</span>; <span class='curlybracket'>}</span>        <span class='comment'>// OK</span>
<span class='keyword'>constexpr</span> <span class='keyword'>int</span> abs<span class='parenthesis'>(</span><span class='keyword'>int</span> x<span class='parenthesis'>)</span> <span class='curlybracket'>{</span>
  <span class='keyword'>if</span> <span class='parenthesis'>(</span>x <span class='anglebracket'>&lt;</span> <span class='literal'>0</span><span class='parenthesis'>)</span>
    x <span class='operator'>=</span> <span class='operator'>-</span>x;
  <span class='keyword'>return</span> x;                     <span class='comment'>// OK</span>
<span class='curlybracket'>}</span>
<span class='keyword'>constexpr</span> <span class='keyword'>int</span> constant_non_42<span class='parenthesis'>(</span><span class='keyword'>int</span> n<span class='parenthesis'>)</span> <span class='curlybracket'>{</span>  <span class='comment'>// OK</span>
  <span class='keyword'>if</span> <span class='parenthesis'>(</span>n <span class='operator'>=</span><span class='operator'>=</span> <span class='literal'>42</span><span class='parenthesis'>)</span> <span class='curlybracket'>{</span>
    <span class='keyword'>static</span> <span class='keyword'>int</span> value <span class='operator'>=</span> n;
    <span class='keyword'>return</span> value;
  <span class='curlybracket'>}</span>
  <span class='keyword'>return</span> n;
<span class='curlybracket'>}</span>
<span class='keyword'>constexpr</span> <span class='keyword'>int</span> uninit<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='curlybracket'>{</span>
  <span class='keyword'>struct</span> <span class='curlybracket'>{</span> <span class='keyword'>int</span> a; <span class='curlybracket'>}</span> s;
  <span class='keyword'>return</span> s<span class='operator'>.</span>a;                   <span class='comment'>// error: uninitialized read of <span class='tcode_in_codeblock'>s.a</span></span>
<span class='curlybracket'>}</span>
<span class='keyword'>constexpr</span> <span class='keyword'>int</span> prev<span class='parenthesis'>(</span><span class='keyword'>int</span> x<span class='parenthesis'>)</span>
  <span class='curlybracket'>{</span> <span class='keyword'>return</span> <span class='operator'>-</span><span class='operator'>-</span>x; <span class='curlybracket'>}</span>               <span class='comment'>// OK</span>
<span class='keyword'>constexpr</span> <span class='keyword'>int</span> g<span class='parenthesis'>(</span><span class='keyword'>int</span> x, <span class='keyword'>int</span> n<span class='parenthesis'>)</span> <span class='curlybracket'>{</span> <span class='comment'>// OK</span>
  <span class='keyword'>int</span> r <span class='operator'>=</span> <span class='literal'>1</span>;
  <span class='keyword'>while</span> <span class='parenthesis'>(</span><span class='operator'>-</span><span class='operator'>-</span>n <span class='anglebracket'>&gt;</span> <span class='literal'>0</span><span class='parenthesis'>)</span> r <span class='operator'>*</span><span class='operator'>=</span> x;
  <span class='keyword'>return</span> r;
<span class='curlybracket'>}</span>
</span> —&nbsp;<i>end example</i>]</div></div></div></div><div class='para' id='4'><div class='marginalizedparent'><a class='marginalized' href='#4'>4</a></div><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/declarations.tex#L956'>#</a></div><div class='texpara'><div id='4.sentence-1' class='sentence'>An invocation of a constexpr function in a given context
produces the same result as
an invocation of an equivalent non-constexpr function in the same context
in all respects except that
<ul class='itemize'><li id='4.1'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#4.1'>(4.1)</a></div>an invocation of a constexpr function
can appear in a constant expression (<a href='expr.const' title='7.7&emsp;Constant expressions'>[expr.<span class='shy'></span>const]</a>) and</li><li id='4.2'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#4.2'>(4.2)</a></div>copy elision is not performed in a constant expression (<a href='class.copy.elision' title='11.9.6&emsp;Copy/move elision'>[class.<span class='shy'></span>copy.<span class='shy'></span>elision]</a>)<a class='hidden_link' href='#4.sentence-1'>.</a></li></ul></div> <div id='note-4' class='note'><div class='texpara'>[<i>Note&nbsp;<a href='#note-4'>4</a></i>:&ensp;<div id='4.sentence-2' class='sentence'>Declaring a function constexpr can change whether an expression
is a constant expression<a class='hidden_link' href='#4.sentence-2'>.</a></div> <div id='4.sentence-3' class='sentence'>This can indirectly cause calls to <span class='texttt'>std<span class='operator'>&#x200b;::&#x200b;</span>is_<span class='shy'></span>constant_<span class='shy'></span>evaluated</span>
within an invocation of the function to produce a different value<a class='hidden_link' href='#4.sentence-3'>.</a></div> —&nbsp;<i>end note</i>]</div></div> <div id='note-5' class='note'><div class='texpara'>[<i>Note&nbsp;<a href='#note-5'>5</a></i>:&ensp;<div id='4.sentence-4' class='sentence'>It is possible to write a constexpr function for which
no invocation satisfies the requirements of a core constant expression<a class='hidden_link' href='#4.sentence-4'>.</a></div> —&nbsp;<i>end note</i>]</div></div></div></div><div class='para' id='5'><div class='marginalizedparent'><a class='marginalized' href='#5'>5</a></div><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/declarations.tex#L979'>#</a></div><div class='texpara'><div id='5.sentence-1' class='sentence'>The <span id=':constexpr_______'><span class='texttt'><span class='keyword'>constexpr</span></span></span> and <span id=':consteval_______'><span class='texttt'><span class='keyword'>consteval</span></span></span> specifiers have no
effect on the type of a constexpr function<a class='hidden_link' href='#5.sentence-1'>.</a></div> <div id='example-3' class='example'><div class='texpara'>[<i>Example&nbsp;<a href='#example-3'>3</a></i>:&ensp;<span class='codeblock'><span class='keyword'>constexpr</span> <span class='keyword'>int</span> bar<span class='parenthesis'>(</span><span class='keyword'>int</span> x, <span class='keyword'>int</span> y<span class='parenthesis'>)</span>         <span class='comment'>// OK</span>
    <span class='curlybracket'>{</span> <span class='keyword'>return</span> x <span class='operator'>+</span> y <span class='operator'>+</span> x<span class='operator'>*</span>y; <span class='curlybracket'>}</span>
<span class='comment'>// ...</span>
<span class='keyword'>int</span> bar<span class='parenthesis'>(</span><span class='keyword'>int</span> x, <span class='keyword'>int</span> y<span class='parenthesis'>)</span>                   <span class='comment'>// error: redefinition of <span class='tcode_in_codeblock'>bar</span></span>
    <span class='curlybracket'>{</span> <span class='keyword'>return</span> x <span class='operator'>*</span> <span class='literal'>2</span> <span class='operator'>+</span> <span class='literal'>3</span> <span class='operator'>*</span> y; <span class='curlybracket'>}</span>
</span> —&nbsp;<i>end example</i>]</div></div></div></div><div class='para' id='6'><div class='marginalizedparent'><a class='marginalized' href='#6'>6</a></div><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/declarations.tex#L992'>#</a></div><div class='texpara'><div id='6.sentence-1' class='sentence'>A <span id=':constexpr________'><span class='texttt'><span class='keyword'>constexpr</span></span></span> specifier used in an object declaration
declares the object as const<a class='hidden_link' href='#6.sentence-1'>.</a></div> <div id='6.sentence-2' class='sentence'>Such an object
shall have literal type and
shall be initialized<a class='hidden_link' href='#6.sentence-2'>.</a></div> <div id='6.sentence-3' class='sentence'>In any <span id=':constexpr_________'><span class='texttt'><span class='keyword'>constexpr</span></span></span> variable declaration,
the full-expression of the initialization
shall be a constant expression (<a href='expr.const' title='7.7&emsp;Constant expressions'>[expr.<span class='shy'></span>const]</a>)<a class='hidden_link' href='#6.sentence-3'>.</a></div> <div id='6.sentence-4' class='sentence'>A <span id=':constexpr__________'><span class='texttt'><span class='keyword'>constexpr</span></span></span> variable that is an object,
as well as any temporary to which a <span id=':constexpr___________'><span class='texttt'><span class='keyword'>constexpr</span></span></span> reference is bound,
shall have constant destruction<a class='hidden_link' href='#6.sentence-4'>.</a></div> <div id='example-4' class='example'><div class='texpara'>[<i>Example&nbsp;<a href='#example-4'>4</a></i>:&ensp;<span class='codeblock'><span class='keyword'>struct</span> pixel <span class='curlybracket'>{</span>
  <span class='keyword'>int</span> x, y;
<span class='curlybracket'>}</span>;
<span class='keyword'>constexpr</span> pixel ur <span class='operator'>=</span> <span class='curlybracket'>{</span> <span class='literal'>1294</span>, <span class='literal'>1024</span> <span class='curlybracket'>}</span>;    <span class='comment'>// OK</span>
<span class='keyword'>constexpr</span> pixel origin;                 <span class='comment'>// error: initializer missing</span>
</span> —&nbsp;<i>end example</i>]</div></div></div></div>
   </div><div class="wording">
		<h2 ><a class='secnum' style='min-width:65pt'>17.12</a> Coroutines <a class='abbr_ref'>[support.coroutine]</a></h2><div id='general' class='section'><h3 ><a class='secnum' href='#general' style='min-width:80pt'>17.12.1</a> General <a class='abbr_ref' href='support.coroutine.general'>[support.coroutine.general]</a></h3><div class='para' id='general-1'><div class='marginalizedparent'><a class='marginalized' href='#general-1'>1</a></div><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/support.tex#L5146'>#</a></div><div class='texpara'><div id='general-1.sentence-1' class='sentence'>The header <span id='header:<coroutine>'><span class='texttt'><span class='anglebracket'>&lt;</span>coroutine<span class='anglebracket'>&gt;</span></span></span>
defines several types providing
compile and run-time support for
coroutines in a C++ program<a class='hidden_link' href='#general-1.sentence-1'>.</a></div></div></div></div><div id='coroutine.syn' class='section'><h3 ><a class='secnum' href='#coroutine.syn' style='min-width:80pt'>17.12.2</a> Header <span class='texttt'>&lt;coroutine&gt;</span> synopsis <a class='abbr_ref' href='coroutine.syn'>[coroutine.syn]</a></h3><div class='texpara'><span id='lib:noop_coroutine_handle'><span id='header:<coroutine>_'><div class='marginalizedparent'><a class='itemDeclLink' href='#header:%3ccoroutine%3e_'>🔗</a></div><span class='codeblock'><span class='comment'>// all freestanding</span>
<span class='preprocessordirective'>#include</span> <span class='anglebracket'>&lt;</span>compare<span class='anglebracket'>&gt;</span>              <span class='comment'>// see <a href='compare.syn' title='17.11.1&emsp;Header &lt;compare&gt; synopsis'>[compare.<span class='shy'></span>syn]</a></span>

<span class='keyword'>namespace</span> std <span class='curlybracket'>{</span>
  <span class='comment'>// <a href='#coroutine.traits' title='17.12.3&emsp;Coroutine traits'>[coroutine.<span class='shy'></span>traits]</a>, coroutine traits</span>
  <span class='keyword'>template</span><span class='anglebracket'>&lt;</span><span class='keyword'>class</span> R, <span class='keyword'>class</span><span class='operator'>.</span><span class='operator'>.</span><span class='operator'>.</span> ArgTypes<span class='anglebracket'>&gt;</span>
    <span class='keyword'>struct</span> coroutine_traits;

  <span class='comment'>// <a href='#coroutine.handle' title='17.12.4&emsp;Class template coroutine_&shy;handle'>[coroutine.<span class='shy'></span>handle]</a>, coroutine handle</span>
  <span class='keyword'>template</span><span class='anglebracket'>&lt;</span><span class='keyword'>class</span> Promise <span class='operator'>=</span> <span class='keyword'>void</span><span class='anglebracket'>&gt;</span>
    <span class='keyword'>struct</span> coroutine_handle;

  <span class='comment'>// <a href='#coroutine.handle.compare' title='17.12.4.8&emsp;Comparison operators'>[coroutine.<span class='shy'></span>handle.<span class='shy'></span>compare]</a>, comparison operators</span>
  <span class='keyword'>constexpr</span> <span class='keyword'>bool</span> <span class='keyword'>operator</span><span class='operator'>=</span><span class='operator'>=</span><span class='parenthesis'>(</span>coroutine_handle<span class='anglebracket'>&lt;</span><span class='anglebracket'>&gt;</span> x, coroutine_handle<span class='anglebracket'>&lt;</span><span class='anglebracket'>&gt;</span> y<span class='parenthesis'>)</span> <span class='keyword'>noexcept</span>;
  <span class='keyword'>constexpr</span> strong_ordering <span class='keyword'>operator</span><span class='anglebracket'>&lt;</span><span class='operator'>=</span><span class='anglebracket'>&gt;</span><span class='parenthesis'>(</span>coroutine_handle<span class='anglebracket'>&lt;</span><span class='anglebracket'>&gt;</span> x, coroutine_handle<span class='anglebracket'>&lt;</span><span class='anglebracket'>&gt;</span> y<span class='parenthesis'>)</span> <span class='keyword'>noexcept</span>;

  <span class='comment'>// <a href='#coroutine.handle.hash' title='17.12.4.9&emsp;Hash support'>[coroutine.<span class='shy'></span>handle.<span class='shy'></span>hash]</a>, hash support</span>
  <span class='keyword'>template</span><span class='anglebracket'>&lt;</span><span class='keyword'>class</span> T<span class='anglebracket'>&gt;</span> <span class='keyword'>struct</span> hash;
  <span class='keyword'>template</span><span class='anglebracket'>&lt;</span><span class='keyword'>class</span> P<span class='anglebracket'>&gt;</span> <span class='keyword'>struct</span> hash<span class='anglebracket'>&lt;</span>coroutine_handle<span class='anglebracket'>&lt;</span>P<span class='anglebracket'>&gt;</span><span class='anglebracket'>&gt;</span>;

  <span class='comment'>// <a href='#coroutine.noop' title='17.12.5&emsp;No-op coroutines'>[coroutine.<span class='shy'></span>noop]</a>, no-op coroutines</span>
  <span class='keyword'>struct</span> noop_coroutine_promise;

  <span class='keyword'>template</span><span class='anglebracket'>&lt;</span><span class='anglebracket'>&gt;</span> <span class='keyword'>struct</span> coroutine_handle<span class='anglebracket'>&lt;</span>noop_coroutine_promise<span class='anglebracket'>&gt;</span>;
  <span class='keyword'>using</span> noop_coroutine_handle <span class='operator'>=</span> coroutine_handle<span class='anglebracket'>&lt;</span>noop_coroutine_promise<span class='anglebracket'>&gt;</span>;

  <span class="added keyword">constexpr </span>noop_coroutine_handle noop_coroutine<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>noexcept</span>;

  <span class='comment'>// <a href='#coroutine.trivial.awaitables' title='17.12.6&emsp;Trivial awaitables'>[coroutine.<span class='shy'></span>trivial.<span class='shy'></span>awaitables]</a>, trivial awaitables</span>
  <span class='keyword'>struct</span> suspend_never;
  <span class='keyword'>struct</span> suspend_always;
<span class='curlybracket'>}</span>
</span></span></span></div></div><div id='coroutine.traits' class='section'><h3 ><a class='secnum' href='#coroutine.traits' style='min-width:80pt'>17.12.3</a> Coroutine traits <a class='abbr_ref' href='coroutine.traits'>[coroutine.traits]</a></h3><div id='coroutine.traits.general' class='section'><h4 ><a class='secnum' href='#coroutine.traits.general' style='min-width:95pt'>17.12.3.1</a> General <a class='abbr_ref' href='coroutine.traits.general'>[coroutine.traits.general]</a></h4><div class='para' id='coroutine.traits.general-1'><div class='marginalizedparent'><a class='marginalized' href='#coroutine.traits.general-1'>1</a></div><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/support.tex#L5195'>#</a></div><div class='texpara'><div id='coroutine.traits.general-1.sentence-1' class='sentence'>Subclause <a href='#coroutine.traits' title='17.12.3&emsp;Coroutine traits'>[coroutine.<span class='shy'></span>traits]</a> defines requirements on classes representing
<a class='hidden_link' href='#def:coroutine_traits' id='def:coroutine_traits'><i>coroutine traits</i></a>,
and defines the class template
<span class='texttt'>coroutine_<span class='shy'></span>traits</span>
that meets those requirements<a class='hidden_link' href='#coroutine.traits.general-1.sentence-1'>.</a></div></div></div></div><div id='coroutine.traits.primary' class='section'><h4 ><a class='secnum' href='#coroutine.traits.primary' style='min-width:95pt'>17.12.3.2</a> Class template <span class='texttt'>coroutine_<span class='shy'></span>traits</span> <a class='abbr_ref' href='coroutine.traits.primary'>[coroutine.traits.primary]</a></h4><div class='texpara'><a class='index' id='lib:coroutine_traits'></a></div><div class='para' id='coroutine.traits.primary-1'><div class='marginalizedparent'><a class='marginalized' href='#coroutine.traits.primary-1'>1</a></div><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/support.tex#L5205'>#</a></div><div class='texpara'><div id='coroutine.traits.primary-1.sentence-1' class='sentence'>The header <a href='#header:%3ccoroutine%3e' title='17.12.2&emsp;Header &lt;coroutine&gt; synopsis&emsp;[coroutine.syn]'><span id='headerref:<coroutine>'><span class='texttt'>&lt;coroutine&gt;</span></span></a> defines the primary template
<span class='texttt'>coroutine_<span class='shy'></span>traits</span> such that
if <span class='texttt'>ArgTypes</span> is a parameter pack of types and
if the <a href='expr.prim.id.qual#nt:qualified-id' title='7.5.5.3&emsp;Qualified names&emsp;[expr.prim.id.qual]'><span id='ntref:qualified-id'><span class='textsf'><i >qualified-id</i></span></span></a> <span class='texttt'>R<span class='operator'>&#x200b;::&#x200b;</span>promise_<span class='shy'></span>type</span> is valid and
denotes a type (<a href='temp.deduct' title='13.10.3&emsp;Template argument deduction'>[temp.<span class='shy'></span>deduct]</a>),
then <span class='texttt'>coroutine_<span class='shy'></span>traits<span class='anglebracket'>&lt;</span>R, ArgTypes<span class='operator'>.</span><span class='operator'>.</span><span class='operator'>.</span><span class='anglebracket'>&gt;</span></span> has the following publicly
accessible member:
<span class='codeblock'><span class='keyword'>using</span> promise_type <span class='operator'>=</span> <span class='keyword'>typename</span> R<span class='operator'>::</span>promise_type;
</span></div></div><div class='texpara'><div id='coroutine.traits.primary-1.sentence-2' class='sentence'>Otherwise, <span class='texttt'>coroutine_<span class='shy'></span>traits<span class='anglebracket'>&lt;</span>R, ArgTypes<span class='operator'>.</span><span class='operator'>.</span><span class='operator'>.</span><span class='anglebracket'>&gt;</span></span> has no members<a class='hidden_link' href='#coroutine.traits.primary-1.sentence-2'>.</a></div></div></div><div class='para' id='coroutine.traits.primary-2'><div class='marginalizedparent'><a class='marginalized' href='#coroutine.traits.primary-2'>2</a></div><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/support.tex#L5219'>#</a></div><div class='texpara'><div id='coroutine.traits.primary-2.sentence-1' class='sentence'>Program-defined specializations of this template shall define a publicly
accessible nested type named <span class='texttt'>promise_<span class='shy'></span>type</span><a class='hidden_link' href='#coroutine.traits.primary-2.sentence-1'>.</a></div></div></div></div></div><div id='coroutine.handle' class='section'><h3 ><a class='secnum' href='#coroutine.handle' style='min-width:80pt'>17.12.4</a> Class template <span class='texttt'>coroutine_<span class='shy'></span>handle</span> <a class='abbr_ref' href='coroutine.handle'>[coroutine.handle]</a></h3><div id='coroutine.handle.general' class='section'><h4 ><a class='secnum' href='#coroutine.handle.general' style='min-width:95pt'>17.12.4.1</a> General <a class='abbr_ref' href='coroutine.handle.general'>[coroutine.handle.general]</a></h4><div class='texpara'><span id='lib:coroutine_handle'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:coroutine_handle'>🔗</a></div><span class='codeblock'><span class='keyword'>namespace</span> std <span class='curlybracket'>{</span>
  <span class='keyword'>template</span><span class='anglebracket'>&lt;</span><span class='anglebracket'>&gt;</span>
  <span class='keyword'>struct</span> coroutine_handle<span class='anglebracket'>&lt;</span><span class='keyword'>void</span><span class='anglebracket'>&gt;</span>
  <span class='curlybracket'>{</span>
    <span class='comment'>// <a href='#coroutine.handle.con' title='17.12.4.2&emsp;Construct/reset'>[coroutine.<span class='shy'></span>handle.<span class='shy'></span>con]</a>, construct/reset</span>
    <span class='keyword'>constexpr</span> coroutine_handle<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>noexcept</span>;
    <span class='keyword'>constexpr</span> coroutine_handle<span class='parenthesis'>(</span>nullptr_t<span class='parenthesis'>)</span> <span class='keyword'>noexcept</span>;
    <span class='keyword added'>constexpr</span> coroutine_handle<span class='operator'>&amp;</span> <span class='keyword'>operator</span><span class='operator'>=</span><span class='parenthesis'>(</span>nullptr_t<span class='parenthesis'>)</span> <span class='keyword'>noexcept</span>;

    <span class='comment'>// <a href='#coroutine.handle.export.import' title='17.12.4.4&emsp;Export/import'>[coroutine.<span class='shy'></span>handle.<span class='shy'></span>export.<span class='shy'></span>import]</a>, export/import</span>
    <span class='keyword'>constexpr</span> <span class='keyword'>void</span><span class='operator'>*</span> address<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span> <span class='keyword'>noexcept</span>;
    <span class='keyword'>static</span> <span class='keyword'>constexpr</span> coroutine_handle from_address<span class='parenthesis'>(</span><span class='keyword'>void</span><span class='operator'>*</span> addr<span class='parenthesis'>)</span>;

    <span class='comment'>// <a href='#coroutine.handle.observers' title='17.12.4.5&emsp;Observers'>[coroutine.<span class='shy'></span>handle.<span class='shy'></span>observers]</a>, observers</span>
    <span class='keyword'>constexpr</span> <span class='keyword'>explicit</span> <span class='keyword'>operator</span> <span class='keyword'>bool</span><span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span> <span class='keyword'>noexcept</span>;
    <span class='keyword added'>constexpr</span> <span class='keyword'>bool</span> done<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span>;

    <span class='comment'>// <a href='#coroutine.handle.resumption' title='17.12.4.6&emsp;Resumption'>[coroutine.<span class='shy'></span>handle.<span class='shy'></span>resumption]</a>, resumption</span>
    <span class='keyword added'>constexpr</span> <span class='keyword'>void</span> <span class='keyword'>operator</span><span class='parenthesis'>(</span><span class='parenthesis'>)</span><span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span>;
    <span class='keyword added'>constexpr</span> <span class='keyword'>void</span> resume<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span>;
    <span class='keyword added'>constexpr</span> <span class='keyword'>void</span> destroy<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span>;

  <span class='keyword'>private</span><span class='operator'>:</span>
    <span class='keyword'>void</span><span class='operator'>*</span> ptr;  <span class='comment'>// <i >exposition only</i></span>
  <span class='curlybracket'>}</span>;

  <span class='keyword'>template</span><span class='anglebracket'>&lt;</span><span class='keyword'>class</span> Promise<span class='anglebracket'>&gt;</span>
  <span class='keyword'>struct</span> coroutine_handle
  <span class='curlybracket'>{</span>
    <span class='comment'>// <a href='#coroutine.handle.con' title='17.12.4.2&emsp;Construct/reset'>[coroutine.<span class='shy'></span>handle.<span class='shy'></span>con]</a>, construct/reset</span>
    <span class='keyword'>constexpr</span> coroutine_handle<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>noexcept</span>;
    <span class='keyword'>constexpr</span> coroutine_handle<span class='parenthesis'>(</span>nullptr_t<span class='parenthesis'>)</span> <span class='keyword'>noexcept</span>;
    <span class='keyword'>static</span> <span class='keyword added'>constexpr</span> coroutine_handle from_promise<span class='parenthesis'>(</span>Promise<span class='operator'>&amp;</span><span class='parenthesis'>)</span>;
    <span class='keyword added'>constexpr</span> coroutine_handle<span class='operator'>&amp;</span> <span class='keyword'>operator</span><span class='operator'>=</span><span class='parenthesis'>(</span>nullptr_t<span class='parenthesis'>)</span> <span class='keyword'>noexcept</span>;

    <span class='comment'>// <a href='#coroutine.handle.export.import' title='17.12.4.4&emsp;Export/import'>[coroutine.<span class='shy'></span>handle.<span class='shy'></span>export.<span class='shy'></span>import]</a>, export/import</span>
    <span class='keyword'>constexpr</span> <span class='keyword'>void</span><span class='operator'>*</span> address<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span> <span class='keyword'>noexcept</span>;
    <span class='keyword'>static</span> <span class='keyword'>constexpr</span> coroutine_handle from_address<span class='parenthesis'>(</span><span class='keyword'>void</span><span class='operator'>*</span> addr<span class='parenthesis'>)</span>;

    <span class='comment'>// <a href='#coroutine.handle.conv' title='17.12.4.3&emsp;Conversion'>[coroutine.<span class='shy'></span>handle.<span class='shy'></span>conv]</a>, conversion</span>
    <span class='keyword'>constexpr</span> <span class='keyword'>operator</span> coroutine_handle<span class='anglebracket'>&lt;</span><span class='anglebracket'>&gt;</span><span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span> <span class='keyword'>noexcept</span>;

    <span class='comment'>// <a href='#coroutine.handle.observers' title='17.12.4.5&emsp;Observers'>[coroutine.<span class='shy'></span>handle.<span class='shy'></span>observers]</a>, observers</span>
    <span class='keyword'>constexpr</span> <span class='keyword'>explicit</span> <span class='keyword'>operator</span> <span class='keyword'>bool</span><span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span> <span class='keyword'>noexcept</span>;
    <span class='keyword added'>constexpr</span> <span class='keyword'>bool</span> done<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span>;

    <span class='comment'>// <a href='#coroutine.handle.resumption' title='17.12.4.6&emsp;Resumption'>[coroutine.<span class='shy'></span>handle.<span class='shy'></span>resumption]</a>, resumption</span>
    <span class='keyword added'>constexpr</span> <span class='keyword'>void</span> <span class='keyword'>operator</span><span class='parenthesis'>(</span><span class='parenthesis'>)</span><span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span>;
    <span class='keyword added'>constexpr</span> <span class='keyword'>void</span> resume<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span>;
    <span class='keyword added'>constexpr</span> <span class='keyword'>void</span> destroy<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span>;

    <span class='comment'>// <a href='#coroutine.handle.promise' title='17.12.4.7&emsp;Promise access'>[coroutine.<span class='shy'></span>handle.<span class='shy'></span>promise]</a>, promise access</span>
    <span class='keyword added'>constexpr</span> Promise<span class='operator'>&amp;</span> promise<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span>;

  <span class='keyword'>private</span><span class='operator'>:</span>
    <span class='keyword'>void</span><span class='operator'>*</span> ptr;  <span class='comment'>// <i >exposition only</i></span>
  <span class='curlybracket'>}</span>;
<span class='curlybracket'>}</span>
</span></span></div><div class='para' id='coroutine.handle.general-1'><div class='marginalizedparent'><a class='marginalized' href='#coroutine.handle.general-1'>1</a></div><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/support.tex#L5289'>#</a></div><div class='texpara'><div id='coroutine.handle.general-1.sentence-1' class='sentence'>An object of type
<span class='texttt'>coroutine_<span class='shy'></span>handle<span class='anglebracket'>&lt;</span>T<span class='anglebracket'>&gt;</span></span> is called a <a class='hidden_link' href='#def:coroutine_handle' id='def:coroutine_handle'><i>coroutine handle</i></a>
and can be used to refer to a suspended or executing coroutine<a class='hidden_link' href='#coroutine.handle.general-1.sentence-1'>.</a></div> <div id='coroutine.handle.general-1.sentence-2' class='sentence'>A <span class='texttt'>coroutine_<span class='shy'></span>handle</span> object whose
member <span class='texttt'>address<span class='parenthesis'>(</span><span class='parenthesis'>)</span></span> returns a null pointer value
does not refer to any
coroutine<a class='hidden_link' href='#coroutine.handle.general-1.sentence-2'>.</a></div> <div id='coroutine.handle.general-1.sentence-3' class='sentence'>Two <span class='texttt'>coroutine_<span class='shy'></span>handle</span> objects refer to the same coroutine
if and only if their member <span class='texttt'>address<span class='parenthesis'>(</span><span class='parenthesis'>)</span></span> returns the same non-null value<a class='hidden_link' href='#coroutine.handle.general-1.sentence-3'>.</a></div></div></div><div class='para' id='coroutine.handle.general-2'><div class='marginalizedparent'><a class='marginalized' href='#coroutine.handle.general-2'>2</a></div><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/support.tex#L5300'>#</a></div><div class='texpara'><div id='coroutine.handle.general-2.sentence-1' class='sentence'>If a program declares an explicit or partial specialization of
<span class='texttt'>coroutine_<span class='shy'></span>handle</span>, the behavior is undefined<a class='hidden_link' href='#coroutine.handle.general-2.sentence-1'>.</a></div></div></div></div><div id='coroutine.handle.con' class='section'><h4 ><a class='secnum' href='#coroutine.handle.con' style='min-width:95pt'>17.12.4.2</a> Construct/reset <a class='abbr_ref' href='coroutine.handle.con'>[coroutine.handle.con]</a></h4><div class='texpara'><div id='lib:coroutine_handle,constructor'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:coroutine_handle,constructor'>🔗</a></div><code class='itemdeclcode'><span class='keyword'>constexpr</span> coroutine_handle<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>noexcept</span>;
<span class='keyword'>constexpr</span> coroutine_handle<span class='parenthesis'>(</span>nullptr_t<span class='parenthesis'>)</span> <span class='keyword'>noexcept</span>;
</code></div></div></div><div class='para' id='coroutine.handle.con-1'><div class='marginalizedparent'><a class='marginalized' href='#coroutine.handle.con-1'>1</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/support.tex#L5313'>#</a></div><div class='texpara'><div id='coroutine.handle.con-1.sentence-1' class='sentence'><i >Postconditions</i>: <span class='texttt'>address<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='operator'>=</span><span class='operator'>=</span> <span class='literal'>nullptr</span></span><a class='hidden_link' href='#coroutine.handle.con-1.sentence-1'>.</a></div></div></div></div><div class='texpara'><div id='lib:coroutine_handle,from_promise'><div id='lib:from_promise,coroutine_handle'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:from_promise,coroutine_handle'>🔗</a></div><code class='itemdeclcode'><span class='keyword'>static</span> <span class='keyword added'>constexpr</span> coroutine_handle from_promise<span class='parenthesis'>(</span>Promise<span class='operator'>&amp;</span> p<span class='parenthesis'>)</span>;
</code></div></div></div></div><div class='para' id='coroutine.handle.con-2'><div class='marginalizedparent'><a class='marginalized' href='#coroutine.handle.con-2'>2</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/support.tex#L5324'>#</a></div><div class='texpara'><div id='coroutine.handle.con-2.sentence-1' class='sentence'><i >Preconditions</i>: <span class='texttt'>p</span> is a reference to a promise object of a coroutine<a class='hidden_link' href='#coroutine.handle.con-2.sentence-1'>.</a></div></div></div></div><div class='para' id='coroutine.handle.con-3'><div class='marginalizedparent'><a class='marginalized' href='#coroutine.handle.con-3'>3</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/support.tex#L5328'>#</a></div><div class='texpara'><div id='coroutine.handle.con-3.sentence-1' class='sentence'><i >Postconditions</i>: <span class='texttt'>addressof<span class='parenthesis'>(</span>h<span class='operator'>.</span>promise<span class='parenthesis'>(</span><span class='parenthesis'>)</span><span class='parenthesis'>)</span> <span class='operator'>=</span><span class='operator'>=</span> addressof<span class='parenthesis'>(</span>p<span class='parenthesis'>)</span></span><a class='hidden_link' href='#coroutine.handle.con-3.sentence-1'>.</a></div></div></div></div><div class='para' id='coroutine.handle.con-4'><div class='marginalizedparent'><a class='marginalized' href='#coroutine.handle.con-4'>4</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/support.tex#L5332'>#</a></div><div class='texpara'><div id='coroutine.handle.con-4.sentence-1' class='sentence'><i >Returns</i>: A coroutine handle <span class='texttt'>h</span> referring to the coroutine<a class='hidden_link' href='#coroutine.handle.con-4.sentence-1'>.</a></div></div></div></div><div class='texpara'><div id='lib:coroutine_handle,operator='><div id='lib:operator=,coroutine_handle'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:operator=,coroutine_handle'>🔗</a></div><code class='itemdeclcode'><span class='keyword added'>constexpr</span> coroutine_handle<span class='operator'>&amp;</span> <span class='keyword'>operator</span><span class='operator'>=</span><span class='parenthesis'>(</span>nullptr_t<span class='parenthesis'>)</span> <span class='keyword'>noexcept</span>;
</code></div></div></div></div><div class='para' id='coroutine.handle.con-5'><div class='marginalizedparent'><a class='marginalized' href='#coroutine.handle.con-5'>5</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/support.tex#L5343'>#</a></div><div class='texpara'><div id='coroutine.handle.con-5.sentence-1' class='sentence'><i >Postconditions</i>: <span class='texttt'>address<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='operator'>=</span><span class='operator'>=</span> <span class='literal'>nullptr</span></span><a class='hidden_link' href='#coroutine.handle.con-5.sentence-1'>.</a></div></div></div></div><div class='para' id='coroutine.handle.con-6'><div class='marginalizedparent'><a class='marginalized' href='#coroutine.handle.con-6'>6</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/support.tex#L5347'>#</a></div><div class='texpara'><div id='coroutine.handle.con-6.sentence-1' class='sentence'><i >Returns</i>: <span class='texttt'><span class='operator'>*</span><span class='keyword'>this</span></span><a class='hidden_link' href='#coroutine.handle.con-6.sentence-1'>.</a></div></div></div></div></div><div id='coroutine.handle.conv' class='section'><h4 ><a class='secnum' href='#coroutine.handle.conv' style='min-width:95pt'>17.12.4.3</a> Conversion <a class='abbr_ref' href='coroutine.handle.conv'>[coroutine.handle.conv]</a></h4><div class='texpara'><div id='lib:coroutine_handle,operator_coroutine_handle<>'><div id='lib:operator_coroutine_handle<>,coroutine_handle'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:operator_coroutine_handle%3c%3e,coroutine_handle'>🔗</a></div><code class='itemdeclcode'><span class='keyword'>constexpr</span> <span class='keyword'>operator</span> coroutine_handle<span class='anglebracket'>&lt;</span><span class='anglebracket'>&gt;</span><span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span> <span class='keyword'>noexcept</span>;
</code></div></div></div></div><div class='para' id='coroutine.handle.conv-1'><div class='marginalizedparent'><a class='marginalized' href='#coroutine.handle.conv-1'>1</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/support.tex#L5360'>#</a></div><div class='texpara'><div id='coroutine.handle.conv-1.sentence-1' class='sentence'><i >Effects</i>: Equivalent to: <span class='texttt'><span class='keyword'>return</span> coroutine_<span class='shy'></span>handle<span class='anglebracket'>&lt;</span><span class='anglebracket'>&gt;</span><span class='operator'>&#x200b;::&#x200b;</span>from_<span class='shy'></span>address<span class='parenthesis'>(</span>address<span class='parenthesis'>(</span><span class='parenthesis'>)</span><span class='parenthesis'>)</span>;</span></div></div></div></div></div><div id='coroutine.handle.export.import' class='section'><h4 ><a class='secnum' href='#coroutine.handle.export.import' style='min-width:95pt'>17.12.4.4</a> Export/import <a class='abbr_ref' href='coroutine.handle.export.import'>[coroutine.handle.export.import]</a></h4><div class='texpara'><div id='lib:coroutine_handle,address'><div id='lib:address,coroutine_handle'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:address,coroutine_handle'>🔗</a></div><code class='itemdeclcode'><span class='keyword'>constexpr</span> <span class='keyword'>void</span><span class='operator'>*</span> address<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span> <span class='keyword'>noexcept</span>;
</code></div></div></div></div><div class='para' id='coroutine.handle.export.import-1'><div class='marginalizedparent'><a class='marginalized' href='#coroutine.handle.export.import-1'>1</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/support.tex#L5373'>#</a></div><div class='texpara'><div id='coroutine.handle.export.import-1.sentence-1' class='sentence'><i >Returns</i>: <span class='texttt'>ptr</span><a class='hidden_link' href='#coroutine.handle.export.import-1.sentence-1'>.</a></div></div></div></div><div class='texpara'><div id='lib:coroutine_handle,from_address'><div id='lib:from_address,coroutine_handle'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:from_address,coroutine_handle'>🔗</a></div><code class='itemdeclcode'><span class='keyword'>static</span> <span class='keyword'>constexpr</span> coroutine_handle<span class='anglebracket'>&lt;</span><span class='anglebracket'>&gt;</span> coroutine_handle<span class='anglebracket'>&lt;</span><span class='anglebracket'>&gt;</span><span class='operator'>::</span>from_address<span class='parenthesis'>(</span><span class='keyword'>void</span><span class='operator'>*</span> addr<span class='parenthesis'>)</span>;
</code></div></div></div></div><div class='para' id='coroutine.handle.export.import-2'><div class='marginalizedparent'><a class='marginalized' href='#coroutine.handle.export.import-2'>2</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/support.tex#L5384'>#</a></div><div class='texpara'><div id='coroutine.handle.export.import-2.sentence-1' class='sentence'><i >Preconditions</i>: <span class='texttt'>addr</span> was obtained via a prior call to <span class='texttt'>address</span>
on an object whose type is a specialization of <span class='texttt'>coroutine_<span class='shy'></span>handle</span><a class='hidden_link' href='#coroutine.handle.export.import-2.sentence-1'>.</a></div></div></div></div><div class='para' id='coroutine.handle.export.import-3'><div class='marginalizedparent'><a class='marginalized' href='#coroutine.handle.export.import-3'>3</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/support.tex#L5389'>#</a></div><div class='texpara'><div id='coroutine.handle.export.import-3.sentence-1' class='sentence'><i >Postconditions</i>: <span class='texttt'>from_<span class='shy'></span>address<span class='parenthesis'>(</span>address<span class='parenthesis'>(</span><span class='parenthesis'>)</span><span class='parenthesis'>)</span> <span class='operator'>=</span><span class='operator'>=</span> <span class='operator'>*</span><span class='keyword'>this</span></span><a class='hidden_link' href='#coroutine.handle.export.import-3.sentence-1'>.</a></div></div></div></div><div class='texpara'><div id='lib:coroutine_handle,from_address_'><div id='lib:from_address,coroutine_handle_'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:from_address,coroutine_handle_'>🔗</a></div><code class='itemdeclcode'><span class='keyword'>static</span> <span class='keyword'>constexpr</span> coroutine_handle<span class='anglebracket'>&lt;</span>Promise<span class='anglebracket'>&gt;</span> coroutine_handle<span class='anglebracket'>&lt;</span>Promise<span class='anglebracket'>&gt;</span><span class='operator'>::</span>from_address<span class='parenthesis'>(</span><span class='keyword'>void</span><span class='operator'>*</span> addr<span class='parenthesis'>)</span>;
</code></div></div></div></div><div class='para' id='coroutine.handle.export.import-4'><div class='marginalizedparent'><a class='marginalized' href='#coroutine.handle.export.import-4'>4</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/support.tex#L5400'>#</a></div><div class='texpara'><div id='coroutine.handle.export.import-4.sentence-1' class='sentence'><i >Preconditions</i>: <span class='texttt'>addr</span> was obtained via a prior call to <span class='texttt'>address</span>
on an object of type <span class='mathit'>cv</span> <span class='texttt'>coroutine_<span class='shy'></span>handle<span class='anglebracket'>&lt;</span>Promise<span class='anglebracket'>&gt;</span></span><a class='hidden_link' href='#coroutine.handle.export.import-4.sentence-1'>.</a></div></div></div></div><div class='para' id='coroutine.handle.export.import-5'><div class='marginalizedparent'><a class='marginalized' href='#coroutine.handle.export.import-5'>5</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/support.tex#L5405'>#</a></div><div class='texpara'><div id='coroutine.handle.export.import-5.sentence-1' class='sentence'><i >Postconditions</i>: <span class='texttt'>from_<span class='shy'></span>address<span class='parenthesis'>(</span>address<span class='parenthesis'>(</span><span class='parenthesis'>)</span><span class='parenthesis'>)</span> <span class='operator'>=</span><span class='operator'>=</span> <span class='operator'>*</span><span class='keyword'>this</span></span><a class='hidden_link' href='#coroutine.handle.export.import-5.sentence-1'>.</a></div></div></div></div></div><div id='coroutine.handle.observers' class='section'><h4 ><a class='secnum' href='#coroutine.handle.observers' style='min-width:95pt'>17.12.4.5</a> Observers <a class='abbr_ref' href='coroutine.handle.observers'>[coroutine.handle.observers]</a></h4><div class='texpara'><div id='lib:coroutine_handle,operator_bool'><div id='lib:operator_bool,coroutine_handle'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:operator_bool,coroutine_handle'>🔗</a></div><code class='itemdeclcode'><span class='keyword'>constexpr</span> <span class='keyword'>explicit</span> <span class='keyword'>operator</span> <span class='keyword'>bool</span><span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span> <span class='keyword'>noexcept</span>;
</code></div></div></div></div><div class='para' id='coroutine.handle.observers-1'><div class='marginalizedparent'><a class='marginalized' href='#coroutine.handle.observers-1'>1</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/support.tex#L5418'>#</a></div><div class='texpara'><div id='coroutine.handle.observers-1.sentence-1' class='sentence'><i >Returns</i>: <span class='texttt'>address<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='operator'>!</span><span class='operator'>=</span> <span class='literal'>nullptr</span></span><a class='hidden_link' href='#coroutine.handle.observers-1.sentence-1'>.</a></div></div></div></div><div class='texpara'><div id='lib:coroutine_handle,done'><div id='lib:done,coroutine_handle'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:done,coroutine_handle'>🔗</a></div><code class='itemdeclcode'><span class='keyword added'>constexpr</span> <span class='keyword'>bool</span> done<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span>;
</code></div></div></div></div><div class='para' id='coroutine.handle.observers-2'><div class='marginalizedparent'><a class='marginalized' href='#coroutine.handle.observers-2'>2</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/support.tex#L5429'>#</a></div><div class='texpara'><div id='coroutine.handle.observers-2.sentence-1' class='sentence'><i >Preconditions</i>: <span class='texttt'><span class='operator'>*</span><span class='keyword'>this</span></span> refers to a suspended coroutine<a class='hidden_link' href='#coroutine.handle.observers-2.sentence-1'>.</a></div></div></div></div><div class='para' id='coroutine.handle.observers-3'><div class='marginalizedparent'><a class='marginalized' href='#coroutine.handle.observers-3'>3</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/support.tex#L5433'>#</a></div><div class='texpara'><div id='coroutine.handle.observers-3.sentence-1' class='sentence'><i >Returns</i>: <span class='texttt'><span class='literal'>true</span></span> if the coroutine is suspended at its
final suspend point, otherwise <span class='texttt'><span class='literal'>false</span></span><a class='hidden_link' href='#coroutine.handle.observers-3.sentence-1'>.</a></div></div></div></div></div><div id='coroutine.handle.resumption' class='section'><h4 ><a class='secnum' href='#coroutine.handle.resumption' style='min-width:95pt'>17.12.4.6</a> Resumption <a class='abbr_ref' href='coroutine.handle.resumption'>[coroutine.handle.resumption]</a></h4><div class='para' id='coroutine.handle.resumption-1'><div class='marginalizedparent'><a class='marginalized' href='#coroutine.handle.resumption-1'>1</a></div><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/support.tex#L5441'>#</a></div><div class='texpara'><div id='coroutine.handle.resumption-1.sentence-1' class='sentence'>Resuming a coroutine via <span class='texttt'>resume</span>, <span class='texttt'><span class='keyword'>operator</span><span class='parenthesis'>(</span><span class='parenthesis'>)</span></span>, or <span class='texttt'>destroy</span>
on an execution agent other than the one on which it was suspended
has <a class='index' id=':resuming_a_coroutine_on_a_different_execution_agent'></a>implementation-defined behavior
unless
each execution agent either is
an instance of <span class='texttt'>std<span class='operator'>&#x200b;::&#x200b;</span>thread</span> or <span class='texttt'>std<span class='operator'>&#x200b;::&#x200b;</span>jthread</span>,
or is the thread that executes <span class='texttt'>main</span><a class='hidden_link' href='#coroutine.handle.resumption-1.sentence-1'>.</a></div> <div id='coroutine.handle.resumption-note-1' class='note'><div class='texpara'>[<i>Note&nbsp;<a href='#coroutine.handle.resumption-note-1'>1</a></i>:&ensp;<div id='coroutine.handle.resumption-1.sentence-2' class='sentence'>A coroutine that is resumed on a different execution agent should
avoid relying on consistent thread identity throughout, such as holding
a mutex object across a suspend point<a class='hidden_link' href='#coroutine.handle.resumption-1.sentence-2'>.</a></div> —&nbsp;<i>end note</i>]</div></div> <div id='coroutine.handle.resumption-note-2' class='note'><div class='texpara'>[<i>Note&nbsp;<a href='#coroutine.handle.resumption-note-2'>2</a></i>:&ensp;<div id='coroutine.handle.resumption-1.sentence-3' class='sentence'>A concurrent resumption of the coroutine can result in a data race<a class='hidden_link' href='#coroutine.handle.resumption-1.sentence-3'>.</a></div> —&nbsp;<i>end note</i>]</div></div></div></div><div class='texpara'><div id='lib:coroutine_handle,resume'><div id='lib:resume,coroutine_handle'><div id='lib:coroutine_handle,operator()'><div id='lib:operator(),coroutine_handle'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:operator(),coroutine_handle'>🔗</a></div><code class='itemdeclcode'><span class='keyword added'>constexpr</span> <span class='keyword'>void</span> <span class='keyword'>operator</span><span class='parenthesis'>(</span><span class='parenthesis'>)</span><span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span>;
<span class='keyword added'>constexpr</span> <span class='keyword'>void</span> resume<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span>;
</code></div></div></div></div></div></div><div class='para' id='coroutine.handle.resumption-2'><div class='marginalizedparent'><a class='marginalized' href='#coroutine.handle.resumption-2'>2</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/support.tex#L5466'>#</a></div><div class='texpara'><div id='coroutine.handle.resumption-2.sentence-1' class='sentence'><i >Preconditions</i>: <span class='texttt'><span class='operator'>*</span><span class='keyword'>this</span></span> refers to a suspended coroutine<a class='hidden_link' href='#coroutine.handle.resumption-2.sentence-1'>.</a></div> <div id='coroutine.handle.resumption-2.sentence-2' class='sentence'>The coroutine is not suspended at its final suspend point<a class='hidden_link' href='#coroutine.handle.resumption-2.sentence-2'>.</a></div></div></div></div><div class='para' id='coroutine.handle.resumption-3'><div class='marginalizedparent'><a class='marginalized' href='#coroutine.handle.resumption-3'>3</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/support.tex#L5471'>#</a></div><div class='texpara'><div id='coroutine.handle.resumption-3.sentence-1' class='sentence'><i >Effects</i>: Resumes the execution of the coroutine<a class='hidden_link' href='#coroutine.handle.resumption-3.sentence-1'>.</a></div></div></div></div><div class='texpara'><div id='lib:coroutine_handle,destroy'><div id='lib:destroy,coroutine_handle'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:destroy,coroutine_handle'>🔗</a></div><code class='itemdeclcode'><span class='keyword added'>constexpr</span> <span class='keyword'>void</span> destroy<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span>;
</code></div></div></div></div><div class='para' id='coroutine.handle.resumption-4'><div class='marginalizedparent'><a class='marginalized' href='#coroutine.handle.resumption-4'>4</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/support.tex#L5482'>#</a></div><div class='texpara'><div id='coroutine.handle.resumption-4.sentence-1' class='sentence'><i >Preconditions</i>: <span class='texttt'><span class='operator'>*</span><span class='keyword'>this</span></span> refers to a suspended coroutine<a class='hidden_link' href='#coroutine.handle.resumption-4.sentence-1'>.</a></div></div></div></div><div class='para' id='coroutine.handle.resumption-5'><div class='marginalizedparent'><a class='marginalized' href='#coroutine.handle.resumption-5'>5</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/support.tex#L5486'>#</a></div><div class='texpara'><div id='coroutine.handle.resumption-5.sentence-1' class='sentence'><i >Effects</i>: Destroys the coroutine (<a href='dcl.fct.def.coroutine' title='9.5.4&emsp;Coroutine definitions'>[dcl.<span class='shy'></span>fct.<span class='shy'></span>def.<span class='shy'></span>coroutine]</a>)<a class='hidden_link' href='#coroutine.handle.resumption-5.sentence-1'>.</a></div></div></div></div></div><div id='coroutine.handle.promise' class='section'><h4 ><a class='secnum' href='#coroutine.handle.promise' style='min-width:95pt'>17.12.4.7</a> Promise access <a class='abbr_ref' href='coroutine.handle.promise'>[coroutine.handle.promise]</a></h4><div class='texpara'><div id='lib:coroutine_handle,promise'><div id='lib:promise,coroutine_handle'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:promise,coroutine_handle'>🔗</a></div><code class='itemdeclcode'><span class='keyword added'>constexpr</span> Promise<span class='operator'>&amp;</span> promise<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span>;
</code></div></div></div></div><div class='para' id='coroutine.handle.promise-1'><div class='marginalizedparent'><a class='marginalized' href='#coroutine.handle.promise-1'>1</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/support.tex#L5499'>#</a></div><div class='texpara'><div id='coroutine.handle.promise-1.sentence-1' class='sentence'><i >Preconditions</i>: <span class='texttt'><span class='operator'>*</span><span class='keyword'>this</span></span> refers to a coroutine<a class='hidden_link' href='#coroutine.handle.promise-1.sentence-1'>.</a></div></div></div></div><div class='para' id='coroutine.handle.promise-2'><div class='marginalizedparent'><a class='marginalized' href='#coroutine.handle.promise-2'>2</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/support.tex#L5503'>#</a></div><div class='texpara'><div id='coroutine.handle.promise-2.sentence-1' class='sentence'><i >Returns</i>: A reference to the promise of the coroutine<a class='hidden_link' href='#coroutine.handle.promise-2.sentence-1'>.</a></div></div></div></div></div><div id='coroutine.handle.compare' class='section'><h4 ><a class='secnum' href='#coroutine.handle.compare' style='min-width:95pt'>17.12.4.8</a> Comparison operators <a class='abbr_ref' href='coroutine.handle.compare'>[coroutine.handle.compare]</a></h4><div class='texpara'><div id='lib:coroutine_handle,operator!='><div id='lib:operator!=,coroutine_handle'><div id='lib:coroutine_handle,operator=='><div id='lib:operator==,coroutine_handle'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:operator==,coroutine_handle'>🔗</a></div><code class='itemdeclcode'><span class='keyword'>constexpr</span> <span class='keyword'>bool</span> <span class='keyword'>operator</span><span class='operator'>=</span><span class='operator'>=</span><span class='parenthesis'>(</span>coroutine_handle<span class='anglebracket'>&lt;</span><span class='anglebracket'>&gt;</span> x, coroutine_handle<span class='anglebracket'>&lt;</span><span class='anglebracket'>&gt;</span> y<span class='parenthesis'>)</span> <span class='keyword'>noexcept</span>;
</code></div></div></div></div></div></div><div class='para' id='coroutine.handle.compare-1'><div class='marginalizedparent'><a class='marginalized' href='#coroutine.handle.compare-1'>1</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/support.tex#L5517'>#</a></div><div class='texpara'><div id='coroutine.handle.compare-1.sentence-1' class='sentence'><i >Returns</i>: <span class='texttt'>x<span class='operator'>.</span>address<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='operator'>=</span><span class='operator'>=</span> y<span class='operator'>.</span>address<span class='parenthesis'>(</span><span class='parenthesis'>)</span></span><a class='hidden_link' href='#coroutine.handle.compare-1.sentence-1'>.</a></div></div></div></div><div class='texpara'><div id='lib:coroutine_handle,operator<=>'><div id='lib:operator<=>,coroutine_handle'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:operator%3c=%3e,coroutine_handle'>🔗</a></div><code class='itemdeclcode'><span class='keyword'>constexpr</span> strong_ordering <span class='keyword'>operator</span><span class='anglebracket'>&lt;</span><span class='operator'>=</span><span class='anglebracket'>&gt;</span><span class='parenthesis'>(</span>coroutine_handle<span class='anglebracket'>&lt;</span><span class='anglebracket'>&gt;</span> x, coroutine_handle<span class='anglebracket'>&lt;</span><span class='anglebracket'>&gt;</span> y<span class='parenthesis'>)</span> <span class='keyword'>noexcept</span>;
</code></div></div></div></div><div class='para' id='coroutine.handle.compare-2'><div class='marginalizedparent'><a class='marginalized' href='#coroutine.handle.compare-2'>2</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/support.tex#L5528'>#</a></div><div class='texpara'><div id='coroutine.handle.compare-2.sentence-1' class='sentence'><i >Returns</i>: <span class='texttt'>compare_<span class='shy'></span>three_<span class='shy'></span>way<span class='parenthesis'>(</span><span class='parenthesis'>)</span><span class='parenthesis'>(</span>x<span class='operator'>.</span>address<span class='parenthesis'>(</span><span class='parenthesis'>)</span>, y<span class='operator'>.</span>address<span class='parenthesis'>(</span><span class='parenthesis'>)</span><span class='parenthesis'>)</span></span><a class='hidden_link' href='#coroutine.handle.compare-2.sentence-1'>.</a></div></div></div></div></div><div id='coroutine.handle.hash' class='section'><h4 ><a class='secnum' href='#coroutine.handle.hash' style='min-width:95pt'>17.12.4.9</a> Hash support <a class='abbr_ref' href='coroutine.handle.hash'>[coroutine.handle.hash]</a></h4><div class='texpara'><div id='lib:coroutine_handle,hash'><div id='lib:hash,coroutine_handle'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:hash,coroutine_handle'>🔗</a></div><code class='itemdeclcode'><span class='keyword'>template</span><span class='anglebracket'>&lt;</span><span class='keyword'>class</span> P<span class='anglebracket'>&gt;</span> <span class='keyword'>struct</span> hash<span class='anglebracket'>&lt;</span>coroutine_handle<span class='anglebracket'>&lt;</span>P<span class='anglebracket'>&gt;</span><span class='anglebracket'>&gt;</span>;
</code></div></div></div></div><div class='para' id='coroutine.handle.hash-1'><div class='marginalizedparent'><a class='marginalized' href='#coroutine.handle.hash-1'>1</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/support.tex#L5541'>#</a></div><div class='texpara'><div id='coroutine.handle.hash-1.sentence-1' class='sentence'>The specialization is enabled (<a href='unord.hash' title='22.10.19&emsp;Class template hash'>[unord.<span class='shy'></span>hash]</a>)<a class='hidden_link' href='#coroutine.handle.hash-1.sentence-1'>.</a></div></div></div></div></div></div><div id='coroutine.noop' class='section'><h3 ><a class='secnum' href='#coroutine.noop' style='min-width:80pt'>17.12.5</a> No-op coroutines <a class='abbr_ref' href='coroutine.noop'>[coroutine.noop]</a></h3><div id='coroutine.promise.noop' class='section'><h4 ><a class='secnum' href='#coroutine.promise.noop' style='min-width:95pt'>17.12.5.1</a> Class <span class='texttt'>noop_<span class='shy'></span>coroutine_<span class='shy'></span>promise</span> <a class='abbr_ref' href='coroutine.promise.noop'>[coroutine.promise.noop]</a></h4><div class='texpara'><div id='lib:noop_coroutine_promise'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:noop_coroutine_promise'>🔗</a></div><code class='itemdeclcode'><span class='keyword'>struct</span> noop_coroutine_promise <span class='curlybracket'>{</span><span class='curlybracket'>}</span>;
</code></div></div></div><div class='para' id='coroutine.promise.noop-1'><div class='marginalizedparent'><a class='marginalized' href='#coroutine.promise.noop-1'>1</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/support.tex#L5555'>#</a></div><div class='texpara'><div id='coroutine.promise.noop-1.sentence-1' class='sentence'>The class <span class='texttt'>noop_<span class='shy'></span>coroutine_<span class='shy'></span>promise</span> defines the promise type for
the coroutine referred to
by <span class='texttt'>noop_<span class='shy'></span>coroutine_<span class='shy'></span>handle</span> (<a href='#coroutine.syn' title='17.12.2&emsp;Header &lt;coroutine&gt; synopsis'>[coroutine.<span class='shy'></span>syn]</a>)<a class='hidden_link' href='#coroutine.promise.noop-1.sentence-1'>.</a></div></div></div></div></div><div id='coroutine.handle.noop' class='section'><h4 ><a class='secnum' href='#coroutine.handle.noop' style='min-width:95pt'>17.12.5.2</a> Class <span class='texttt'>coroutine_<span class='shy'></span>handle&lt;noop_<span class='shy'></span>coroutine_<span class='shy'></span>promise&gt;</span> <a class='abbr_ref' href='coroutine.handle.noop'>[coroutine.handle.noop]</a></h4><div id='coroutine.handle.noop.general' class='section'><h4 ><a class='secnum' href='#coroutine.handle.noop.general' style='min-width:110pt'>17.12.5.2.1</a> General <a class='abbr_ref' href='coroutine.handle.noop.general'>[coroutine.handle.noop.general]</a></h4><div class='texpara'><span id='lib:coroutine_handle<noop_coroutine_promise>'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:coroutine_handle%3cnoop_coroutine_promise%3e'>🔗</a></div><span class='codeblock'><span class='keyword'>namespace</span> std <span class='curlybracket'>{</span>
  <span class='keyword'>template</span><span class='anglebracket'>&lt;</span><span class='anglebracket'>&gt;</span>
  <span class='keyword'>struct</span> coroutine_handle<span class='anglebracket'>&lt;</span>noop_coroutine_promise<span class='anglebracket'>&gt;</span>
  <span class='curlybracket'>{</span>
    <span class='comment'>// <a href='#coroutine.handle.noop.conv' title='17.12.5.2.2&emsp;Conversion'>[coroutine.<span class='shy'></span>handle.<span class='shy'></span>noop.<span class='shy'></span>conv]</a>, conversion</span>
    <span class='keyword'>constexpr</span> <span class='keyword'>operator</span> coroutine_handle<span class='anglebracket'>&lt;</span><span class='anglebracket'>&gt;</span><span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span> <span class='keyword'>noexcept</span>;

    <span class='comment'>// <a href='#coroutine.handle.noop.observers' title='17.12.5.2.3&emsp;Observers'>[coroutine.<span class='shy'></span>handle.<span class='shy'></span>noop.<span class='shy'></span>observers]</a>, observers</span>
    <span class='keyword'>constexpr</span> <span class='keyword'>explicit</span> <span class='keyword'>operator</span> <span class='keyword'>bool</span><span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span> <span class='keyword'>noexcept</span>;
    <span class='keyword'>constexpr</span> <span class='keyword'>bool</span> done<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span> <span class='keyword'>noexcept</span>;

    <span class='comment'>// <a href='#coroutine.handle.noop.resumption' title='17.12.5.2.4&emsp;Resumption'>[coroutine.<span class='shy'></span>handle.<span class='shy'></span>noop.<span class='shy'></span>resumption]</a>, resumption</span>
    <span class='keyword'>constexpr</span> <span class='keyword'>void</span> <span class='keyword'>operator</span><span class='parenthesis'>(</span><span class='parenthesis'>)</span><span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span> <span class='keyword'>noexcept</span>;
    <span class='keyword'>constexpr</span> <span class='keyword'>void</span> resume<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span> <span class='keyword'>noexcept</span>;
    <span class='keyword'>constexpr</span> <span class='keyword'>void</span> destroy<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span> <span class='keyword'>noexcept</span>;

    <span class='comment'>// <a href='#coroutine.handle.noop.promise' title='17.12.5.2.5&emsp;Promise access'>[coroutine.<span class='shy'></span>handle.<span class='shy'></span>noop.<span class='shy'></span>promise]</a>, promise access</span>
    <span class='keyword added'>constexpr</span> noop_coroutine_promise<span class='operator'>&amp;</span> promise<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span> <span class='keyword'>noexcept</span>;

    <span class='comment'>// <a href='#coroutine.handle.noop.address' title='17.12.5.2.6&emsp;Address'>[coroutine.<span class='shy'></span>handle.<span class='shy'></span>noop.<span class='shy'></span>address]</a>, address</span>
    <span class='keyword'>constexpr</span> <span class='keyword'>void</span><span class='operator'>*</span> address<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span> <span class='keyword'>noexcept</span>;
  <span class='keyword'>private</span><span class='operator'>:</span>
    <span class='keyword added'>constexpr</span> coroutine_handle<span class='parenthesis'>(</span><i ><span class='texttt'>unspecified</span></i><span class='parenthesis'>)</span>;
    <span class='keyword'>void</span><span class='operator'>*</span> ptr;  <span class='comment'>// <i >exposition only</i></span>
  <span class='curlybracket'>}</span>;
<span class='curlybracket'>}</span>
</span></span></div></div><div id='coroutine.handle.noop.conv' class='section'><h4 ><a class='secnum' href='#coroutine.handle.noop.conv' style='min-width:110pt'>17.12.5.2.2</a> Conversion <a class='abbr_ref' href='coroutine.handle.noop.conv'>[coroutine.handle.noop.conv]</a></h4><div class='texpara'><div id='lib:coroutine_handle<noop_coroutine_promise>,operator_coroutine_handle<>'><div id='lib:operator_coroutine_handle<>,coroutine_handle<noop_coroutine_promise>'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:operator_coroutine_handle%3c%3e,coroutine_handle%3cnoop_coroutine_promise%3e'>🔗</a></div><code class='itemdeclcode'><span class='keyword'>constexpr</span> <span class='keyword'>operator</span> coroutine_handle<span class='anglebracket'>&lt;</span><span class='anglebracket'>&gt;</span><span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span> <span class='keyword'>noexcept</span>;
</code></div></div></div></div><div class='para' id='coroutine.handle.noop.conv-1'><div class='marginalizedparent'><a class='marginalized' href='#coroutine.handle.noop.conv-1'>1</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/support.tex#L5603'>#</a></div><div class='texpara'><div id='coroutine.handle.noop.conv-1.sentence-1' class='sentence'><i >Effects</i>: Equivalent to: <span class='texttt'><span class='keyword'>return</span> coroutine_<span class='shy'></span>handle<span class='anglebracket'>&lt;</span><span class='anglebracket'>&gt;</span><span class='operator'>&#x200b;::&#x200b;</span>from_<span class='shy'></span>address<span class='parenthesis'>(</span>address<span class='parenthesis'>(</span><span class='parenthesis'>)</span><span class='parenthesis'>)</span>;</span></div></div></div></div></div><div id='coroutine.handle.noop.observers' class='section'><h4 ><a class='secnum' href='#coroutine.handle.noop.observers' style='min-width:110pt'>17.12.5.2.3</a> Observers <a class='abbr_ref' href='coroutine.handle.noop.observers'>[coroutine.handle.noop.observers]</a></h4><div class='texpara'><div id='lib:coroutine_handle<noop_coroutine_promise>,operator_bool'><div id='lib:operator_bool,coroutine_handle<noop_coroutine_promise>'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:operator_bool,coroutine_handle%3cnoop_coroutine_promise%3e'>🔗</a></div><code class='itemdeclcode'><span class='keyword'>constexpr</span> <span class='keyword'>explicit</span> <span class='keyword'>operator</span> <span class='keyword'>bool</span><span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span> <span class='keyword'>noexcept</span>;
</code></div></div></div></div><div class='para' id='coroutine.handle.noop.observers-1'><div class='marginalizedparent'><a class='marginalized' href='#coroutine.handle.noop.observers-1'>1</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/support.tex#L5616'>#</a></div><div class='texpara'><div id='coroutine.handle.noop.observers-1.sentence-1' class='sentence'><i >Returns</i>: <span class='texttt'><span class='literal'>true</span></span><a class='hidden_link' href='#coroutine.handle.noop.observers-1.sentence-1'>.</a></div></div></div></div><div class='texpara'><div id='lib:coroutine_handle<noop_coroutine_promise>,done'><div id='lib:done,coroutine_handle<noop_coroutine_promise>'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:done,coroutine_handle%3cnoop_coroutine_promise%3e'>🔗</a></div><code class='itemdeclcode'><span class='keyword'>constexpr</span> <span class='keyword'>bool</span> done<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span> <span class='keyword'>noexcept</span>;
</code></div></div></div></div><div class='para' id='coroutine.handle.noop.observers-2'><div class='marginalizedparent'><a class='marginalized' href='#coroutine.handle.noop.observers-2'>2</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/support.tex#L5627'>#</a></div><div class='texpara'><div id='coroutine.handle.noop.observers-2.sentence-1' class='sentence'><i >Returns</i>: <span class='texttt'><span class='literal'>false</span></span><a class='hidden_link' href='#coroutine.handle.noop.observers-2.sentence-1'>.</a></div></div></div></div></div><div id='coroutine.handle.noop.resumption' class='section'><h4 ><a class='secnum' href='#coroutine.handle.noop.resumption' style='min-width:110pt'>17.12.5.2.4</a> Resumption <a class='abbr_ref' href='coroutine.handle.noop.resumption'>[coroutine.handle.noop.resumption]</a></h4><div class='texpara'><div id='lib:coroutine_handle<noop_coroutine_promise>,destroy'><div id='lib:destroy,coroutine_handle<noop_coroutine_promise>'><div id='lib:coroutine_handle<noop_coroutine_promise>,resume'><div id='lib:resume,coroutine_handle<noop_coroutine_promise>'><div id='lib:coroutine_handle<noop_coroutine_promise>,operator()'><div id='lib:operator(),coroutine_handle<noop_coroutine_promise>'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:operator(),coroutine_handle%3cnoop_coroutine_promise%3e'>🔗</a></div><code class='itemdeclcode'><span class='keyword'>constexpr</span> <span class='keyword'>void</span> <span class='keyword'>operator</span><span class='parenthesis'>(</span><span class='parenthesis'>)</span><span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span> <span class='keyword'>noexcept</span>;
<span class='keyword'>constexpr</span> <span class='keyword'>void</span> resume<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span> <span class='keyword'>noexcept</span>;
<span class='keyword'>constexpr</span> <span class='keyword'>void</span> destroy<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span> <span class='keyword'>noexcept</span>;
</code></div></div></div></div></div></div></div></div><div class='para' id='coroutine.handle.noop.resumption-1'><div class='marginalizedparent'><a class='marginalized' href='#coroutine.handle.noop.resumption-1'>1</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/support.tex#L5644'>#</a></div><div class='texpara'><div id='coroutine.handle.noop.resumption-1.sentence-1' class='sentence'><i >Effects</i>: None<a class='hidden_link' href='#coroutine.handle.noop.resumption-1.sentence-1'>.</a></div></div></div></div><div class='para' id='coroutine.handle.noop.resumption-2'><div class='marginalizedparent'><a class='marginalized' href='#coroutine.handle.noop.resumption-2'>2</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/support.tex#L5648'>#</a></div><div class='texpara'><div id='coroutine.handle.noop.resumption-2.sentence-1' class='sentence'><i >Remarks</i>: If <span class='texttt'>noop_<span class='shy'></span>coroutine_<span class='shy'></span>handle</span> is converted to <span class='texttt'>coroutine_<span class='shy'></span>handle<span class='anglebracket'>&lt;</span><span class='anglebracket'>&gt;</span></span>,
calls to <span class='texttt'><span class='keyword'>operator</span><span class='parenthesis'>(</span><span class='parenthesis'>)</span></span>, <span class='texttt'>resume</span> and <span class='texttt'>destroy</span> on that handle
will also have no observable effects<a class='hidden_link' href='#coroutine.handle.noop.resumption-2.sentence-1'>.</a></div></div></div></div></div><div id='coroutine.handle.noop.promise' class='section'><h4 ><a class='secnum' href='#coroutine.handle.noop.promise' style='min-width:110pt'>17.12.5.2.5</a> Promise access <a class='abbr_ref' href='coroutine.handle.noop.promise'>[coroutine.handle.noop.promise]</a></h4><div class='texpara'><div id='lib:coroutine_handle<noop_coroutine_promise>,promise'><div id='lib:promise,coroutine_handle<noop_coroutine_promise>'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:promise,coroutine_handle%3cnoop_coroutine_promise%3e'>🔗</a></div><code class='itemdeclcode'><span class='keyword added'>constexpr</span> noop_coroutine_promise<span class='operator'>&amp;</span> promise<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span> <span class='keyword'>noexcept</span>;
</code></div></div></div></div><div class='para' id='coroutine.handle.noop.promise-1'><div class='marginalizedparent'><a class='marginalized' href='#coroutine.handle.noop.promise-1'>1</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/support.tex#L5663'>#</a></div><div class='texpara'><div id='coroutine.handle.noop.promise-1.sentence-1' class='sentence'><i >Returns</i>: A reference to the promise object associated with this
coroutine handle<a class='hidden_link' href='#coroutine.handle.noop.promise-1.sentence-1'>.</a></div></div></div></div></div><div id='coroutine.handle.noop.address' class='section'><h4 ><a class='secnum' href='#coroutine.handle.noop.address' style='min-width:110pt'>17.12.5.2.6</a> Address <a class='abbr_ref' href='coroutine.handle.noop.address'>[coroutine.handle.noop.address]</a></h4><div class='texpara'><div id='lib:coroutine_handle<noop_coroutine_promise>,address'><div id='lib:address,coroutine_handle<noop_coroutine_promise>'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:address,coroutine_handle%3cnoop_coroutine_promise%3e'>🔗</a></div><code class='itemdeclcode'><span class='keyword'>constexpr</span> <span class='keyword'>void</span><span class='operator'>*</span> address<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span> <span class='keyword'>noexcept</span>;
</code></div></div></div></div><div class='para' id='coroutine.handle.noop.address-1'><div class='marginalizedparent'><a class='marginalized' href='#coroutine.handle.noop.address-1'>1</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/support.tex#L5677'>#</a></div><div class='texpara'><div id='coroutine.handle.noop.address-1.sentence-1' class='sentence'><i >Returns</i>: <span class='texttt'>ptr</span><a class='hidden_link' href='#coroutine.handle.noop.address-1.sentence-1'>.</a></div></div></div></div><div class='para' id='coroutine.handle.noop.address-2'><div class='marginalizedparent'><a class='marginalized' href='#coroutine.handle.noop.address-2'>2</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/support.tex#L5681'>#</a></div><div class='texpara'><div id='coroutine.handle.noop.address-2.sentence-1' class='sentence'><i >Remarks</i>: A <span class='texttt'>noop_<span class='shy'></span>coroutine_<span class='shy'></span>handle</span>'s <span class='texttt'>ptr</span> is always a
non-null pointer value<a class='hidden_link' href='#coroutine.handle.noop.address-2.sentence-1'>.</a></div></div></div></div></div></div><div id='coroutine.noop.coroutine' class='section'><h4 ><a class='secnum' href='#coroutine.noop.coroutine' style='min-width:95pt'>17.12.5.3</a> Function <span class='texttt'>noop_<span class='shy'></span>coroutine</span> <a class='abbr_ref' href='coroutine.noop.coroutine'>[coroutine.noop.coroutine]</a></h4><div class='texpara'><div id='lib:noop_coroutine'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:noop_coroutine'>🔗</a></div><code class='itemdeclcode'><span class='keyword added'>constexpr</span> noop_coroutine_handle noop_coroutine<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>noexcept</span>;
</code></div></div></div><div class='para' id='coroutine.noop.coroutine-1'><div class='marginalizedparent'><a class='marginalized' href='#coroutine.noop.coroutine-1'>1</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/support.tex#L5695'>#</a></div><div class='texpara'><div id='coroutine.noop.coroutine-1.sentence-1' class='sentence'><i >Returns</i>: A handle to a coroutine that has no observable effects
when resumed or destroyed<a class='hidden_link' href='#coroutine.noop.coroutine-1.sentence-1'>.</a></div></div></div></div><div class='para' id='coroutine.noop.coroutine-2'><div class='marginalizedparent'><a class='marginalized' href='#coroutine.noop.coroutine-2'>2</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/support.tex#L5700'>#</a></div><div class='texpara'><div id='coroutine.noop.coroutine-2.sentence-1' class='sentence'><i >Remarks</i>: A handle returned from <span class='texttt'>noop_<span class='shy'></span>coroutine</span> may or may not
compare equal to a handle returned from another invocation
of <span class='texttt'>noop_<span class='shy'></span>coroutine</span><a class='hidden_link' href='#coroutine.noop.coroutine-2.sentence-1'>.</a></div></div></div></div></div></div><div id='coroutine.trivial.awaitables' class='section'><h3 ><a class='secnum' href='#coroutine.trivial.awaitables' style='min-width:80pt'>17.12.6</a> Trivial awaitables <a class='abbr_ref' href='coroutine.trivial.awaitables'>[coroutine.trivial.awaitables]</a></h3><div class='texpara'><span id='lib:suspend_always,await_resume'><span id='lib:await_resume,suspend_always'><span id='lib:suspend_always,await_suspend'><span id='lib:await_suspend,suspend_always'><span id='lib:suspend_always,await_ready'><span id='lib:await_ready,suspend_always'><span id='lib:suspend_always'><span id='lib:suspend_never,await_resume'><span id='lib:await_resume,suspend_never'><span id='lib:suspend_never,await_suspend'><span id='lib:await_suspend,suspend_never'><span id='lib:suspend_never,await_ready'><span id='lib:await_ready,suspend_never'><span id='lib:suspend_never'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:suspend_never'>🔗</a></div><span class='codeblock'><span class='keyword'>namespace</span> std <span class='curlybracket'>{</span>
  <span class='keyword'>struct</span> suspend_never <span class='curlybracket'>{</span>
    <span class='keyword'>constexpr</span> <span class='keyword'>bool</span> await_ready<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span> <span class='keyword'>noexcept</span> <span class='curlybracket'>{</span> <span class='keyword'>return</span> <span class='literal'>true</span>; <span class='curlybracket'>}</span>
    <span class='keyword'>constexpr</span> <span class='keyword'>void</span> await_suspend<span class='parenthesis'>(</span>coroutine_handle<span class='anglebracket'>&lt;</span><span class='anglebracket'>&gt;</span><span class='parenthesis'>)</span> <span class='keyword'>const</span> <span class='keyword'>noexcept</span> <span class='curlybracket'>{</span><span class='curlybracket'>}</span>
    <span class='keyword'>constexpr</span> <span class='keyword'>void</span> await_resume<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span> <span class='keyword'>noexcept</span> <span class='curlybracket'>{</span><span class='curlybracket'>}</span>
  <span class='curlybracket'>}</span>;
  <span class='keyword'>struct</span> suspend_always <span class='curlybracket'>{</span>
    <span class='keyword'>constexpr</span> <span class='keyword'>bool</span> await_ready<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span> <span class='keyword'>noexcept</span> <span class='curlybracket'>{</span> <span class='keyword'>return</span> <span class='literal'>false</span>; <span class='curlybracket'>}</span>
    <span class='keyword'>constexpr</span> <span class='keyword'>void</span> await_suspend<span class='parenthesis'>(</span>coroutine_handle<span class='anglebracket'>&lt;</span><span class='anglebracket'>&gt;</span><span class='parenthesis'>)</span> <span class='keyword'>const</span> <span class='keyword'>noexcept</span> <span class='curlybracket'>{</span><span class='curlybracket'>}</span>
    <span class='keyword'>constexpr</span> <span class='keyword'>void</span> await_resume<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span> <span class='keyword'>noexcept</span> <span class='curlybracket'>{</span><span class='curlybracket'>}</span>
  <span class='curlybracket'>}</span>;
<span class='curlybracket'>}</span>
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></div><div class='para nonNormativeOnly' id='coroutine.trivial.awaitables-1'><div class='marginalizedparent'><a class='marginalized' href='#coroutine.trivial.awaitables-1'>1</a></div><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/support.tex#L5732'>#</a></div><div class='texpara'><div id='coroutine.trivial.awaitables-note-1' class='note'><div class='texpara'>[<i>Note&nbsp;<a href='#coroutine.trivial.awaitables-note-1'>1</a></i>:&ensp;<div id='coroutine.trivial.awaitables-1.sentence-1' class='sentence'>The types <span class='texttt'>suspend_<span class='shy'></span>never</span> and <span class='texttt'>suspend_<span class='shy'></span>always</span> can be used
to indicate that an <a href='expr.await#nt:await-expression' title='7.6.2.4&emsp;Await&emsp;[expr.await]'><span id='ntref:await-expression'><span class='textsf'><i >await-expression</i></span></span></a> either never
suspends or always suspends, and in either case does not produce a value<a class='hidden_link' href='#coroutine.trivial.awaitables-1.sentence-1'>.</a></div> —&nbsp;<i>end note</i>]</div></div></div></div></div>
    </div>
	</div>
  <h3 id="feature-test-macros"><a href="#feature-test-macros">Feature test macros</a></h3>
  <div class="wording">
  <h2><a href="http://eel.is/c++draft/cpp.predefined">15.11 Predefined macro names [cpp.predefined]</a></h2>
  <div class="description">
  <span class="added"><code>__cpp_constexpr_coroutines 2024??L</code></span>
  </div>
  <h2><a href="http://eel.is/c++draft/version.syn">17.3.2 Header &lt;version&gt; synopsis [version.syn]</a></h2>
  <div class="description">
  <span class="added"><code>#define __cpp_lib_constexpr_coroutines 2024??L</code></span>
  </div>

  </div>
</div></div></article>
</div><script>
	hljs.addPlugin(mergeHTMLPlugin);
	hljs.highlightAll();
</script>
</body>
</html>
