<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>P3378R0: constexpr exception types</title>
<link rel="stylesheet" href="data:text/css;base64,QG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyaykgewoJOnJvb3QgewoJCS0tdGV4dC1jb2xvcjogI0JCQjsKCQktLWZvdW5kLWhpZ2hsaWdodDogYmx1ZTsKCQktLWZvdW5kLXRleHQtY29sb3I6IHdoaXRlOwoJCS0tbWFpbi1iYWNrZ3JvdW5kOiAzMiwzMiwzMjsKCQktLWhlYWRlci1jb2xvcjogd2hpdGU7CgkJLS1ib3gtc2hhZG93LWNvbG9yOiByZ2JhKDAsMCwwLDAuNSk7CiAgICAtLXRoaW4tYm94LXNoYWRvdy1jb2xvcjogcmdiYSgwLDAsMCwwLjEpOwoJCS0tbmF2LWJhY2tncm91bmQtY29sb3I6ICMxMDEwMTA7CgkJLS1jb2RlLWZvcmVncm91bmQtY29sb3I6IHdoaXRlOwoJCS0tY29kZS1pbmZvLWNvbG9yOiByZ2JhKDI1NSwyNTUsMjU1LDAuMSk7CgkJLS1jb2RlLWJhY2tncm91bmQtY29sb3I6IHZhcigtLW5hdi1iYWNrZ3JvdW5kLWNvbG9yKTsKCQktLWxpbmstY29sb3I6ICM4ZWYzZmY7CgkJLS12aXNpdGVkLWxpbmstY29sb3I6ICNmMGZmODk7CgkJLS1ob3Zlci1saW5rLWNvbG9yOiAjYjNmN2ZmOwoJCS0taG92ZXItdmlzaXRlZC1saW5rLWNvbG9yOiAjYzhmZmIzOwoJCS0tbGluZS1jb2xvcjogMjU1LDI1NSwyNTU7CgkJLS1oZWFkZXItYmFja2dyb3VuZDogMCwwLDA7CgkJLS1xdW90ZS1sZWZ0LWNvbG9yOiByZ2JhKDI1NSwyNTUsMjU1LDAuNSk7CgkJLS1oaWdobGlnaHQ6IHJnYmEoMjU1LDI1MiwwLDAuMjUpOwoJfQoJOjpzZWxlY3Rpb24gewoJICBjb2xvcjogYmxhY2s7CgkgIGJhY2tncm91bmQ6IGxpZ2h0eWVsbG93OwoJfQoJCn0KCkBtZWRpYSAocHJlZmVycy1jb2xvci1zY2hlbWU6IGxpZ2h0KSB7Cgk6cm9vdCB7CgkJLS10ZXh0LWNvbG9yOiBibGFjazsKCQktLWZvdW5kLWhpZ2hsaWdodDogeWVsbG93OwoJCS0tZm91bmQtdGV4dC1jb2xvcjogYmxhY2s7CgkJLS1tYWluLWJhY2tncm91bmQ6IDI1NSwyNTUsMjU1OwoJCS0taGVhZGVyLWNvbG9yOiBibGFjazsKCQktLWJveC1zaGFkb3ctY29sb3I6IHJnYmEoMCwwLDAsMC4zKTsKICAgIC0tdGhpbi1ib3gtc2hhZG93LWNvbG9yOiByZ2JhKDAsMCwwLDAuMSk7CgkJLS1uYXYtYmFja2dyb3VuZC1jb2xvcjogI0Y1RjVGNTsKCQktLWNvZGUtZm9yZWdyb3VuZC1jb2xvcjogYmxhY2s7CgkJLS1jb2RlLWluZm8tY29sb3I6IHJnYmEoMCwwLDAsMC4xKTsKCQktLWNvZGUtYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbmF2LWJhY2tncm91bmQtY29sb3IpOwoJCS0tbGluay1jb2xvcjogIzAwMDA4MjsKCQktLXZpc2l0ZWQtbGluay1jb2xvcjogIzUwOGQwZjsKCQktLWhvdmVyLWxpbmstY29sb3I6ICM1NzU3YzI7CgkJLS1ob3Zlci12aXNpdGVkLWxpbmstY29sb3I6ICM5NGM1NjA7CgkJLS1saW5lLWNvbG9yOiAxMiw0Myw3NTsKCQktLWhlYWRlci1iYWNrZ3JvdW5kOiAwLDAsMDsKCQktLXF1b3RlLWxlZnQtY29sb3I6IHJnYmEoMCwwLDAsMC41KTsKCQktLWhpZ2hsaWdodDogcmdiYSgyNTUsMjU0LDIwNywwLjUpOwoJfQoJOjpzZWxlY3Rpb24gewoJICBjb2xvcjogYmxhY2s7CgkgIGJhY2tncm91bmQ6ICNhNGMzZjY7Cgl9Cn0KCnNwYW46dGFyZ2V0LCBwOnRhcmdldCwgbGk6dGFyZ2V0LCBkaXY6dGFyZ2V0IHsKICBiYWNrZ3JvdW5kOiB2YXIoLS1oaWdobGlnaHQpOwp9CgoubmFtZS1vZi1wYXBlciB7Cglmb250LXNpemU6IDI4cHg7CglwYWRkaW5nLXRvcDogMC41ZW07Cn0KCnNwYW4uZm91bmQgewoJdGV4dC1zaGFkb3c6IDAgMCAxMHB4IHZhcigtLWZvdW5kLWhpZ2hsaWdodCksICAwIDAgMTBweCB2YXIoLS1mb3VuZC1oaWdobGlnaHQpLCAgMCAwIDEwcHggdmFyKC0tZm91bmQtaGlnaGxpZ2h0KSwgIDAgMCAxMHB4IHZhcigtLWZvdW5kLWhpZ2hsaWdodCk7Cgljb2xvcjogdmFyKC0tZm91bmQtdGV4dC1jb2xvcikgIWltcG9ydGFudDsKfQoKYm9keSB7Cglmb250LWZhbWlseTogSGVsdmV0aWNhOwoJcGFkZGluZzogMDsKCW1hcmdpbjogMDsKCW92ZXJmbG93OiBoaWRkZW47Cgljb2xvcjogdmFyKC0tdGV4dC1jb2xvcik7CgliYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKHZhcigtLW1haW4tYmFja2dyb3VuZCksIDEpOwp9Cgpib2R5ID4gZGl2IHsKCWRpc3BsYXk6IGZsZXg7CglwYWRkaW5nOiAwOwoJbWFyZ2luOiAwOwp9CgouaGlkZS1vbi1uYXJyb3cgewoJZGlzcGxheTogaW5oZXJpdDsKfQoKLmhpZGUtb24td2lkZSB7CglkaXNwbGF5OiBub25lOwp9CgpAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDExMDBweCkgewoJYm9keSB7CgkJb3ZlcmZsb3c6IGluaGVyaXQgIWltcG9ydGFudDsKCX0KCS5oaWRlLW9uLW5hcnJvdyB7CgkJZGlzcGxheTogbm9uZTsKCX0KCS5oaWRlLW9uLXdpZGUgewoJCWRpc3BsYXk6IGluaGVyaXQ7Cgl9Cglib2R5ID4gZGl2IHsKCQlkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50OwoJfQoJYXJ0aWNsZSB7CgkJb3ZlcmZsb3c6IGluaGVyaXQgIWltcG9ydGFudDsKCQliYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsIHRyYW5zcGFyZW50LHJnYmEodmFyKC0tbWFpbi1iYWNrZ3JvdW5kKSwwLjYpLCByZ2JhKHZhcigtLW1haW4tYmFja2dyb3VuZCksMC44KSwgcmdiYSh2YXIoLS1tYWluLWJhY2tncm91bmQpLDAuNiksIHRyYW5zcGFyZW50KSAhaW1wb3J0YW50OwoJfQoJbmF2LCBhcnRpY2xlIHsKCQlmbGV4OiBpbml0aWFsICFpbXBvcnRhbnQ7Cgl9CgluYXYgewoJCW1pbi13aWR0aDogaW5pdGlhbCAhaW1wb3J0YW50OwoJCW1heC13aWR0aDogaW5pdGlhbCAhaW1wb3J0YW50OwoJCW1pbi1oZWlnaHQ6IGluaXRpYWwgIWltcG9ydGFudDsKCQltYXgtaGVpZ2h0OiBpbml0aWFsICFpbXBvcnRhbnQ7CgkJYm94LXNoYWRvdzogMCAxMHB4IDAgdmFyKC0tYm94LXNoYWRvdy1jb2xvcik7Cgl9CgluYXYgPiBkaXYgewoJCW92ZXJmbG93OiBpbmhlcml0ICFpbXBvcnRhbnQ7CgkJcG9zaXRpb246IHJlbGF0aXZlICFpbXBvcnRhbnQ7CgkJbWF4LXdpZHRoOiBpbml0aWFsICFpbXBvcnRhbnQ7CgkJbWF4LWhlaWdodDogaW5pdGlhbCAhaW1wb3J0YW50OwoJfQoJZGl2Omhhcyg+IGlucHV0W3R5cGU9c2VhcmNoXSkgewoJCWRpc3BsYXk6IG5vbmU7Cgl9CglkaXYucXVvdGUgewoJCW92ZXJmbG93LXg6IHNjcm9sbDsKCQlvdmVyZmxvdy15OiB2aXNpYmxlOwoJfQp9CgpuYXYgewoJcGFkZGluZzogMCAwLjVlbTsKCW1hcmdpbjogMDsKCWZsZXg6IDEgMSAwOwoJbWluLXdpZHRoOiAzNTBweDsKCW1heC13aWR0aDogMzUwcHg7Cglib3gtc2hhZG93OiAwIDAgMTBweCB2YXIoLS1ib3gtc2hhZG93LWNvbG9yKTsKCWJhY2tncm91bmQtY29sb3I6IHZhcigtLW5hdi1iYWNrZ3JvdW5kLWNvbG9yKTsKfQoKbmF2ID4gZGl2IHsKCXBvc2l0aW9uOiBmaXhlZDsKCW1heC13aWR0aDogMzUwcHg7CgltYXgtaGVpZ2h0OiAxMDAlOwoJb3ZlcmZsb3c6IHNjcm9sbDsKCXRvcDogMDsKCWxlZnQ6IDA7CglwYWRkaW5nOiAwIDAuNWVtOwoJbWFyZ2luOiAwOwp9CgpuYXYgPiBkaXYgPiBkaXYgewoJcGFkZGluZzogMC41ZW07CglwYWRkaW5nLXRvcDogMDsKCXBhZGRpbmctYm90dG9tOiAxZW07Cn0KCmFydGljbGUgewoJZmxleDogMyAxIDA7CiAgc2Nyb2xsLWJlaGF2aW9yOiBzbW9vdGg7CglvdmVyZmxvdzogc2Nyb2xsOwoJaGVpZ2h0OiAxMDB2aDsKCXRleHQtYWxpZ246IGp1c3RpZnk7CgliYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCB0cmFuc3BhcmVudCxyZ2JhKHZhcigtLW1haW4tYmFja2dyb3VuZCksMC42KSwgcmdiYSh2YXIoLS1tYWluLWJhY2tncm91bmQpLDAuOCksIHJnYmEodmFyKC0tbWFpbi1iYWNrZ3JvdW5kKSwwLjYpLCB0cmFuc3BhcmVudCk7CglwYWRkaW5nOiAwOwoJbWFyZ2luOiAwOwp9CgphcnRpY2xlID4gZGl2IHsKCXBhZGRpbmctcmlnaHQ6IDEuNWVtOwoJcGFkZGluZy1sZWZ0OiAxLjVlbTsKCXBhZGRpbmctYm90dG9tOiAxZW07Cn0KCmNvZGUgewoJCn0KCmRpdi5xdW90ZSB7Cgljb2xvcjogdmFyKC0tY29kZS1mb3JlZ3JvdW5kLWNvbG9yKTsKCWJhY2tncm91bmQ6IHZhcigtLWNvZGUtYmFja2dyb3VuZC1jb2xvcik7CglwYWRkaW5nOiAxZW07Cglib3JkZXItcmFkaXVzOiAwcHggMTVweCAxNXB4IDBweDsKCWJvcmRlci1sZWZ0OiA1cHggc29saWQgdmFyKC0tcXVvdGUtbGVmdC1jb2xvcik7Cglmb250LXN0eWxlOiBpdGFsaWM7CgltYXJnaW46IDFlbTsKfQoKY29kZTpub3QocHJlID4gY29kZSkgewoJY29sb3I6IGluaGVyaXQ7CgliYWNrZ3JvdW5kOiB2YXIoLS1jb2RlLWJhY2tncm91bmQtY29sb3IpOwoJYm9yZGVyLXJhZGl1czogNXB4OwoJcGFkZGluZzogMCAwLjJlbTsKCW1hcmdpbjogMCAycHg7CglvdXRsaW5lOiAycHggc29saWQgdmFyKC0tY29kZS1iYWNrZ3JvdW5kLWNvbG9yKTsKfQoKcHJlID4gY29kZSB7CglvdXRsaW5lOiBub25lOwoJbGluZS1oZWlnaHQ6IDEuNDsKCXRhYi1zaXplOiAyOwp9CgpwcmU6aGFzKGNvZGUpIHsKCWNvbG9yOiB2YXIoLS1jb2RlLWZvcmVncm91bmQtY29sb3IpOwoJYmFja2dyb3VuZDogdmFyKC0tY29kZS1iYWNrZ3JvdW5kLWNvbG9yKTsKCXBhZGRpbmc6IDFlbTsKCWJvcmRlci1yYWRpdXM6IDE1cHg7Cglwb3NpdGlvbjogcmVsYXRpdmU7Cgl6LWluZGV4OiAxOwoJb3ZlcmZsb3cteDogc2Nyb2xsOwoJb3ZlcmZsb3cteTogdmlzaWJsZTsKfQoKcHJlOmhhcyhjb2RlLmxhbmd1YWdlLWNhcmJvbik6OmJlZm9yZSB7Cgljb250ZW50OiAiQ2FyYm9uIjsKCXRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7Cglwb3NpdGlvbjogYWJzb2x1dGU7Cgl0b3A6IDFlbTsKCXJpZ2h0OiAxZW07Cgljb2xvcjogdmFyKC0tY29kZS1pbmZvLWNvbG9yKTsKCWZvbnQtd2VpZ2h0OiBib2xkOwp9CgpwLCB1bCA+IGxpIHsKCXRleHQtYWxpZ246IGp1c3RpZnk7CglvdmVyZmxvdy13cmFwOiBicmVhay13b3JkOwoJaHlwaGVuczogYXV0bzsKfQoKYXJ0aWNsZSB1bCA+IGxpIHsKCXBhZGRpbmctYm90dG9tOiAwLjI1ZW07Cn0KCmRpdi5kZXNjcmlwdGlvbiB1bCB7CiAgcGFkZGluZy10b3A6IDAuNWVtOwoJcGFkZGluZy1ib3R0b206IDAuNWVtOwp9CgphIHsKCWNvbG9yOiB2YXIoLS1saW5rLWNvbG9yKTsKCXRleHQtZGVjb3JhdGlvbi1zdHlsZTogZG90dGVkOwp9CgphOmhvdmVyIHsKCWNvbG9yOiB2YXIoLS1ob3Zlci1saW5rLWNvbG9yKTsKCXRleHQtZGVjb3JhdGlvbi1zdHlsZTogc29saWQ7Cn0KCmE6dmlzaXRlZCB7Cgljb2xvcjogdmFyKC0tdmlzaXRlZC1saW5rLWNvbG9yKTsKfQoKYTp2aXNpdGVkOmhvdmVyIHsKCWNvbG9yOiB2YXIoLS1ob3Zlci12aXNpdGVkLWxpbmstY29sb3IpOwoJdGV4dC1kZWNvcmF0aW9uLXN0eWxlOiBzb2xpZDsKfQoKaDEsIGgyLCBoMywgaDQsIGg1IHsKCW1hcmdpbjogMDsKCW1hcmdpbi1ib3R0b206IDEwcHg7CglwYWRkaW5nOiAwLjVlbTsKCXBhZGRpbmctdG9wOiAyMHB4OwoJcGFkZGluZy1ib3R0b206IDJweDsKCXotaW5kZXg6IDI7Cgljb2xvcjogdmFyKC0taGVhZGVyLWNvbG9yKTsKfQoKYXJ0aWNsZSBoMSwgYXJ0aWNsZSBoMiwgYXJ0aWNsZSBoMywgYXJ0aWNsZSBoNCwgYXJ0aWNsZSBoNSB7Ci8qCXBvc2l0aW9uOiBzdGlja3k7Cglwb3NpdGlvbjogLXdlYmtpdC1zdGlja3k7Cgl0b3A6IDA7Ki8KCQp9CgpoMSB7Cglmb250LXdlaWdodDogODAwOwoJYm9yZGVyLWJvdHRvbTogcmdiYSh2YXIoLS1saW5lLWNvbG9yKSwgMSkgZG90dGVkIDJweDsKfQoKaDIgewoJZm9udC13ZWlnaHQ6IDgwMDsKCWJvcmRlci1ib3R0b206IHJnYmEodmFyKC0tbGluZS1jb2xvciksIDAuNzUpIGRvdHRlZCAycHg7Cn0KCmgzLCBoNCwgaDUgewoJZm9udC13ZWlnaHQ6IDYwMDsKCWJvcmRlci1ib3R0b206IHJnYmEodmFyKC0tbGluZS1jb2xvciksIDAuMzMpIGRvdHRlZCAycHg7Cn0KCmgxID4gYSwgaDIgPiBhLCBoMyA+IGEsIGg0ID4gYSwgaDUgPiBhIHsKCWNvbG9yOiBpbmhlcml0ICFpbXBvcnRhbnQ7Cgl0ZXh0LWRlY29yYXRpb246IGluaGVyaXQ7Cn0KCmgxOnRhcmdldDo6YWZ0ZXIsIGgyOnRhcmdldDo6YWZ0ZXIsIGgzOnRhcmdldDo6YWZ0ZXIsIGg0OnRhcmdldDo6YWZ0ZXIsIGg1OnRhcmdldDo6YWZ0ZXIgewoJdGV4dC1kZWNvcmF0aW9uOiBpbmhlcml0OwoJY29udGVudDogIiDimpPvuI4iOwogIGZvbnQtc2l6ZTogMTRweDsKfQoKaDEgPiBhOmhvdmVyLCBoMiA+IGE6aG92ZXIsIGgzID4gYTpob3ZlciwgaDQgPiBhOmhvdmVyLCBoNSA+IGE6aG92ZXIgewoJY29sb3I6IHZhcigtLWhvdmVyLWxpbmstY29sb3IpOwp9CgpkaXY6aGFzKD4gaW5wdXRbdHlwZT1zZWFyY2hdKSB7Cglwb3NpdGlvbjogZml4ZWQ7Cgl0b3A6IDA7CglyaWdodDogMDsKCXotaW5kZXg6IDEwMDA7CglwYWRkaW5nOiAwLjVlbTsKCWJhY2tncm91bmQtY29sb3I6IHZhcigtLW5hdi1iYWNrZ3JvdW5kLWNvbG9yKTsKCWJveC1zaGFkb3c6IDAgMCAxMHB4IHJnYmEoMCwwLDAsMC4zKTsKCWJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDEwcHg7Cn0KCmRpdiA+IGlucHV0W3R5cGU9c2VhcmNoXSB7CgliYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1uYXYtYmFja2dyb3VuZC1jb2xvcik7Cglib3JkZXI6IDJweCBzb2xpZCB2YXIoLS10ZXh0LWNvbG9yKTsKCWNvbG9yOiB2YXIoLS10ZXh0LWNvbG9yKTsKCXdpZHRoOiAzMDBweDsKfQoKZGl2LnBhcGVyLWluZm8gewoJcGFkZGluZzogMDsKCXBhZGRpbmctdG9wOiAxZW07CgkKCS5rZXkgewoJCWZvbnQtd2VpZ2h0OiBib2xkOwoJfQoJCglkaXYgewoJfQp9Cgp1bCB7CglwYWRkaW5nOiAwOwoJbWFyZ2luOiAwOwoJcGFkZGluZy1sZWZ0OiAyZW07Cn0KCmxpID4gdWwgewoJcGFkZGluZy1sZWZ0OiAwLjVlbTsKfQoKdWwgPiBsaSB7CglwYWRkaW5nLWxlZnQ6IDAuNWVtOwp9Cgpjb2RlIC5lcnJvciwgY29kZSAuYmVmb3JlIHsKCQlsaW5lLWhlaWdodDogMS45Owp9Cgpjb2RlIC5lcnJvciA+ICosIGNvZGUgLmJlZm9yZSA+ICogewoJYmFja2dyb3VuZC1jb2xvcjogI0ZGODg4OCAhaW1wb3J0YW50OwoJY29sb3I6IGJsYWNrICFpbXBvcnRhbnQ7CglAbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKSB7CgkJY29sb3I6IHdoaXRlOwoJfQoJYm9yZGVyOiAzcHggc29saWQgI0ZGODg4ODsKCWZvbnQtd2VpZ2h0OiBib2xkOwp9Cgpjb2RlIC5hZnRlciA+ICogewoJYmFja2dyb3VuZC1jb2xvcjogbGlnaHRncmVlbiAhaW1wb3J0YW50OwoJY29sb3I6IGJsYWNrICFpbXBvcnRhbnQ7CglAbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKSB7CgkJY29sb3I6IHdoaXRlOwoJfQoJYm9yZGVyOiAzcHggc29saWQgbGlnaHRncmVlbjsKCWZvbnQtd2VpZ2h0OiBib2xkOwp9Cgpjb2RlIC51bmNoYW5nZWQgPiAqIHsKCWJhY2tncm91bmQtY29sb3I6IGxpZ2h0eWVsbG93ICFpbXBvcnRhbnQ7Cgljb2xvcjogYmxhY2sgIWltcG9ydGFudDsKCUBtZWRpYSAocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspIHsKCQljb2xvcjogd2hpdGU7Cgl9Cglib3JkZXI6IDNweCBzb2xpZCBsaWdodHllbGxvdzsKCWZvbnQtd2VpZ2h0OiBib2xkOwp9Cgpjb2RlIC5pbnZpc2libGUgewoJdmlzaWJpbGl0eTogaGlkZGVuOwp9CgouY2hhbmdlcyB7CglkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KCi53b3JkaW5nIGgxLCAud29yZGluZyBoMiB7Cglmb250LXNpemU6IGluaGVyaXQ7Cgl0ZXh0LWRlY29yYXRpb246IG5vbmU7Cglib3JkZXI6IG5vbmU7CglwYWRkaW5nOiAwOwoJbWFyZ2luOiAwOwp9Cgoud29yZGluZyBwIHsKCXBhZGRpbmc6IDA7CglwYWRkaW5nLXRvcDogMC41ZW07CgltYXJnaW46IDA7Cn0KCi53b3JkaW5nIGEgewoJdGV4dC1kZWNvcmF0aW9uOiBub25lOwoJY29sb3I6IGluaGVyaXQ7Cn0KCi53b3JkaW5nIGE6aG92ZXIgewoJdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Cgljb2xvcjogdmFyKC0tbGluay1jb2xvcik7Cn0KCi53b3JkaW5nIGNvZGUgewoJYmFja2dyb3VuZDogaW5oZXJpdCAhaW1wb3J0YW50OwoJYm9yZGVyOiBub25lOwoJb3V0bGluZTogbm9uZTsKfQoJCi53b3JkaW5nIHsKCWZvbnQtZmFtaWx5OiAiTm90byBTZXJpZiI7CgkKCXBhZGRpbmc6IDAuNWVtIDFlbTsKCXBhZGRpbmctYm90dG9tOiAxZW07Cgljb2xvcjogdmFyKC0tY29kZS1mb3JlZ3JvdW5kLWNvbG9yKTsKCWJhY2tncm91bmQ6IHZhcigtLWNvZGUtYmFja2dyb3VuZC1jb2xvcik7CglsaW5lLWhlaWdodDogMS41NTsKCQoJYm9yZGVyLXJhZGl1czogMTVweDsKCXBvc2l0aW9uOiByZWxhdGl2ZTsKCXotaW5kZXg6IDE7CglvdmVyZmxvdy14OiB2aXNpYmxlOwoJb3ZlcmZsb3cteTogdmlzaWJsZTsKfQoJCi53b3JkaW5nIC5hZGRlZCwgcHJlIC5hZGRlZCB7CgliYWNrZ3JvdW5kLWNvbG9yOiBsaWdodGdyZWVuOwogIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwogIHRleHQtZGVjb3JhdGlvbi1jb2xvcjogZ3JlZW47CiAgdGV4dC1kZWNvcmF0aW9uLXRoaWNrbmVzczogMnB4ICFpbXBvcnRhbnQ7Cgl6LWluZGV4OiA4MDsKCXBhZGRpbmc6IDNweDsKCUBtZWRpYSAocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspIHsKCQljb2xvcjogYmxhY2s7Cgl9Cn0KCQoud29yZGluZyAucmVtb3ZlZCB7CgliYWNrZ3JvdW5kLWNvbG9yOiAjRkY4ODg4OwoJei1pbmRleDogNTA7CglwYWRkaW5nOiAzcHg7CiAgdGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7CiAgdGV4dC1kZWNvcmF0aW9uLWNvbG9yOiByZWQ7CiAgdGV4dC1kZWNvcmF0aW9uLXRoaWNrbmVzczogMnB4ICFpbXBvcnRhbnQ7CglAbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKSB7CgkJY29sb3I6IGJsYWNrOwoJfQp9CgkKLndvcmRpbmcgLm5vdGUgewoJZm9udC1zaXplOiAwLjhlbTsKfQoJCi53b3JkaW5nCSsgLndvcmRpbmcgewoJbWFyZ2luLXRvcDogMC41ZW07Cn0KCQoud29yZGluZyBwcmU6aGFzKGNvZGUpIHsKCWJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWNvZGUtaW5mby1jb2xvcik7Cglib3JkZXItcmFkaXVzOiAwOwoJcGFkZGluZzogMGVtOwoJei1pbmRleDogMTsKCW92ZXJmbG93LXg6IHNjcm9sbDsKfQoJCi53b3JkaW5nCWNvZGUgLmFkZGVkZWQgc3BhbiB7Cgljb2xvcjogYmxhY2sgIWltcG9ydGFudDsKfQoKdGFibGUucG9sbCB7CiAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKICBtYXJnaW4tdG9wOiAyMHB4Owp9Cgp0YWJsZS5wb2xsIHRoLCB0YWJsZS5wb2xsIHRkIHsKICBib3JkZXI6IDA7CiAgcGFkZGluZzogMCAxMHB4OwogIHRleHQtYWxpZ246IGNlbnRlcjsKICBib3JkZXI6IDJweCBzb2xpZCByZ2JhKDEyOCwxMjgsMTI4LDAuMik7Cn0KCnRhYmxlLnBvbGwgdGQ6Zmlyc3QtY2hpbGQsIHRhYmxlLnBvbGwgdGg6Zmlyc3QtY2hpbGQgewogYm9yZGVyLWxlZnQ6IG5vbmU7Cn0KCnRhYmxlLnBvbGwgdGQ6bGFzdC1jaGlsZCwgdGFibGUucG9sbCB0aDpsYXN0LWNoaWxkIHsKIGJvcmRlci1yaWdodDogbm9uZTsKfQoKdGFibGUucG9sbCB0cjpmaXJzdC1jaGlsZCB0aCwgdGFibGUucG9sbCB0cjpmaXJzdC1jaGlsZCB0ZCB7CiAgYm9yZGVyLXRvcDogbm9uZTsKfQoKdGFibGUucG9sbCB0cjpsYXN0LWNoaWxkIHRoLCB0YWJsZS5wb2xsIHRyOmxhc3QtY2hpbGQgdGQgewogIGJvcmRlci1ib3R0b206IG5vbmU7Cn0KCi53b3JkaW5nIC5kZXNjcmlwdGlvbiB7CiAgcGFkZGluZy1ib3R0b206IDFlbTsKfQoKLndvcmRpbmcgLmNhcHMgewogIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7Cn0KCnRhYmxlIHRoLnRhYmxlLWdyb3VwIHsKCW1heC13aWR0aDogMmVtOwp9Cgp0YWJsZSB0aC50YWJsZS1ncm91cCA+IHNwYW4gewoJbWF4LXdpZHRoOiAyZW07CglkaXNwbGF5OiBibG9jazsKCW92ZXJmbG93OiB2aXNpYmxlOwoJdGV4dC1hbGlnbjogY2VudGVyOwoJdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDFlbSk7Cn0KCnRhYmxlIHRoLnRhYmxlLWdyb3VwID4gc3BhbiA+IHNwYW4gewoJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpIHJvdGF0ZSgtOTBkZWcpOwoJd2lkdGg6IGF1dG87Cn0KCnRhYmxlLmJlZm9yZS1hZnRlciB0aCwgdGFibGUuYmVmb3JlLWFmdGVyIHRkICB7CiAgaGVpZ2h0OiAzMHB4Owp9CgoKCnRhYmxlLmJlZm9yZS1hZnRlciAuZ3JlZW4gewogIGNvbG9yOiBncmVlbjsKfQoKdGFibGUuYmVmb3JlLWFmdGVyIC5vcmFuZ2UgewogIGNvbG9yOiBvcmFuZ2U7Cn0KCnRhYmxlLmJlZm9yZS1hZnRlciAucmVkLW5vcm1hbCB7CiAgY29sb3I6IHJlZDsKfQoKdGFibGUuYmVmb3JlLWFmdGVyIC5pbi1wcm9ncmVzcyB7Cgljb2xvcjogYmx1ZTsKCWJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwyMzEsMjU1LDAuNSk7Cn0KCnRhYmxlLmJlZm9yZS1hZnRlciAucHJvcG9zaW5nIHsKCWNvbG9yOiBncmVlbjsKCWJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwyNTUsMCwwLjUpOwp9Cgp0YWJsZS5iZWZvcmUtYWZ0ZXIgLm5vdC1wcm9wb3NpbmcgewoJY29sb3I6IHJlZDsKCWJhY2tncm91bmQtY29sb3I6IHJnYmEoMjU1LDAsMCwwLjI1KTsKfQoKdGFibGUuYmVmb3JlLWFmdGVyIC5uZXZlci1wcm9wb3NpbmcgewoJY29sb3I6IHJlZDsKCWJhY2tncm91bmQtY29sb3I6IHJnYmEoMjU1LDAsMCwwLjI1KTsKfQoKdGFibGUuYmVmb3JlLWFmdGVyIC5wcm9wb3NlZC1yZWFkeS1mb3ItZnV0dXJlIHsKCWNvbG9yOiBncmVlbjsKCWJhY2tncm91bmQtY29sb3I6IHJnYmEoMjAzLDIyOSw3LDAuNSk7Cn0KCnRhYmxlLmJlZm9yZS1hZnRlciAucHJvcG9zZWQtcmVhZHktZm9yLWZ1dHVyZTIgewoJY29sb3I6IGdyZWVuOwoJYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsMTk4LDAsMC41KTsKfQoKdGFibGUuYmVmb3JlLWFmdGVyIC5yZWQgewogIGNvbG9yOiByZWQ7CiAgZm9udC1zaXplOiAyNHB4OwogIGxpbmUtaGVpZ2h0OiAxNnB4Owp9Cgp0ZCBhLCB0ZCBhOnZpc2l0ZWQsIHRkIGE6aG92ZXIgewoJY29sb3I6IGluaGVyaXQ7Cn0KCmRpdi53b3JkaW5nLW5vdGUgewogIGJhY2tncm91bmQ6IHJnYih2YXIoLS1tYWluLWJhY2tncm91bmQpKTsKICBib3gtc2hhZG93OiA1cHggMCAxMHB4IHZhcigtLXRoaW4tYm94LXNoYWRvdy1jb2xvcikgaW5zZXQ7CiAgYm9yZGVyLXJhZGl1czogMTVweDsKICBjb2xvcjogdmFyKC0tdGV4dC1jb2xvcik7CiAgcGFkZGluZzogMTBweDsKICBtYXJnaW46IDEwcHggMjBweDsKICBmb250LXNpemU6IDEycHg7Cn0KCi5wYXJudW0gewoJZm9udC1zaXplOiAxMnB4OwoJbWFyZ2luLXJpZ2h0OiAwLjI1ZW07CglkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KCmxpOmhhcyg+IC5wYXJudW0pIHsKCWxpc3Qtc3R5bGUtcG9zaXRpb246IGluc2lkZTsKCXBvc2l0aW9uOiByZWxhdGl2ZTsKfQoKbGkgPiAucGFybnVtIHsKCXBvc2l0aW9uOiBhYnNvbHV0ZTsKCWxlZnQ6IC0zMHB4OwoJYm90dG9tOiAycHg7Cn0KCnRhYmxlLmJlZm9yZS1hZnRlciB0ZC5kaXNhYmxlLWJvdHRvbSwgdGFibGUuYmVmb3JlLWFmdGVyIHRoLmRpc2FibGUtYm90dG9tIHsKCWJvcmRlci1ib3R0b206IG5vbmU7Cn0KdGFibGUuYmVmb3JlLWFmdGVyIHRoLmxlZnQsIHRhYmxlLmJlZm9yZS1hZnRlciB0ZC5sZWZ0IHsKCXRleHQtYWxpZ246IGxlZnQ7Cn0KCnRkIGEubm90ZTphZnRlciB7Cgl2ZXJ0aWNhbC1hbGlnbjogc3VwZXI7Cglmb250LXNpemU6IDc1JTsKCW1hcmdpbi1sZWZ0OiAwLjVlbTsKfQoKdGQgYS5ub3RlLm4xOmFmdGVyIHsKCWNvbnRlbnQ6ICIxIjsKfQoKdGQgYS5ub3RlLm4yOmFmdGVyIHsKCWNvbnRlbnQ6ICIyIjsKfQoKdGQgYS5ub3RlLm4zOmFmdGVyIHsKCWNvbnRlbnQ6ICIzIjsKfQoKdGQgYS5ub3RlLm40OmFmdGVyIHsKCWNvbnRlbnQ6ICI0IjsKfQoKdGQgYS5ub3RlLm41OmFmdGVyIHsKCWNvbnRlbnQ6ICI1IjsKfQ==">
<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 exception types</h1>
<div class="paper-info">
	<div><span class="key">Number:</span> P3378R0</div>
	<div><span class="key">Date:</span> <time>2024-10-14</time></div>
	<div><span class="key">Audience:</span> 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="#introduction">Introduction and motivation</a></li>
	<li><a href="#tldr">TL;DR</a></li>
	<li><a href="#implementation-experience">Implementation experience</a>
		<ul>
			<li><a href="#libcxx">libc++</a></li>
			<li><a href="#refcounted-string">Reference counted string</a></li>
			<li><a href="#libcppabi">libc++abi</a></li>
			<li><a href="#dependency-on-string">Dependecy on <code>&lt;string&gt;</code></a></li>
		</ul>
	</li>
	<li><a href="#existing-exception-types">Existing exception types</a></li>
	<li><a href="#should-all-exception-types-be-constexpr">Should all exception types be constexpr?</a>
		<ul>
			<li><a href="#runtime-error"><code>std::runtime_error</code></a></li>
			<li><a href="#error-code-and-error-category-depending-exception-types"><code>std::error_code</code> and <code>std::error_category</code> depending exception types</a></li>
		</ul>
	</li>
	<li><a href="#impact-on-existing-code">Impact on existing code</a></li>
	<li><a href="#intention-for-wording-changes">Intention for wording changes</a></li>
	<li><a href="#wording">Proposed changes to wording</a>
		<ul>
			<li><a href="#feature-test-macro">Feature test macro</a></li>
		</ul>
	</li>
</ul>
</div></div></nav>
<article>
<div><div>
	<h1 class="hide-on-narrow name-of-paper" id="introduction"><a href="#introduction">constexpr exception types</a></h1>
	<p>This paper is mechanical wording change; making all exception types associated with constexpr compatible functionality marked <code>constexpr</code>. This is needed for consistency across library since allowing exception handling during constant evaluation by <a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p3068r4.html">P3068</a>.</p>
	<p>As every exception type is just an ordinary type, they should be make constexpr compatible.</p>
	<h2 id="tldr"><a href="#tldr">TL;DR</a></h2>
	<p>Now when we can throw exceptions during constant evaluation we should make sure all constexpr compatible functionality (eg. <code>vector</code>) is able to throw its exception types (eg. <code>out_of_range</code>) and allow users to recover from errors gracefully.</p>
	<p>This proposal fixes the lag between constexpr exception support and library constexpr support and all future constexprification papers should make their exception types constexpr.</p>
	<h2 id="implementation-experience"><a href="#implementation-experience">Implementation experience</a></h2>
	<p>Implemented in libc++ as part of implementation of <a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p3068r4.html">P3068</a>, with source code available on <a href="https://github.com/hanickadot/llvm-project/tree/personal/hana/constexpr-exceptions">my github</a> and with compiler + library available on <a href="https://compiler-explorer.com/z/KWbMxeEoj">the compiler explorer</a>.</p>
	<pre><code class="language-cpp">constexpr bool check(const char * msg) {
    try {
        auto vec = std::vector&lt;int&gt;{0,1,2,3};
        return vec.at(4) == 4; // out-of-range
    } catch (const std::out_of_range & exc) {
        return std::string_view{exc.what()} == msg;
    } catch (...) {
        return false;
    }
    return false;
}

static_assert(check("vector"));
assert(check("vector"));
</code></pre>
	<h3 id="libcxx"><a href="#libcxx">libc++</a></h3>
	<p>In libc++ most of exception types have implementation of <code>what()</code> function members and destructors inside <code>.cpp</code> files. Most of them are in form:</p>
	<pre><code>
		<span class="added">constexpr</span> const char* <em>EXCEPTION_TYPE</em>::what() const noexcept { return "<em>EXCEPTION_MESSAGE</em>"; }
		<span class="added">constexpr</span> ~<em>EXCEPTION_TYPE</em>() noexcept { /* do nothing */ }
	</code></pre>
	<p>This code needs to be moved to header files.</p>
	<h4 id="refcounted-string"><a href="#refcounted-string">Reference counted string</a></h4>
	<p>One obstacle was a reference counted string inside <code>logic_error</code> and <code>runtime_error</code> which allocates <code>sizeof(_Rep_base) + strlen(_string) + 1</code> byte storage, and is using <code>reinterpret_cast</code> to access the <code>_Rep_base</code>. Also it uses atomic operations for refcounting.</p>
	<p>This can be avoided by not doing this during constant evaluation and just copy the string everytime underlying exception is copied or assigned.</p>
	<h4 id="libcppabi"><a href="#libcppabi">libc++abi</a></h4>
	<p>By moving exception member functions implementation to header files out of <code>.cpp</code> files we are loosing existing symbol emitted inside shared library of libc++ and libc++abi. This needs to be carefully fixed by providing same symbol explicitly to keep compatibility.</p>
	<h4 id="dependency-on-string"><a href="#dependency-on-string">Dependency on <code>&lt;string&gt;</code></a></h4>
	<p>All library generic errors (based on <code>logic_error</code> and <code>runtime_error</code>) are using also <code>std::string</code> constructor. But <code>&lt;stdexcept&gt;</code> is also required by <code>&lt;string&gt;</code>. This creates a cycle of dependency and fix is moving implementation of <code>&lt;stdexcept&gt;</code> constructors using <code>std::string</code> after definition of <code>std::basic_string&lt;CharT&gt;</code> template.</p>
	<h2 id="existing-exception-types"><a href="#existing-exception-types">Existing exception types</a></h2>
	<p>Following table shows in detail what is proposed and what is not. Also it shows which standard library implementation has exception types implemented in headers and which not. In addition to it you can see if functionality throwing the exception is already constant evaluatable or not. Allowing associated exception types to be constant evaluatable will allow users to recover from errors.</p>
	<table class="poll before-after">
		<tr><th rowspan="2" colspan="2">exception<br/>type</th><th rowspan="2">defined<br/>in</th><th colspan="2">constexpr</th><th colspan="3">implemented in header</th><th rowspan="2">note</th></tr>
		<tr><th>exception<br/>itself</th><th>associated<br/>functionality</th><th>libc++</th><th>libstdc++</th><th>STL</th></tr>
<tr>
	<th rowspan="6" class="table-group"><span><span>language</span></span></th>
	
	<td><a href="http://eel.is/c++draft/exception"><code>exception</code></a></td><td><code>&lt;exception&gt;</code></td><td class="in-progress"><a href="#in-progress" class="note n1">in&nbsp;progress</a></td><td class="in-progress"><a href="#in-progress" class="note n1">in&nbsp;progress</a></td><td class="red">x</td><td class="red">x</td><td class="green">✔︎</td><td><a href="https://wg21.link/P3068">P3068</a>, base class for all standard exceptions</td></tr>

<tr><td><a href="http://eel.is/c++draft/bad.alloc"><code>bad_alloc</code></a></td><td><code>&lt;new&gt;</code></td><td class="in-progress"><a href="#in-progress" class="note n1">in&nbsp;progress</a></td><td class="green">✔︎</td><td class="red">x</td><td class="red">x</td><td class="orange"><a href="#different-header-note" class="note n2">✔︎</a></td><td><a href="https://wg21.link/P3068">P3068</a></td></tr>

<tr><td><code><a href="http://eel.is/c++draft/new.badlength">bad_array_new_length</a></code></td><td><code>&lt;new&gt;</code></td><td class="in-progress"><a href="#in-progress" class="note n1">in&nbsp;progress</a></td><td class="green">✔︎</td><td class="red">x</td><td class="red">x</td><td class="orange"><a href="#different-header-note" class="note n2">✔︎</a></td><td><a href="https://wg21.link/P3068">P3068</a></td></tr>

<tr><td><code><a href="http://eel.is/c++draft/bad.cast">bad_cast</a></code></td><td><code>&lt;typeinfo&gt;</code></td><td class="in-progress"><a href="#in-progress" class="note n1">in&nbsp;progress</a></td><td class="green">✔︎</td><td class="red">x</td><td class="red">x</td><td class="orange"><a href="#different-header-note" class="note n2">✔︎</a></td><td><a href="https://wg21.link/P3068">P3068</a></td></tr>

<tr><td><code><a href="http://eel.is/c++draft/bad.exception">bad_exception</a></code></td><td><code>&lt;exception&gt;</code></td><td class="in-progress"><a href="#in-progress" class="note n1">in&nbsp;progress</a></td><td class="in-progress"><a href="#in-progress" class="note n1">in&nbsp;progress</a></td><td class="red">x</td><td class="red">x</td><td class="green">✔︎</td><td><a href="https://wg21.link/P3068">P3068</a></td></tr>

<tr><td><code><a href="http://eel.is/c++draft/bad.typeid">bad_typeid</a></code></td><td><code>&lt;typeinfo&gt;</code></td><td class="in-progress"><a href="#in-progress" class="note n1">in&nbsp;progress</a></td><td class="green">✔︎</td><td class="red">x</td><td class="red">x</td><td class="orange"><a href="#different-header-note" class="note n2">✔︎</a></td><td><a href="https://wg21.link/P3068">P3068</a></td></tr>

<tr>
	<th rowspan="9" class="table-group"><span><span>library&nbsp;generic&nbsp;errors</span></span></th>
	<td><code>domain_error</code></td><td><code>&lt;stdexcept&gt;</code></td><td class="proposing">proposed</td><td>–</td><td class="red">x</td><td class="red">x</td><td class="green">✔︎</td><td></td></tr>

<tr><td><code><a href="http://eel.is/c++draft/invalid.argument">invalid_argument</a></code></td><td><code>&lt;stdexcept&gt;</code></td><td class="proposing">proposed</td><td>–</td><td class="red">x</td><td class="red">x</td><td class="green">✔︎</td><td></td></tr>

<tr><td><code><a href="http://eel.is/c++draft/length.error">length_error</a></code></td><td><code>&lt;stdexcept&gt;</code></td><td class="proposing">proposed</td><td>–</td><td class="red">x</td><td class="red">x</td><td class="green">✔︎</td><td></td></tr>

<tr><td><code><a href="http://eel.is/c++draft/logic.error">logic_error</a></code></td><td><code>&lt;stdexcept&gt;</code></td><td class="proposing">proposed</td><td>–</td><td class="red">x</td><td class="red">x</td><td class="green">✔︎</td><td>base class for others</td></tr>

<tr><td><code><a href="http://eel.is/c++draft/out.of.range">out_of_range</a></code></td><td><code>&lt;stdexcept&gt;</code></td><td class="proposing">proposed</td><td>–</td><td class="red">x</td><td class="red">x</td><td class="green">✔︎</td><td></td></tr>

<tr><td><code><a href="http://eel.is/c++draft/overflow.error">overflow_error</a></code></td><td><code>&lt;stdexcept&gt;</code></td><td class="proposing">proposed</td><td>–</td><td class="red">x</td><td class="red">x</td><td class="green">✔︎</td><td></td></tr>

<tr><td><code><a href="http://eel.is/c++draft/range.error">range_error</a></code></td><td><code>&lt;stdexcept&gt;</code></td><td class="proposing">proposed</td><td>–</td><td class="red">x</td><td class="red">x</td><td class="green">✔︎</td><td></td></tr>

<tr><td><code><a href="http://eel.is/c++draft/runtime.error">runtime_error</a></code></td><td><code>&lt;stdexcept&gt;</code></td><td class="proposing">proposed</td><td>–</td><td class="red">x</td><td class="red">x</td><td class="green">✔︎</td><td>base class for others</td></tr>

<tr><td><code><a href="http://eel.is/c++draft/underflow.error">underflow_error</a></code></td><td><code>&lt;stdexcept&gt;</code></td><td class="proposing">proposed</td><td>–</td><td class="red">x</td><td class="red">x</td><td class="green">✔︎</td><td></td></tr>


<tr>
	<th rowspan="14" class="table-group disable-bottom"><span><span>library&nbsp;errors</span></span></th>
	
	<td><code><a href="http://eel.is/c++draft/any.bad.any.cast">bad_any_cast</a></code></td><td><code>&lt;any&gt;</code></td><td class="not-proposing"><a href="#notproposed" class="note n3">not proposed</a></td><td class="red">x</td><td class="red">x</td><td class="green">✔︎</td><td class="green">✔︎</td><td></td></tr>

<tr><td><code><a href="http://eel.is/c++draft/expected.bad">bad_expected_access</a>&lt;T&gt;</code></td><td><code>&lt;expected&gt;</code></td><td class="proposing">proposed</td><td class="green">✔︎</td><td class="red">x</td><td class="green">✔︎</td><td class="green">✔︎</td><td></td></tr>

<tr><td><code><a href="http://eel.is/c++draft/func.wrap.badcall">bad_function_call</a></code></td><td><code>&lt;functional&gt;</code></td><td class="not-proposing"><a href="#notproposed" class="note n3">not proposed</a></td><td class="red">x</td><td class="red">x</td><td class="red">x</td><td class="green">✔︎</td><td></td></tr>

<tr><td><code><a href="http://eel.is/c++draft/optional.bad.access">bad_optional_access</a></code></td><td><code>&lt;optional&gt;</code></td><td class="proposing">proposed</td><td class="green">✔︎</td><td class="red">x</td><td class="green">✔︎</td><td class="green">✔︎</td><td></td></tr>

<tr><td><code><a href="http://eel.is/c++draft/variant.bad.access">bad_variant_access</a></code></td><td><code>&lt;variant&gt;</code></td><td class="proposing">proposed</td><td class="green">✔︎</td><td class="red">x</td><td class="green">✔︎</td><td class="orange"><a href="#different-header-note" class="note n2">✔︎</a></td><td></td></tr>

<tr><td><code><a href="http://eel.is/c++draft/util.smartptr.weak.bad">bad_weak_ptr</a></code></td><td><code>&lt;memory&gt;</code></td><td class="in-progress"><a href="#in-progress" class="note n1">in&nbsp;progress</a></td><td class="in-progress"><a href="#in-progress" class="note n1">in&nbsp;progress</a></td><td class="red">x</td><td class="red">x</td><td class="green">✔︎</td><td><a href="https://wg21.link/p3037">P3037</a></td></tr>

<tr><td><code><a href="http://eel.is/c++draft/ios.failure">ios_base::failure</a></code></td><td><code>&lt;ios&gt;</code></td><td class="not-proposing"><a href="#notproposed" class="note n3">not proposed</a></td><td class="red">x</td><td class="red">x</td><td class="red">x</td><td class="green">✔︎</td><td></td></tr>

<tr><td><code><a href="http://eel.is/c++draft/fs.class.filesystem.error">filesystem_error</a></code></td><td><code>&lt;filesystem&gt;</code></td><td class="not-proposing"><a href="#notproposed-probably-never" class="note n4">not proposed</a></td><td class="red">x</td><td class="red">x</td><td class="red">x</td><td class="green">✔︎</td><td></td></tr>

<tr><td><code><a href="http://eel.is/c++draft/futures.future.error">future_error</a></code></td><td><code>&lt;future&gt;</code></td><td class="not-proposing"><a href="#notproposed" class="note n3">not proposed</a></td><td class="red">x</td><td class="red">x</td><td class="red">x</td><td class="green">✔︎</td><td></td></tr>

<tr><td><code><a href="http://eel.is/c++draft/time.zone.exception.nonexist">chrono::nonexistent_local_time</a></code></td><td><code>&lt;chrono&gt;</code></td><td class="not-proposing"><a href="#notproposed-probably-never" class="note n4">not proposed</a></td><td class="red">x</td><td class="red">x</td><td class="green">✔︎</td><td class="green">✔︎</td><td><a href="http://eel.is/c++draft/time.zone.exception.nonexist#3">uses <code>ostringstream</code></a></td></tr>

<tr><td><code><a href="http://eel.is/c++draft/time.zone.exception.ambig">chrono::ambiguous_local_time</a></code></td><td><code>&lt;chrono&gt;</code></td><td class="not-proposing"><a href="#notproposed-probably-never" class="note n4">not proposed</a></td><td class="red">x</td><td class="red">x</td><td class="green">✔︎</td><td class="green">✔︎</td><td><a href="http://eel.is/c++draft/time.zone.exception.ambig#3">uses <code>ostringstream</code></a></td></tr>

<tr><td><code><a href="http://eel.is/c++draft/re.badexp">regex_error</a></code></td><td><code>&lt;regex&gt;</code></td><td class="not-proposing"><a href="#notproposed" class="note n3">not proposed</a></td><td class="red">x</td><td class="red">x</td><td class="red">x</td><td class="green">✔︎</td><td></td></tr>

<tr><td><code><a href="http://eel.is/c++draft/format.error">format_error</a></code></td><td><code>&lt;format&gt;</code></td><td class="proposing">proposed</td><td class="green">✔︎</td><td class="red">x</td><td class="green">✔︎</td><td class="green">✔︎</td><td></td></tr>

<tr><td><code><a href="http://eel.is/c++draft/syserr.syserr">system_error</a></code></td><td><code>&lt;system_error&gt;</code></td><td class="not-proposing"><a href="#depends-on-error-code" class="note n5">not proposed</a></td><td class="red">x</td><td class="red">x</td><td class="red">x</td><td class="green">✔︎</td><td></td></tr>


		
	</table>
	<p>
	<div id="in-progress"><sup>1</sup> already proposed in a different proposal.</div>
	<div id="different-header-note"><sup>2</sup> MS STL is defining some exception types in &lt;exception&gt; instead of header where they are supposed to be defined.</div>
	<div id="notproposed"><sup>3</sup> not needed unless functionality using the exception type is also constexpr compatible.</div>
	<div id="notproposed-probably-never"><sup>4</sup> this functionality will probably never be constexpr compatible as it needs to observe outside of its program (is doing I/O or gives you current time).</div>
	<div id="depends-on-error-code"><sup>5</sup> will need to implement changes to <code>error_code</code> and <code>error_category</code>.</div>
	</p>
	
	<h2 id="should-all-exception-types-be-constexpr"><a href="#should-all-exception-types-be-constexpr">Should all exception types be constexpr?</a></h2>
	<p>In general, yes. But I'm <b>not proposing</b> it. But in future every constexprification proposal should make associated exception types constexpr compatible.</p>
	<h3 id="runtime-error"><a href="#runtime-error"><code>std::runtime_error</code></a></h3>
	<p>Yes, this exception should be <code>constexpr</code> too, as it's used as base classes for other exception types (eg. <code>out_of_range</code>). Maybe the name sounds funny in constant evaluation context, but it is really needed to be constexpr compatible.</p>
	<h3 id="error-code-and-error-category-depending-exception-types"><a href="#error-code-and-error-category-depending-exception-types"><code>std::error_code</code> and <code>std::error_category</code> depending exception types</a></h3>
	<p>In future to make <em>all</em> exception types constant evaluatable we will need to make parts of <code>std::error_code</code> and <code>std::error_category</code> constexpr. List of these types and their dependencies:</p>
		<ul>
			<li><code>filesystem_error</code> — <code>error_code</code> only</li>
			<li><code>system_error</code> — both <code>error_code</code> and <code>error_category</code></li>
			<li><code>ios_base::failure</code> — <code>error_code</code> only</li>
		</ul>
	<h2 id="impact-on-existing-code"><a href="#impact-on-existing-code">Impact on existing code</a></h2>
	<p>Pure extension, previously types weren't compatible with constant evaluation. For standard libraries it needs to be implemented carefully to not break ABI.</p>
	<h2 id="intention-for-wording-changes"><a href="#intention-for-wording-changes">Intention for wording changes</a></h2>
	<p>Mark all function members, constructors, and destructors of all following exception types with <code>constexpr</code>:</p>
	<ul>
		<li>logic_error,</li>
		<li>domain_error,</li>
		<li>invalid_argument,</li>
		<li>length_error,</li>
		<li>out_of_range,</li>
		
		<li>runtime_error,</li>
		<li>range_error,</li>
		<li>overflow_error,</li>
		<li>underflow_error,</li>
		
		<li>bad_optional_access,</li>
		<li>bad_variant_access,</li>
		<li>bad_expected_access,</li>
		<li>format_error</li>
	</ul>
	<p>In addition to this change, some <code>.what()</code> members mentions they are returning implementation-defined NTBS and these strings needs to be in ordinary literal encoding (as recommended by SG16 for <a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p3068r4.html">P3068: Allowing exception throwing in constant-evaluation</a>).
	<h2 id="wording"><a href="#wording">Proposed changes to wording</a></h2>
	<div class="wording">
		<h3 ><a class='secnum' style='min-width:80pt'>19.2.3</a> Class <span class='texttt'>logic_<span class='shy'></span>error</span> <a class='abbr_ref'>[logic.error]</a></h3><div class='texpara'><span id='lib:logic_error'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:logic_error'>🔗</a></div><span class='codeblock'><span class='keyword'>namespace</span> std <span class='curlybracket'>{</span>
  <span class='keyword'>class</span> logic_error <span class='operator'>:</span> <span class='keyword'>public</span> exception <span class='curlybracket'>{</span>
  <span class='keyword'>public</span><span class='operator'>:</span>
    <span class="added keyword">constexpr</span> <span class='keyword'>explicit</span> logic_error<span class='parenthesis'>(</span><span class='keyword'>const</span> string<span class='operator'>&amp;</span> what_arg<span class='parenthesis'>)</span>;
    <span class="added keyword">constexpr</span> <span class='keyword'>explicit</span> logic_error<span class='parenthesis'>(</span><span class='keyword'>const</span> <span class='keyword'>char</span><span class='operator'>*</span> what_arg<span class='parenthesis'>)</span>;
  <span class='curlybracket'>}</span>;
<span class='curlybracket'>}</span>
</span></span></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/diagnostics.tex#L90'>#</a></div><div class='texpara'><div id='1.sentence-1' class='sentence'>The class
<span class='texttt'>logic_<span class='shy'></span>error</span>
defines the type of objects thrown as
exceptions to report errors presumably detectable before
the program executes, such as violations of logical preconditions or class
invariants<a class='hidden_link' href='#1.sentence-1'>.</a></div></div></div><div class='texpara'><div id='lib:logic_error,constructor'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:logic_error,constructor'>🔗</a></div><code class='itemdeclcode'><span class="added keyword">constexpr</span> logic_error<span class='parenthesis'>(</span><span class='keyword'>const</span> string<span class='operator'>&amp;</span> what_arg<span class='parenthesis'>)</span>;
</code></div></div></div><div class='para' id='2'><div class='marginalizedparent'><a class='marginalized' href='#2'>2</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/diagnostics.tex#L104'>#</a></div><div class='texpara'><div id='2.sentence-1' class='sentence'><i >Postconditions</i>: <span class='texttt'>strcmp<span class='parenthesis'>(</span>what<span class='parenthesis'>(</span><span class='parenthesis'>)</span>, what_<span class='shy'></span>arg<span class='operator'>.</span>c_<span class='shy'></span>str<span class='parenthesis'>(</span><span class='parenthesis'>)</span><span class='parenthesis'>)</span> <span class='operator'>=</span><span class='operator'>=</span> <span class='literal'>0</span></span><a class='hidden_link' href='#2.sentence-1'>.</a></div></div></div></div><div class='texpara'><div id='lib:logic_error,constructor_'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:logic_error,constructor_'>🔗</a></div><code class='itemdeclcode'><span class="added keyword">constexpr</span> logic_error<span class='parenthesis'>(</span><span class='keyword'>const</span> <span class='keyword'>char</span><span class='operator'>*</span> what_arg<span class='parenthesis'>)</span>;
</code></div></div></div><div class='para' id='3'><div class='marginalizedparent'><a class='marginalized' href='#3'>3</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/diagnostics.tex#L115'>#</a></div><div class='texpara'><div id='3.sentence-1' class='sentence'><i >Postconditions</i>: <span class='texttt'>strcmp<span class='parenthesis'>(</span>what<span class='parenthesis'>(</span><span class='parenthesis'>)</span>, what_<span class='shy'></span>arg<span class='parenthesis'>)</span> <span class='operator'>=</span><span class='operator'>=</span> <span class='literal'>0</span></span><a class='hidden_link' href='#3.sentence-1'>.</a></div></div></div></div>
		<h3 ><a class='secnum' style='min-width:80pt'>19.2.4</a> Class <span class='texttt'>domain_<span class='shy'></span>error</span> <a class='abbr_ref'>[domain.error]</a></h3><div class='texpara'><span id='lib:domain_error'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:domain_error'>🔗</a></div><span class='codeblock'><span class='keyword'>namespace</span> std <span class='curlybracket'>{</span>
  <span class='keyword'>class</span> domain_error <span class='operator'>:</span> <span class='keyword'>public</span> logic_error <span class='curlybracket'>{</span>
  <span class='keyword'>public</span><span class='operator'>:</span>
    <span class="added keyword">constexpr</span> <span class='keyword'>explicit</span> domain_error<span class='parenthesis'>(</span><span class='keyword'>const</span> string<span class='operator'>&amp;</span> what_arg<span class='parenthesis'>)</span>;
    <span class="added keyword">constexpr</span> <span class='keyword'>explicit</span> domain_error<span class='parenthesis'>(</span><span class='keyword'>const</span> <span class='keyword'>char</span><span class='operator'>*</span> what_arg<span class='parenthesis'>)</span>;
  <span class='curlybracket'>}</span>;
<span class='curlybracket'>}</span>
</span></span></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/diagnostics.tex#L133'>#</a></div><div class='texpara'><div id='1.sentence-1' class='sentence'>The class
<span class='texttt'>domain_<span class='shy'></span>error</span>
defines the type of objects thrown as
exceptions by the implementation to report domain errors<a class='hidden_link' href='#1.sentence-1'>.</a></div></div></div><div class='texpara'><div id='lib:domain_error,constructor'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:domain_error,constructor'>🔗</a></div><code class='itemdeclcode'><span class="added keyword">constexpr</span> domain_error<span class='parenthesis'>(</span><span class='keyword'>const</span> string<span class='operator'>&amp;</span> what_arg<span class='parenthesis'>)</span>;
</code></div></div></div><div class='para' id='2'><div class='marginalizedparent'><a class='marginalized' href='#2'>2</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/diagnostics.tex#L145'>#</a></div><div class='texpara'><div id='2.sentence-1' class='sentence'><i >Postconditions</i>: <span class='texttt'>strcmp<span class='parenthesis'>(</span>what<span class='parenthesis'>(</span><span class='parenthesis'>)</span>, what_<span class='shy'></span>arg<span class='operator'>.</span>c_<span class='shy'></span>str<span class='parenthesis'>(</span><span class='parenthesis'>)</span><span class='parenthesis'>)</span> <span class='operator'>=</span><span class='operator'>=</span> <span class='literal'>0</span></span><a class='hidden_link' href='#2.sentence-1'>.</a></div></div></div></div><div class='texpara'><div id='lib:domain_error,constructor_'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:domain_error,constructor_'>🔗</a></div><code class='itemdeclcode'><span class="added keyword">constexpr</span> domain_error<span class='parenthesis'>(</span><span class='keyword'>const</span> <span class='keyword'>char</span><span class='operator'>*</span> what_arg<span class='parenthesis'>)</span>;
</code></div></div></div><div class='para' id='3'><div class='marginalizedparent'><a class='marginalized' href='#3'>3</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/diagnostics.tex#L156'>#</a></div><div class='texpara'><div id='3.sentence-1' class='sentence'><i >Postconditions</i>: <span class='texttt'>strcmp<span class='parenthesis'>(</span>what<span class='parenthesis'>(</span><span class='parenthesis'>)</span>, what_<span class='shy'></span>arg<span class='parenthesis'>)</span> <span class='operator'>=</span><span class='operator'>=</span> <span class='literal'>0</span></span><a class='hidden_link' href='#3.sentence-1'>.</a></div></div></div></div>
		<h3 ><a class='secnum' style='min-width:80pt'>19.2.5</a> Class <span class='texttt'>invalid_<span class='shy'></span>argument</span> <a class='abbr_ref'>[invalid.argument]</a></h3><div class='texpara'><span id='lib:invalid_argument'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:invalid_argument'>🔗</a></div><span class='codeblock'><span class='keyword'>namespace</span> std <span class='curlybracket'>{</span>
  <span class='keyword'>class</span> invalid_argument <span class='operator'>:</span> <span class='keyword'>public</span> logic_error <span class='curlybracket'>{</span>
  <span class='keyword'>public</span><span class='operator'>:</span>
    <span class="added keyword">constexpr</span> <span class='keyword'>explicit</span> invalid_argument<span class='parenthesis'>(</span><span class='keyword'>const</span> string<span class='operator'>&amp;</span> what_arg<span class='parenthesis'>)</span>;
    <span class="added keyword">constexpr</span> <span class='keyword'>explicit</span> invalid_argument<span class='parenthesis'>(</span><span class='keyword'>const</span> <span class='keyword'>char</span><span class='operator'>*</span> what_arg<span class='parenthesis'>)</span>;
  <span class='curlybracket'>}</span>;
<span class='curlybracket'>}</span>
</span></span></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/diagnostics.tex#L174'>#</a></div><div class='texpara'><div id='1.sentence-1' class='sentence'>The class
<span class='texttt'>invalid_<span class='shy'></span>argument</span>
defines the type of objects thrown as exceptions to report an invalid argument<a class='hidden_link' href='#1.sentence-1'>.</a></div></div></div><div class='texpara'><div id='lib:invalid_argument,constructor'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:invalid_argument,constructor'>🔗</a></div><code class='itemdeclcode'><span class="added keyword">constexpr</span> invalid_argument<span class='parenthesis'>(</span><span class='keyword'>const</span> string<span class='operator'>&amp;</span> what_arg<span class='parenthesis'>)</span>;
</code></div></div></div><div class='para' id='2'><div class='marginalizedparent'><a class='marginalized' href='#2'>2</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/diagnostics.tex#L185'>#</a></div><div class='texpara'><div id='2.sentence-1' class='sentence'><i >Postconditions</i>: <span class='texttt'>strcmp<span class='parenthesis'>(</span>what<span class='parenthesis'>(</span><span class='parenthesis'>)</span>, what_<span class='shy'></span>arg<span class='operator'>.</span>c_<span class='shy'></span>str<span class='parenthesis'>(</span><span class='parenthesis'>)</span><span class='parenthesis'>)</span> <span class='operator'>=</span><span class='operator'>=</span> <span class='literal'>0</span></span><a class='hidden_link' href='#2.sentence-1'>.</a></div></div></div></div><div class='texpara'><div id='lib:invalid_argument,constructor_'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:invalid_argument,constructor_'>🔗</a></div><code class='itemdeclcode'><span class="added keyword">constexpr</span> invalid_argument<span class='parenthesis'>(</span><span class='keyword'>const</span> <span class='keyword'>char</span><span class='operator'>*</span> what_arg<span class='parenthesis'>)</span>;
</code></div></div></div><div class='para' id='3'><div class='marginalizedparent'><a class='marginalized' href='#3'>3</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/diagnostics.tex#L196'>#</a></div><div class='texpara'><div id='3.sentence-1' class='sentence'><i >Postconditions</i>: <span class='texttt'>strcmp<span class='parenthesis'>(</span>what<span class='parenthesis'>(</span><span class='parenthesis'>)</span>, what_<span class='shy'></span>arg<span class='parenthesis'>)</span> <span class='operator'>=</span><span class='operator'>=</span> <span class='literal'>0</span></span><a class='hidden_link' href='#3.sentence-1'>.</a></div></div></div></div>
		<h3 ><a class='secnum' style='min-width:80pt'>19.2.6</a> Class <span class='texttt'>length_<span class='shy'></span>error</span> <a class='abbr_ref'>[length.error]</a></h3><div class='texpara'><span id='lib:length_error'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:length_error'>🔗</a></div><span class='codeblock'><span class='keyword'>namespace</span> std <span class='curlybracket'>{</span>
  <span class='keyword'>class</span> length_error <span class='operator'>:</span> <span class='keyword'>public</span> logic_error <span class='curlybracket'>{</span>
  <span class='keyword'>public</span><span class='operator'>:</span>
    <span class="added keyword">constexpr</span> <span class='keyword'>explicit</span> length_error<span class='parenthesis'>(</span><span class='keyword'>const</span> string<span class='operator'>&amp;</span> what_arg<span class='parenthesis'>)</span>;
    <span class="added keyword">constexpr</span> <span class='keyword'>explicit</span> length_error<span class='parenthesis'>(</span><span class='keyword'>const</span> <span class='keyword'>char</span><span class='operator'>*</span> what_arg<span class='parenthesis'>)</span>;
  <span class='curlybracket'>}</span>;
<span class='curlybracket'>}</span>
</span></span></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/diagnostics.tex#L214'>#</a></div><div class='texpara'><div id='1.sentence-1' class='sentence'>The class
<span class='texttt'>length_<span class='shy'></span>error</span>
defines the type of objects thrown as exceptions
to report an attempt to produce
an object whose length exceeds its maximum allowable size<a class='hidden_link' href='#1.sentence-1'>.</a></div></div></div><div class='texpara'><div id='lib:length_error,constructor'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:length_error,constructor'>🔗</a></div><code class='itemdeclcode'><span class="added keyword">constexpr</span> length_error<span class='parenthesis'>(</span><span class='keyword'>const</span> string<span class='operator'>&amp;</span> what_arg<span class='parenthesis'>)</span>;
</code></div></div></div><div class='para' id='2'><div class='marginalizedparent'><a class='marginalized' href='#2'>2</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/diagnostics.tex#L227'>#</a></div><div class='texpara'><div id='2.sentence-1' class='sentence'><i >Postconditions</i>: <span class='texttt'>strcmp<span class='parenthesis'>(</span>what<span class='parenthesis'>(</span><span class='parenthesis'>)</span>, what_<span class='shy'></span>arg<span class='operator'>.</span>c_<span class='shy'></span>str<span class='parenthesis'>(</span><span class='parenthesis'>)</span><span class='parenthesis'>)</span> <span class='operator'>=</span><span class='operator'>=</span> <span class='literal'>0</span></span><a class='hidden_link' href='#2.sentence-1'>.</a></div></div></div></div><div class='texpara'><div id='lib:length_error,constructor_'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:length_error,constructor_'>🔗</a></div><code class='itemdeclcode'><span class="added keyword">constexpr</span> length_error<span class='parenthesis'>(</span><span class='keyword'>const</span> <span class='keyword'>char</span><span class='operator'>*</span> what_arg<span class='parenthesis'>)</span>;
</code></div></div></div><div class='para' id='3'><div class='marginalizedparent'><a class='marginalized' href='#3'>3</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/diagnostics.tex#L238'>#</a></div><div class='texpara'><div id='3.sentence-1' class='sentence'><i >Postconditions</i>: <span class='texttt'>strcmp<span class='parenthesis'>(</span>what<span class='parenthesis'>(</span><span class='parenthesis'>)</span>, what_<span class='shy'></span>arg<span class='parenthesis'>)</span> <span class='operator'>=</span><span class='operator'>=</span> <span class='literal'>0</span></span><a class='hidden_link' href='#3.sentence-1'>.</a></div></div></div></div>
		<h3 ><a class='secnum' style='min-width:80pt'>19.2.7</a> Class <span class='texttt'>out_<span class='shy'></span>of_<span class='shy'></span>range</span> <a class='abbr_ref'>[out.of.range]</a></h3><div class='texpara'><span id='lib:out_of_range'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:out_of_range'>🔗</a></div><span class='codeblock'><span class='keyword'>namespace</span> std <span class='curlybracket'>{</span>
  <span class='keyword'>class</span> out_of_range <span class='operator'>:</span> <span class='keyword'>public</span> logic_error <span class='curlybracket'>{</span>
  <span class='keyword'>public</span><span class='operator'>:</span>
    <span class="added keyword">constexpr</span> <span class='keyword'>explicit</span> out_of_range<span class='parenthesis'>(</span><span class='keyword'>const</span> string<span class='operator'>&amp;</span> what_arg<span class='parenthesis'>)</span>;
    <span class="added keyword">constexpr</span> <span class='keyword'>explicit</span> out_of_range<span class='parenthesis'>(</span><span class='keyword'>const</span> <span class='keyword'>char</span><span class='operator'>*</span> what_arg<span class='parenthesis'>)</span>;
  <span class='curlybracket'>}</span>;
<span class='curlybracket'>}</span>
</span></span></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/diagnostics.tex#L256'>#</a></div><div class='texpara'><div id='1.sentence-1' class='sentence'>The class
<span class='texttt'>out_<span class='shy'></span>of_<span class='shy'></span>range</span>
defines the type of objects thrown as exceptions to report an
argument value not in its expected range<a class='hidden_link' href='#1.sentence-1'>.</a></div> <a class='index' id=':argument'></a></div></div><div class='texpara'><div id='lib:out_of_range,constructor'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:out_of_range,constructor'>🔗</a></div><code class='itemdeclcode'><span class="added keyword">constexpr</span> out_of_range<span class='parenthesis'>(</span><span class='keyword'>const</span> string<span class='operator'>&amp;</span> what_arg<span class='parenthesis'>)</span>;
</code></div></div></div><div class='para' id='2'><div class='marginalizedparent'><a class='marginalized' href='#2'>2</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/diagnostics.tex#L269'>#</a></div><div class='texpara'><div id='2.sentence-1' class='sentence'><i >Postconditions</i>: <span class='texttt'>strcmp<span class='parenthesis'>(</span>what<span class='parenthesis'>(</span><span class='parenthesis'>)</span>, what_<span class='shy'></span>arg<span class='operator'>.</span>c_<span class='shy'></span>str<span class='parenthesis'>(</span><span class='parenthesis'>)</span><span class='parenthesis'>)</span> <span class='operator'>=</span><span class='operator'>=</span> <span class='literal'>0</span></span><a class='hidden_link' href='#2.sentence-1'>.</a></div></div></div></div><div class='texpara'><div id='lib:out_of_range,constructor_'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:out_of_range,constructor_'>🔗</a></div><code class='itemdeclcode'><span class="added keyword">constexpr</span> out_of_range<span class='parenthesis'>(</span><span class='keyword'>const</span> <span class='keyword'>char</span><span class='operator'>*</span> what_arg<span class='parenthesis'>)</span>;
</code></div></div></div><div class='para' id='3'><div class='marginalizedparent'><a class='marginalized' href='#3'>3</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/diagnostics.tex#L280'>#</a></div><div class='texpara'><div id='3.sentence-1' class='sentence'><i >Postconditions</i>: <span class='texttt'>strcmp<span class='parenthesis'>(</span>what<span class='parenthesis'>(</span><span class='parenthesis'>)</span>, what_<span class='shy'></span>arg<span class='parenthesis'>)</span> <span class='operator'>=</span><span class='operator'>=</span> <span class='literal'>0</span></span><a class='hidden_link' href='#3.sentence-1'>.</a></div></div></div></div>
		
		<h3><a class='secnum' style='min-width:80pt'>19.2.8</a> Class <span class='texttt'>runtime_<span class='shy'></span>error</span> <a class='abbr_ref'>[runtime.error]</a></h3><div class='texpara'><span id='lib:runtime_error'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:runtime_error'>🔗</a></div><span class='codeblock'><span class='keyword'>namespace</span> std <span class='curlybracket'>{</span>
  <span class='keyword'>class</span> runtime_error <span class='operator'>:</span> <span class='keyword'>public</span> exception <span class='curlybracket'>{</span>
  <span class='keyword'>public</span><span class='operator'>:</span>
    <span class="added keyword">constexpr</span> <span class='keyword'>explicit</span> runtime_error<span class='parenthesis'>(</span><span class='keyword'>const</span> string<span class='operator'>&amp;</span> what_arg<span class='parenthesis'>)</span>;
    <span class="added keyword">constexpr</span> <span class='keyword'>explicit</span> runtime_error<span class='parenthesis'>(</span><span class='keyword'>const</span> <span class='keyword'>char</span><span class='operator'>*</span> what_arg<span class='parenthesis'>)</span>;
  <span class='curlybracket'>}</span>;
<span class='curlybracket'>}</span>
</span></span></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/diagnostics.tex#L298'>#</a></div><div class='texpara'><div id='1.sentence-1' class='sentence'>The class
<span class='texttt'>runtime_<span class='shy'></span>error</span>
defines the type of objects thrown as exceptions to report errors presumably detectable only
when the program executes<a class='hidden_link' href='#1.sentence-1'>.</a></div></div></div><div class='texpara'><div id='lib:runtime_error,constructor'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:runtime_error,constructor'>🔗</a></div><code class='itemdeclcode'><span class="added keyword">constexpr</span> runtime_error<span class='parenthesis'>(</span><span class='keyword'>const</span> string<span class='operator'>&amp;</span> what_arg<span class='parenthesis'>)</span>;
</code></div></div></div><div class='para' id='2'><div class='marginalizedparent'><a class='marginalized' href='#2'>2</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/diagnostics.tex#L310'>#</a></div><div class='texpara'><div id='2.sentence-1' class='sentence'><i >Postconditions</i>: <span class='texttt'>strcmp<span class='parenthesis'>(</span>what<span class='parenthesis'>(</span><span class='parenthesis'>)</span>, what_<span class='shy'></span>arg<span class='operator'>.</span>c_<span class='shy'></span>str<span class='parenthesis'>(</span><span class='parenthesis'>)</span><span class='parenthesis'>)</span> <span class='operator'>=</span><span class='operator'>=</span> <span class='literal'>0</span></span><a class='hidden_link' href='#2.sentence-1'>.</a></div></div></div></div><div class='texpara'><div id='lib:runtime_error,constructor_'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:runtime_error,constructor_'>🔗</a></div><code class='itemdeclcode'><span class="added keyword">constexpr</span> runtime_error<span class='parenthesis'>(</span><span class='keyword'>const</span> <span class='keyword'>char</span><span class='operator'>*</span> what_arg<span class='parenthesis'>)</span>;
</code></div></div></div><div class='para' id='3'><div class='marginalizedparent'><a class='marginalized' href='#3'>3</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/diagnostics.tex#L321'>#</a></div><div class='texpara'><div id='3.sentence-1' class='sentence'><i >Postconditions</i>: <span class='texttt'>strcmp<span class='parenthesis'>(</span>what<span class='parenthesis'>(</span><span class='parenthesis'>)</span>, what_<span class='shy'></span>arg<span class='parenthesis'>)</span> <span class='operator'>=</span><span class='operator'>=</span> <span class='literal'>0</span></span><a class='hidden_link' href='#3.sentence-1'>.</a></div></div></div></div>
		<h3 ><a class='secnum' style='min-width:80pt'>19.2.9</a> Class <span class='texttt'>range_<span class='shy'></span>error</span> <a class='abbr_ref'>[range.error]</a></h3><div class='texpara'><span id='lib:range_error'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:range_error'>🔗</a></div><span class='codeblock'><span class='keyword'>namespace</span> std <span class='curlybracket'>{</span>
  <span class='keyword'>class</span> range_error <span class='operator'>:</span> <span class='keyword'>public</span> runtime_error <span class='curlybracket'>{</span>
  <span class='keyword'>public</span><span class='operator'>:</span>
    <span class="added keyword">constexpr</span> <span class='keyword'>explicit</span> range_error<span class='parenthesis'>(</span><span class='keyword'>const</span> string<span class='operator'>&amp;</span> what_arg<span class='parenthesis'>)</span>;
    <span class="added keyword">constexpr</span> <span class='keyword'>explicit</span> range_error<span class='parenthesis'>(</span><span class='keyword'>const</span> <span class='keyword'>char</span><span class='operator'>*</span> what_arg<span class='parenthesis'>)</span>;
  <span class='curlybracket'>}</span>;
<span class='curlybracket'>}</span>
</span></span></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/diagnostics.tex#L339'>#</a></div><div class='texpara'><div id='1.sentence-1' class='sentence'>The class
<span class='texttt'>range_<span class='shy'></span>error</span>
defines the type of objects thrown as exceptions to report range errors
in internal computations<a class='hidden_link' href='#1.sentence-1'>.</a></div></div></div><div class='texpara'><div id='lib:range_error,constructor'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:range_error,constructor'>🔗</a></div><code class='itemdeclcode'><span class="added keyword">constexpr</span> range_error<span class='parenthesis'>(</span><span class='keyword'>const</span> string<span class='operator'>&amp;</span> what_arg<span class='parenthesis'>)</span>;
</code></div></div></div><div class='para' id='2'><div class='marginalizedparent'><a class='marginalized' href='#2'>2</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/diagnostics.tex#L351'>#</a></div><div class='texpara'><div id='2.sentence-1' class='sentence'><i >Postconditions</i>: <span class='texttt'>strcmp<span class='parenthesis'>(</span>what<span class='parenthesis'>(</span><span class='parenthesis'>)</span>, what_<span class='shy'></span>arg<span class='operator'>.</span>c_<span class='shy'></span>str<span class='parenthesis'>(</span><span class='parenthesis'>)</span><span class='parenthesis'>)</span> <span class='operator'>=</span><span class='operator'>=</span> <span class='literal'>0</span></span><a class='hidden_link' href='#2.sentence-1'>.</a></div></div></div></div><div class='texpara'><div id='lib:range_error,constructor_'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:range_error,constructor_'>🔗</a></div><code class='itemdeclcode'><span class="added keyword">constexpr</span> range_error<span class='parenthesis'>(</span><span class='keyword'>const</span> <span class='keyword'>char</span><span class='operator'>*</span> what_arg<span class='parenthesis'>)</span>;
</code></div></div></div><div class='para' id='3'><div class='marginalizedparent'><a class='marginalized' href='#3'>3</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/diagnostics.tex#L362'>#</a></div><div class='texpara'><div id='3.sentence-1' class='sentence'><i >Postconditions</i>: <span class='texttt'>strcmp<span class='parenthesis'>(</span>what<span class='parenthesis'>(</span><span class='parenthesis'>)</span>, what_<span class='shy'></span>arg<span class='parenthesis'>)</span> <span class='operator'>=</span><span class='operator'>=</span> <span class='literal'>0</span></span><a class='hidden_link' href='#3.sentence-1'>.</a></div></div></div></div>
		<h3 ><a class='secnum' style='min-width:80pt'>19.2.10</a> Class <span class='texttt'>overflow_<span class='shy'></span>error</span> <a class='abbr_ref'>[overflow.error]</a></h3><div class='texpara'><span id='lib:overflow_error'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:overflow_error'>🔗</a></div><span class='codeblock'><span class='keyword'>namespace</span> std <span class='curlybracket'>{</span>
  <span class='keyword'>class</span> overflow_error <span class='operator'>:</span> <span class='keyword'>public</span> runtime_error <span class='curlybracket'>{</span>
  <span class='keyword'>public</span><span class='operator'>:</span>
    <span class="added keyword">constexpr</span> <span class='keyword'>explicit</span> overflow_error<span class='parenthesis'>(</span><span class='keyword'>const</span> string<span class='operator'>&amp;</span> what_arg<span class='parenthesis'>)</span>;
    <span class="added keyword">constexpr</span> <span class='keyword'>explicit</span> overflow_error<span class='parenthesis'>(</span><span class='keyword'>const</span> <span class='keyword'>char</span><span class='operator'>*</span> what_arg<span class='parenthesis'>)</span>;
  <span class='curlybracket'>}</span>;
<span class='curlybracket'>}</span>
</span></span></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/diagnostics.tex#L380'>#</a></div><div class='texpara'><div id='1.sentence-1' class='sentence'>The class
<span class='texttt'>overflow_<span class='shy'></span>error</span>
defines the type of objects thrown as exceptions to report an arithmetic overflow error<a class='hidden_link' href='#1.sentence-1'>.</a></div></div></div><div class='texpara'><div id='lib:overflow_error,constructor'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:overflow_error,constructor'>🔗</a></div><code class='itemdeclcode'><span class="added keyword">constexpr</span> overflow_error<span class='parenthesis'>(</span><span class='keyword'>const</span> string<span class='operator'>&amp;</span> what_arg<span class='parenthesis'>)</span>;
</code></div></div></div><div class='para' id='2'><div class='marginalizedparent'><a class='marginalized' href='#2'>2</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/diagnostics.tex#L391'>#</a></div><div class='texpara'><div id='2.sentence-1' class='sentence'><i >Postconditions</i>: <span class='texttt'>strcmp<span class='parenthesis'>(</span>what<span class='parenthesis'>(</span><span class='parenthesis'>)</span>, what_<span class='shy'></span>arg<span class='operator'>.</span>c_<span class='shy'></span>str<span class='parenthesis'>(</span><span class='parenthesis'>)</span><span class='parenthesis'>)</span> <span class='operator'>=</span><span class='operator'>=</span> <span class='literal'>0</span></span><a class='hidden_link' href='#2.sentence-1'>.</a></div></div></div></div><div class='texpara'><div id='lib:overflow_error,constructor_'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:overflow_error,constructor_'>🔗</a></div><code class='itemdeclcode'><span class="added keyword">constexpr</span> overflow_error<span class='parenthesis'>(</span><span class='keyword'>const</span> <span class='keyword'>char</span><span class='operator'>*</span> what_arg<span class='parenthesis'>)</span>;
</code></div></div></div><div class='para' id='3'><div class='marginalizedparent'><a class='marginalized' href='#3'>3</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/diagnostics.tex#L402'>#</a></div><div class='texpara'><div id='3.sentence-1' class='sentence'><i >Postconditions</i>: <span class='texttt'>strcmp<span class='parenthesis'>(</span>what<span class='parenthesis'>(</span><span class='parenthesis'>)</span>, what_<span class='shy'></span>arg<span class='parenthesis'>)</span> <span class='operator'>=</span><span class='operator'>=</span> <span class='literal'>0</span></span><a class='hidden_link' href='#3.sentence-1'>.</a></div></div></div></div>
		<h3 ><a class='secnum' style='min-width:80pt'>19.2.11</a> Class <span class='texttt'>underflow_<span class='shy'></span>error</span> <a class='abbr_ref'>[underflow.error]</a></h3><div class='texpara'><span id='lib:underflow_error'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:underflow_error'>🔗</a></div><span class='codeblock'><span class='keyword'>namespace</span> std <span class='curlybracket'>{</span>
  <span class='keyword'>class</span> underflow_error <span class='operator'>:</span> <span class='keyword'>public</span> runtime_error <span class='curlybracket'>{</span>
  <span class='keyword'>public</span><span class='operator'>:</span>
    <span class="added keyword">constexpr</span> <span class='keyword'>explicit</span> underflow_error<span class='parenthesis'>(</span><span class='keyword'>const</span> string<span class='operator'>&amp;</span> what_arg<span class='parenthesis'>)</span>;
    <span class="added keyword">constexpr</span> <span class='keyword'>explicit</span> underflow_error<span class='parenthesis'>(</span><span class='keyword'>const</span> <span class='keyword'>char</span><span class='operator'>*</span> what_arg<span class='parenthesis'>)</span>;
  <span class='curlybracket'>}</span>;
<span class='curlybracket'>}</span>
</span></span></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/diagnostics.tex#L420'>#</a></div><div class='texpara'><div id='1.sentence-1' class='sentence'>The class
<span class='texttt'>underflow_<span class='shy'></span>error</span>
defines the type of objects thrown as exceptions to report an arithmetic underflow error<a class='hidden_link' href='#1.sentence-1'>.</a></div></div></div><div class='texpara'><div id='lib:underflow_error,constructor'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:underflow_error,constructor'>🔗</a></div><code class='itemdeclcode'><span class="added keyword">constexpr</span> underflow_error<span class='parenthesis'>(</span><span class='keyword'>const</span> string<span class='operator'>&amp;</span> what_arg<span class='parenthesis'>)</span>;
</code></div></div></div><div class='para' id='2'><div class='marginalizedparent'><a class='marginalized' href='#2'>2</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/diagnostics.tex#L431'>#</a></div><div class='texpara'><div id='2.sentence-1' class='sentence'><i >Postconditions</i>: <span class='texttt'>strcmp<span class='parenthesis'>(</span>what<span class='parenthesis'>(</span><span class='parenthesis'>)</span>, what_<span class='shy'></span>arg<span class='operator'>.</span>c_<span class='shy'></span>str<span class='parenthesis'>(</span><span class='parenthesis'>)</span><span class='parenthesis'>)</span> <span class='operator'>=</span><span class='operator'>=</span> <span class='literal'>0</span></span><a class='hidden_link' href='#2.sentence-1'>.</a></div></div></div></div><div class='texpara'><div id='lib:underflow_error,constructor_'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:underflow_error,constructor_'>🔗</a></div><code class='itemdeclcode'><span class="added keyword">constexpr</span> underflow_error<span class='parenthesis'>(</span><span class='keyword'>const</span> <span class='keyword'>char</span><span class='operator'>*</span> what_arg<span class='parenthesis'>)</span>;
</code></div></div></div><div class='para' id='3'><div class='marginalizedparent'><a class='marginalized' href='#3'>3</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/diagnostics.tex#L442'>#</a></div><div class='texpara'><div id='3.sentence-1' class='sentence'><i >Postconditions</i>: <span class='texttt'>strcmp<span class='parenthesis'>(</span>what<span class='parenthesis'>(</span><span class='parenthesis'>)</span>, what_<span class='shy'></span>arg<span class='parenthesis'>)</span> <span class='operator'>=</span><span class='operator'>=</span> <span class='literal'>0</span></span><a class='hidden_link' href='#3.sentence-1'>.</a></div></div></div></div>
		
		<h3 ><a class='secnum' style='min-width:80pt'>22.5.5</a> Class <span class='texttt'>bad_<span class='shy'></span>optional_<span class='shy'></span>access</span> <a class='abbr_ref'>[optional.bad.access]</a></h3><div class='texpara'><span class='codeblock'><span class='keyword'>namespace</span> std <span class='curlybracket'>{</span>
  <span class='keyword'>class</span> bad_optional_access <span class='operator'>:</span> <span class='keyword'>public</span> exception <span class='curlybracket'>{</span>
  <span class='keyword'>public</span><span class='operator'>:</span>
    <span class='comment'>// see <a href='exception' title='17.9.3&emsp;Class exception'>[exception]</a> for the specification of the special member functions</span>
    <span class="added keyword">constexpr</span> <span class='keyword'>const</span> <span class='keyword'>char</span><span class='operator'>*</span> what<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span> <span class='keyword'>noexcept</span> <span class='keyword'>override</span>;
  <span class='curlybracket'>}</span>;
<span class='curlybracket'>}</span>
</span></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/utilities.tex#L4450'>#</a></div><div class='texpara'><div id='1.sentence-1' class='sentence'>The class <span class='texttt'>bad_<span class='shy'></span>optional_<span class='shy'></span>access</span> defines the type of objects thrown as exceptions to report the situation where an attempt is made to access the value of an optional object that does not contain a value<a class='hidden_link' href='#1.sentence-1'>.</a></div></div></div><div class='texpara'><div id='lib:bad_optional_access,what'><div id='lib:what,bad_optional_access'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:what,bad_optional_access'>🔗</a></div><code class='itemdeclcode'><span class="added keyword">constexpr</span> <span class='keyword'>const</span> <span class='keyword'>char</span><span class='operator'>*</span> what<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span> <span class='keyword'>noexcept</span> <span class='keyword'>override</span>;
</code></div></div></div></div><div class='para' id='2'><div class='marginalizedparent'><a class='marginalized' href='#2'>2</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/utilities.tex#L4459'>#</a></div><div class='texpara'><div id='2.sentence-1' class='sentence'><i >Returns</i>: An <a class='index' id=':return_value_of_bad_optional_access::what'></a>implementation-defined <span class='textsc'>ntbs</span><span class="added">, which during constant evaluation shall be encoded with the ordinary literal encoding (<a href="http://eel.is/c++draft/lex.ccon">[lex.ccon]</a>)</span><a class='hidden_link' href='#2.sentence-1'>.</a><div class="wording-note"><strong>note for editor:</strong> this change is mirroring the change recommended by SG16 for <a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p3068r4.html">P3068</a>.</div></div></div></div></div>
		<h3 ><a class='secnum' style='min-width:80pt'>22.6.11</a> Class <span class='texttt'>bad_<span class='shy'></span>variant_<span class='shy'></span>access</span> <a class='abbr_ref'>[variant.bad.access]</a></h3><div class='texpara'><a class='index' id='lib:bad_variant_access'></a>
<span class='codeblock'><span class='keyword'>namespace</span> std <span class='curlybracket'>{</span>
  <span class='keyword'>class</span> bad_variant_access <span class='operator'>:</span> <span class='keyword'>public</span> exception <span class='curlybracket'>{</span>
  <span class='keyword'>public</span><span class='operator'>:</span>
    <span class='comment'>// see <a href='exception' title='17.9.3&emsp;Class exception'>[exception]</a> for the specification of the special member functions</span>
    <span class="added keyword">constexpr</span> <span class='keyword'>const</span> <span class='keyword'>char</span><span class='operator'>*</span> what<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span> <span class='keyword'>noexcept</span> <span class='keyword'>override</span>;
  <span class='curlybracket'>}</span>;
<span class='curlybracket'>}</span>
</span></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/utilities.tex#L6385'>#</a></div><div class='texpara'><div id='1.sentence-1' class='sentence'>Objects of type <span class='texttt'>bad_<span class='shy'></span>variant_<span class='shy'></span>access</span> are thrown to report invalid
accesses to the value of a <span class='texttt'>variant</span> object<a class='hidden_link' href='#1.sentence-1'>.</a></div></div></div><div class='texpara'><div id='lib:bad_variant_access,what'><div id='lib:what,bad_variant_access'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:what,bad_variant_access'>🔗</a></div><code class='itemdeclcode'><span class="added keyword">constexpr</span> <span class='keyword'>const</span> <span class='keyword'>char</span><span class='operator'>*</span> what<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span> <span class='keyword'>noexcept</span> <span class='keyword'>override</span>;
</code></div></div></div></div><div class='para' id='2'><div class='marginalizedparent'><a class='marginalized' href='#2'>2</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/utilities.tex#L6395'>#</a></div><div class='texpara'><div id='2.sentence-1' class='sentence'><i >Returns</i>: An <a class='index' id=':return_value_of_bad_variant_access::what'></a>implementation-defined <span class='textsc'>ntbs</span><span class="added">, which during constant evaluation shall be encoded with the ordinary literal encoding (<a href="http://eel.is/c++draft/lex.ccon">[lex.ccon]</a>)</span><a class='hidden_link' href='#2.sentence-1'>.</a><div class="wording-note"><strong>note for editor:</strong> this change is mirroring the change recommended by SG16 for <a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p3068r4.html">P3068</a>.</div></div></div></div></div>
		
		<h3 ><a class='secnum' style='min-width:80pt'>22.8.4</a> Class template <span class='texttt'>bad_<span class='shy'></span>expected_<span class='shy'></span>access</span> <a class='abbr_ref'>[expected.bad]</a></h3><div class='texpara'><span id='lib:bad_expected_access'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:bad_expected_access'>🔗</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='keyword'>class</span> E<span class='anglebracket'>&gt;</span>
  <span class='keyword'>class</span> bad_expected_access <span class='operator'>:</span> <span class='keyword'>public</span> bad_expected_access<span class='anglebracket'>&lt;</span><span class='keyword'>void</span><span class='anglebracket'>&gt;</span> <span class='curlybracket'>{</span>
  <span class='keyword'>public</span><span class='operator'>:</span>
    <span class="added keyword">constexpr</span> <span class='keyword'>explicit</span> bad_expected_access<span class='parenthesis'>(</span>E<span class='parenthesis'>)</span>;
    <span class="added keyword">constexpr</span> <span class='keyword'>const</span> <span class='keyword'>char</span><span class='operator'>*</span> what<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span> <span class='keyword'>noexcept</span> <span class='keyword'>override</span>;
    <span class="added keyword">constexpr</span> E<span class='operator'>&amp;</span> error<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='operator'>&amp;</span> <span class='keyword'>noexcept</span>;
    <span class="added keyword">constexpr</span> <span class='keyword'>const</span> E<span class='operator'>&amp;</span> error<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span> <span class='operator'>&amp;</span> <span class='keyword'>noexcept</span>;
    <span class="added keyword">constexpr</span> E<span class='operator'>&amp;</span><span class='operator'>&amp;</span> error<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='operator'>&amp;</span><span class='operator'>&amp;</span> <span class='keyword'>noexcept</span>;
    <span class="added keyword">constexpr</span> <span class='keyword'>const</span> E<span class='operator'>&amp;</span><span class='operator'>&amp;</span> error<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span> <span class='operator'>&amp;</span><span class='operator'>&amp;</span> <span class='keyword'>noexcept</span>;

  <span class='keyword'>private</span><span class='operator'>:</span>
    E <i >unex</i>;             <span class='comment'>// <i >exposition only</i></span>
  <span class='curlybracket'>}</span>;
<span class='curlybracket'>}</span>
</span></span></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/utilities.tex#L7327'>#</a></div><div class='texpara'><div id='1.sentence-1' class='sentence'>The class template <span class='texttt'>bad_<span class='shy'></span>expected_<span class='shy'></span>access</span>
defines the type of objects thrown as exceptions to report the situation
where an attempt is made to access the value of an <span class='texttt'>expected<span class='anglebracket'>&lt;</span>T, E<span class='anglebracket'>&gt;</span></span> object
for which <span class='texttt'>has_<span class='shy'></span>value<span class='parenthesis'>(</span><span class='parenthesis'>)</span></span> is <span class='texttt'><span class='literal'>false</span></span><a class='hidden_link' href='#1.sentence-1'>.</a></div></div></div><div class='texpara'><div id='lib:bad_expected_access,constructor'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:bad_expected_access,constructor'>🔗</a></div><code class='itemdeclcode'><span class="added keyword">constexpr</span> <span class='keyword'>explicit</span> bad_expected_access<span class='parenthesis'>(</span>E e<span class='parenthesis'>)</span>;
</code></div></div></div><div class='para' id='2'><div class='marginalizedparent'><a class='marginalized' href='#2'>2</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/utilities.tex#L7339'>#</a></div><div class='texpara'><div id='2.sentence-1' class='sentence'><i >Effects</i>: Initializes <span class='texttt'><i >unex</i></span> with <span class='texttt'>std<span class='operator'>&#x200b;::&#x200b;</span>move<span class='parenthesis'>(</span>e<span class='parenthesis'>)</span></span><a class='hidden_link' href='#2.sentence-1'>.</a></div></div></div></div><div class='texpara'><div id='lib:bad_expected_access,error'><div id='lib:error,bad_expected_access'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:error,bad_expected_access'>🔗</a></div><code class='itemdeclcode'><span class="added keyword">constexpr</span> <span class='keyword'>const</span> E<span class='operator'>&amp;</span> error<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span> <span class='operator'>&amp;</span> <span class='keyword'>noexcept</span>;
<span class="added keyword">constexpr</span> E<span class='operator'>&amp;</span> error<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='operator'>&amp;</span> <span class='keyword'>noexcept</span>;
</code></div></div></div></div><div class='para' id='3'><div class='marginalizedparent'><a class='marginalized' href='#3'>3</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/utilities.tex#L7351'>#</a></div><div class='texpara'><div id='3.sentence-1' class='sentence'><i >Returns</i>: <span class='texttt'><i >unex</i></span><a class='hidden_link' href='#3.sentence-1'>.</a></div></div></div></div><div class='texpara'><div id='lib:bad_expected_access,error_'><div id='lib:error,bad_expected_access_'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:error,bad_expected_access_'>🔗</a></div><code class='itemdeclcode'><span class="added keyword">constexpr</span> E<span class='operator'>&amp;</span><span class='operator'>&amp;</span> error<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='operator'>&amp;</span><span class='operator'>&amp;</span> <span class='keyword'>noexcept</span>;
<span class="added keyword">constexpr</span> <span class='keyword'>const</span> E<span class='operator'>&amp;</span><span class='operator'>&amp;</span> error<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span> <span class='operator'>&amp;</span><span class='operator'>&amp;</span> <span class='keyword'>noexcept</span>;
</code></div></div></div></div><div class='para' id='4'><div class='marginalizedparent'><a class='marginalized' href='#4'>4</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/utilities.tex#L7363'>#</a></div><div class='texpara'><div id='4.sentence-1' class='sentence'><i >Returns</i>: <span class='texttt'>std<span class='operator'>&#x200b;::&#x200b;</span>move<span class='parenthesis'>(</span><span class='texttt'><i >unex</i></span><span class='parenthesis'>)</span></span><a class='hidden_link' href='#4.sentence-1'>.</a></div></div></div></div><div class='texpara'><div id='lib:bad_expected_access,what'><div id='lib:what,bad_expected_access'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:what,bad_expected_access'>🔗</a></div><code class='itemdeclcode'><span class="added keyword">constexpr</span> <span class='keyword'>const</span> <span class='keyword'>char</span><span class='operator'>*</span> what<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span> <span class='keyword'>noexcept</span> <span class='keyword'>override</span>;
</code></div></div></div></div><div class='para' id='5'><div class='marginalizedparent'><a class='marginalized' href='#5'>5</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/utilities.tex#L7374'>#</a></div><div class='texpara'><div id='5.sentence-1' class='sentence'><i >Returns</i>: An implementation-defined <span class='textsc'>ntbs</span><span class="added">, which during constant evaluation shall be encoded with the ordinary literal encoding (<a href="http://eel.is/c++draft/lex.ccon">[lex.ccon]</a>)</span><a class='hidden_link' href='#5.sentence-1'>.</a>
<div class="wording-note"><strong>note for editor:</strong> this change is mirroring the change recommended by SG16 for <a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p3068r4.html">P3068</a>.</div>
</div></div></div></div>
		<h3 ><a class='secnum' style='min-width:80pt'>22.8.5</a> Class template specialization <span class='texttt'>bad_<span class='shy'></span>expected_<span class='shy'></span>access&lt;void&gt;</span> <a class='abbr_ref'>[expected.bad.void]</a></h3><div class='texpara'><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'>class</span> bad_expected_access<span class='anglebracket'>&lt;</span><span class='keyword'>void</span><span class='anglebracket'>&gt;</span> <span class='operator'>:</span> <span class='keyword'>public</span> exception <span class='curlybracket'>{</span>
  <span class='keyword'>protected</span><span class='operator'>:</span>
    <span class="added keyword">constexpr</span> bad_expected_access<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>noexcept</span>;
    <span class="added keyword">constexpr</span> bad_expected_access<span class='parenthesis'>(</span><span class='keyword'>const</span> bad_expected_access<span class='operator'>&amp;</span><span class='parenthesis'>)</span> <span class='keyword'>noexcept</span>;
    <span class="added keyword">constexpr</span> bad_expected_access<span class='parenthesis'>(</span>bad_expected_access<span class='operator'>&amp;</span><span class='operator'>&amp;</span><span class='parenthesis'>)</span> <span class='keyword'>noexcept</span>;
    <span class="added keyword">constexpr</span> bad_expected_access<span class='operator'>&amp;</span> <span class='keyword'>operator</span><span class='operator'>=</span><span class='parenthesis'>(</span><span class='keyword'>const</span> bad_expected_access<span class='operator'>&amp;</span> <span class='keyword'>noexcept</span><span class='parenthesis'>)</span>;
    <span class="added keyword">constexpr</span> bad_expected_access<span class='operator'>&amp;</span> <span class='keyword'>operator</span><span class='operator'>=</span><span class='parenthesis'>(</span>bad_expected_access<span class='operator'>&amp;</span><span class='operator'>&amp;</span><span class='parenthesis'>)</span> <span class='keyword'>noexcept</span>;
    <span class="added keyword">constexpr</span> <span class='operator'>~</span>bad_expected_access<span class='parenthesis'>(</span><span class='parenthesis'>)</span>;

  <span class='keyword'>public</span><span class='operator'>:</span>
    <span class="added keyword">constexpr</span> <span class='keyword'>const</span> <span class='keyword'>char</span><span class='operator'>*</span> what<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span> <span class='keyword'>noexcept</span> <span class='keyword'>override</span>;
  <span class='curlybracket'>}</span>;
<span class='curlybracket'>}</span>
</span></div><div class='texpara'><div id='lib:bad_expected_access,what'><div id='lib:what,bad_expected_access'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:what,bad_expected_access'>🔗</a></div><code class='itemdeclcode'><span class="added keyword">constexpr</span> <span class='keyword'>const</span> <span class='keyword'>char</span><span class='operator'>*</span> what<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span> <span class='keyword'>noexcept</span> <span class='keyword'>override</span>;
</code></div></div></div></div><div class='para' id='1'><div class='marginalizedparent'><a class='marginalized' href='#1'>1</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/utilities.tex#L7405'>#</a></div><div class='texpara'><div id='1.sentence-1' class='sentence'><i >Returns</i>: An implementation-defined <span class='textsc'>ntbs</span><span class="added">, which during constant evaluation shall be encoded with the ordinary literal encoding (<a href="http://eel.is/c++draft/lex.ccon">[lex.ccon]</a>)</span><a class='hidden_link' href='#1.sentence-1'>.</a><div class="wording-note"><strong>note for editor:</strong> this change is mirroring the change recommended by SG16 for <a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p3068r4.html">P3068</a>.</div></div></div></div></div>
		
		<h3 ><a class='secnum' style='min-width:80pt'>22.14.10</a> Class <span class='texttt'>format_<span class='shy'></span>error</span> <a class='abbr_ref'>[format.error]</a></h3><div class='texpara'><span id='lib:format_error'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:format_error'>🔗</a></div><span class='codeblock'><span class='keyword'>namespace</span> std <span class='curlybracket'>{</span>
  <span class='keyword'>class</span> format_error <span class='operator'>:</span> <span class='keyword'>public</span> runtime_error <span class='curlybracket'>{</span>
  <span class='keyword'>public</span><span class='operator'>:</span>
    <span class="added keyword">constexpr</span> <span class='keyword'>explicit</span> format_error<span class='parenthesis'>(</span><span class='keyword'>const</span> string<span class='operator'>&amp;</span> what_arg<span class='parenthesis'>)</span>;
    <span class="added keyword">constexpr</span> <span class='keyword'>explicit</span> format_error<span class='parenthesis'>(</span><span class='keyword'>const</span> <span class='keyword'>char</span><span class='operator'>*</span> what_arg<span class='parenthesis'>)</span>;
  <span class='curlybracket'>}</span>;
<span class='curlybracket'>}</span>
</span></span></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/utilities.tex#L18968'>#</a></div><div class='texpara'><div id='1.sentence-1' class='sentence'>The class <span class='texttt'>format_<span class='shy'></span>error</span> defines the type of objects thrown as
exceptions to report errors from the formatting library<a class='hidden_link' href='#1.sentence-1'>.</a></div></div></div><div class='texpara'><div id='lib:format_error,constructor'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:format_error,constructor'>🔗</a></div><code class='itemdeclcode'><span class="added keyword">constexpr</span> format_error<span class='parenthesis'>(</span><span class='keyword'>const</span> string<span class='operator'>&amp;</span> what_arg<span class='parenthesis'>)</span>;
</code></div></div></div><div class='para' id='2'><div class='marginalizedparent'><a class='marginalized' href='#2'>2</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/utilities.tex#L18978'>#</a></div><div class='texpara'><div id='2.sentence-1' class='sentence'><i >Postconditions</i>: <span class='texttt'>strcmp<span class='parenthesis'>(</span>what<span class='parenthesis'>(</span><span class='parenthesis'>)</span>, what_<span class='shy'></span>arg<span class='operator'>.</span>c_<span class='shy'></span>str<span class='parenthesis'>(</span><span class='parenthesis'>)</span><span class='parenthesis'>)</span> <span class='operator'>=</span><span class='operator'>=</span> <span class='literal'>0</span></span><a class='hidden_link' href='#2.sentence-1'>.</a></div> <a class='index' id='lib:format_error,constructor_'></a></div></div></div><div class='texpara'><div class='itemdecl' id='itemdecl:2'><div class='marginalizedparent'><a class='itemDeclLink' href='#itemdecl:2'>🔗</a></div><code class='itemdeclcode'><span class="added keyword">constexpr</span> format_error<span class='parenthesis'>(</span><span class='keyword'>const</span> <span class='keyword'>char</span><span class='operator'>*</span> what_arg<span class='parenthesis'>)</span>;
</code></div></div><div class='para' id='3'><div class='marginalizedparent'><a class='marginalized' href='#3'>3</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/utilities.tex#L18989'>#</a></div><div class='texpara'><div id='3.sentence-1' class='sentence'><i >Postconditions</i>: <span class='texttt'>strcmp<span class='parenthesis'>(</span>what<span class='parenthesis'>(</span><span class='parenthesis'>)</span>, what_<span class='shy'></span>arg<span class='parenthesis'>)</span> <span class='operator'>=</span><span class='operator'>=</span> <span class='literal'>0</span></span><a class='hidden_link' href='#3.sentence-1'>.</a></div></div></div></div>
	</div>
	<h3 id="feature-test-macro"><a href="#feature-test-macro">Feature test macro</a></h3>
	<div class="wording">
	<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_exception_types 2024??L</code></span>
	</div>
	</div>
</div></div></article>
</div><script>
	hljs.addPlugin(mergeHTMLPlugin);
	hljs.highlightAll();
</script>
</body>
</html>
