<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>P3125R2: constexpr pointer tagging</title>
<link rel="stylesheet" href="data:text/css;base64,QG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyaykgewoJOnJvb3QgewoJCS0tdGV4dC1jb2xvcjogI0JCQjsKCQktLWZvdW5kLWhpZ2hsaWdodDogYmx1ZTsKCQktLWZvdW5kLXRleHQtY29sb3I6IHdoaXRlOwoJCS0tbWFpbi1iYWNrZ3JvdW5kOiAzMiwzMiwzMjsKCQktLWhlYWRlci1jb2xvcjogd2hpdGU7CgkJLS1ib3gtc2hhZG93LWNvbG9yOiByZ2JhKDAsMCwwLDAuNSk7CiAgICAtLXRoaW4tYm94LXNoYWRvdy1jb2xvcjogcmdiYSgwLDAsMCwwLjEpOwoJCS0tbmF2LWJhY2tncm91bmQtY29sb3I6ICMxMDEwMTA7CgkJLS1jb2RlLWZvcmVncm91bmQtY29sb3I6IHdoaXRlOwoJCS0tY29kZS1pbmZvLWNvbG9yOiByZ2JhKDI1NSwyNTUsMjU1LDAuMSk7CgkJLS1jb2RlLWJhY2tncm91bmQtY29sb3I6IHZhcigtLW5hdi1iYWNrZ3JvdW5kLWNvbG9yKTsKCQktLWxpbmstY29sb3I6ICM4ZWYzZmY7CgkJLS12aXNpdGVkLWxpbmstY29sb3I6ICNmMGZmODk7CgkJLS1ob3Zlci1saW5rLWNvbG9yOiAjYjNmN2ZmOwoJCS0taG92ZXItdmlzaXRlZC1saW5rLWNvbG9yOiAjYzhmZmIzOwoJCS0tbGluZS1jb2xvcjogMjU1LDI1NSwyNTU7CgkJLS1oZWFkZXItYmFja2dyb3VuZDogMCwwLDA7CgkJLS1xdW90ZS1sZWZ0LWNvbG9yOiByZ2JhKDI1NSwyNTUsMjU1LDAuNSk7CgkJLS1oaWdobGlnaHQ6IHJnYmEoMjU1LDI1MiwwLDAuMjUpOwoJfQoJOjpzZWxlY3Rpb24gewoJICBjb2xvcjogYmxhY2s7CgkgIGJhY2tncm91bmQ6IGxpZ2h0eWVsbG93OwoJfQp9CgpAbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOiBsaWdodCkgewoJOnJvb3QgewoJCS0tdGV4dC1jb2xvcjogYmxhY2s7CgkJLS1mb3VuZC1oaWdobGlnaHQ6IHllbGxvdzsKCQktLWZvdW5kLXRleHQtY29sb3I6IGJsYWNrOwoJCS0tbWFpbi1iYWNrZ3JvdW5kOiAyNTUsMjU1LDI1NTsKCQktLWhlYWRlci1jb2xvcjogYmxhY2s7CgkJLS1ib3gtc2hhZG93LWNvbG9yOiByZ2JhKDAsMCwwLDAuMyk7CiAgICAtLXRoaW4tYm94LXNoYWRvdy1jb2xvcjogcmdiYSgwLDAsMCwwLjEpOwoJCS0tbmF2LWJhY2tncm91bmQtY29sb3I6ICNGNUY1RjU7CgkJLS1jb2RlLWZvcmVncm91bmQtY29sb3I6IGJsYWNrOwoJCS0tY29kZS1pbmZvLWNvbG9yOiByZ2JhKDAsMCwwLDAuMSk7CgkJLS1jb2RlLWJhY2tncm91bmQtY29sb3I6IHZhcigtLW5hdi1iYWNrZ3JvdW5kLWNvbG9yKTsKCQktLWxpbmstY29sb3I6ICMwMDAwODI7CgkJLS12aXNpdGVkLWxpbmstY29sb3I6ICM1MDhkMGY7CgkJLS1ob3Zlci1saW5rLWNvbG9yOiAjNTc1N2MyOwoJCS0taG92ZXItdmlzaXRlZC1saW5rLWNvbG9yOiAjOTRjNTYwOwoJCS0tbGluZS1jb2xvcjogMTIsNDMsNzU7CgkJLS1oZWFkZXItYmFja2dyb3VuZDogMCwwLDA7CgkJLS1xdW90ZS1sZWZ0LWNvbG9yOiByZ2JhKDAsMCwwLDAuNSk7CgkJLS1oaWdobGlnaHQ6IHJnYmEoMjU1LDI1NCwyMDcsMC41KTsKCX0KCTo6c2VsZWN0aW9uIHsKCSAgY29sb3I6IGJsYWNrOwoJICBiYWNrZ3JvdW5kOiAjYTRjM2Y2OwoJfQp9CgpzcGFuOnRhcmdldCwgcDp0YXJnZXQsIGxpOnRhcmdldCwgZGl2OnRhcmdldCB7CiAgYmFja2dyb3VuZDogdmFyKC0taGlnaGxpZ2h0KTsKfQoKLm5hbWUtb2YtcGFwZXIgewoJZm9udC1zaXplOiAyOHB4OwoJcGFkZGluZy10b3A6IDAuNWVtOwp9CgpzcGFuLmZvdW5kIHsKCXRleHQtc2hhZG93OiAwIDAgMTBweCB2YXIoLS1mb3VuZC1oaWdobGlnaHQpLCAgMCAwIDEwcHggdmFyKC0tZm91bmQtaGlnaGxpZ2h0KSwgIDAgMCAxMHB4IHZhcigtLWZvdW5kLWhpZ2hsaWdodCksICAwIDAgMTBweCB2YXIoLS1mb3VuZC1oaWdobGlnaHQpOwoJY29sb3I6IHZhcigtLWZvdW5kLXRleHQtY29sb3IpICFpbXBvcnRhbnQ7Cn0KCmJvZHkgewoJZm9udC1mYW1pbHk6IEhlbHZldGljYTsKCXBhZGRpbmc6IDA7CgltYXJnaW46IDA7CglvdmVyZmxvdzogaGlkZGVuOwoJY29sb3I6IHZhcigtLXRleHQtY29sb3IpOwoJYmFja2dyb3VuZC1jb2xvcjogcmdiYSh2YXIoLS1tYWluLWJhY2tncm91bmQpLCAxKTsKfQoKYm9keSA+IGRpdiB7CglkaXNwbGF5OiBmbGV4OwoJcGFkZGluZzogMDsKCW1hcmdpbjogMDsKfQoKLmhpZGUtb24tbmFycm93IHsKCWRpc3BsYXk6IGluaGVyaXQ7Cn0KCi5oaWRlLW9uLXdpZGUgewoJZGlzcGxheTogbm9uZTsKfQoKQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAxMTAwcHgpIHsKCWJvZHkgewoJCW92ZXJmbG93OiBpbmhlcml0ICFpbXBvcnRhbnQ7Cgl9CgkuaGlkZS1vbi1uYXJyb3cgewoJCWRpc3BsYXk6IG5vbmU7Cgl9CgkuaGlkZS1vbi13aWRlIHsKCQlkaXNwbGF5OiBpbmhlcml0OwoJfQoJYm9keSA+IGRpdiB7CgkJZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDsKCX0KCWFydGljbGUgewoJCW92ZXJmbG93OiBpbmhlcml0ICFpbXBvcnRhbnQ7CgkJYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCB0cmFuc3BhcmVudCxyZ2JhKHZhcigtLW1haW4tYmFja2dyb3VuZCksMC42KSwgcmdiYSh2YXIoLS1tYWluLWJhY2tncm91bmQpLDAuOCksIHJnYmEodmFyKC0tbWFpbi1iYWNrZ3JvdW5kKSwwLjYpLCB0cmFuc3BhcmVudCkgIWltcG9ydGFudDsKCX0KCW5hdiwgYXJ0aWNsZSB7CgkJZmxleDogaW5pdGlhbCAhaW1wb3J0YW50OwoJfQoJbmF2IHsKCQltaW4td2lkdGg6IGluaXRpYWwgIWltcG9ydGFudDsKCQltYXgtd2lkdGg6IGluaXRpYWwgIWltcG9ydGFudDsKCQltaW4taGVpZ2h0OiBpbml0aWFsICFpbXBvcnRhbnQ7CgkJbWF4LWhlaWdodDogaW5pdGlhbCAhaW1wb3J0YW50OwoJCWJveC1zaGFkb3c6IDAgMTBweCAwIHZhcigtLWJveC1zaGFkb3ctY29sb3IpOwoJfQoJbmF2ID4gZGl2IHsKCQlvdmVyZmxvdzogaW5oZXJpdCAhaW1wb3J0YW50OwoJCXBvc2l0aW9uOiByZWxhdGl2ZSAhaW1wb3J0YW50OwoJCW1heC13aWR0aDogaW5pdGlhbCAhaW1wb3J0YW50OwoJCW1heC1oZWlnaHQ6IGluaXRpYWwgIWltcG9ydGFudDsKCX0KCWRpdjpoYXMoPiBpbnB1dFt0eXBlPXNlYXJjaF0pIHsKCQlkaXNwbGF5OiBub25lOwoJfQoJZGl2LnF1b3RlIHsKCQlvdmVyZmxvdy14OiBzY3JvbGw7CgkJb3ZlcmZsb3cteTogdmlzaWJsZTsKCX0KfQoKbmF2IHsKCXBhZGRpbmc6IDAgMC41ZW07CgltYXJnaW46IDA7CglmbGV4OiAxIDEgMDsKCW1pbi13aWR0aDogMzUwcHg7CgltYXgtd2lkdGg6IDM1MHB4OwoJYm94LXNoYWRvdzogMCAwIDEwcHggdmFyKC0tYm94LXNoYWRvdy1jb2xvcik7CgliYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1uYXYtYmFja2dyb3VuZC1jb2xvcik7Cn0KCm5hdiA+IGRpdiB7Cglwb3NpdGlvbjogZml4ZWQ7CgltYXgtd2lkdGg6IDM1MHB4OwoJbWF4LWhlaWdodDogMTAwJTsKCW92ZXJmbG93OiBzY3JvbGw7Cgl0b3A6IDA7CglsZWZ0OiAwOwoJcGFkZGluZzogMCAwLjVlbTsKCW1hcmdpbjogMDsKfQoKbmF2ID4gZGl2ID4gZGl2IHsKCXBhZGRpbmc6IDAuNWVtOwoJcGFkZGluZy10b3A6IDA7CglwYWRkaW5nLWJvdHRvbTogMWVtOwp9CgphcnRpY2xlIHsKCWZsZXg6IDMgMSAwOwoJb3ZlcmZsb3c6IHNjcm9sbDsKCWhlaWdodDogMTAwdmg7Cgl0ZXh0LWFsaWduOiBqdXN0aWZ5OwoJYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgdHJhbnNwYXJlbnQscmdiYSh2YXIoLS1tYWluLWJhY2tncm91bmQpLDAuNiksIHJnYmEodmFyKC0tbWFpbi1iYWNrZ3JvdW5kKSwwLjgpLCByZ2JhKHZhcigtLW1haW4tYmFja2dyb3VuZCksMC42KSwgdHJhbnNwYXJlbnQpOwoJcGFkZGluZzogMDsKCW1hcmdpbjogMDsKfQoKYXJ0aWNsZSA+IGRpdiB7CglwYWRkaW5nLXJpZ2h0OiAxLjVlbTsKCXBhZGRpbmctbGVmdDogMS41ZW07CglwYWRkaW5nLWJvdHRvbTogMWVtOwp9Cgpjb2RlIHsKCQp9CgpkaXYucXVvdGUgewoJY29sb3I6IHZhcigtLWNvZGUtZm9yZWdyb3VuZC1jb2xvcik7CgliYWNrZ3JvdW5kOiB2YXIoLS1jb2RlLWJhY2tncm91bmQtY29sb3IpOwoJcGFkZGluZzogMWVtOwoJYm9yZGVyLXJhZGl1czogMHB4IDE1cHggMTVweCAwcHg7Cglib3JkZXItbGVmdDogNXB4IHNvbGlkIHZhcigtLXF1b3RlLWxlZnQtY29sb3IpOwoJZm9udC1zdHlsZTogaXRhbGljOwoJbWFyZ2luOiAxZW07Cn0KCmNvZGU6bm90KHByZSA+IGNvZGUpIHsKCWNvbG9yOiBpbmhlcml0OwoJYmFja2dyb3VuZDogdmFyKC0tY29kZS1iYWNrZ3JvdW5kLWNvbG9yKTsKCWJvcmRlci1yYWRpdXM6IDVweDsKCXBhZGRpbmc6IDAgMC4yZW07CgltYXJnaW46IDAgMnB4OwoJb3V0bGluZTogMnB4IHNvbGlkIHZhcigtLWNvZGUtYmFja2dyb3VuZC1jb2xvcik7Cn0KCnByZSA+IGNvZGUgewoJb3V0bGluZTogbm9uZTsKCWxpbmUtaGVpZ2h0OiAxLjQ7Cgl0YWItc2l6ZTogMjsKfQoKcHJlOmhhcyhjb2RlKSB7Cgljb2xvcjogdmFyKC0tY29kZS1mb3JlZ3JvdW5kLWNvbG9yKTsKCWJhY2tncm91bmQ6IHZhcigtLWNvZGUtYmFja2dyb3VuZC1jb2xvcik7CglwYWRkaW5nOiAxZW07Cglib3JkZXItcmFkaXVzOiAxNXB4OwoJcG9zaXRpb246IHJlbGF0aXZlOwoJei1pbmRleDogMTsKCW92ZXJmbG93LXg6IHNjcm9sbDsKCW92ZXJmbG93LXk6IHZpc2libGU7Cn0KCnByZTpoYXMoY29kZS5sYW5ndWFnZS1jYXJib24pOjpiZWZvcmUgewoJY29udGVudDogIkNhcmJvbiI7Cgl0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwoJcG9zaXRpb246IGFic29sdXRlOwoJdG9wOiAxZW07CglyaWdodDogMWVtOwoJY29sb3I6IHZhcigtLWNvZGUtaW5mby1jb2xvcik7Cglmb250LXdlaWdodDogYm9sZDsKfQoKcCwgdWwgPiBsaSB7Cgl0ZXh0LWFsaWduOiBqdXN0aWZ5OwoJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCWh5cGhlbnM6IGF1dG87Cn0KCmFydGljbGUgdWwgPiBsaSB7CglwYWRkaW5nLWJvdHRvbTogMC4yNWVtOwp9CgpkaXYuZGVzY3JpcHRpb24gdWwgewogIHBhZGRpbmctdG9wOiAwLjVlbTsKCXBhZGRpbmctYm90dG9tOiAwLjVlbTsKfQoKYSB7Cgljb2xvcjogdmFyKC0tbGluay1jb2xvcik7Cgl0ZXh0LWRlY29yYXRpb24tc3R5bGU6IGRvdHRlZDsKfQoKYTpob3ZlciB7Cgljb2xvcjogdmFyKC0taG92ZXItbGluay1jb2xvcik7Cgl0ZXh0LWRlY29yYXRpb24tc3R5bGU6IHNvbGlkOwp9CgphOnZpc2l0ZWQgewoJY29sb3I6IHZhcigtLXZpc2l0ZWQtbGluay1jb2xvcik7Cn0KCmE6dmlzaXRlZDpob3ZlciB7Cgljb2xvcjogdmFyKC0taG92ZXItdmlzaXRlZC1saW5rLWNvbG9yKTsKCXRleHQtZGVjb3JhdGlvbi1zdHlsZTogc29saWQ7Cn0KCmgxLCBoMiwgaDMsIGg0LCBoNSB7CgltYXJnaW46IDA7CgltYXJnaW4tYm90dG9tOiAxMHB4OwoJcGFkZGluZzogMC41ZW07CglwYWRkaW5nLXRvcDogMjBweDsKCXBhZGRpbmctYm90dG9tOiAycHg7Cgl6LWluZGV4OiAyOwoJY29sb3I6IHZhcigtLWhlYWRlci1jb2xvcik7Cn0KCmFydGljbGUgaDEsIGFydGljbGUgaDIsIGFydGljbGUgaDMsIGFydGljbGUgaDQsIGFydGljbGUgaDUgewovKglwb3NpdGlvbjogc3RpY2t5OwoJcG9zaXRpb246IC13ZWJraXQtc3RpY2t5OwoJdG9wOiAwOyovCgkKfQoKaDEgewoJZm9udC13ZWlnaHQ6IDgwMDsKCWJvcmRlci1ib3R0b206IHJnYmEodmFyKC0tbGluZS1jb2xvciksIDEpIGRvdHRlZCAycHg7Cn0KCmgyIHsKCWZvbnQtd2VpZ2h0OiA4MDA7Cglib3JkZXItYm90dG9tOiByZ2JhKHZhcigtLWxpbmUtY29sb3IpLCAwLjc1KSBkb3R0ZWQgMnB4Owp9CgpoMywgaDQsIGg1IHsKCWZvbnQtd2VpZ2h0OiA2MDA7Cglib3JkZXItYm90dG9tOiByZ2JhKHZhcigtLWxpbmUtY29sb3IpLCAwLjMzKSBkb3R0ZWQgMnB4Owp9CgpoMSA+IGEsIGgyID4gYSwgaDMgPiBhLCBoNCA+IGEsIGg1ID4gYSB7Cgljb2xvcjogaW5oZXJpdCAhaW1wb3J0YW50OwoJdGV4dC1kZWNvcmF0aW9uOiBpbmhlcml0Owp9CgpoMTp0YXJnZXQ6OmFmdGVyLCBoMjp0YXJnZXQ6OmFmdGVyLCBoMzp0YXJnZXQ6OmFmdGVyLCBoNDp0YXJnZXQ6OmFmdGVyLCBoNTp0YXJnZXQ6OmFmdGVyIHsKCXRleHQtZGVjb3JhdGlvbjogaW5oZXJpdDsKCWNvbnRlbnQ6ICIg4pqT77iOIjsKICBmb250LXNpemU6IDE0cHg7Cn0KCmgxID4gYTpob3ZlciwgaDIgPiBhOmhvdmVyLCBoMyA+IGE6aG92ZXIsIGg0ID4gYTpob3ZlciwgaDUgPiBhOmhvdmVyIHsKCWNvbG9yOiB2YXIoLS1ob3Zlci1saW5rLWNvbG9yKTsKfQoKZGl2Omhhcyg+IGlucHV0W3R5cGU9c2VhcmNoXSkgewoJcG9zaXRpb246IGZpeGVkOwoJdG9wOiAwOwoJcmlnaHQ6IDA7Cgl6LWluZGV4OiAxMDAwOwoJcGFkZGluZzogMC41ZW07CgliYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1uYXYtYmFja2dyb3VuZC1jb2xvcik7Cglib3gtc2hhZG93OiAwIDAgMTBweCByZ2JhKDAsMCwwLDAuMyk7Cglib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAxMHB4Owp9CgpkaXYgPiBpbnB1dFt0eXBlPXNlYXJjaF0gewoJYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbmF2LWJhY2tncm91bmQtY29sb3IpOwoJYm9yZGVyOiAycHggc29saWQgdmFyKC0tdGV4dC1jb2xvcik7Cgljb2xvcjogdmFyKC0tdGV4dC1jb2xvcik7Cgl3aWR0aDogMzAwcHg7Cn0KCmRpdi5wYXBlci1pbmZvIHsKCXBhZGRpbmc6IDA7CglwYWRkaW5nLXRvcDogMWVtOwoJCgkua2V5IHsKCQlmb250LXdlaWdodDogYm9sZDsKCX0KCQoJZGl2IHsKCX0KfQoKdWwgewoJcGFkZGluZzogMDsKCW1hcmdpbjogMDsKCXBhZGRpbmctbGVmdDogMmVtOwp9CgpsaSA+IHVsIHsKCXBhZGRpbmctbGVmdDogMC41ZW07Cn0KCnVsID4gbGkgewoJcGFkZGluZy1sZWZ0OiAwLjVlbTsKfQoKY29kZSAuZXJyb3IsIGNvZGUgLmJlZm9yZSB7CgkJbGluZS1oZWlnaHQ6IDEuOTsKfQoKY29kZSAuZXJyb3IgPiAqLCBjb2RlIC5iZWZvcmUgPiAqIHsKCWJhY2tncm91bmQtY29sb3I6ICNGRjg4ODggIWltcG9ydGFudDsKCWNvbG9yOiBibGFjayAhaW1wb3J0YW50OwoJQG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyaykgewoJCWNvbG9yOiB3aGl0ZTsKCX0KCWJvcmRlcjogM3B4IHNvbGlkICNGRjg4ODg7Cglmb250LXdlaWdodDogYm9sZDsKfQoKY29kZSAuYWZ0ZXIgPiAqIHsKCWJhY2tncm91bmQtY29sb3I6IGxpZ2h0Z3JlZW4gIWltcG9ydGFudDsKCWNvbG9yOiBibGFjayAhaW1wb3J0YW50OwoJQG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyaykgewoJCWNvbG9yOiB3aGl0ZTsKCX0KCWJvcmRlcjogM3B4IHNvbGlkIGxpZ2h0Z3JlZW47Cglmb250LXdlaWdodDogYm9sZDsKfQoKY29kZSAudW5jaGFuZ2VkID4gKiB7CgliYWNrZ3JvdW5kLWNvbG9yOiBsaWdodHllbGxvdyAhaW1wb3J0YW50OwoJY29sb3I6IGJsYWNrICFpbXBvcnRhbnQ7CglAbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKSB7CgkJY29sb3I6IHdoaXRlOwoJfQoJYm9yZGVyOiAzcHggc29saWQgbGlnaHR5ZWxsb3c7Cglmb250LXdlaWdodDogYm9sZDsKfQoKY29kZSAuaW52aXNpYmxlIHsKCXZpc2liaWxpdHk6IGhpZGRlbjsKfQoKLmNoYW5nZXMgewoJZGlzcGxheTogaW5saW5lLWJsb2NrOwp9Cgoud29yZGluZyBoMSwgLndvcmRpbmcgaDIgewoJZm9udC1zaXplOiBpbmhlcml0OwoJdGV4dC1kZWNvcmF0aW9uOiBub25lOwoJYm9yZGVyOiBub25lOwoJcGFkZGluZzogMDsKCW1hcmdpbjogMDsKfQoKLndvcmRpbmcgcCB7CglwYWRkaW5nOiAwOwoJcGFkZGluZy10b3A6IDAuNWVtOwoJbWFyZ2luOiAwOwp9Cgoud29yZGluZyBhIHsKCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKCWNvbG9yOiBpbmhlcml0Owp9Cgoud29yZGluZyBhOmhvdmVyIHsKCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwoJY29sb3I6IHZhcigtLWxpbmstY29sb3IpOwp9Cgoud29yZGluZyBhOnZpc2l0ZWQgewoJQG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyaykgewoJCWNvbG9yOiBibGFjayAhaW1wb3J0YW50OwoJfQp9Cgoud29yZGluZyBjb2RlIHsKCWJhY2tncm91bmQ6IGluaGVyaXQgIWltcG9ydGFudDsKCWJvcmRlcjogbm9uZTsKCW91dGxpbmU6IG5vbmU7Cn0KCQoud29yZGluZyB7Cglmb250LWZhbWlseTogIk5vdG8gU2VyaWYiOwoJCglwYWRkaW5nOiAwLjVlbSAxZW07CglwYWRkaW5nLWJvdHRvbTogMWVtOwoJY29sb3I6IHZhcigtLWNvZGUtZm9yZWdyb3VuZC1jb2xvcik7CgliYWNrZ3JvdW5kOiB2YXIoLS1jb2RlLWJhY2tncm91bmQtY29sb3IpOwoJbGluZS1oZWlnaHQ6IDEuNTU7CgkKCWJvcmRlci1yYWRpdXM6IDE1cHg7Cglwb3NpdGlvbjogcmVsYXRpdmU7Cgl6LWluZGV4OiAxOwoJb3ZlcmZsb3cteDogdmlzaWJsZTsKCW92ZXJmbG93LXk6IHZpc2libGU7Cn0KCQoud29yZGluZyAuYWRkZWQsIHByZSAuYWRkZWQgewoJYmFja2dyb3VuZC1jb2xvcjogbGlnaHRncmVlbjsKICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICB0ZXh0LWRlY29yYXRpb24tY29sb3I6IGdyZWVuOwogIHRleHQtZGVjb3JhdGlvbi10aGlja25lc3M6IDJweCAhaW1wb3J0YW50OwoJei1pbmRleDogODA7CglwYWRkaW5nOiAzcHg7CglAbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKSB7CgkJY29sb3I6IGJsYWNrICFpbXBvcnRhbnQ7Cgl9Cn0KCi53b3JkaW5nIC5hZGRlZC1pdGVtIHsKCWJhY2tncm91bmQtY29sb3I6IGxpZ2h0Z3JlZW47CiAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgdGV4dC1kZWNvcmF0aW9uLWNvbG9yOiBncmVlbjsKICB0ZXh0LWRlY29yYXRpb24tdGhpY2tuZXNzOiAycHggIWltcG9ydGFudDsKCUBtZWRpYSAocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspIHsKCQljb2xvcjogYmxhY2s7Cgl9Cn0KCQoud29yZGluZyAucmVtb3ZlZCB7CgliYWNrZ3JvdW5kLWNvbG9yOiAjRkY4ODg4OwoJei1pbmRleDogNTA7CglwYWRkaW5nOiAzcHg7CiAgdGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7CiAgdGV4dC1kZWNvcmF0aW9uLWNvbG9yOiByZWQ7CiAgdGV4dC1kZWNvcmF0aW9uLXRoaWNrbmVzczogMnB4ICFpbXBvcnRhbnQ7CglAbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKSB7CgkJY29sb3I6IGJsYWNrOwoJfQp9CgkKLndvcmRpbmcgLm5vdGUgewoJZm9udC1zaXplOiAwLjhlbTsKfQoJCi53b3JkaW5nCSsgLndvcmRpbmcgewoJbWFyZ2luLXRvcDogMC41ZW07Cn0KCQoud29yZGluZyBwcmU6aGFzKGNvZGUpIHsKCWJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWNvZGUtaW5mby1jb2xvcik7Cglib3JkZXItcmFkaXVzOiAwOwoJcGFkZGluZzogMGVtOwoJei1pbmRleDogMTsKCW92ZXJmbG93LXg6IHNjcm9sbDsKfQoJCi53b3JkaW5nCWNvZGUgLmFkZGVkZWQgc3BhbiB7Cgljb2xvcjogYmxhY2sgIWltcG9ydGFudDsKfQoKdGFibGUucG9sbCB7CiAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKICBtYXJnaW4tdG9wOiAyMHB4Owp9Cgp0YWJsZS5wb2xsIHRoLCB0YWJsZS5wb2xsIHRkIHsKICBib3JkZXI6IDA7CiAgcGFkZGluZzogMCAxMHB4OwogIHRleHQtYWxpZ246IGNlbnRlcjsKICBib3JkZXI6IDJweCBzb2xpZCByZ2JhKDEyOCwxMjgsMTI4LDAuMik7Cn0KCnRhYmxlLnBvbGwgdGQ6Zmlyc3QtY2hpbGQsIHRhYmxlLnBvbGwgdGg6Zmlyc3QtY2hpbGQgewogYm9yZGVyLWxlZnQ6IG5vbmU7Cn0KCnRhYmxlLnBvbGwgdGQ6bGFzdC1jaGlsZCwgdGFibGUucG9sbCB0aDpsYXN0LWNoaWxkIHsKIGJvcmRlci1yaWdodDogbm9uZTsKfQoKdGFibGUucG9sbCB0cjpmaXJzdC1jaGlsZCB0aCwgdGFibGUucG9sbCB0cjpmaXJzdC1jaGlsZCB0ZCB7CiAgYm9yZGVyLXRvcDogbm9uZTsKfQoKdGFibGUucG9sbCB0cjpsYXN0LWNoaWxkIHRoLCB0YWJsZS5wb2xsIHRyOmxhc3QtY2hpbGQgdGQgewogIGJvcmRlci1ib3R0b206IG5vbmU7Cn0KCi53b3JkaW5nIC5kZXNjcmlwdGlvbiB7CiAgcGFkZGluZy1ib3R0b206IDFlbTsKfQoKLndvcmRpbmcgLmNhcHMgewogIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7Cn0KCnRhYmxlIHRoLnRhYmxlLWdyb3VwIHsKCW1heC13aWR0aDogMmVtOwp9Cgp0YWJsZSB0aC50YWJsZS1ncm91cCA+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 pointer tagging</h1>
<div class="paper-info">
	<div><span class="key">Number:</span> P3125R2</div>
	<div><span class="key">Date:</span> <time>2024-11-27</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="#history">Revision history</a></li>
	<li><a href="#tldr">TL;DR</a></li>
	<li><a href="#introduction">Introduction and motivation</a>
    <ul>
      <li><a href="#usecases">Use-cases</a></li>
      <li><a href="#safety">Safety</a></li>
    </ul>
  </li>
  <li><a href="#examples">Examples</a></li>
	<li><a href="#implementation-experience">Implementation experience</a>
    <ul>
      <li><a href="#library-part">Implementation in the library</a>
        <ul>
          <li><a href="#accesing-raw-pointers">Accessing raw tagged pointers</a></li>
          <li><a href="#available-schemas">Available tagging schemas</a></li>
        </ul>
      </li>
      <li><a href="#compiler-part">Implementation in the compiler</a>
        <ul>
          <li><a href="#compiler-interaction">Compiler builtins</a></li>
          <li><a href="#constexpr-support">Constexpr support</a></li>
          <li><a href="#runtime">Provenance</a></li>
          <li><a href="#alternative-constexpr-approach">Alternative constexpr approach</a></li>
        </ul>
      </li>
    </ul>
  </li>
  <li><a href="#design">Design of the proposed functionality</a>
    <ul>
			<li><a href="#additional-constructor-safety">Preconditions of constructors</a></li>
      <li><a href="#tuple-protocol">tuple protocol</a></li>
    </ul>
  </li>
	<li><a href="#impact-on-existing-code">Impact on existing code</a></li>
	<li><a href="#wording">Proposed changes to wording</a></li>
		<ul>
			<li><a href="#feature-test-macro">Feature test macro</a></li>
		</ul>
</ul>
</div></div></nav>
<article>
<div><div>
	<h1 class="hide-on-narrow name-of-paper">constexpr pointer tagging</h1>
	<p>This paper proposes a new library non-owning pointer and value pair which has ability to store small amount of information <em>'tag'</em> in a pointer bits in an unspecified-way. This functionality must be usable in <code>constexpr</code> environment.</p>
	<h2 id="history"><a href="#history">Revision history</a></h2>
	<ul>
		<li><a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p3125r1.html">R1</a>&#x2005;→&#x2005;R2: simplifying design by removing schemas and the heavy interface, massive simplification as discussed in SG1 (<code>pointer_tag_pair</code>, required <code>sizeof(pointer_tag_pair) == sizeof(T*)</code>)</li>
		<li><a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p3125r0.pdf">R0</a>&#x2005;→&#x2005;<a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p3125r1.html">R1</a>: proposing and explaining design based on existing implementation</li>
	</ul>
	<h2 id="tldr"><a href="#tldr">TL;DR</a></h2>
	<p>This paper proposes simple type for which user request <em>n</em>-bits of storage inside a pointer value in an unspecified way. Construction of the type should fail in case when no such storage is available.</p>
	<h2 id="introduction"><a href="#introduction">Introduction and motivation</a></h2>
	<p>Pointer tagging is widely known and used technique (<a href="https://takenobu-hs.github.io/downloads/haskell_ghc_illustrated.pdf">Glasgow Haskell Compiler</a>, LLVM's <code><a href="https://github.com/llvm/llvm-project/blob/8e5aa538caccef167e8096b2173fdaf2be9cc129/llvm/include/llvm/ADT/PointerIntPair.h#L80">PointerIntPair</a></code>, <code><a href="https://github.com/llvm/llvm-project/blob/8e5aa538caccef167e8096b2173fdaf2be9cc129/llvm/include/llvm/ADT/PointerUnion.h#L112">PointerUnion</a></code>, <a href="https://blog.codingconfessions.com/p/cpython-garbage-collection-internals">CPython's garbage collector</a>, <a href="https://alwaysprocessing.blog/2023/03/19/objc-tagged-ptr">Objective C</a> / Swift, Chrome's <a href="https://v8.dev/blog/pointer-compression">V8 JavaScript engine</a>, <a href="https://www.gap-system.org">GAP</a>, <a href="https://ocaml.org/docs/memory-representation#distinguishing-integers-and-pointers-at-runtime">OCaml</a>, <a href="https://pbr-book.org/4ed/Utilities/Containers_and_Memory_Management#TaggedPointers">PBRT</a>). All major CPU vendors provides mechanism for pointer tagging (Intel's LAM <a href="https://cdrdv2-public.intel.com/835759/325462-sdm-vol-1-2abcd-3abcd-4.pdf">linear address masking</a>, AMD's <a href="https://www.amd.com/content/dam/amd/en/documents/processor-tech-docs/programmer-references/24593.pdf">Upper Address Ignore</a>, ARM's TBI <a href="https://en.wikichip.org/wiki/arm/tbi">top byte ignore</a> and MTE <a href="https://en.wikichip.org/wiki/arm/mte">memory tagging extension</a>). All widely used 64 bit platforms are <a href="https://muxup.com/2023q4/storing-data-in-pointers">not using more than 48 or 49 bits of the pointers</a>.</p>
	<p>This functionality widely supported can't be expressed in a standard conforming way.</p>
	<p><a href="https://doc.rust-lang.org/std/primitive.pointer.html#examples-9">Rust</a>, <a href="https://dlang.org/library/std/bitmanip/tagged_pointer.html">Dlang</a>, or <a href="https://zig.news/orgold/type-safe-tagged-pointers-with-comptime-ghi">Zig</a> has an interface for pointer tagging. This is demonstrating demand for the feature and C++ should have it too and it should also work in <code>constexpr</code>.</p>
	<div style="text-align: center"><img width="90%" src="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIGlkPSJMYXllcl8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA3NDcuOTYgMTI1Ljg2Ij48ZGVmcz48c3R5bGU+LmNscy0xLC5jbHMtMiwuY2xzLTMsLmNscy00LC5jbHMtNSwuY2xzLTYsLmNscy03LC5jbHMtOCwuY2xzLTl7c3Ryb2tlLW1pdGVybGltaXQ6MTA7fS5jbHMtMSwuY2xzLTIsLmNscy0zLC5jbHMtNCwuY2xzLTUsLmNscy02LC5jbHMtOCwuY2xzLTl7c3Ryb2tlOiMyMzFmMjA7fS5jbHMtMSwuY2xzLTd7ZmlsbDpub25lO30uY2xzLTJ7ZmlsbDojYmNiZWMwO30uY2xzLTEwe2ZpbGw6IzIzMWYyMDt9LmNscy0ze2ZpbGw6I2U2ZTdlODt9LmNscy00e2ZpbGw6IzhkYzYzZjt9LmNscy01e2ZpbGw6I2YyODViNTt9LmNscy02e2ZpbGw6Izc5YzJlMjt9LmNscy03e3N0cm9rZTojYTdhOWFjO3N0cm9rZS1saW5lY2FwOnNxdWFyZTt9LmNscy04e2ZpbGw6I2VkZGU1ZDt9LmNscy05e2ZpbGw6I2ZmZjt9PC9zdHlsZT48L2RlZnM+PGxpbmUgY2xhc3M9ImNscy03IiB4MT0iMTY5LjMyIiB4Mj0iMTY5LjMyIiB5Mj0iNTguMDYiLz48bGluZSBjbGFzcz0iY2xzLTciIHgxPSI2NDEuNDUiIHkxPSIxMTcuMDgiIHgyPSI2NDEuNDUiLz48cmVjdCBjbGFzcz0iY2xzLTkiIHg9IjExLjk0IiB5PSI0OC4yMyIgd2lkdGg9IjkuODQiIGhlaWdodD0iOS44NCIvPjxyZWN0IGNsYXNzPSJjbHMtOSIgeD0iMjEuNzgiIHk9IjQ4LjIzIiB3aWR0aD0iOS44NCIgaGVpZ2h0PSI5Ljg0Ii8+PHJlY3QgY2xhc3M9ImNscy05IiB4PSIzMS42MSIgeT0iNDguMjMiIHdpZHRoPSI5Ljg0IiBoZWlnaHQ9IjkuODQiLz48cmVjdCBjbGFzcz0iY2xzLTkiIHg9IjQxLjQ1IiB5PSI0OC4yMyIgd2lkdGg9IjkuODQiIGhlaWdodD0iOS44NCIvPjxyZWN0IGNsYXNzPSJjbHMtOSIgeD0iNTEuMjgiIHk9IjQ4LjIzIiB3aWR0aD0iOS44NCIgaGVpZ2h0PSI5Ljg0Ii8+PHJlY3QgY2xhc3M9ImNscy05IiB4PSI2MS4xMiIgeT0iNDguMjMiIHdpZHRoPSI5Ljg0IiBoZWlnaHQ9IjkuODQiLz48cmVjdCBjbGFzcz0iY2xzLTkiIHg9IjcwLjk2IiB5PSI0OC4yMyIgd2lkdGg9IjkuODQiIGhlaWdodD0iOS44NCIvPjxyZWN0IGNsYXNzPSJjbHMtOSIgeD0iODAuNzkiIHk9IjQ4LjIzIiB3aWR0aD0iOS44NCIgaGVpZ2h0PSI5Ljg0Ii8+PHJlY3QgY2xhc3M9ImNscy0zIiB4PSI5MC42MyIgeT0iNDguMjMiIHdpZHRoPSI5Ljg0IiBoZWlnaHQ9IjkuODQiLz48cmVjdCBjbGFzcz0iY2xzLTMiIHg9IjEwMC40NiIgeT0iNDguMjMiIHdpZHRoPSI5Ljg0IiBoZWlnaHQ9IjkuODQiLz48cmVjdCBjbGFzcz0iY2xzLTMiIHg9IjExMC4zIiB5PSI0OC4yMyIgd2lkdGg9IjkuODQiIGhlaWdodD0iOS44NCIvPjxyZWN0IGNsYXNzPSJjbHMtMyIgeD0iMTIwLjE0IiB5PSI0OC4yMyIgd2lkdGg9IjkuODQiIGhlaWdodD0iOS44NCIvPjxyZWN0IGNsYXNzPSJjbHMtMyIgeD0iMTI5Ljk3IiB5PSI0OC4yMyIgd2lkdGg9IjkuODQiIGhlaWdodD0iOS44NCIvPjxyZWN0IGNsYXNzPSJjbHMtMyIgeD0iMTM5LjgxIiB5PSI0OC4yMyIgd2lkdGg9IjkuODQiIGhlaWdodD0iOS44NCIvPjxyZWN0IGNsYXNzPSJjbHMtMyIgeD0iMTQ5LjY0IiB5PSI0OC4yMyIgd2lkdGg9IjkuODQiIGhlaWdodD0iOS44NCIvPjxyZWN0IGNsYXNzPSJjbHMtMyIgeD0iMTU5LjQ4IiB5PSI0OC4yMyIgd2lkdGg9IjkuODQiIGhlaWdodD0iOS44NCIvPjxyZWN0IGNsYXNzPSJjbHMtOSIgeD0iMTY5LjMyIiB5PSI0Ni4zNiIgd2lkdGg9IjkuODQiIGhlaWdodD0iMTEuNyIvPjxyZWN0IGNsYXNzPSJjbHMtOSIgeD0iMTc5LjE1IiB5PSI0Ni4zNiIgd2lkdGg9IjkuODQiIGhlaWdodD0iMTEuNyIvPjxyZWN0IGNsYXNzPSJjbHMtOSIgeD0iMTg4Ljk5IiB5PSI0Ni4zNiIgd2lkdGg9IjkuODQiIGhlaWdodD0iMTEuNyIvPjxyZWN0IGNsYXNzPSJjbHMtOSIgeD0iMTk4LjgyIiB5PSI0Ni4zNiIgd2lkdGg9IjkuODQiIGhlaWdodD0iMTEuNyIvPjxyZWN0IGNsYXNzPSJjbHMtOSIgeD0iMjA4LjY2IiB5PSI0Ni4zNiIgd2lkdGg9IjkuODQiIGhlaWdodD0iMTEuNyIvPjxyZWN0IGNsYXNzPSJjbHMtOSIgeD0iMjE4LjUiIHk9IjQ2LjM2IiB3aWR0aD0iOS44NCIgaGVpZ2h0PSIxMS43Ii8+PHJlY3QgY2xhc3M9ImNscy05IiB4PSIyMjguMzMiIHk9IjQ2LjM2IiB3aWR0aD0iOS44NCIgaGVpZ2h0PSIxMS43Ii8+PHJlY3QgY2xhc3M9ImNscy05IiB4PSIyMzguMTciIHk9IjQ2LjM2IiB3aWR0aD0iOS44NCIgaGVpZ2h0PSIxMS43Ii8+PHJlY3QgY2xhc3M9ImNscy0yIiB4PSIyNDguMDEiIHk9IjQ2LjM2IiB3aWR0aD0iOS44NCIgaGVpZ2h0PSIxMS43Ii8+PHJlY3QgY2xhc3M9ImNscy0yIiB4PSIyNTcuODQiIHk9IjQ2LjM2IiB3aWR0aD0iOS44NCIgaGVpZ2h0PSIxMS43Ii8+PHJlY3QgY2xhc3M9ImNscy0yIiB4PSIyNjcuNjgiIHk9IjQ2LjM2IiB3aWR0aD0iOS44NCIgaGVpZ2h0PSIxMS43Ii8+PHJlY3QgY2xhc3M9ImNscy0yIiB4PSIyNzcuNTEiIHk9IjQ2LjM2IiB3aWR0aD0iOS44NCIgaGVpZ2h0PSIxMS43Ii8+PHJlY3QgY2xhc3M9ImNscy0yIiB4PSIyODcuMzUiIHk9IjQ2LjM2IiB3aWR0aD0iOS44NCIgaGVpZ2h0PSIxMS43Ii8+PHJlY3QgY2xhc3M9ImNscy0yIiB4PSIyOTcuMTkiIHk9IjQ2LjM2IiB3aWR0aD0iOS44NCIgaGVpZ2h0PSIxMS43Ii8+PHJlY3QgY2xhc3M9ImNscy0yIiB4PSIzMDcuMDIiIHk9IjQ2LjM2IiB3aWR0aD0iOS44NCIgaGVpZ2h0PSIxMS43Ii8+PHJlY3QgY2xhc3M9ImNscy0yIiB4PSIzMTYuODYiIHk9IjQ2LjM2IiB3aWR0aD0iOS44NCIgaGVpZ2h0PSIxMS43Ii8+PHJlY3QgY2xhc3M9ImNscy05IiB4PSIzMjYuNjkiIHk9IjQ2LjM2IiB3aWR0aD0iOS44NCIgaGVpZ2h0PSIxMS43Ii8+PHJlY3QgY2xhc3M9ImNscy05IiB4PSIzMzYuNTMiIHk9IjQ2LjM2IiB3aWR0aD0iOS44NCIgaGVpZ2h0PSIxMS43Ii8+PHJlY3QgY2xhc3M9ImNscy05IiB4PSIzNDYuMzciIHk9IjQ2LjM2IiB3aWR0aD0iOS44NCIgaGVpZ2h0PSIxMS43Ii8+PHJlY3QgY2xhc3M9ImNscy05IiB4PSIzNTYuMiIgeT0iNDYuMzYiIHdpZHRoPSI5Ljg0IiBoZWlnaHQ9IjExLjciLz48cmVjdCBjbGFzcz0iY2xzLTkiIHg9IjM2Ni4wNCIgeT0iNDYuMzYiIHdpZHRoPSI5Ljg0IiBoZWlnaHQ9IjExLjciLz48cmVjdCBjbGFzcz0iY2xzLTkiIHg9IjM3NS44NyIgeT0iNDYuMzYiIHdpZHRoPSI5Ljg0IiBoZWlnaHQ9IjExLjciLz48cmVjdCBjbGFzcz0iY2xzLTkiIHg9IjM4NS43MSIgeT0iNDYuMzYiIHdpZHRoPSI5Ljg0IiBoZWlnaHQ9IjExLjciLz48cmVjdCBjbGFzcz0iY2xzLTkiIHg9IjM5NS41NSIgeT0iNDYuMzYiIHdpZHRoPSI5Ljg0IiBoZWlnaHQ9IjExLjciLz48cmVjdCBjbGFzcz0iY2xzLTIiIHg9IjQwNS4zOCIgeT0iNDYuMzYiIHdpZHRoPSI5Ljg0IiBoZWlnaHQ9IjExLjciLz48cmVjdCBjbGFzcz0iY2xzLTIiIHg9IjQxNS4yMiIgeT0iNDYuMzYiIHdpZHRoPSI5Ljg0IiBoZWlnaHQ9IjExLjciLz48cmVjdCBjbGFzcz0iY2xzLTIiIHg9IjQyNS4wNSIgeT0iNDYuMzYiIHdpZHRoPSI5Ljg0IiBoZWlnaHQ9IjExLjciLz48cmVjdCBjbGFzcz0iY2xzLTIiIHg9IjQzNC44OSIgeT0iNDYuMzYiIHdpZHRoPSI5Ljg0IiBoZWlnaHQ9IjExLjciLz48cmVjdCBjbGFzcz0iY2xzLTIiIHg9IjQ0NC43MyIgeT0iNDYuMzYiIHdpZHRoPSI5Ljg0IiBoZWlnaHQ9IjExLjciLz48cmVjdCBjbGFzcz0iY2xzLTIiIHg9IjQ1NC41NiIgeT0iNDYuMzYiIHdpZHRoPSI5Ljg0IiBoZWlnaHQ9IjExLjciLz48cmVjdCBjbGFzcz0iY2xzLTIiIHg9IjQ2NC40IiB5PSI0Ni4zNiIgd2lkdGg9IjkuODQiIGhlaWdodD0iMTEuNyIvPjxyZWN0IGNsYXNzPSJjbHMtMiIgeD0iNDc0LjIzIiB5PSI0Ni4zNiIgd2lkdGg9IjkuODQiIGhlaWdodD0iMTEuNyIvPjxyZWN0IGNsYXNzPSJjbHMtOSIgeD0iNDg0LjA3IiB5PSI0Ni4zNiIgd2lkdGg9IjkuODQiIGhlaWdodD0iMTEuNyIvPjxyZWN0IGNsYXNzPSJjbHMtOSIgeD0iNDkzLjkxIiB5PSI0Ni4zNiIgd2lkdGg9IjkuODQiIGhlaWdodD0iMTEuNyIvPjxyZWN0IGNsYXNzPSJjbHMtOSIgeD0iNTAzLjc0IiB5PSI0Ni4zNiIgd2lkdGg9IjkuODQiIGhlaWdodD0iMTEuNyIvPjxyZWN0IGNsYXNzPSJjbHMtOSIgeD0iNTEzLjU4IiB5PSI0Ni4zNiIgd2lkdGg9IjkuODQiIGhlaWdodD0iMTEuNyIvPjxyZWN0IGNsYXNzPSJjbHMtOSIgeD0iNTIzLjQyIiB5PSI0Ni4zNiIgd2lkdGg9IjkuODQiIGhlaWdodD0iMTEuNyIvPjxyZWN0IGNsYXNzPSJjbHMtOSIgeD0iNTMzLjI1IiB5PSI0Ni4zNiIgd2lkdGg9IjkuODQiIGhlaWdodD0iMTEuNyIvPjxyZWN0IGNsYXNzPSJjbHMtOSIgeD0iNTQzLjA5IiB5PSI0Ni4zNiIgd2lkdGg9IjkuODQiIGhlaWdodD0iMTEuNyIvPjxyZWN0IGNsYXNzPSJjbHMtOSIgeD0iNTUyLjkyIiB5PSI0Ni4zNiIgd2lkdGg9IjkuODQiIGhlaWdodD0iMTEuNyIvPjxyZWN0IGNsYXNzPSJjbHMtMiIgeD0iNTYyLjc2IiB5PSI0Ni4zNiIgd2lkdGg9IjkuODQiIGhlaWdodD0iMTEuNyIvPjxyZWN0IGNsYXNzPSJjbHMtMiIgeD0iNTcyLjYiIHk9IjQ2LjM2IiB3aWR0aD0iOS44NCIgaGVpZ2h0PSIxMS43Ii8+PHJlY3QgY2xhc3M9ImNscy0yIiB4PSI1ODIuNDMiIHk9IjQ2LjM2IiB3aWR0aD0iOS44NCIgaGVpZ2h0PSIxMS43Ii8+PHJlY3QgY2xhc3M9ImNscy0yIiB4PSI1OTIuMjciIHk9IjQ2LjM2IiB3aWR0aD0iOS44NCIgaGVpZ2h0PSIxMS43Ii8+PHJlY3QgY2xhc3M9ImNscy0yIiB4PSI2MDIuMSIgeT0iNDguMjMiIHdpZHRoPSI5Ljg0IiBoZWlnaHQ9IjkuODQiLz48cmVjdCBjbGFzcz0iY2xzLTIiIHg9IjYxMS45NCIgeT0iNDguMjMiIHdpZHRoPSI5Ljg0IiBoZWlnaHQ9IjkuODQiLz48cmVjdCBjbGFzcz0iY2xzLTIiIHg9IjYyMS43OCIgeT0iNDguMjMiIHdpZHRoPSI5Ljg0IiBoZWlnaHQ9IjkuODQiLz48cmVjdCBjbGFzcz0iY2xzLTIiIHg9IjYzMS42MSIgeT0iNDguMjMiIHdpZHRoPSI5Ljg0IiBoZWlnaHQ9IjkuODQiLz48cGF0aCBjbGFzcz0iY2xzLTEwIiBkPSJNOTguOTYsNjQuMjFoMS4zMmwzLjEyLDguNjFoLTEuMjhsLS44Ny0yLjU4aC0zLjRsLS45MywyLjU4aC0xLjJsMy4yNC04LjYxWk0xMDAuODgsNjkuMjlsLTEuMzEtMy44LTEuMzksMy44aDIuN1oiLz48cGF0aCBjbGFzcz0iY2xzLTEwIiBkPSJNMTA0LjYsNjQuMjFoMy45MWMuNjQsMCwxLjE4LjEsMS41OS4yOS43OS4zNywxLjE5LDEuMDQsMS4xOSwyLjAzLDAsLjUyLS4xMS45NC0uMzIsMS4yN3MtLjUxLjU5LS44OS43OWMuMzQuMTQuNTkuMzIuNzYuNTRzLjI2LjU4LjI4LDEuMDhsLjA0LDEuMTVjLjAxLjMzLjA0LjU3LjA4LjczLjA3LjI3LjIuNDUuMzguNTN2LjE5aC0xLjQzYy0uMDQtLjA3LS4wNy0uMTctLjA5LS4yOXMtLjA0LS4zNC0uMDYtLjY4bC0uMDctMS40NGMtLjAzLS41Ni0uMjMtLjk0LS42MS0xLjEzLS4yMi0uMTEtLjU2LS4xNi0xLjAyLS4xNmgtMi41OHYzLjY5aC0xLjE3di04LjYxWk0xMDguMzksNjguMTVjLjUzLDAsLjk1LS4xMSwxLjI2LS4zM3MuNDYtLjYxLjQ2LTEuMThjMC0uNjEtLjIyLTEuMDMtLjY1LTEuMjUtLjIzLS4xMi0uNTQtLjE4LS45My0uMThoLTIuNzd2Mi45NGgyLjYyWiIvPjxwYXRoIGNsYXNzPSJjbHMtMTAiIGQ9Ik0xMTMuMSw2NC4yMWgxLjY3bDIuNDgsNy4yOCwyLjQ2LTcuMjhoMS42NnY4LjYxaC0xLjExdi01LjA4YzAtLjE4LDAtLjQ3LjAxLS44N3MuMDEtLjg0LjAxLTEuMzFsLTIuNDYsNy4yNmgtMS4xNmwtMi40OC03LjI2di4yNmMwLC4yMSwwLC41My4wMi45NnMuMDIuNzUuMDIuOTV2NS4wOGgtMS4xMXYtOC42MVoiLz48cGF0aCBjbGFzcz0iY2xzLTEwIiBkPSJNMTIzLjIxLDY2LjcxYy4yMi0uMDQuMzgtLjE2LjQ5LS4zNnMuMTctLjQ1LjE3LS43MWMwLS4wMywwLS4wNSwwLS4wN3MwLS4wNS0uMDEtLjA3aC0uNjR2LTEuMjhoMS4yNXYxLjE4YzAsLjUtLjEuOTItLjMxLDEuMjdzLS41Mi41NS0uOTQuNnYtLjU1WiIvPjxwYXRoIGNsYXNzPSJjbHMtMTAiIGQ9Ik0xMjYuMDcsNzAuODVjLjAzLjM1LjEyLjYyLjI3LjgxLjI3LjM0Ljc0LjUxLDEuNDEuNTEuNCwwLC43NS0uMDgsMS4wNS0uMjVzLjQ1LS40My40NS0uNzljMC0uMjctLjEyLS40Ny0uMzYtLjYyLS4xNS0uMDktLjQ2LS4xOS0uOTItLjNsLS44NS0uMjFjLS41NC0uMTMtLjk0LS4yOC0xLjItLjQ1LS40Ni0uMjktLjY5LS42OC0uNjktMS4xOCwwLS41OS4yMi0xLjA3LjY1LTEuNDQuNDMtLjM3LDEuMDItLjU1LDEuNzUtLjU1Ljk2LDAsMS42NS4yOCwyLjA3LjgzLjI3LjM1LjM5LjczLjM5LDEuMTRoLTFjLS4wMi0uMjQtLjExLS40NS0uMjYtLjY1LS4yNS0uMjgtLjY4LS40MS0xLjI5LS40MS0uNDEsMC0uNzIuMDgtLjkzLjIzcy0uMzEuMzUtLjMxLjZjMCwuMjcuMTQuNDkuNDEuNjUuMTYuMS4zOS4xOC43LjI2bC43MS4xN2MuNzcuMTgsMS4yOS4zNiwxLjU1LjUzLjQxLjI3LjYyLjY5LjYyLDEuMjdzLS4yMSwxLjA0LS42NCwxLjQ1Yy0uNDMuNDEtMS4wOC42MS0xLjk2LjYxLS45NCwwLTEuNjEtLjIxLTIuMDEtLjY0cy0uNi0uOTUtLjYzLTEuNTdoMS4wMVoiLz48cGF0aCBjbGFzcz0iY2xzLTEwIiBkPSJNMTM0Ljk5LDY0Ljc5aDEuMDd2MS43NWgxdi44NmgtMXY0LjFjMCwuMjIuMDcuMzcuMjIuNDQuMDguMDQuMjIuMDYuNDEuMDYuMDUsMCwuMTEsMCwuMTYsMHMuMTMsMCwuMjEtLjAydi44NGMtLjEyLjA0LS4yNS4wNi0uMzguMDhzLS4yNy4wMi0uNDIuMDJjLS40OSwwLS44My0uMTMtMS0uMzhzLS4yNi0uNTgtLjI2LS45OHYtNC4xNWgtLjg1di0uODZoLjg1di0xLjc1WiIvPjxwYXRoIGNsYXNzPSJjbHMtMTAiIGQ9Ik0xNDIuNjYsNjcuMTdjLjU1LjU0LjgzLDEuMzMuODMsMi4zOHMtLjI0LDEuODUtLjczLDIuNTFjLS40OS42Ni0xLjI1Ljk5LTIuMjcuOTktLjg2LDAtMS41NC0uMjktMi4wNC0uODhzLS43Ni0xLjM3LS43Ni0yLjM1YzAtMS4wNS4yNy0xLjg5LjgtMi41Mi41My0uNjIsMS4yNS0uOTQsMi4xNC0uOTQuOCwwLDEuNDguMjcsMi4wNC44MVpNMTQyLDcxLjM0Yy4yNi0uNTMuMzktMS4xMi4zOS0xLjc2LDAtLjU4LS4wOS0xLjA2LS4yOC0xLjQzLS4yOS0uNTgtLjgtLjg3LTEuNTItLjg3LS42NCwwLTEuMS4yNS0xLjM5Ljc0cy0uNDMsMS4wOC0uNDMsMS43OC4xNSwxLjIyLjQzLDEuNjcuNzUuNjcsMS4zOC42N2MuNjksMCwxLjE3LS4yNiwxLjQyLS43OVoiLz48cGF0aCBjbGFzcz0iY2xzLTEwIiBkPSJNMTQ0LjY5LDY2LjU3aDEuMDN2LjgzYy4yMS0uMjkuNDQtLjUxLjY5LS42Ni4zNi0uMjMuNzgtLjM1LDEuMjYtLjM1LjcxLDAsMS4zMi4yNywxLjgyLjgycy43NSwxLjMyLjc1LDIuMzNjMCwxLjM3LS4zNiwyLjM0LTEuMDgsMi45My0uNDUuMzctLjk4LjU2LTEuNTkuNTYtLjQ3LDAtLjg3LS4xLTEuMTktLjMxLS4xOS0uMTItLjQtLjMyLS42My0uNnYzLjIxaC0xLjA1di04Ljc1Wk0xNDguNjYsNzEuNDljLjMzLS40MS40OS0xLjAzLjQ5LTEuODUsMC0uNS0uMDctLjkzLS4yMi0xLjI5LS4yNy0uNjktLjc4LTEuMDQtMS41LTEuMDRzLTEuMjMuMzctMS41LDEuMWMtLjE1LjM5LS4yMi44OS0uMjIsMS40OSwwLC40OC4wNy45LjIyLDEuMjQuMjcuNjUuNzguOTcsMS41Ljk3LjQ5LDAsLjktLjIxLDEuMjMtLjYyWiIvPjxwYXRoIGNsYXNzPSJjbHMtMTAiIGQ9Ik0xNTQuNyw2NC4xOGgxLjAzdjMuMTJjLjIzLS4zLjUxLS41My44My0uNjkuMzItLjE2LjY3LS4yNCwxLjA1LS4yNC43OCwwLDEuNDIuMjcsMS45MS44MXMuNzMsMS4zMy43MywyLjM4YzAsLjk5LS4yNCwxLjgyLS43MiwyLjQ3cy0xLjE1Ljk4LTIuMDEuOThjLS40OCwwLS44OC0uMTItMS4yMS0uMzUtLjItLjE0LS40MS0uMzYtLjYzLS42NnYuOGgtLjk3di04LjY0Wk0xNTguNzMsNzEuNGMuMjgtLjQ1LjQzLTEuMDUuNDMtMS43OSwwLS42Ni0uMTQtMS4yMS0uNDMtMS42NHMtLjctLjY1LTEuMjYtLjY1Yy0uNDgsMC0uOS4xOC0xLjI3LjUzLS4zNi4zNi0uNTQuOTQtLjU0LDEuNzYsMCwuNTkuMDcsMS4wNy4yMiwxLjQ0LjI4LjY5LjgsMS4wNCwxLjU2LDEuMDQuNTcsMCwxLS4yMywxLjI4LS42OFoiLz48cGF0aCBjbGFzcz0iY2xzLTEwIiBkPSJNMTY1LjM5LDY2LjU0aDEuMTdjLS4xNS40LS40OCwxLjMyLS45OSwyLjc2LS4zOCwxLjA4LS43LDEuOTYtLjk2LDIuNjQtLjYxLDEuNi0xLjA0LDIuNTgtMS4yOSwyLjkzLS4yNS4zNS0uNjguNTMtMS4yOS41My0uMTUsMC0uMjYsMC0uMzQtLjAyLS4wOC0uMDEtLjE4LS4wMy0uMy0uMDZ2LS45NmMuMTguMDUuMzIuMDguNC4wOS4wOC4wMS4xNS4wMi4yMi4wMi4xOSwwLC4zNC0uMDMuNDMtLjEuMDktLjA2LjE3LS4xNC4yMy0uMjQuMDItLjAzLjA5LS4xOS4yMS0uNDguMTItLjI5LjIxLS41LjI2LS42NGwtMi4zMi02LjQ2aDEuMmwxLjY4LDUuMTEsMS42OS01LjExWiIvPjxwYXRoIGNsYXNzPSJjbHMtMTAiIGQ9Ik0xNjcuNjcsNjQuNzloMS4wN3YxLjc1aDF2Ljg2aC0xdjQuMWMwLC4yMi4wNy4zNy4yMi40NC4wOC4wNC4yMi4wNi40MS4wNi4wNSwwLC4xMSwwLC4xNiwwcy4xMywwLC4yMS0uMDJ2Ljg0Yy0uMTIuMDQtLjI1LjA2LS4zOC4wOHMtLjI3LjAyLS40Mi4wMmMtLjQ5LDAtLjgzLS4xMy0xLS4zOHMtLjI2LS41OC0uMjYtLjk4di00LjE1aC0uODV2LS44NmguODV2LTEuNzVaIi8+PHBhdGggY2xhc3M9ImNscy0xMCIgZD0iTTE3NC42Nyw2Ni43MWMuNDIuMjEuNzMuNDguOTUuODEuMjEuMzIuMzUuNjkuNDIsMS4xMS4wNi4yOS4wOS43NS4wOSwxLjM4aC00LjU2Yy4wMi42NC4xNywxLjE1LjQ1LDEuNTQuMjguMzkuNzEuNTgsMS4zLjU4LjU1LDAsLjk4LS4xOCwxLjMxLS41NS4xOC0uMjEuMzEtLjQ2LjM5LS43NGgxLjA0Yy0uMDMuMjMtLjEyLjQ5LS4yNy43N3MtLjMzLjUxLS41Mi42OWMtLjMyLjMxLS43MS41Mi0xLjE4LjYzLS4yNS4wNi0uNTQuMDktLjg1LjA5LS43OCwwLTEuNDMtLjI4LTEuOTctLjg1LS41NC0uNTctLjgxLTEuMzYtLjgxLTIuMzlzLjI3LTEuODMuODItMi40NmMuNTQtLjYzLDEuMjUtLjk0LDIuMTMtLjk0LjQ0LDAsLjg3LjEsMS4yOS4zMVpNMTc1LjA1LDY5LjE4Yy0uMDQtLjQ2LS4xNC0uODItLjMtMS4xLS4yOS0uNTEtLjc3LS43Ni0xLjQ0LS43Ni0uNDgsMC0uODguMTctMS4yMS41MnMtLjUuNzktLjUyLDEuMzNoMy40NloiLz48cGF0aCBjbGFzcz0iY2xzLTEwIiBkPSJNMTgwLjgxLDY0LjIxaDEuMDd2MS4yaC0xLjA3di0xLjJaTTE4MC44MSw2Ni41N2gxLjA3djYuMjVoLTEuMDd2LTYuMjVaIi8+PHBhdGggY2xhc3M9ImNscy0xMCIgZD0iTTE4Ni45Niw2Ni43OWMuMi4xNC40LjM0LjYxLjZ2LS43OWguOTd2NS43MWMwLC44LS4xMiwxLjQzLS4zNSwxLjg5LS40NC44NS0xLjI2LDEuMjgtMi40NywxLjI4LS42NywwLTEuMjQtLjE1LTEuNy0uNDVzLS43Mi0uNzgtLjc3LTEuNDJoMS4wN2MuMDUuMjguMTUuNS4zLjY1LjI0LjIzLjYxLjM1LDEuMTIuMzUuOCwwLDEuMzMtLjI5LDEuNTgtLjg2LjE1LS4zNC4yMi0uOTQuMi0xLjgtLjIxLjMyLS40Ni41Ni0uNzYuNzEtLjMuMTYtLjY5LjIzLTEuMTcuMjMtLjY4LDAtMS4yNy0uMjQtMS43OC0uNzJzLS43Ni0xLjI4LS43Ni0yLjM5YzAtMS4wNS4yNi0xLjg3Ljc3LTIuNDZzMS4xMy0uODgsMS44NS0uODhjLjQ5LDAsLjkyLjEyLDEuMjguMzZaTTE4Ny4wOSw2Ny45MmMtLjMyLS4zOC0uNzItLjU2LTEuMjItLjU2LS43NCwwLTEuMjQuMzUtMS41MiwxLjA0LS4xNC4zNy0uMjIuODYtLjIyLDEuNDYsMCwuNzEuMTQsMS4yNS40MywxLjYxLjI5LjM3LjY3LjU1LDEuMTUuNTUuNzUsMCwxLjI4LS4zNCwxLjU5LTEuMDMuMTctLjM5LjI2LS44NC4yNi0xLjM1LDAtLjc4LS4xNi0xLjM1LS40OC0xLjczWiIvPjxwYXRoIGNsYXNzPSJjbHMtMTAiIGQ9Ik0xOTAuMTUsNjYuNTRoMXYuODljLjMtLjM3LjYxLS42My45NC0uNzlzLjctLjI0LDEuMTEtLjI0Yy44OSwwLDEuNDkuMzEsMS44LjkzLjE3LjM0LjI2LjgzLjI2LDEuNDZ2NC4wM2gtMS4wN3YtMy45NmMwLS4zOC0uMDYtLjY5LS4xNy0uOTMtLjE5LS4zOS0uNTMtLjU5LTEuMDItLjU5LS4yNSwwLS40Ni4wMy0uNjIuMDgtLjI5LjA5LS41NC4yNi0uNzYuNTItLjE4LjIxLS4yOS40Mi0uMzQuNjRzLS4wOC41NC0uMDguOTV2My4yOWgtMS4wNXYtNi4yOFoiLz48cGF0aCBjbGFzcz0iY2xzLTEwIiBkPSJNMjAxLjM3LDY3LjE3Yy41NS41NC44MywxLjMzLjgzLDIuMzhzLS4yNCwxLjg1LS43MywyLjUxYy0uNDkuNjYtMS4yNS45OS0yLjI3Ljk5LS44NiwwLTEuNTQtLjI5LTIuMDQtLjg4cy0uNzYtMS4zNy0uNzYtMi4zNWMwLTEuMDUuMjctMS44OS44LTIuNTIuNTMtLjYyLDEuMjUtLjk0LDIuMTQtLjk0LjgsMCwxLjQ4LjI3LDIuMDQuODFaTTIwMC43MSw3MS4zNGMuMjYtLjUzLjM5LTEuMTIuMzktMS43NiwwLS41OC0uMDktMS4wNi0uMjgtMS40My0uMjktLjU4LS44LS44Ny0xLjUyLS44Ny0uNjQsMC0xLjEuMjUtMS4zOS43NHMtLjQzLDEuMDgtLjQzLDEuNzguMTUsMS4yMi40MywxLjY3Ljc1LjY3LDEuMzguNjdjLjY5LDAsMS4xNy0uMjYsMS40Mi0uNzlaIi8+PHBhdGggY2xhc3M9ImNscy0xMCIgZD0iTTIwMy41Miw2Ni41NGgxdjEuMDhjLjA4LS4yMS4yOC0uNDcuNi0uNzdzLjY5LS40NSwxLjExLS40NWMuMDIsMCwuMDUsMCwuMSwwcy4xMy4wMS4yNC4wMnYxLjExYy0uMDYtLjAxLS4xMi0uMDItLjE3LS4wMnMtLjExLDAtLjE3LDBjLS41MywwLS45NC4xNy0xLjIyLjUxcy0uNDMuNzQtLjQzLDEuMTh2My42MWgtMS4wNXYtNi4yOFoiLz48cGF0aCBjbGFzcz0iY2xzLTEwIiBkPSJNMjExLjM3LDY2LjcxYy40Mi4yMS43My40OC45NS44MS4yMS4zMi4zNS42OS40MiwxLjExLjA2LjI5LjA5Ljc1LjA5LDEuMzhoLTQuNTZjLjAyLjY0LjE3LDEuMTUuNDUsMS41NC4yOC4zOS43MS41OCwxLjMuNTguNTUsMCwuOTgtLjE4LDEuMzEtLjU1LjE4LS4yMS4zMS0uNDYuMzktLjc0aDEuMDRjLS4wMy4yMy0uMTIuNDktLjI3Ljc3cy0uMzMuNTEtLjUyLjY5Yy0uMzIuMzEtLjcxLjUyLTEuMTguNjMtLjI1LjA2LS41NC4wOS0uODUuMDktLjc4LDAtMS40My0uMjgtMS45Ny0uODUtLjU0LS41Ny0uODEtMS4zNi0uODEtMi4zOXMuMjctMS44My44Mi0yLjQ2Yy41NC0uNjMsMS4yNS0uOTQsMi4xMy0uOTQuNDQsMCwuODcuMSwxLjI5LjMxWk0yMTEuNzQsNjkuMThjLS4wNC0uNDYtLjE0LS44Mi0uMy0xLjEtLjI5LS41MS0uNzctLjc2LTEuNDQtLjc2LS40OCwwLS44OC4xNy0xLjIxLjUycy0uNS43OS0uNTIsMS4zM2gzLjQ2WiIvPjxyZWN0IGNsYXNzPSJjbHMtNCIgeD0iNjExLjk0IiB5PSI3Ny43MyIgd2lkdGg9IjkuODQiIGhlaWdodD0iOS44NCIvPjxyZWN0IGNsYXNzPSJjbHMtNCIgeD0iNjIxLjc4IiB5PSI3Ny43MyIgd2lkdGg9IjkuODQiIGhlaWdodD0iOS44NCIvPjxyZWN0IGNsYXNzPSJjbHMtNCIgeD0iNjMxLjYxIiB5PSI3Ny43MyIgd2lkdGg9IjkuODQiIGhlaWdodD0iOS44NCIvPjxyZWN0IGNsYXNzPSJjbHMtNCIgeD0iNjIxLjc4IiB5PSI5Mi40OSIgd2lkdGg9IjkuODQiIGhlaWdodD0iOS44NCIvPjxyZWN0IGNsYXNzPSJjbHMtNCIgeD0iNjMxLjYxIiB5PSI5Mi40OSIgd2lkdGg9IjkuODQiIGhlaWdodD0iOS44NCIvPjxyZWN0IGNsYXNzPSJjbHMtNCIgeD0iNjMxLjYxIiB5PSIxMDcuMjQiIHdpZHRoPSI5Ljg0IiBoZWlnaHQ9IjkuODQiLz48cGF0aCBjbGFzcz0iY2xzLTEwIiBkPSJNNTQ1Ljc4LDIzLjA3aDEuMDV2OC42MWgtMS4wNXYtOC42MVoiLz48cGF0aCBjbGFzcz0iY2xzLTEwIiBkPSJNNTUyLjk2LDI2LjAzYy41NS41NC44MywxLjMzLjgzLDIuMzhzLS4yNCwxLjg1LS43MywyLjUxYy0uNDkuNjYtMS4yNS45OS0yLjI3Ljk5LS44NiwwLTEuNTQtLjI5LTIuMDQtLjg4LS41LS41OC0uNzYtMS4zNy0uNzYtMi4zNSwwLTEuMDUuMjctMS44OS44LTIuNTIuNTMtLjYyLDEuMjUtLjk0LDIuMTQtLjk0LjgsMCwxLjQ4LjI3LDIuMDQuODFaTTU1Mi4zLDMwLjJjLjI2LS41My4zOS0xLjEyLjM5LTEuNzYsMC0uNTgtLjA5LTEuMDYtLjI4LTEuNDMtLjI5LS41OC0uOC0uODctMS41Mi0uODctLjY0LDAtMS4xLjI1LTEuMzkuNzRzLS40MywxLjA4LS40MywxLjc4LjE0LDEuMjIuNDMsMS42Ny43NS42NywxLjM4LjY3Yy42OSwwLDEuMTctLjI2LDEuNDItLjc5WiIvPjxwYXRoIGNsYXNzPSJjbHMtMTAiIGQ9Ik01NTUuNTgsMjUuNGwxLjIxLDQuOTUsMS4yMi00Ljk1aDEuMThsMS4yMyw0LjkyLDEuMjgtNC45MmgxLjA1bC0xLjgyLDYuMjhoLTEuMWwtMS4yOC00Ljg2LTEuMjQsNC44NmgtMS4xbC0xLjgxLTYuMjhoMS4xNVoiLz48cGF0aCBjbGFzcz0iY2xzLTEwIiBkPSJNNTY3LDIzLjA0aDEuMDN2My4xMmMuMjMtLjMuNTEtLjUzLjgzLS42OS4zMi0uMTYuNjctLjI0LDEuMDUtLjI0Ljc4LDAsMS40Mi4yNywxLjkxLjgxcy43MywxLjMzLjczLDIuMzhjMCwuOTktLjI0LDEuODItLjcyLDIuNDdzLTEuMTUuOTgtMi4wMS45OGMtLjQ4LDAtLjg4LS4xMi0xLjIxLS4zNS0uMi0uMTQtLjQxLS4zNi0uNjMtLjY2di44aC0uOTd2LTguNjRaTTU3MS4wMywzMC4yN2MuMjgtLjQ1LjQzLTEuMDUuNDMtMS43OSwwLS42Ni0uMTQtMS4yMS0uNDMtMS42NC0uMjktLjQzLS43LS42NS0xLjI2LS42NS0uNDgsMC0uOS4xOC0xLjI3LjUzcy0uNTQuOTQtLjU0LDEuNzZjMCwuNTkuMDcsMS4wNy4yMiwxLjQ0LjI4LjY5LjgsMS4wNCwxLjU2LDEuMDQuNTcsMCwxLS4yMywxLjI5LS42OFoiLz48cGF0aCBjbGFzcz0iY2xzLTEwIiBkPSJNNTczLjc2LDIzLjA3aDEuMDd2MS4yaC0xLjA3di0xLjJaTTU3My43NiwyNS40M2gxLjA3djYuMjVoLTEuMDd2LTYuMjVaIi8+PHBhdGggY2xhc3M9ImNscy0xMCIgZD0iTTU3Ni42NCwyMy42NWgxLjA3djEuNzVoMXYuODZoLTF2NC4xYzAsLjIyLjA3LjM3LjIyLjQ0LjA4LjA0LjIyLjA2LjQxLjA2LjA1LDAsLjExLDAsLjE2LDBzLjEzLDAsLjIxLS4wMnYuODRjLS4xMi4wNC0uMjUuMDYtLjM4LjA4cy0uMjcuMDItLjQyLjAyYy0uNDksMC0uODMtLjEzLTEtLjM4cy0uMjYtLjU4LS4yNi0uOTh2LTQuMTVoLS44NXYtLjg2aC44NXYtMS43NVoiLz48cGF0aCBjbGFzcz0iY2xzLTEwIiBkPSJNNTgwLjM5LDI5LjcxYy4wMy4zNS4xMi42Mi4yNy44MS4yNy4zNC43NC41MSwxLjQxLjUxLjQsMCwuNzUtLjA4LDEuMDUtLjI1LjMtLjE3LjQ1LS40My40NS0uNzksMC0uMjctLjEyLS40Ny0uMzYtLjYyLS4xNi0uMDktLjQ2LS4xOS0uOTItLjNsLS44NS0uMjFjLS41NC0uMTMtLjk0LS4yOC0xLjItLjQ1LS40Ni0uMjktLjY5LS42OC0uNjktMS4xOCwwLS41OS4yMi0xLjA3LjY1LTEuNDRzMS4wMi0uNTUsMS43NS0uNTVjLjk2LDAsMS42NS4yOCwyLjA3LjgzLjI2LjM1LjM5LjczLjM5LDEuMTRoLTFjLS4wMi0uMjQtLjExLS40NS0uMjYtLjY1LS4yNS0uMjgtLjY4LS40MS0xLjI5LS40MS0uNDEsMC0uNzIuMDgtLjkzLjIzcy0uMzEuMzUtLjMxLjZjMCwuMjcuMTQuNDkuNDEuNjUuMTYuMS4zOS4xOC43LjI2bC43MS4xN2MuNzcuMTgsMS4yOS4zNiwxLjU1LjUzLjQxLjI3LjYyLjY5LjYyLDEuMjdzLS4yMSwxLjA0LS42NCwxLjQ1Yy0uNDMuNDEtMS4wOC42MS0xLjk2LjYxLS45NSwwLTEuNjEtLjIxLTIuMDEtLjY0cy0uNi0uOTUtLjYzLTEuNTdoMS4wMVoiLz48bGluZSBjbGFzcz0iY2xzLTEiIHgxPSI0ODQuMDciIHkxPSIzNi42NSIgeDI9IjYzNS40OCIgeTI9IjM2LjY1Ii8+PHBvbHlnb24gY2xhc3M9ImNscy0xMCIgcG9pbnRzPSI2MzIuNjcgNDAuMzUgNjM0LjI0IDM2LjY1IDYzMi42NyAzMi45NCA2NDEuNDUgMzYuNjUgNjMyLjY3IDQwLjM1Ii8+PHJlY3QgY2xhc3M9ImNscy00IiB4PSI2MTEuOTQiIHk9IjYyLjk4IiB3aWR0aD0iOS44NCIgaGVpZ2h0PSI5Ljg0Ii8+PHJlY3QgY2xhc3M9ImNscy00IiB4PSI2MjEuNzgiIHk9IjYyLjk4IiB3aWR0aD0iOS44NCIgaGVpZ2h0PSI5Ljg0Ii8+PHJlY3QgY2xhc3M9ImNscy00IiB4PSI2MzEuNjEiIHk9IjYyLjk4IiB3aWR0aD0iOS44NCIgaGVpZ2h0PSI5Ljg0Ii8+PHJlY3QgY2xhc3M9ImNscy00IiB4PSI2MDIuMSIgeT0iNjIuOTgiIHdpZHRoPSI5Ljg0IiBoZWlnaHQ9IjkuODQiLz48cGF0aCBjbGFzcz0iY2xzLTEwIiBkPSJNNjQ4LjQ5LDY4LjY1aDEuMDN2My4xMmMuMjMtLjMuNTEtLjUzLjgzLS42OS4zMi0uMTYuNjctLjI0LDEuMDUtLjI0Ljc4LDAsMS40Mi4yNywxLjkxLjgxcy43MywxLjMzLjczLDIuMzhjMCwuOTktLjI0LDEuODItLjcyLDIuNDdzLTEuMTUuOTgtMi4wMS45OGMtLjQ4LDAtLjg4LS4xMi0xLjIxLS4zNS0uMi0uMTQtLjQxLS4zNi0uNjMtLjY2di44aC0uOTd2LTguNjRaTTY1Mi41Miw3NS44N2MuMjgtLjQ1LjQzLTEuMDUuNDMtMS43OSwwLS42Ni0uMTQtMS4yMS0uNDMtMS42NC0uMjktLjQzLS43LS42NS0xLjI2LS42NS0uNDgsMC0uOS4xOC0xLjI3LjUzcy0uNTQuOTQtLjU0LDEuNzZjMCwuNTkuMDcsMS4wNy4yMiwxLjQ0LjI4LjY5LjgsMS4wNCwxLjU2LDEuMDQuNTcsMCwxLS4yMywxLjI5LS42OFoiLz48cGF0aCBjbGFzcz0iY2xzLTEwIiBkPSJNNjU1LjI1LDY4LjY4aDEuMDd2MS4yaC0xLjA3di0xLjJaTTY1NS4yNSw3MS4wNGgxLjA3djYuMjVoLTEuMDd2LTYuMjVaIi8+PHBhdGggY2xhc3M9ImNscy0xMCIgZD0iTTY1OC4xMyw2OS4yNmgxLjA3djEuNzVoMXYuODZoLTF2NC4xYzAsLjIyLjA3LjM3LjIyLjQ0LjA4LjA0LjIyLjA2LjQxLjA2LjA1LDAsLjExLDAsLjE2LDBzLjEzLDAsLjIxLS4wMnYuODRjLS4xMi4wNC0uMjUuMDYtLjM4LjA4cy0uMjcuMDItLjQyLjAyYy0uNDksMC0uODMtLjEzLTEtLjM4cy0uMjYtLjU4LS4yNi0uOTh2LTQuMTVoLS44NXYtLjg2aC44NXYtMS43NVoiLz48cGF0aCBjbGFzcz0iY2xzLTEwIiBkPSJNNjYxLjg4LDc1LjMyYy4wMy4zNS4xMi42Mi4yNy44MS4yNy4zNC43NC41MSwxLjQxLjUxLjQsMCwuNzUtLjA4LDEuMDUtLjI1LjMtLjE3LjQ1LS40My40NS0uNzksMC0uMjctLjEyLS40Ny0uMzYtLjYyLS4xNi0uMDktLjQ2LS4xOS0uOTItLjNsLS44NS0uMjFjLS41NC0uMTMtLjk0LS4yOC0xLjItLjQ1LS40Ni0uMjktLjY5LS42OC0uNjktMS4xOCwwLS41OS4yMi0xLjA3LjY1LTEuNDRzMS4wMi0uNTUsMS43NS0uNTVjLjk2LDAsMS42NS4yOCwyLjA3LjgzLjI2LjM1LjM5LjczLjM5LDEuMTRoLTFjLS4wMi0uMjQtLjExLS40NS0uMjYtLjY1LS4yNS0uMjgtLjY4LS40MS0xLjI5LS40MS0uNDEsMC0uNzIuMDgtLjkzLjIzcy0uMzEuMzUtLjMxLjZjMCwuMjcuMTQuNDkuNDEuNjUuMTYuMS4zOS4xOC43LjI2bC43MS4xN2MuNzcuMTgsMS4yOS4zNiwxLjU1LjUzLjQxLjI3LjYyLjY5LjYyLDEuMjdzLS4yMSwxLjA0LS42NCwxLjQ1Yy0uNDMuNDEtMS4wOC42MS0xLjk2LjYxLS45NSwwLTEuNjEtLjIxLTIuMDEtLjY0cy0uNi0uOTUtLjYzLTEuNTdoMS4wMVoiLz48cGF0aCBjbGFzcz0iY2xzLTEwIiBkPSJNNjcxLjA3LDcxLjAxbDEuMjEsNC45NSwxLjIyLTQuOTVoMS4xOGwxLjIzLDQuOTIsMS4yOC00LjkyaDEuMDVsLTEuODIsNi4yOGgtMS4xbC0xLjI4LTQuODYtMS4yNCw0Ljg2aC0xLjFsLTEuODEtNi4yOGgxLjE1WiIvPjxwYXRoIGNsYXNzPSJjbHMtMTAiIGQ9Ik02NzkuMjUsNjguNjhoMS4wN3YxLjJoLTEuMDd2LTEuMlpNNjc5LjI1LDcxLjA0aDEuMDd2Ni4yNWgtMS4wN3YtNi4yNVoiLz48cGF0aCBjbGFzcz0iY2xzLTEwIiBkPSJNNjgyLjEzLDY5LjI2aDEuMDd2MS43NWgxdi44NmgtMXY0LjFjMCwuMjIuMDcuMzcuMjIuNDQuMDguMDQuMjIuMDYuNDEuMDYuMDUsMCwuMTEsMCwuMTYsMHMuMTMsMCwuMjEtLjAydi44NGMtLjEyLjA0LS4yNS4wNi0uMzguMDhzLS4yNy4wMi0uNDIuMDJjLS40OSwwLS44My0uMTMtMS0uMzhzLS4yNi0uNTgtLjI2LS45OHYtNC4xNWgtLjg1di0uODZoLjg1di0xLjc1WiIvPjxwYXRoIGNsYXNzPSJjbHMtMTAiIGQ9Ik02ODUuMjUsNjguNjVoMS4wNXYzLjIxYy4yNS0uMzIuNDctLjU0LjY3LS42Ny4zNC0uMjIuNzYtLjMzLDEuMjctLjMzLjkxLDAsMS41My4zMiwxLjg1Ljk2LjE4LjM1LjI2LjgzLjI2LDEuNDV2NC4wM2gtMS4wOHYtMy45NmMwLS40Ni0uMDYtLjgtLjE4LTEuMDEtLjE5LS4zNC0uNTUtLjUyLTEuMDgtLjUyLS40NCwwLS44My4xNS0xLjE5LjQ1cy0uNTMuODctLjUzLDEuNzF2My4zM2gtMS4wNXYtOC42NFoiLz48cGF0aCBjbGFzcz0iY2xzLTEwIiBkPSJNNjQ4LjExLDkwLjg1bDMuNzMtNC41aC0zLjQ1di0uOTRoNC44N3YuODZsLTMuNyw0LjQ3aDMuODF2Ljk0aC01LjI2di0uODNaIi8+PHBhdGggY2xhc3M9ImNscy0xMCIgZD0iTTY1OC40NSw4NS41OGMuNDIuMjEuNzMuNDguOTUuODEuMjEuMzIuMzUuNjkuNDIsMS4xMS4wNi4yOS4wOS43NS4wOSwxLjM4aC00LjU2Yy4wMi42NC4xNywxLjE1LjQ1LDEuNTQuMjguMzkuNzEuNTgsMS4zLjU4LjU1LDAsLjk4LS4xOCwxLjMxLS41NS4xOC0uMjEuMzEtLjQ2LjM5LS43NGgxLjA0Yy0uMDMuMjMtLjEyLjQ5LS4yNy43N3MtLjMzLjUxLS41Mi42OWMtLjMyLjMxLS43MS41Mi0xLjE4LjYzLS4yNS4wNi0uNTQuMDktLjg1LjA5LS43OCwwLTEuNDMtLjI4LTEuOTctLjg1LS41NC0uNTctLjgxLTEuMzYtLjgxLTIuMzlzLjI3LTEuODMuODItMi40NmMuNTQtLjYzLDEuMjUtLjk0LDIuMTMtLjk0LjQ0LDAsLjg3LjEsMS4yOS4zMVpNNjU4LjgzLDg4LjA1Yy0uMDQtLjQ2LS4xNC0uODItLjMtMS4xLS4yOS0uNTEtLjc3LS43Ni0xLjQ0LS43Ni0uNDgsMC0uODguMTctMS4yMS41Mi0uMzMuMzUtLjUuNzktLjUyLDEuMzNoMy40NloiLz48cGF0aCBjbGFzcz0iY2xzLTEwIiBkPSJNNjYxLjI4LDg1LjQxaDF2MS4wOGMuMDgtLjIxLjI4LS40Ny42LS43N3MuNjktLjQ1LDEuMTEtLjQ1Yy4wMiwwLC4wNSwwLC4xLDBzLjEzLjAxLjI0LjAydjEuMTFjLS4wNi0uMDEtLjEyLS4wMi0uMTctLjAycy0uMTEsMC0uMTcsMGMtLjUzLDAtLjk0LjE3LTEuMjIuNTFzLS40My43NC0uNDMsMS4xOHYzLjYxaC0xLjA1di02LjI4WiIvPjxwYXRoIGNsYXNzPSJjbHMtMTAiIGQ9Ik02NjkuNzksODYuMDRjLjU1LjU0LjgzLDEuMzMuODMsMi4zOHMtLjI0LDEuODUtLjczLDIuNTFjLS40OS42Ni0xLjI1Ljk5LTIuMjcuOTktLjg2LDAtMS41NC0uMjktMi4wNC0uODgtLjUtLjU4LS43Ni0xLjM3LS43Ni0yLjM1LDAtMS4wNS4yNy0xLjg5LjgtMi41Mi41My0uNjIsMS4yNS0uOTQsMi4xNC0uOTQuOCwwLDEuNDguMjcsMi4wNC44MVpNNjY5LjE0LDkwLjIxYy4yNi0uNTMuMzktMS4xMi4zOS0xLjc2LDAtLjU4LS4wOS0xLjA2LS4yOC0xLjQzLS4yOS0uNTgtLjgtLjg3LTEuNTItLjg3LS42NCwwLTEuMS4yNS0xLjM5Ljc0cy0uNDMsMS4wOC0uNDMsMS43OC4xNCwxLjIyLjQzLDEuNjcuNzUuNjcsMS4zOC42N2MuNjksMCwxLjE3LS4yNiwxLjQyLS43OVoiLz48cGF0aCBjbGFzcz0iY2xzLTEwIiBkPSJNNjcyLjU1LDg5LjcyYy4wMy4zNS4xMi42Mi4yNy44MS4yNy4zNC43NC41MSwxLjQxLjUxLjQsMCwuNzUtLjA4LDEuMDUtLjI1LjMtLjE3LjQ1LS40My40NS0uNzksMC0uMjctLjEyLS40Ny0uMzYtLjYyLS4xNi0uMDktLjQ2LS4xOS0uOTItLjNsLS44NS0uMjFjLS41NC0uMTMtLjk0LS4yOC0xLjItLjQ1LS40Ni0uMjktLjY5LS42OC0uNjktMS4xOCwwLS41OS4yMi0xLjA3LjY1LTEuNDRzMS4wMi0uNTUsMS43NS0uNTVjLjk2LDAsMS42NS4yOCwyLjA3LjgzLjI2LjM1LjM5LjczLjM5LDEuMTRoLTFjLS4wMi0uMjQtLjExLS40NS0uMjYtLjY1LS4yNS0uMjgtLjY4LS40MS0xLjI5LS40MS0uNDEsMC0uNzIuMDgtLjkzLjIzcy0uMzEuMzUtLjMxLjZjMCwuMjcuMTQuNDkuNDEuNjUuMTYuMS4zOS4xOC43LjI2bC43MS4xN2MuNzcuMTgsMS4yOS4zNiwxLjU1LjUzLjQxLjI3LjYyLjY5LjYyLDEuMjdzLS4yMSwxLjA0LS42NCwxLjQ1Yy0uNDMuNDEtMS4wOC42MS0xLjk2LjYxLS45NSwwLTEuNjEtLjIxLTIuMDEtLjY0cy0uNi0uOTUtLjYzLTEuNTdoMS4wMVoiLz48cGF0aCBjbGFzcz0iY2xzLTEwIiBkPSJNNjg0LjcsODUuNmMuMTkuMTIuNC4zMi42NC42MnYtMy4xN2gxLjAxdjguNjRoLS45NXYtLjg3Yy0uMjUuMzktLjU0LjY3LS44Ny44NC0uMzMuMTctLjcyLjI2LTEuMTUuMjYtLjcsMC0xLjMtLjI5LTEuODEtLjg4cy0uNzYtMS4zNy0uNzYtMi4zNWMwLS45MS4yMy0xLjcxLjctMi4zOHMxLjEzLTEsMS45OS0xYy40OCwwLC44OC4xLDEuMi4zWk02ODIuMzUsOTAuMzFjLjI4LjQ1Ljc0LjY4LDEuMzYuNjguNDksMCwuODgtLjIxLDEuMi0uNjMuMzEtLjQyLjQ3LTEuMDIuNDctMS44MXMtLjE2LTEuMzgtLjQ4LTEuNzZjLS4zMi0uMzgtLjcyLS41Ny0xLjItLjU3LS41MywwLS45Ni4yLTEuMjkuNjEtLjMzLjQxLS40OSwxLS40OSwxLjc5LDAsLjY3LjE0LDEuMjMuNDMsMS42OVoiLz48cGF0aCBjbGFzcz0iY2xzLTEwIiBkPSJNNjg4Ljk4LDg1LjQxdjQuMTdjMCwuMzIuMDUuNTguMTUuNzkuMTguMzguNTIuNTYsMS4wMi41Ni43MSwwLDEuMi0uMzMsMS40Ni0uOTguMTQtLjM1LjIxLS44My4yMS0xLjQ1di0zLjA4aDEuMDV2Ni4yOGgtMXYtLjkzYy0uMTIuMjQtLjI5LjQ0LS40OS42LS40LjMzLS44Ny40OS0xLjQ0LjQ5LS44OCwwLTEuNDgtLjMtMS43OS0uOS0uMTctLjMyLS4yNi0uNzUtLjI2LTEuMjh2LTQuMjdoMS4wOFoiLz48cGF0aCBjbGFzcz0iY2xzLTEwIiBkPSJNNjk4LjQ4LDg1LjU4Yy40Mi4yMS43My40OC45NS44MS4yMS4zMi4zNS42OS40MiwxLjExLjA2LjI5LjA5Ljc1LjA5LDEuMzhoLTQuNTZjLjAyLjY0LjE3LDEuMTUuNDUsMS41NC4yOC4zOS43MS41OCwxLjMuNTguNTUsMCwuOTgtLjE4LDEuMzEtLjU1LjE4LS4yMS4zMS0uNDYuMzktLjc0aDEuMDRjLS4wMy4yMy0uMTIuNDktLjI3Ljc3cy0uMzMuNTEtLjUyLjY5Yy0uMzIuMzEtLjcxLjUyLTEuMTguNjMtLjI1LjA2LS41NC4wOS0uODUuMDktLjc4LDAtMS40My0uMjgtMS45Ny0uODUtLjU0LS41Ny0uODEtMS4zNi0uODEtMi4zOXMuMjctMS44My44Mi0yLjQ2Yy41NC0uNjMsMS4yNS0uOTQsMi4xMy0uOTQuNDQsMCwuODcuMSwxLjI5LjMxWk02OTguODYsODguMDVjLS4wNC0uNDYtLjE0LS44Mi0uMy0xLjEtLjI5LS41MS0uNzctLjc2LTEuNDQtLjc2LS40OCwwLS44OC4xNy0xLjIxLjUyLS4zMy4zNS0uNS43OS0uNTIsMS4zM2gzLjQ2WiIvPjxwYXRoIGNsYXNzPSJjbHMtMTAiIGQ9Ik02NDguNDksOTkuODRoMS4wM3YuODNjLjIxLS4yOS40NC0uNTEuNjktLjY2LjM2LS4yMy43OC0uMzUsMS4yNi0uMzUuNzEsMCwxLjMyLjI3LDEuODIuODJzLjc1LDEuMzIuNzUsMi4zM2MwLDEuMzctLjM2LDIuMzQtMS4wOCwyLjkzLS40Ni4zNy0uOTguNTYtMS41OS41Ni0uNDcsMC0uODctLjEtMS4xOS0uMzEtLjE5LS4xMi0uNC0uMzItLjYzLS42djMuMjFoLTEuMDV2LTguNzVaTTY1Mi40NiwxMDQuNzZjLjMzLS40MS40OS0xLjAzLjQ5LTEuODUsMC0uNS0uMDctLjkzLS4yMi0xLjI5LS4yNy0uNjktLjc4LTEuMDQtMS41LTEuMDRzLTEuMjMuMzctMS41LDEuMWMtLjE1LjM5LS4yMi44OS0uMjIsMS40OSwwLC40OC4wNy45LjIyLDEuMjQuMjcuNjUuNzguOTcsMS41Ljk3LjQ5LDAsLjktLjIxLDEuMjMtLjYyWiIvPjxwYXRoIGNsYXNzPSJjbHMtMTAiIGQ9Ik02NTkuOCwxMDAuNDRjLjU1LjU0LjgzLDEuMzMuODMsMi4zOHMtLjI0LDEuODUtLjczLDIuNTFjLS40OS42Ni0xLjI1Ljk5LTIuMjcuOTktLjg2LDAtMS41NC0uMjktMi4wNC0uODgtLjUtLjU4LS43Ni0xLjM3LS43Ni0yLjM1LDAtMS4wNS4yNy0xLjg5LjgtMi41Mi41My0uNjIsMS4yNS0uOTQsMi4xNC0uOTQuOCwwLDEuNDguMjcsMi4wNC44MVpNNjU5LjE0LDEwNC42MWMuMjYtLjUzLjM5LTEuMTIuMzktMS43NiwwLS41OC0uMDktMS4wNi0uMjgtMS40My0uMjktLjU4LS44LS44Ny0xLjUyLS44Ny0uNjQsMC0xLjEuMjUtMS4zOS43NHMtLjQzLDEuMDgtLjQzLDEuNzguMTQsMS4yMi40MywxLjY3Ljc1LjY3LDEuMzguNjdjLjY5LDAsMS4xNy0uMjYsMS40Mi0uNzlaIi8+PHBhdGggY2xhc3M9ImNscy0xMCIgZD0iTTY2MS45Miw5Ny40OGgxLjA3djEuMmgtMS4wN3YtMS4yWk02NjEuOTIsOTkuODRoMS4wN3Y2LjI1aC0xLjA3di02LjI1WiIvPjxwYXRoIGNsYXNzPSJjbHMtMTAiIGQ9Ik02NjQuNTksOTkuODFoMXYuODljLjMtLjM3LjYxLS42My45NC0uNzlzLjctLjI0LDEuMTEtLjI0Yy44OSwwLDEuNDkuMzEsMS44LjkzLjE3LjM0LjI2LjgzLjI2LDEuNDZ2NC4wM2gtMS4wN3YtMy45NmMwLS4zOC0uMDYtLjY5LS4xNy0uOTMtLjE5LS4zOS0uNTMtLjU5LTEuMDItLjU5LS4yNSwwLS40Ni4wMy0uNjIuMDgtLjI5LjA5LS41NC4yNi0uNzYuNTItLjE4LjIxLS4yOS40Mi0uMzQuNjRzLS4wOC41NC0uMDguOTV2My4yOWgtMS4wNXYtNi4yOFoiLz48cGF0aCBjbGFzcz0iY2xzLTEwIiBkPSJNNjcxLjQ4LDk4LjA2aDEuMDd2MS43NWgxdi44NmgtMXY0LjFjMCwuMjIuMDcuMzcuMjIuNDQuMDguMDQuMjIuMDYuNDEuMDYuMDUsMCwuMTEsMCwuMTYsMHMuMTMsMCwuMjEtLjAydi44NGMtLjEyLjA0LS4yNS4wNi0uMzguMDhzLS4yNy4wMi0uNDIuMDJjLS40OSwwLS44My0uMTMtMS0uMzhzLS4yNi0uNTgtLjI2LS45OHYtNC4xNWgtLjg1di0uODZoLjg1di0xLjc1WiIvPjxwYXRoIGNsYXNzPSJjbHMtMTAiIGQ9Ik02NzguNDcsOTkuOThjLjQyLjIxLjczLjQ4Ljk1LjgxLjIxLjMyLjM1LjY5LjQyLDEuMTEuMDYuMjkuMDkuNzUuMDksMS4zOGgtNC41NmMuMDIuNjQuMTcsMS4xNS40NSwxLjU0LjI4LjM5LjcxLjU4LDEuMy41OC41NSwwLC45OC0uMTgsMS4zMS0uNTUuMTgtLjIxLjMxLS40Ni4zOS0uNzRoMS4wNGMtLjAzLjIzLS4xMi40OS0uMjcuNzdzLS4zMy41MS0uNTIuNjljLS4zMi4zMS0uNzEuNTItMS4xOC42My0uMjUuMDYtLjU0LjA5LS44NS4wOS0uNzgsMC0xLjQzLS4yOC0xLjk3LS44NS0uNTQtLjU3LS44MS0xLjM2LS44MS0yLjM5cy4yNy0xLjgzLjgyLTIuNDZjLjU0LS42MywxLjI1LS45NCwyLjEzLS45NC40NCwwLC44Ny4xLDEuMjkuMzFaTTY3OC44NSwxMDIuNDVjLS4wNC0uNDYtLjE0LS44Mi0uMy0xLjEtLjI5LS41MS0uNzctLjc2LTEuNDQtLjc2LS40OCwwLS44OC4xNy0xLjIxLjUyLS4zMy4zNS0uNS43OS0uNTIsMS4zM2gzLjQ2WiIvPjxwYXRoIGNsYXNzPSJjbHMtMTAiIGQ9Ik02ODEuMyw5OS44MWgxdjEuMDhjLjA4LS4yMS4yOC0uNDcuNi0uNzdzLjY5LS40NSwxLjExLS40NWMuMDIsMCwuMDUsMCwuMSwwcy4xMy4wMS4yNC4wMnYxLjExYy0uMDYtLjAxLS4xMi0uMDItLjE3LS4wMnMtLjExLDAtLjE3LDBjLS41MywwLS45NC4xNy0xLjIyLjUxcy0uNDMuNzQtLjQzLDEuMTh2My42MWgtMS4wNXYtNi4yOFoiLz48cGF0aCBjbGFzcz0iY2xzLTEwIiBkPSJNNjkxLjk3LDEwMi4yOWMuMjQtLjAzLjQtLjEzLjQ5LS4zLjA1LS4wOS4wNy0uMjMuMDctLjQxLDAtLjM2LS4xMy0uNjItLjM4LS43OS0uMjYtLjE2LS42Mi0uMjQtMS4xLS4yNC0uNTUsMC0uOTQuMTUtMS4xNy40NS0uMTMuMTctLjIxLjQxLS4yNS43NGgtLjk4Yy4wMi0uNzguMjctMS4zMi43NS0xLjYyLjQ4LS4zLDEuMDQtLjQ2LDEuNjgtLjQ2Ljc0LDAsMS4zNC4xNCwxLjguNDIuNDYuMjguNjguNzIuNjgsMS4zMXYzLjYyYzAsLjExLjAyLjIuMDcuMjYuMDQuMDcuMTQuMS4yOC4xLjA1LDAsLjEsMCwuMTYsMHMuMTItLjAxLjE5LS4wM3YuNzhjLS4xNi4wNS0uMjkuMDgtLjM4LjA5cy0uMi4wMi0uMzUuMDJjLS4zNiwwLS42My0uMTMtLjc5LS4zOS0uMDktLjE0LS4xNS0uMzMtLjE4LS41OC0uMjEuMjgtLjUyLjUzLS45My43M3MtLjg1LjMxLTEuMzMuMzFjLS41OCwwLTEuMDYtLjE4LTEuNDMtLjUzcy0uNTUtLjc5LS41NS0xLjMzYzAtLjU4LjE4LTEuMDMuNTQtMS4zNXMuODQtLjUyLDEuNDMtLjU5bDEuNjgtLjIxWk02ODkuNzQsMTA1LjE0Yy4yMi4xOC40OS4yNi43OS4yNi4zNywwLC43My0uMDksMS4wOC0uMjYuNTktLjI4Ljg4LS43NS44OC0xLjR2LS44NWMtLjEzLjA4LS4yOS4xNS0uNS4yMS0uMi4wNS0uNC4wOS0uNi4xMmwtLjY0LjA4Yy0uMzguMDUtLjY3LjEzLS44Ni4yNC0uMzMuMTgtLjQ5LjQ4LS40OS44OCwwLC4zLjExLjU0LjMzLjcyWiIvPjxwYXRoIGNsYXNzPSJjbHMtMTAiIGQ9Ik02OTUuMzEsOTcuNDhoMS4wNXY4LjYxaC0xLjA1di04LjYxWiIvPjxwYXRoIGNsYXNzPSJjbHMtMTAiIGQ9Ik02OTcuOTQsOTcuNDhoMS4wN3YxLjJoLTEuMDd2LTEuMlpNNjk3Ljk0LDk5Ljg0aDEuMDd2Ni4yNWgtMS4wN3YtNi4yNVoiLz48cGF0aCBjbGFzcz0iY2xzLTEwIiBkPSJNNzA0LjEsMTAwLjA2Yy4yLjE0LjQuMzQuNjEuNnYtLjc5aC45N3Y1LjcxYzAsLjgtLjEyLDEuNDMtLjM1LDEuODktLjQ0Ljg1LTEuMjYsMS4yOC0yLjQ3LDEuMjgtLjY3LDAtMS4yNC0uMTUtMS43LS40NS0uNDYtLjMtLjcyLS43OC0uNzctMS40MmgxLjA3Yy4wNS4yOC4xNS41LjMuNjUuMjQuMjMuNjEuMzUsMS4xMi4zNS44LDAsMS4zMy0uMjksMS41OC0uODYuMTUtLjM0LjIyLS45NC4yLTEuOC0uMjEuMzItLjQ2LjU2LS43Ni43MXMtLjY5LjIzLTEuMTcuMjNjLS42OCwwLTEuMjctLjI0LTEuNzgtLjcycy0uNzYtMS4yOC0uNzYtMi4zOWMwLTEuMDUuMjYtMS44Ny43Ny0yLjQ2czEuMTMtLjg4LDEuODUtLjg4Yy40OSwwLC45Mi4xMiwxLjI4LjM2Wk03MDQuMjMsMTAxLjE5Yy0uMzItLjM4LS43My0uNTYtMS4yMi0uNTYtLjc0LDAtMS4yNC4zNS0xLjUyLDEuMDQtLjE0LjM3LS4yMi44Ni0uMjIsMS40NiwwLC43MS4xNCwxLjI1LjQzLDEuNjEuMjkuMzcuNjcuNTUsMS4xNS41NS43NSwwLDEuMjgtLjM0LDEuNTktMS4wMy4xNy0uMzkuMjYtLjg0LjI2LTEuMzUsMC0uNzgtLjE2LTEuMzUtLjQ4LTEuNzNaIi8+PHBhdGggY2xhc3M9ImNscy0xMCIgZD0iTTcwNy4yOCw5OS44MWgxdi44OWMuMy0uMzcuNjEtLjYzLjk0LS43OXMuNy0uMjQsMS4xMS0uMjRjLjg5LDAsMS40OS4zMSwxLjguOTMuMTcuMzQuMjYuODMuMjYsMS40NnY0LjAzaC0xLjA3di0zLjk2YzAtLjM4LS4wNi0uNjktLjE3LS45My0uMTktLjM5LS41My0uNTktMS4wMi0uNTktLjI1LDAtLjQ2LjAzLS42Mi4wOC0uMjkuMDktLjU0LjI2LS43Ni41Mi0uMTguMjEtLjI5LjQyLS4zNC42NHMtLjA4LjU0LS4wOC45NXYzLjI5aC0xLjA1di02LjI4WiIvPjxwYXRoIGNsYXNzPSJjbHMtMTAiIGQ9Ik03MTMuOTYsOTkuODFoMS4wNHYuODljLjI1LS4zMS40OC0uNTMuNjgtLjY3LjM1LS4yNC43NC0uMzYsMS4xOC0uMzYuNSwwLC45LjEyLDEuMjEuMzcuMTcuMTQuMzMuMzUuNDcuNjIuMjMtLjM0LjUxLS41OC44My0uNzVzLjY3LS4yNCwxLjA3LS4yNGMuODQsMCwxLjQyLjMsMS43Mi45MS4xNi4zMy4yNS43Ny4yNSwxLjMydjQuMThoLTEuMXYtNC4zNmMwLS40Mi0uMS0uNzEtLjMxLS44NnMtLjQ2LS4yMy0uNzYtLjIzYy0uNDEsMC0uNzcuMTQtMS4wNy40MnMtLjQ1Ljc0LS40NSwxLjM5djMuNjVoLTEuMDd2LTQuMWMwLS40My0uMDUtLjc0LS4xNS0uOTMtLjE2LS4yOS0uNDYtLjQ0LS45LS40NC0uNCwwLS43Ni4xNS0xLjA5LjQ2cy0uNDkuODctLjQ5LDEuNjh2My4zM2gtMS4wNXYtNi4yOFoiLz48cGF0aCBjbGFzcz0iY2xzLTEwIiBkPSJNNzI3LjgzLDk5Ljk4Yy40Mi4yMS43My40OC45NS44MS4yMS4zMi4zNS42OS40MiwxLjExLjA2LjI5LjA5Ljc1LjA5LDEuMzhoLTQuNTZjLjAyLjY0LjE3LDEuMTUuNDUsMS41NC4yOC4zOS43MS41OCwxLjMuNTguNTUsMCwuOTgtLjE4LDEuMzEtLjU1LjE4LS4yMS4zMS0uNDYuMzktLjc0aDEuMDRjLS4wMy4yMy0uMTIuNDktLjI3Ljc3cy0uMzMuNTEtLjUyLjY5Yy0uMzIuMzEtLjcxLjUyLTEuMTguNjMtLjI1LjA2LS41NC4wOS0uODUuMDktLjc4LDAtMS40My0uMjgtMS45Ny0uODUtLjU0LS41Ny0uODEtMS4zNi0uODEtMi4zOXMuMjctMS44My44Mi0yLjQ2Yy41NC0uNjMsMS4yNS0uOTQsMi4xMy0uOTQuNDQsMCwuODcuMSwxLjI5LjMxWk03MjguMjEsMTAyLjQ1Yy0uMDQtLjQ2LS4xNC0uODItLjMtMS4xLS4yOS0uNTEtLjc3LS43Ni0xLjQ0LS43Ni0uNDgsMC0uODguMTctMS4yMS41Mi0uMzMuMzUtLjUuNzktLjUyLDEuMzNoMy40NloiLz48cGF0aCBjbGFzcz0iY2xzLTEwIiBkPSJNNzMwLjYzLDk5LjgxaDF2Ljg5Yy4zLS4zNy42MS0uNjMuOTQtLjc5cy43LS4yNCwxLjExLS4yNGMuODksMCwxLjQ5LjMxLDEuOC45My4xNy4zNC4yNi44My4yNiwxLjQ2djQuMDNoLTEuMDd2LTMuOTZjMC0uMzgtLjA2LS42OS0uMTctLjkzLS4xOS0uMzktLjUzLS41OS0xLjAyLS41OS0uMjUsMC0uNDYuMDMtLjYyLjA4LS4yOS4wOS0uNTQuMjYtLjc2LjUyLS4xOC4yMS0uMjkuNDItLjM0LjY0cy0uMDguNTQtLjA4Ljk1djMuMjloLTEuMDV2LTYuMjhaIi8+PHBhdGggY2xhc3M9ImNscy0xMCIgZD0iTTczNy41MSw5OC4wNmgxLjA3djEuNzVoMXYuODZoLTF2NC4xYzAsLjIyLjA3LjM3LjIyLjQ0LjA4LjA0LjIyLjA2LjQxLjA2LjA1LDAsLjExLDAsLjE2LDBzLjEzLDAsLjIxLS4wMnYuODRjLS4xMi4wNC0uMjUuMDYtLjM4LjA4cy0uMjcuMDItLjQyLjAyYy0uNDksMC0uODMtLjEzLTEtLjM4cy0uMjYtLjU4LS4yNi0uOTh2LTQuMTVoLS44NXYtLjg2aC44NXYtMS43NVoiLz48cGF0aCBjbGFzcz0iY2xzLTEwIiBkPSJNMzcyLjY5LDEwLjQxdi0yLjA1aC0zLjY4di0xLjAzbDMuODQtNS4zM2guODl2NS40NGgxLjI0di45MmgtMS4yNHYyLjA1aC0xLjA1Wk0zNzIuNjcsNy40NHYtMy44MWwtMi42OSwzLjgxaDIuNjlaIi8+PHBhdGggY2xhc3M9ImNscy0xMCIgZD0iTTM3Ni41Miw1LjVjLS4zMS0uMzEtLjQ2LS43Mi0uNDYtMS4yMiwwLS42Mi4yMy0xLjE2LjY4LTEuNjEuNDUtLjQ1LDEuMDktLjY3LDEuOTMtLjY3czEuNDMuMjEsMS44OS42NGMuNDYuNDIuNjguOTIuNjgsMS40OSwwLC41Mi0uMTMuOTUtLjQsMS4yNy0uMTUuMTgtLjM4LjM2LS42OS41NC4zNS4xNi42Mi4zNC44Mi41NS4zNy4zOS41Ni45LjU2LDEuNTIsMCwuNzQtLjI1LDEuMzYtLjc0LDEuODhzLTEuMi43Ny0yLjEuNzdjLS44MiwwLTEuNTEtLjIyLTIuMDctLjY3cy0uODUtMS4wOS0uODUtMS45M2MwLS41LjEyLS45Mi4zNi0xLjI5cy42LS42NCwxLjA4LS44M2MtLjI5LS4xMi0uNTItLjI3LS42OS0uNDRaTTM3OS45Myw5LjI5Yy4zMi0uMjYuNDgtLjY2LjQ4LTEuMThzLS4xNy0uOTYtLjUtMS4yNC0uNzYtLjQyLTEuMjgtLjQyLS45Mi4xNC0xLjIzLjQzLS40OC42OC0uNDgsMS4xOWMwLC40NC4xNS44Mi40NCwxLjEzcy43NC40OCwxLjM1LjQ4Yy40OSwwLC44OS0uMTMsMS4yMi0uNFpNMzc5LjczLDUuMTRjLjI2LS4yNi4zOS0uNTcuMzktLjkzLDAtLjMxLS4xMi0uNi0uMzctLjg2LS4yNS0uMjYtLjYzLS4zOS0xLjE0LS4zOXMtLjg3LjEzLTEuMS4zOWMtLjIzLjI2LS4zNC41Ny0uMzQuOTIsMCwuNC4xNS43LjQ0LjkzLjI5LjIyLjY0LjMzLDEuMDQuMzMuNDYsMCwuODMtLjEzLDEuMDktLjM5WiIvPjxwYXRoIGNsYXNzPSJjbHMtMTAiIGQ9Ik0zODYuMDcsMS43N2gxLjAzdjMuMTJjLjIzLS4zLjUxLS41My44My0uNjkuMzItLjE2LjY3LS4yNCwxLjA1LS4yNC43OCwwLDEuNDIuMjcsMS45MS44MXMuNzMsMS4zMy43MywyLjM4YzAsLjk5LS4yNCwxLjgyLS43MiwyLjQ3cy0xLjE1Ljk4LTIuMDEuOThjLS40OCwwLS44OC0uMTItMS4yMS0uMzUtLjItLjE0LS40MS0uMzYtLjYzLS42NnYuOGgtLjk3VjEuNzdaTTM5MC4xMSw5Yy4yOC0uNDUuNDMtMS4wNS40My0xLjc5LDAtLjY2LS4xNC0xLjIxLS40My0xLjY0LS4yOS0uNDMtLjctLjY1LTEuMjYtLjY1LS40OCwwLS45LjE4LTEuMjcuNTNzLS41NC45NC0uNTQsMS43NmMwLC41OS4wNywxLjA3LjIyLDEuNDQuMjguNjkuOCwxLjA0LDEuNTYsMS4wNC41NywwLDEtLjIzLDEuMjktLjY4WiIvPjxwYXRoIGNsYXNzPSJjbHMtMTAiIGQ9Ik0zOTIuODQsMS44aDEuMDd2MS4yaC0xLjA3di0xLjJaTTM5Mi44NCw0LjE2aDEuMDd2Ni4yNWgtMS4wN3YtNi4yNVoiLz48cGF0aCBjbGFzcz0iY2xzLTEwIiBkPSJNMzk1LjcxLDIuMzhoMS4wN3YxLjc1aDF2Ljg2aC0xdjQuMWMwLC4yMi4wNy4zNy4yMi40NC4wOC4wNC4yMi4wNi40MS4wNi4wNSwwLC4xMSwwLC4xNiwwcy4xMywwLC4yMS0uMDJ2Ljg0Yy0uMTIuMDQtLjI1LjA2LS4zOC4wOHMtLjI3LjAyLS40Mi4wMmMtLjQ5LDAtLjgzLS4xMy0xLS4zOHMtLjI2LS41OC0uMjYtLjk4di00LjE1aC0uODV2LS44NmguODV2LTEuNzVaIi8+PHBhdGggY2xhc3M9ImNscy0xMCIgZD0iTTQwMi4wOCw0LjE2aDEuMDN2LjgzYy4yMS0uMjkuNDQtLjUxLjY5LS42Ni4zNi0uMjMuNzgtLjM1LDEuMjYtLjM1LjcxLDAsMS4zMi4yNywxLjgyLjgycy43NSwxLjMyLjc1LDIuMzNjMCwxLjM3LS4zNiwyLjM0LTEuMDgsMi45My0uNDYuMzctLjk4LjU2LTEuNTkuNTYtLjQ3LDAtLjg3LS4xLTEuMTktLjMxLS4xOS0uMTItLjQtLjMyLS42My0uNnYzLjIxaC0xLjA1VjQuMTZaTTQwNi4wNSw5LjA4Yy4zMy0uNDEuNDktMS4wMy40OS0xLjg1LDAtLjUtLjA3LS45My0uMjItMS4yOS0uMjctLjY5LS43OC0xLjA0LTEuNS0xLjA0cy0xLjIzLjM3LTEuNSwxLjFjLS4xNS4zOS0uMjIuODktLjIyLDEuNDksMCwuNDguMDcuOS4yMiwxLjI0LjI3LjY1Ljc4Ljk3LDEuNS45Ny40OSwwLC45LS4yMSwxLjIzLS42MloiLz48cGF0aCBjbGFzcz0iY2xzLTEwIiBkPSJNNDEzLjM5LDQuNzZjLjU1LjU0LjgzLDEuMzMuODMsMi4zOHMtLjI0LDEuODUtLjczLDIuNTFjLS40OS42Ni0xLjI1Ljk5LTIuMjcuOTktLjg2LDAtMS41NC0uMjktMi4wNC0uODgtLjUtLjU4LS43Ni0xLjM3LS43Ni0yLjM1LDAtMS4wNS4yNy0xLjg5LjgtMi41Mi41My0uNjIsMS4yNS0uOTQsMi4xNC0uOTQuOCwwLDEuNDguMjcsMi4wNC44MVpNNDEyLjc0LDguOTNjLjI2LS41My4zOS0xLjEyLjM5LTEuNzYsMC0uNTgtLjA5LTEuMDYtLjI4LTEuNDMtLjI5LS41OC0uOC0uODctMS41Mi0uODctLjY0LDAtMS4xLjI1LTEuMzkuNzRzLS40MywxLjA4LS40MywxLjc4LjE0LDEuMjIuNDMsMS42Ny43NS42NywxLjM4LjY3Yy42OSwwLDEuMTctLjI2LDEuNDItLjc5WiIvPjxwYXRoIGNsYXNzPSJjbHMtMTAiIGQ9Ik00MTUuNTIsMS44aDEuMDd2MS4yaC0xLjA3di0xLjJaTTQxNS41Miw0LjE2aDEuMDd2Ni4yNWgtMS4wN3YtNi4yNVoiLz48cGF0aCBjbGFzcz0iY2xzLTEwIiBkPSJNNDE4LjE4LDQuMTNoMXYuODljLjMtLjM3LjYxLS42My45NC0uNzlzLjctLjI0LDEuMTEtLjI0Yy44OSwwLDEuNDkuMzEsMS44LjkzLjE3LjM0LjI2LjgzLjI2LDEuNDZ2NC4wM2gtMS4wN3YtMy45NmMwLS4zOC0uMDYtLjY5LS4xNy0uOTMtLjE5LS4zOS0uNTMtLjU5LTEuMDItLjU5LS4yNSwwLS40Ni4wMy0uNjIuMDgtLjI5LjA5LS41NC4yNi0uNzYuNTItLjE4LjIxLS4yOS40Mi0uMzQuNjRzLS4wOC41NC0uMDguOTV2My4yOWgtMS4wNXYtNi4yOFoiLz48cGF0aCBjbGFzcz0iY2xzLTEwIiBkPSJNNDI1LjA3LDIuMzhoMS4wN3YxLjc1aDF2Ljg2aC0xdjQuMWMwLC4yMi4wNy4zNy4yMi40NC4wOC4wNC4yMi4wNi40MS4wNi4wNSwwLC4xMSwwLC4xNiwwcy4xMywwLC4yMS0uMDJ2Ljg0Yy0uMTIuMDQtLjI1LjA2LS4zOC4wOHMtLjI3LjAyLS40Mi4wMmMtLjQ5LDAtLjgzLS4xMy0xLS4zOHMtLjI2LS41OC0uMjYtLjk4di00LjE1aC0uODV2LS44NmguODV2LTEuNzVaIi8+PHBhdGggY2xhc3M9ImNscy0xMCIgZD0iTTQzMi4wNyw0LjMxYy40Mi4yMS43My40OC45NS44MS4yMS4zMi4zNS42OS40MiwxLjExLjA2LjI5LjA5Ljc1LjA5LDEuMzhoLTQuNTZjLjAyLjY0LjE3LDEuMTUuNDUsMS41NC4yOC4zOS43MS41OCwxLjMuNTguNTUsMCwuOTgtLjE4LDEuMzEtLjU1LjE4LS4yMS4zMS0uNDYuMzktLjc0aDEuMDRjLS4wMy4yMy0uMTIuNDktLjI3Ljc3cy0uMzMuNTEtLjUyLjY5Yy0uMzIuMzEtLjcxLjUyLTEuMTguNjMtLjI1LjA2LS41NC4wOS0uODUuMDktLjc4LDAtMS40My0uMjgtMS45Ny0uODUtLjU0LS41Ny0uODEtMS4zNi0uODEtMi4zOXMuMjctMS44My44Mi0yLjQ2Yy41NC0uNjMsMS4yNS0uOTQsMi4xMy0uOTQuNDQsMCwuODcuMSwxLjI5LjMxWk00MzIuNDUsNi43N2MtLjA0LS40Ni0uMTQtLjgyLS4zLTEuMS0uMjktLjUxLS43Ny0uNzYtMS40NC0uNzYtLjQ4LDAtLjg4LjE3LTEuMjEuNTItLjMzLjM1LS41Ljc5LS41MiwxLjMzaDMuNDZaIi8+PHBhdGggY2xhc3M9ImNscy0xMCIgZD0iTTQzNC44OSw0LjEzaDF2MS4wOGMuMDgtLjIxLjI4LS40Ny42LS43N3MuNjktLjQ1LDEuMTEtLjQ1Yy4wMiwwLC4wNSwwLC4xLDBzLjEzLjAxLjI0LjAydjEuMTFjLS4wNi0uMDEtLjEyLS4wMi0uMTctLjAycy0uMTEsMC0uMTcsMGMtLjUzLDAtLjk0LjE3LTEuMjIuNTFzLS40My43NC0uNDMsMS4xOHYzLjYxaC0xLjA1di02LjI4WiIvPjxsaW5lIGNsYXNzPSJjbHMtMSIgeDE9IjE3NS4yOSIgeTE9IjE3LjE2IiB4Mj0iNjM1LjQ4IiB5Mj0iMTcuMTYiLz48cG9seWdvbiBjbGFzcz0iY2xzLTEwIiBwb2ludHM9IjE3OC4wOSAyMC44NiAxNzYuNTIgMTcuMTYgMTc4LjA5IDEzLjQ2IDE2OS4zMiAxNy4xNiAxNzguMDkgMjAuODYiLz48cG9seWdvbiBjbGFzcz0iY2xzLTEwIiBwb2ludHM9IjYzMi42NyAyMC44NiA2MzQuMjQgMTcuMTYgNjMyLjY3IDEzLjQ2IDY0MS40NSAxNy4xNiA2MzIuNjcgMjAuODYiLz48cmVjdCBjbGFzcz0iY2xzLTUiIHg9IjExLjk0IiB5PSI2Mi45OCIgd2lkdGg9IjkuODQiIGhlaWdodD0iOS44NCIvPjxyZWN0IGNsYXNzPSJjbHMtNSIgeD0iMjEuNzgiIHk9IjYyLjk4IiB3aWR0aD0iOS44NCIgaGVpZ2h0PSI5Ljg0Ii8+PHJlY3QgY2xhc3M9ImNscy01IiB4PSIzMS42MSIgeT0iNjIuOTgiIHdpZHRoPSI5Ljg0IiBoZWlnaHQ9IjkuODQiLz48cmVjdCBjbGFzcz0iY2xzLTUiIHg9IjQxLjQ1IiB5PSI2Mi45OCIgd2lkdGg9IjkuODQiIGhlaWdodD0iOS44NCIvPjxyZWN0IGNsYXNzPSJjbHMtNSIgeD0iNTEuMjgiIHk9IjYyLjk4IiB3aWR0aD0iOS44NCIgaGVpZ2h0PSI5Ljg0Ii8+PHJlY3QgY2xhc3M9ImNscy01IiB4PSI2MS4xMiIgeT0iNjIuOTgiIHdpZHRoPSI5Ljg0IiBoZWlnaHQ9IjkuODQiLz48cmVjdCBjbGFzcz0iY2xzLTUiIHg9IjcwLjk2IiB5PSI2Mi45OCIgd2lkdGg9IjkuODQiIGhlaWdodD0iOS44NCIvPjxyZWN0IGNsYXNzPSJjbHMtNSIgeD0iODAuNzkiIHk9IjYyLjk4IiB3aWR0aD0iOS44NCIgaGVpZ2h0PSI5Ljg0Ii8+PHJlY3QgY2xhc3M9ImNscy02IiB4PSI5MC42MyIgeT0iNzcuNzMiIHdpZHRoPSI5Ljg0IiBoZWlnaHQ9IjkuODQiLz48cmVjdCBjbGFzcz0iY2xzLTYiIHg9IjEwMC40NiIgeT0iNzcuNzMiIHdpZHRoPSI5Ljg0IiBoZWlnaHQ9IjkuODQiLz48cmVjdCBjbGFzcz0iY2xzLTYiIHg9IjExMC4zIiB5PSI3Ny43MyIgd2lkdGg9IjkuODQiIGhlaWdodD0iOS44NCIvPjxyZWN0IGNsYXNzPSJjbHMtNiIgeD0iMTIwLjE0IiB5PSI3Ny43MyIgd2lkdGg9IjkuODQiIGhlaWdodD0iOS44NCIvPjxyZWN0IGNsYXNzPSJjbHMtNiIgeD0iMTI5Ljk3IiB5PSI3Ny43MyIgd2lkdGg9IjkuODQiIGhlaWdodD0iOS44NCIvPjxyZWN0IGNsYXNzPSJjbHMtNiIgeD0iMTM5LjgxIiB5PSI3Ny43MyIgd2lkdGg9IjkuODQiIGhlaWdodD0iOS44NCIvPjxyZWN0IGNsYXNzPSJjbHMtNiIgeD0iMTQ5LjY0IiB5PSI3Ny43MyIgd2lkdGg9IjkuODQiIGhlaWdodD0iOS44NCIvPjxyZWN0IGNsYXNzPSJjbHMtNiIgeD0iMTU5LjQ4IiB5PSI3Ny43MyIgd2lkdGg9IjkuODQiIGhlaWdodD0iOS44NCIvPjxyZWN0IGNsYXNzPSJjbHMtNiIgeD0iMjEuNzgiIHk9Ijc3LjczIiB3aWR0aD0iOS44NCIgaGVpZ2h0PSI5Ljg0Ii8+PHJlY3QgY2xhc3M9ImNscy02IiB4PSIzMS42MSIgeT0iNzcuNzMiIHdpZHRoPSI5Ljg0IiBoZWlnaHQ9IjkuODQiLz48cmVjdCBjbGFzcz0iY2xzLTYiIHg9IjQxLjQ1IiB5PSI3Ny43MyIgd2lkdGg9IjkuODQiIGhlaWdodD0iOS44NCIvPjxyZWN0IGNsYXNzPSJjbHMtNiIgeD0iNTEuMjgiIHk9Ijc3LjczIiB3aWR0aD0iOS44NCIgaGVpZ2h0PSI5Ljg0Ii8+PHJlY3QgY2xhc3M9ImNscy02IiB4PSI2MS4xMiIgeT0iNzcuNzMiIHdpZHRoPSI5Ljg0IiBoZWlnaHQ9IjkuODQiLz48cmVjdCBjbGFzcz0iY2xzLTYiIHg9IjcwLjk2IiB5PSI3Ny43MyIgd2lkdGg9IjkuODQiIGhlaWdodD0iOS44NCIvPjxyZWN0IGNsYXNzPSJjbHMtNiIgeD0iODAuNzkiIHk9Ijc3LjczIiB3aWR0aD0iOS44NCIgaGVpZ2h0PSI5Ljg0Ii8+PHJlY3QgY2xhc3M9ImNscy04IiB4PSIyMS43OCIgeT0iOTIuNDkiIHdpZHRoPSI5Ljg0IiBoZWlnaHQ9IjkuODQiLz48cmVjdCBjbGFzcz0iY2xzLTgiIHg9IjMxLjYxIiB5PSI5Mi40OSIgd2lkdGg9IjkuODQiIGhlaWdodD0iOS44NCIvPjxyZWN0IGNsYXNzPSJjbHMtOCIgeD0iNDEuNDUiIHk9IjkyLjQ5IiB3aWR0aD0iOS44NCIgaGVpZ2h0PSI5Ljg0Ii8+PHJlY3QgY2xhc3M9ImNscy04IiB4PSI1MS4yOCIgeT0iOTIuNDkiIHdpZHRoPSI5Ljg0IiBoZWlnaHQ9IjkuODQiLz48cmVjdCBjbGFzcz0iY2xzLTgiIHg9IjYxLjEyIiB5PSI5Mi40OSIgd2lkdGg9IjkuODQiIGhlaWdodD0iOS44NCIvPjxyZWN0IGNsYXNzPSJjbHMtOCIgeD0iNzAuOTYiIHk9IjkyLjQ5IiB3aWR0aD0iOS44NCIgaGVpZ2h0PSI5Ljg0Ii8+PHJlY3QgY2xhc3M9ImNscy04IiB4PSI4MC43OSIgeT0iOTIuNDkiIHdpZHRoPSI5Ljg0IiBoZWlnaHQ9IjkuODQiLz48cGF0aCBjbGFzcz0iY2xzLTEwIiBkPSJNMTc1LjQxLDc4Ljk2aDEuMTh2OC42MWgtMS4xOHYtOC42MVoiLz48cGF0aCBjbGFzcz0iY2xzLTEwIiBkPSJNMTc4LjM0LDgxLjI5aDF2Ljg5Yy4zLS4zNy42MS0uNjMuOTQtLjc5cy43LS4yNCwxLjExLS4yNGMuODksMCwxLjQ5LjMxLDEuOC45My4xNy4zNC4yNi44My4yNiwxLjQ2djQuMDNoLTEuMDd2LTMuOTZjMC0uMzgtLjA2LS42OS0uMTctLjkzLS4xOS0uMzktLjUzLS41OS0xLjAyLS41OS0uMjUsMC0uNDYuMDMtLjYyLjA4LS4yOS4wOS0uNTQuMjYtLjc2LjUyLS4xOC4yMS0uMjkuNDItLjM0LjY0cy0uMDguNTQtLjA4Ljk1djMuMjloLTEuMDV2LTYuMjhaIi8+PHBhdGggY2xhc3M9ImNscy0xMCIgZD0iTTE4NS4yMyw3OS41NGgxLjA3djEuNzVoMXYuODZoLTF2NC4xYzAsLjIyLjA3LjM3LjIyLjQ0LjA4LjA0LjIyLjA2LjQxLjA2LjA1LDAsLjExLDAsLjE2LDBzLjEzLDAsLjIxLS4wMnYuODRjLS4xMi4wNC0uMjUuMDYtLjM4LjA4cy0uMjcuMDItLjQyLjAyYy0uNDksMC0uODMtLjEzLTEtLjM4cy0uMjYtLjU4LS4yNi0uOTh2LTQuMTVoLS44NXYtLjg2aC44NXYtMS43NVoiLz48cGF0aCBjbGFzcz0iY2xzLTEwIiBkPSJNMTkyLjIzLDgxLjQ3Yy40Mi4yMS43My40OC45NS44MS4yMS4zMi4zNS42OS40MiwxLjExLjA2LjI5LjA5Ljc1LjA5LDEuMzhoLTQuNTZjLjAyLjY0LjE3LDEuMTUuNDUsMS41NC4yOC4zOS43MS41OCwxLjMuNTguNTUsMCwuOTgtLjE4LDEuMzEtLjU1LjE4LS4yMS4zMS0uNDYuMzktLjc0aDEuMDRjLS4wMy4yMy0uMTIuNDktLjI3Ljc3cy0uMzMuNTEtLjUyLjY5Yy0uMzIuMzEtLjcxLjUyLTEuMTguNjMtLjI1LjA2LS41NC4wOS0uODUuMDktLjc4LDAtMS40My0uMjgtMS45Ny0uODUtLjU0LS41Ny0uODEtMS4zNi0uODEtMi4zOXMuMjctMS44My44Mi0yLjQ2Yy41NC0uNjMsMS4yNS0uOTQsMi4xMy0uOTQuNDQsMCwuODcuMSwxLjI5LjMxWk0xOTIuNiw4My45M2MtLjA0LS40Ni0uMTQtLjgyLS4zLTEuMS0uMjktLjUxLS43Ny0uNzYtMS40NC0uNzYtLjQ4LDAtLjg4LjE3LTEuMjEuNTJzLS41Ljc5LS41MiwxLjMzaDMuNDZaIi8+PHBhdGggY2xhc3M9ImNscy0xMCIgZD0iTTE5NS4wNSw3OC45NmgxLjA1djguNjFoLTEuMDV2LTguNjFaIi8+PHBhdGggY2xhc3M9ImNscy0xMCIgZD0iTTE5Ny45MSw4MS40NmMuMjItLjA0LjM4LS4xNi40OS0uMzZzLjE3LS40NS4xNy0uNzFjMC0uMDMsMC0uMDUsMC0uMDdzMC0uMDUtLjAxLS4wN2gtLjY0di0xLjI4aDEuMjV2MS4xOGMwLC41LS4xLjkyLS4zMSwxLjI3cy0uNTIuNTUtLjk0LjZ2LS41NVoiLz48cGF0aCBjbGFzcz0iY2xzLTEwIiBkPSJNMjAwLjc3LDg1LjZjLjAzLjM1LjEyLjYyLjI3LjgxLjI3LjM0Ljc0LjUxLDEuNDEuNTEuNCwwLC43NS0uMDgsMS4wNS0uMjVzLjQ1LS40My40NS0uNzljMC0uMjctLjEyLS40Ny0uMzYtLjYyLS4xNS0uMDktLjQ2LS4xOS0uOTItLjNsLS44NS0uMjFjLS41NC0uMTMtLjk0LS4yOC0xLjItLjQ1LS40Ni0uMjktLjY5LS42OC0uNjktMS4xOCwwLS41OS4yMi0xLjA3LjY1LTEuNDQuNDMtLjM3LDEuMDItLjU1LDEuNzUtLjU1Ljk2LDAsMS42NS4yOCwyLjA3LjgzLjI3LjM1LjM5LjczLjM5LDEuMTRoLTFjLS4wMi0uMjQtLjExLS40NS0uMjYtLjY1LS4yNS0uMjgtLjY4LS40MS0xLjI5LS40MS0uNDEsMC0uNzIuMDgtLjkzLjIzcy0uMzEuMzUtLjMxLjZjMCwuMjcuMTQuNDkuNDEuNjUuMTYuMS4zOS4xOC43LjI2bC43MS4xN2MuNzcuMTgsMS4yOS4zNiwxLjU1LjUzLjQxLjI3LjYyLjY5LjYyLDEuMjdzLS4yMSwxLjA0LS42NCwxLjQ1Yy0uNDMuNDEtMS4wOC42MS0xLjk2LjYxLS45NCwwLTEuNjEtLjIxLTIuMDEtLjY0cy0uNi0uOTUtLjYzLTEuNTdoMS4wMVoiLz48cGF0aCBjbGFzcz0iY2xzLTEwIiBkPSJNMjA5LjYyLDc4Ljk2aDEuMTd2Ny41OGg0LjMydjEuMDNoLTUuNDh2LTguNjFaIi8+PHBhdGggY2xhc3M9ImNscy0xMCIgZD0iTTIxOC43OSw3OC45NmgxLjMybDMuMTIsOC42MWgtMS4yOGwtLjg3LTIuNThoLTMuNGwtLjkzLDIuNThoLTEuMmwzLjI0LTguNjFaTTIyMC43MSw4NC4wNGwtMS4zMS0zLjgtMS4zOSwzLjhoMi43WiIvPjxwYXRoIGNsYXNzPSJjbHMtMTAiIGQ9Ik0yMjQuMjcsNzguOTZoMS42N2wyLjQ4LDcuMjgsMi40Ni03LjI4aDEuNjZ2OC42MWgtMS4xMXYtNS4wOGMwLS4xOCwwLS40Ny4wMS0uODdzLjAxLS44NC4wMS0xLjMxbC0yLjQ2LDcuMjZoLTEuMTZsLTIuNDgtNy4yNnYuMjZjMCwuMjEsMCwuNTMuMDIuOTZzLjAyLjc1LjAyLjk1djUuMDhoLTEuMTF2LTguNjFaIi8+PHBhdGggY2xhc3M9ImNscy0xMCIgZD0iTTIzOC44OSw3OC45NnY1LjMyYzAsLjYyLjEyLDEuMTQuMzUsMS41Ni4zNS42Mi45NC45NCwxLjc3Ljk0LDEsMCwxLjY3LS4zNCwyLjAzLTEuMDEuMTktLjM3LjI5LS44Ni4yOS0xLjQ4di01LjMyaDEuMTh2NC44M2MwLDEuMDYtLjE0LDEuODctLjQzLDIuNDQtLjUzLDEuMDQtMS41MiwxLjU2LTIuOTgsMS41NnMtMi40NS0uNTItMi45Ny0xLjU2Yy0uMjktLjU3LS40My0xLjM4LS40My0yLjQ0di00LjgzaDEuMThaIi8+PHBhdGggY2xhc3M9ImNscy0xMCIgZD0iTTI0OS4zNiw4Ny41N3YtMi4wNWgtMy42OHYtMS4wM2wzLjg0LTUuMzNoLjg5djUuNDRoMS4yNHYuOTJoLTEuMjR2Mi4wNWgtMS4wNVpNMjQ5LjM1LDg0LjZ2LTMuODFsLTIuNjksMy44MWgyLjY5WiIvPjxwYXRoIGNsYXNzPSJjbHMtMTAiIGQ9Ik0yNTMuMiw4Mi42NmMtLjMxLS4zMS0uNDYtLjcyLS40Ni0xLjIyLDAtLjYyLjIzLTEuMTYuNjgtMS42MXMxLjA5LS42NywxLjkzLS42NywxLjQzLjIxLDEuODkuNjRjLjQ2LjQyLjY4LjkyLjY4LDEuNDksMCwuNTItLjEzLjk1LS40LDEuMjctLjE1LjE4LS4zOC4zNi0uNjkuNTQuMzUuMTYuNjIuMzQuODIuNTUuMzcuMzkuNTYuOS41NiwxLjUyLDAsLjc0LS4yNSwxLjM2LS43NCwxLjg4cy0xLjIuNzctMi4xLjc3Yy0uODIsMC0xLjUxLS4yMi0yLjA3LS42N3MtLjg1LTEuMDktLjg1LTEuOTNjMC0uNS4xMi0uOTIuMzYtMS4yOXMuNi0uNjQsMS4wOC0uODNjLS4yOS0uMTItLjUyLS4yNy0uNjktLjQ0Wk0yNTYuNiw4Ni40NWMuMzItLjI2LjQ4LS42Ni40OC0xLjE4cy0uMTctLjk2LS41LTEuMjQtLjc2LS40Mi0xLjI4LS40Mi0uOTIuMTQtMS4yMy40My0uNDguNjgtLjQ4LDEuMTljMCwuNDQuMTUuODIuNDQsMS4xM3MuNzQuNDgsMS4zNS40OGMuNDksMCwuODktLjEzLDEuMjItLjRaTTI1Ni40LDgyLjNjLjI2LS4yNi4zOS0uNTcuMzktLjkzLDAtLjMxLS4xMi0uNi0uMzctLjg2LS4yNS0uMjYtLjYzLS4zOS0xLjE0LS4zOXMtLjg3LjEzLTEuMS4zOWMtLjIzLjI2LS4zNC41Ny0uMzQuOTIsMCwuNC4xNS43LjQ0LjkzLjI5LjIyLjY0LjMzLDEuMDQuMzMuNDYsMCwuODMtLjEzLDEuMDktLjM5WiIvPjxwYXRoIGNsYXNzPSJjbHMtMTAiIGQ9Ik05Ni45LDkzLjcyaDEuMTh2OC42MWgtMS4xOHYtOC42MVoiLz48cGF0aCBjbGFzcz0iY2xzLTEwIiBkPSJNOTkuODMsOTYuMDVoMXYuODljLjMtLjM3LjYxLS42My45NC0uNzlzLjctLjI0LDEuMTEtLjI0Yy44OSwwLDEuNDkuMzEsMS44LjkzLjE3LjM0LjI2LjgzLjI2LDEuNDZ2NC4wM2gtMS4wN3YtMy45NmMwLS4zOC0uMDYtLjY5LS4xNy0uOTMtLjE5LS4zOS0uNTMtLjU5LTEuMDItLjU5LS4yNSwwLS40Ni4wMy0uNjIuMDgtLjI5LjA5LS41NC4yNi0uNzYuNTItLjE4LjIxLS4yOS40Mi0uMzQuNjRzLS4wOC41NC0uMDguOTV2My4yOWgtMS4wNXYtNi4yOFoiLz48cGF0aCBjbGFzcz0iY2xzLTEwIiBkPSJNMTA2LjcxLDk0LjNoMS4wN3YxLjc1aDF2Ljg2aC0xdjQuMWMwLC4yMi4wNy4zNy4yMi40NC4wOC4wNC4yMi4wNi40MS4wNi4wNSwwLC4xMSwwLC4xNiwwcy4xMywwLC4yMS0uMDJ2Ljg0Yy0uMTIuMDQtLjI1LjA2LS4zOC4wOHMtLjI3LjAyLS40Mi4wMmMtLjQ5LDAtLjgzLS4xMy0xLS4zOHMtLjI2LS41OC0uMjYtLjk4di00LjE1aC0uODV2LS44NmguODV2LTEuNzVaIi8+PHBhdGggY2xhc3M9ImNscy0xMCIgZD0iTTExMy43MSw5Ni4yMmMuNDIuMjEuNzMuNDguOTUuODEuMjEuMzIuMzUuNjkuNDIsMS4xMS4wNi4yOS4wOS43NS4wOSwxLjM4aC00LjU2Yy4wMi42NC4xNywxLjE1LjQ1LDEuNTQuMjguMzkuNzEuNTgsMS4zLjU4LjU1LDAsLjk4LS4xOCwxLjMxLS41NS4xOC0uMjEuMzEtLjQ2LjM5LS43NGgxLjA0Yy0uMDMuMjMtLjEyLjQ5LS4yNy43N3MtLjMzLjUxLS41Mi42OWMtLjMyLjMxLS43MS41Mi0xLjE4LjYzLS4yNS4wNi0uNTQuMDktLjg1LjA5LS43OCwwLTEuNDMtLjI4LTEuOTctLjg1LS41NC0uNTctLjgxLTEuMzYtLjgxLTIuMzlzLjI3LTEuODMuODItMi40NmMuNTQtLjYzLDEuMjUtLjk0LDIuMTMtLjk0LjQ0LDAsLjg3LjEsMS4yOS4zMVpNMTE0LjA5LDk4LjY5Yy0uMDQtLjQ2LS4xNC0uODItLjMtMS4xLS4yOS0uNTEtLjc3LS43Ni0xLjQ0LS43Ni0uNDgsMC0uODguMTctMS4yMS41MnMtLjUuNzktLjUyLDEuMzNoMy40NloiLz48cGF0aCBjbGFzcz0iY2xzLTEwIiBkPSJNMTE2LjU0LDkzLjcyaDEuMDV2OC42MWgtMS4wNXYtOC42MVoiLz48cGF0aCBjbGFzcz0iY2xzLTEwIiBkPSJNMTE5LjQsOTYuMjJjLjIyLS4wNC4zOC0uMTYuNDktLjM2cy4xNy0uNDUuMTctLjcxYzAtLjAzLDAtLjA1LDAtLjA3czAtLjA1LS4wMS0uMDdoLS42NHYtMS4yOGgxLjI1djEuMThjMCwuNS0uMS45Mi0uMzEsMS4yN3MtLjUyLjU1LS45NC42di0uNTVaIi8+PHBhdGggY2xhc3M9ImNscy0xMCIgZD0iTTEyMi4yNiwxMDAuMzZjLjAzLjM1LjEyLjYyLjI3LjgxLjI3LjM0Ljc0LjUxLDEuNDEuNTEuNCwwLC43NS0uMDgsMS4wNS0uMjVzLjQ1LS40My40NS0uNzljMC0uMjctLjEyLS40Ny0uMzYtLjYyLS4xNS0uMDktLjQ2LS4xOS0uOTItLjNsLS44NS0uMjFjLS41NC0uMTMtLjk0LS4yOC0xLjItLjQ1LS40Ni0uMjktLjY5LS42OC0uNjktMS4xOCwwLS41OS4yMi0xLjA3LjY1LTEuNDQuNDMtLjM3LDEuMDItLjU1LDEuNzUtLjU1Ljk2LDAsMS42NS4yOCwyLjA3LjgzLjI3LjM1LjM5LjczLjM5LDEuMTRoLTFjLS4wMi0uMjQtLjExLS40NS0uMjYtLjY1LS4yNS0uMjgtLjY4LS40MS0xLjI5LS40MS0uNDEsMC0uNzIuMDgtLjkzLjIzcy0uMzEuMzUtLjMxLjZjMCwuMjcuMTQuNDkuNDEuNjUuMTYuMS4zOS4xOC43LjI2bC43MS4xN2MuNzcuMTgsMS4yOS4zNiwxLjU1LjUzLjQxLjI3LjYyLjY5LjYyLDEuMjdzLS4yMSwxLjA0LS42NCwxLjQ1Yy0uNDMuNDEtMS4wOC42MS0xLjk2LjYxLS45NCwwLTEuNjEtLjIxLTIuMDEtLjY0cy0uNi0uOTUtLjYzLTEuNTdoMS4wMVoiLz48cGF0aCBjbGFzcz0iY2xzLTEwIiBkPSJNMTMxLjExLDkzLjcyaDEuMTd2Ny41OGg0LjMydjEuMDNoLTUuNDh2LTguNjFaIi8+PHBhdGggY2xhc3M9ImNscy0xMCIgZD0iTTE0MC4yOCw5My43MmgxLjMybDMuMTIsOC42MWgtMS4yOGwtLjg3LTIuNThoLTMuNGwtLjkzLDIuNThoLTEuMmwzLjI0LTguNjFaTTE0Mi4yLDk4LjhsLTEuMzEtMy44LTEuMzksMy44aDIuN1oiLz48cGF0aCBjbGFzcz0iY2xzLTEwIiBkPSJNMTQ1Ljc2LDkzLjcyaDEuNjdsMi40OCw3LjI4LDIuNDYtNy4yOGgxLjY2djguNjFoLTEuMTF2LTUuMDhjMC0uMTgsMC0uNDcuMDEtLjg3cy4wMS0uODQuMDEtMS4zMWwtMi40Niw3LjI2aC0xLjE2bC0yLjQ4LTcuMjZ2LjI2YzAsLjIxLDAsLjUzLjAyLjk2cy4wMi43NS4wMi45NXY1LjA4aC0xLjExdi04LjYxWiIvPjxwYXRoIGNsYXNzPSJjbHMtMTAiIGQ9Ik0xNjAuMzcsOTMuNzJ2NS4zMmMwLC42Mi4xMiwxLjE0LjM1LDEuNTYuMzUuNjIuOTQuOTQsMS43Ny45NCwxLDAsMS42Ny0uMzQsMi4wMy0xLjAxLjE5LS4zNy4yOS0uODYuMjktMS40OHYtNS4zMmgxLjE4djQuODNjMCwxLjA2LS4xNCwxLjg3LS40MywyLjQ0LS41MywxLjA0LTEuNTIsMS41Ni0yLjk4LDEuNTZzLTIuNDUtLjUyLTIuOTctMS41NmMtLjI5LS41Ny0uNDMtMS4zOC0uNDMtMi40NHYtNC44M2gxLjE4WiIvPjxwYXRoIGNsYXNzPSJjbHMtMTAiIGQ9Ik0xNjguMzUsMTAwLjE5Yy4wNy42LjM1LDEuMDIuODQsMS4yNS4yNS4xMi41NC4xOC44Ny4xOC42MiwwLDEuMDktLjIsMS4zOS0uNnMuNDUtLjg0LjQ1LTEuMzJjMC0uNTktLjE4LTEuMDQtLjU0LTEuMzZzLS43OS0uNDgtMS4yOS0uNDhjLS4zNiwwLS42Ny4wNy0uOTMuMjFzLS40OC4zNC0uNjcuNTlsLS45MS0uMDUuNjQtNC41Mmg0LjM2djEuMDJoLTMuNTdsLS4zNiwyLjMzYy4yLS4xNS4zOC0uMjYuNTYtLjMzLjMxLS4xMy42Ny0uMTksMS4wOC0uMTkuNzcsMCwxLjQyLjI1LDEuOTYuNzRzLjgsMS4xMi44LDEuODktLjI1LDEuNDktLjc0LDIuMS0xLjI3LjkxLTIuMzUuOTFjLS42OCwwLTEuMjktLjE5LTEuODEtLjU4cy0uODItLjk4LS44OC0xLjc3aDEuMVoiLz48cGF0aCBjbGFzcz0iY2xzLTEwIiBkPSJNMTc5LjgyLDk0LjA3di45MmMtLjI3LjI2LS42My43Mi0xLjA4LDEuMzdzLS44NCwxLjM1LTEuMTksMi4xYy0uMzQuNzMtLjYsMS40LS43NywyLS4xMS4zOS0uMjYsMS4wMS0uNDQsMS44N2gtMS4xN2MuMjctMS42Ljg1LTMuMiwxLjc2LTQuNzguNTQtLjkzLDEuMS0xLjczLDEuNjktMi40MWgtNC42NHYtMS4wNmg1Ljg0WiIvPjwvc3ZnPg=="/></div>
	<p>Generally programmer can consider low-bits used for alignment to be safely used for storing an information. Upper bits are available on different platforms under different conditions (runtime processor setting, CPU generation, ...). This proposal is trying to make a design which will allow vendors to provide their own extension to access this functionality while allowing interop with standard code.</p>
	<p>These extensions brings a major adventage as they allow to dereferencing a tagged pointer without any actual unmasking. This approach has performance advantage, but the major usage for pointer tagging is <a href="https://www.linaro.org/blog/top-byte-ignore-for-fun-and-memory-savings/">memory size / throughput limitations</a>, not <a href="https://coredumped.dev/2024/09/09/what-is-the-best-pointer-tagging-method/">CPU performance</a>. Interface of this proposal has a such fast-path provided.</p>
	<h3 id="usecases"><a href="#usecases">Use-cases</a></h3>
	<p>There are three basic use-cases:</p>
	<ul>
		<li>marking pointer with an information (in allocators, used as a tiny refcount, or marking source of the pointer)</li>
		<li>pointee polymorphism (usually in data structures, eg. in trees: next node can be an internal node or a leaf)</li>
		<li>in-place polymorphism (similarly as variant, some bits stores an information about rest of payload, it can be a pointer, a number, a small string, ...)</li>
	</ul>
  <p>This paper aims to solve first two use-cases and give tools to build the third use-case safely to users.</p>
	<h3 id="safety"><a href="#safety">Safety</a></h3>
	<p>Pointer tagging is currently implementable only with <code>reinterpret_cast</code> bit manipulating pointers and is prone to be unsafe and hard to debug as it's not expressed clearly in code what is the intention. By giving a name to the tool it allows programmer to express intent clearly and compiler to diagnose better.</p>
	<p>Any unsafe operation like accessing raw tagged pointer or not unmasked but valid pointer must be clearly visible in the code, this proposal is trying to keep these points visible.</p>
	
	<h2 id="examples"><a href="#examples">Examples</a></h3>
	<p>Following example is a recursive search implementation for a <a href="https://en.wikipedia.org/wiki/Hash_array_mapped_trie">HAMT (hash-array-mapped-trie)</a> data structure. Where a tag value indicates leaf node.</p>
	<pre><code class="language-cpp">// requesting only 1 bit of information
using hamt_node_pointer = std::pointer_tag_pair&lt;const void, bool, 1&gt;;
static_assert(sizeof(hamt_node_pointer) == sizeof(void *));

constexpr const T * find_value_in_hamt(hamt_node_pointer tptr, uint32_t hash) {
	if (tptr == nullptr) // checks only pointer part
		return nullptr;
	
	if (tptr.tag()) // we found leaf node, tag is boolean as specified
		return *static_cast&lt;const T *&gt;(tptr.pointer());
	
	const auto * node = static_cast&lt;const internal_node *&gt;(tptr.pointer());
	const auto next_node = node[hash & 0b1111u];
	
	return find_value_in_hamt(next_node, hash >> 4); // recursive descend
}</code></pre>
  <p>This example shows <code>maybe_owning_ptr</code> type which can be both a reference or an owner:</p>
  <pre><code class="language-cpp">template &lt;typename T&gt; class maybe_owning_ptr {
  enum class ownership {
    reference,
    owning,
  };
  
  std::pointer_tag_pair&lt;T, ownership, 1&gt; _ptr;
public:
  constexpr maybe_owning_ptr(T* && pointer) noexcept: _ptr{pointer, ownership::owning} { }
  constexpr maybe_owning_ptr(T & ref) noexcept: _ptr{&ref, ownership::reference} { }
  
  constexpr decltype(auto) operator*() const noexcept {
    return *_ptr.pointer();
  }
  
  constexpr T * operator->() const noexcept {
    return _ptr.pointer();
  }
  
  constexpr ~maybe_owning_ptr() noexcept {
    if (_ptr.tag() == ownership::owning) {
      delete _ptr.pointer();
    }
  }
};

static_assert(sizeof(maybe_owning_ptr&lt;int&gt;) == sizeof(int *));</code></pre>
	<h2 id="implementation-experience"><a href="#wording">Implementation experience</a></h2>
	<p>Old version of this proposal has been implemented within libc++ &amp; clang and it is accessible on <a href="https://github.com/llvm/llvm-project/pull/111861">github</a> and compiler explorer. This functionality can't be implemented as a pure library and needs compiler support in some form.</p> 
	<p>Updated version is strictly subset of of the old version.</p>
	<h3 id="library-part"><a href="#library-part">Implementation in the library</a></h3>
	<p>Library is providing a special pair-lie type containing pointer and small tag type, and user requested number of bits.</p>
	<p>In terms of library design there is nothing surprising, and it's pretty straightforward wrapper which encode and decode tagged pointer on its boundaries and provides basic pointer functionality.</p>
	<h4 id="accesing-raw-pointers"><a href="#accesing-raw-pointers">Accessing raw tagged pointers</a></h4>
	<p>Library has support to access <em>dirty</em>. <em>Dirty pointer</em> is a pointer which can't be dereferenced or otherwise manipulated with, it's an opaque value usable only with legacy tagging interface or it can be used to construct <code>pointer_tag_pair</code> back from it. Existence of this interface allows ability to store such pointers in existing interfaces (atomic, other smart pointers).</p>
	<h3 id="compiler-part"><a href="#compiler-part">Implementation in the compiler</a></h3>
	<p>The implementation is providing C-like builtins to manipulating raw pointers and isn't mean to be used by end-users, only to allow library functionality.</p>
	<h4 id="compiler-interaction"><a href="#compiler-interaction">Compiler builtins</a></h4>
	<p>Implementation needs to manipulate pointers without casting them to integers and back. To do so the provided set of builtins is designed to store/load a value (with size of few bits) into/from unimportant/unused bits of a pointer without revealing actual pointer representation.</p>
	<h4 id="constexpr-support"><a href="#constexpr-support">Constexpr support</a></h4>
	<p>These builints are trivial to implement semanticaly identical behaviour for the constant evaluation. Pointers in clang are not represented as addresses but as symbols (original AST variable, allocation, static object + path to subobject, its provenance), there is no address to manipulate. Actual tag value in "pointer" is stored in a metadata of the pointer itself and builtins only provide access to it.</p>
	<p>Any attempt to deference or otherwise manipulate such pointer, which would be unsafe in runtime, is detected and reported by the interpreter. Only the provided builtins can access original pointer and tag value.</p>
	<h4 id="runtime"><a href="#runtime">Provenance</a></h4>
	<p>Easiest way to implement builtins for pointer tagging is to do the same thing <code>reinterpret_cast</code> is doing, which was my first implementation approach. But this approach leads to loosing pointer's provenance and compiler loosing information which otherwise should be accessible for optimizer to use.</p>
	<p>For unmasking there is already <code>ptr.mask</code> LLVM's builtin, but there is no similar intrinsic to do the tagging. Hence the builtins needs to interact with backend and be implemented with a low level backend intrinsic to do the right thing. This shows how actually unimplementable pointer tagging is in existing language.</p>
	<h4 id="alternative-constexpr-approach"><a href="#alternative-constexpr-approach">Alternative constexpr approach</a></h4>
	<p>Alternative way to implement <code>constexpr</code> support (for compiler which don't have heavy pointer representation in their interprets) is inserting a hidden intermediate object holding the metadata and pointer to original object. This allows exactly same semantic as the metadata approach.</p>
	<h2 id="design"><a href="#design">Design of the proposed functionality</a></h2>
	<p>Simple pointer like pair storing information in "free" bits in a pointer, the storage is done in an unspecified way, but implementations are required to keep size of the object same as the underlying pointer type.</p>
	<pre><code class="language-cpp">template &lt;typename Pointee, typename TagType, unsigned Bits&gt; class pointer_tag_pair {
public:
	using clean_pointer = Pointee *;
	using dirty_pointer = void *;
	using tag_type = TagType;
	
private:
	/* unspecified */ _pointer{nullptr}; // required to have size same as sizeof(Pointee *)

public:
	// constructors
	pointer_tag_pair() = default;
	constexpr pointer_tag_pair(nullptr_t) noexcept;
	pointer_tag_pair(const pointer_tag_pair &) = default;
	pointer_tag_pair(pointer_tag_pair &&) = default;
	
	// to construct from already tagged pointer from external facility
	pointer_tag_pair(std::already_tagged_t, dirty_pointer ptr) noexcept; // no constexpr
	
	// to store and tag pointer (only if eligible)
	constexpr pointer_tag_pair(clean_pointer ptr, tag_type tag) noexcept;
	
	// to store and tag pointer for over-aligned pointers which wouldn't be eligible otherwise
	template &lt;size_t Alignment&gt; constexpr pointer_tag_pair(std::overaligned_pointer_t&lt;Alignment&gt;, clean_pointer ptr, tag_type tag) noexcept;
	
	// destructor
	~pointer_tag_pair() = default;
	
	// accessors
	dirty_pointer unsafe_tagged_pointer() const noexcept; // no constexpr
	constexpr clean_pointer pointer() const noexcept;
	constexpr tag_type tag() const noexcept;
	
	// support for tuple protocol to access [pointer(), tag()]
	template &lt;size_t I&gt; friend constexpr decltype(auto) get(pointer_tag_pair _pair) noexcept; 
	
	// swap
	friend constexpr void swap(pointer_tag_pair & lhs, pointer_tag_pair & rhs) noexcept;
	
	// comparing {pointer(), tag()} &lt;=&gt; {pointer(), tag()} for consistency
	friend constexpr auto operator&lt;=&gt;(pointer_tag_pair lhs, pointer_tag_pair rhs) noexcept {
		// comparison equivalent to (but not actually needing tuple)
		return std::tuple{lhs.pointer(), lhs.tag()} &lt;=&gt; std::tuple{rhs.pointer(), rhs.tag()};
	}
	friend bool operator==(pointer_tag_pair, pointer_tag_pair) = default;
};

struct already_tagged_t { };
constexpr auto already_tagged = already_tagged_t{};

template &lt;unsigned Alignment&gt; struct overaligned_pointer_t { };
template &lt;unsigned Alignment&gt; constexpr auto overaligned_pointer = overaligned_pointer_t&lt;Alignment&gt;{};
</code></pre>
  <h4 id="additional-constructor-safety"><a href="#additional-constructor-safety">Preconditions and eligibility of constructors</a></h3>
  <p>In addition to static safety checks, constructors will have preconditions requiring the original pointer to be recoverable with call of <code>.pointer()</code> and tag of identical value to be recoverable with call of <code>.tag()</code></p>

<h3 id="tuple-protocol"><a href="#tuple-protocol">tuple protocol</a></h3>
<pre><code class="language-cpp">// support for tuple protocol so we can split tagged pointer to structured bindings:
// auto [ptr, tag] = pointer_tag_pair;
template &lt;typename _T, typename _Tag, unsigned _Bits&gt;
struct tuple_size&lt;pointer_tag_pair&lt;_T, _Tag, _Bits&gt;&gt;: std::integral_constant&lt;std::size_t, 2&gt; {};

template &lt;std::size_t I, typename _T, typename _Tag, unsigned _Bits&gt;
struct tuple_element&lt;I, pointer_tag_pair&lt;_T, _Tag, _Bits&gt;&gt; {
  using _pair_type = pointer_tag_pair&lt;_T, _Tag, _Bits&gt;;
  using type = std::conditional_t&lt;I == 0, typename _pair_type::clean_pointer, typename _pair_type::tag_type&gt;;
};
</code></pre>
	<h2 id="impact-on-existing-code"><a href="#impact-on-existing-code">Impact on existing code</a></h2>
	<p>None, this is purely an API extension. It allows to express semantic clearly for a compiler instead of using an unsafe <code>reinterpret_cast</code> based techniques. Integral part of the proposed design is ability to interact with such existing code and migrate away from it.</p>
	<h2 id="wording"><a href="#wording">Proposed changes to wording</a></h2>
	<p>TBD after design review.</p>
	
	<h3 id="feature-test-macro">Feature test macro</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_pointer_tag_pair 2024??L</code></span>
	</div>
	</div>
</div></div></article>
</div><script>
	hljs.addPlugin(mergeHTMLPlugin);
	hljs.highlightAll();
</script>
</body>
</html>
