<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>P3125R1: constexpr pointer tagging</title>
<link rel="stylesheet" href="data:text/css;base64,LypAbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKSB7Cgk6cm9vdCB7CgkJLS10ZXh0LWNvbG9yOiAjQkJCOwoJCS0tZm91bmQtaGlnaGxpZ2h0OiBibHVlOwoJCS0tZm91bmQtdGV4dC1jb2xvcjogd2hpdGU7CgkJLS1tYWluLWJhY2tncm91bmQ6IDMyLDMyLDMyOwoJCS0taGVhZGVyLWNvbG9yOiB3aGl0ZTsKCQktLWJveC1zaGFkb3ctY29sb3I6IHJnYmEoMCwwLDAsMC41KTsKICAgIC0tdGhpbi1ib3gtc2hhZG93LWNvbG9yOiByZ2JhKDAsMCwwLDAuMSk7CgkJLS1uYXYtYmFja2dyb3VuZC1jb2xvcjogIzEwMTAxMDsKCQktLWNvZGUtZm9yZWdyb3VuZC1jb2xvcjogd2hpdGU7CgkJLS1jb2RlLWluZm8tY29sb3I6IHJnYmEoMjU1LDI1NSwyNTUsMC4xKTsKCQktLWNvZGUtYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbmF2LWJhY2tncm91bmQtY29sb3IpOwoJCS0tbGluay1jb2xvcjogIzhlZjNmZjsKCQktLXZpc2l0ZWQtbGluay1jb2xvcjogI2YwZmY4OTsKCQktLWhvdmVyLWxpbmstY29sb3I6ICNiM2Y3ZmY7CgkJLS1ob3Zlci12aXNpdGVkLWxpbmstY29sb3I6ICNjOGZmYjM7CgkJLS1saW5lLWNvbG9yOiAyNTUsMjU1LDI1NTsKCQktLWhlYWRlci1iYWNrZ3JvdW5kOiAwLDAsMDsKCQktLXF1b3RlLWxlZnQtY29sb3I6IHJnYmEoMjU1LDI1NSwyNTUsMC41KTsKCQktLWhpZ2hsaWdodDogcmdiYSgyNTUsMjUyLDAsMC4yNSk7Cgl9Cgk6OnNlbGVjdGlvbiB7CgkgIGNvbG9yOiBibGFjazsKCSAgYmFja2dyb3VuZDogbGlnaHR5ZWxsb3c7Cgl9Cn0qLwoKQG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTogbGlnaHQpIHsKCTpyb290IHsKCQktLXRleHQtY29sb3I6IGJsYWNrOwoJCS0tZm91bmQtaGlnaGxpZ2h0OiB5ZWxsb3c7CgkJLS1mb3VuZC10ZXh0LWNvbG9yOiBibGFjazsKCQktLW1haW4tYmFja2dyb3VuZDogMjU1LDI1NSwyNTU7CgkJLS1oZWFkZXItY29sb3I6IGJsYWNrOwoJCS0tYm94LXNoYWRvdy1jb2xvcjogcmdiYSgwLDAsMCwwLjMpOwogICAgLS10aGluLWJveC1zaGFkb3ctY29sb3I6IHJnYmEoMCwwLDAsMC4xKTsKCQktLW5hdi1iYWNrZ3JvdW5kLWNvbG9yOiAjRjVGNUY1OwoJCS0tY29kZS1mb3JlZ3JvdW5kLWNvbG9yOiBibGFjazsKCQktLWNvZGUtaW5mby1jb2xvcjogcmdiYSgwLDAsMCwwLjEpOwoJCS0tY29kZS1iYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1uYXYtYmFja2dyb3VuZC1jb2xvcik7CgkJLS1saW5rLWNvbG9yOiAjMDAwMDgyOwoJCS0tdmlzaXRlZC1saW5rLWNvbG9yOiAjNTA4ZDBmOwoJCS0taG92ZXItbGluay1jb2xvcjogIzU3NTdjMjsKCQktLWhvdmVyLXZpc2l0ZWQtbGluay1jb2xvcjogIzk0YzU2MDsKCQktLWxpbmUtY29sb3I6IDEyLDQzLDc1OwoJCS0taGVhZGVyLWJhY2tncm91bmQ6IDAsMCwwOwoJCS0tcXVvdGUtbGVmdC1jb2xvcjogcmdiYSgwLDAsMCwwLjUpOwoJCS0taGlnaGxpZ2h0OiByZ2JhKDI1NSwyNTQsMjA3LDAuNSk7Cgl9Cgk6OnNlbGVjdGlvbiB7CgkgIGNvbG9yOiBibGFjazsKCSAgYmFja2dyb3VuZDogI2E0YzNmNjsKCX0KfQoKc3Bhbjp0YXJnZXQsIHA6dGFyZ2V0LCBsaTp0YXJnZXQsIGRpdjp0YXJnZXQgewogIGJhY2tncm91bmQ6IHZhcigtLWhpZ2hsaWdodCk7Cn0KCi5uYW1lLW9mLXBhcGVyIHsKCWZvbnQtc2l6ZTogMjhweDsKCXBhZGRpbmctdG9wOiAwLjVlbTsKfQoKc3Bhbi5mb3VuZCB7Cgl0ZXh0LXNoYWRvdzogMCAwIDEwcHggdmFyKC0tZm91bmQtaGlnaGxpZ2h0KSwgIDAgMCAxMHB4IHZhcigtLWZvdW5kLWhpZ2hsaWdodCksICAwIDAgMTBweCB2YXIoLS1mb3VuZC1oaWdobGlnaHQpLCAgMCAwIDEwcHggdmFyKC0tZm91bmQtaGlnaGxpZ2h0KTsKCWNvbG9yOiB2YXIoLS1mb3VuZC10ZXh0LWNvbG9yKSAhaW1wb3J0YW50Owp9Cgpib2R5IHsKCWZvbnQtZmFtaWx5OiBIZWx2ZXRpY2E7CglwYWRkaW5nOiAwOwoJbWFyZ2luOiAwOwoJb3ZlcmZsb3c6IGhpZGRlbjsKCWNvbG9yOiB2YXIoLS10ZXh0LWNvbG9yKTsKCWJhY2tncm91bmQtY29sb3I6IHJnYmEodmFyKC0tbWFpbi1iYWNrZ3JvdW5kKSwgMSk7Cn0KCmJvZHkgPiBkaXYgewoJZGlzcGxheTogZmxleDsKCXBhZGRpbmc6IDA7CgltYXJnaW46IDA7Cn0KCi5oaWRlLW9uLW5hcnJvdyB7CglkaXNwbGF5OiBpbmhlcml0Owp9CgouaGlkZS1vbi13aWRlIHsKCWRpc3BsYXk6IG5vbmU7Cn0KCkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogMTEwMHB4KSB7Cglib2R5IHsKCQlvdmVyZmxvdzogaW5oZXJpdCAhaW1wb3J0YW50OwoJfQoJLmhpZGUtb24tbmFycm93IHsKCQlkaXNwbGF5OiBub25lOwoJfQoJLmhpZGUtb24td2lkZSB7CgkJZGlzcGxheTogaW5oZXJpdDsKCX0KCWJvZHkgPiBkaXYgewoJCWRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7Cgl9CglhcnRpY2xlIHsKCQlvdmVyZmxvdzogaW5oZXJpdCAhaW1wb3J0YW50OwoJCWJhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudCh0byByaWdodCwgdHJhbnNwYXJlbnQscmdiYSh2YXIoLS1tYWluLWJhY2tncm91bmQpLDAuNiksIHJnYmEodmFyKC0tbWFpbi1iYWNrZ3JvdW5kKSwwLjgpLCByZ2JhKHZhcigtLW1haW4tYmFja2dyb3VuZCksMC42KSwgdHJhbnNwYXJlbnQpICFpbXBvcnRhbnQ7Cgl9CgluYXYsIGFydGljbGUgewoJCWZsZXg6IGluaXRpYWwgIWltcG9ydGFudDsKCX0KCW5hdiB7CgkJbWluLXdpZHRoOiBpbml0aWFsICFpbXBvcnRhbnQ7CgkJbWF4LXdpZHRoOiBpbml0aWFsICFpbXBvcnRhbnQ7CgkJbWluLWhlaWdodDogaW5pdGlhbCAhaW1wb3J0YW50OwoJCW1heC1oZWlnaHQ6IGluaXRpYWwgIWltcG9ydGFudDsKCQlib3gtc2hhZG93OiAwIDEwcHggMCB2YXIoLS1ib3gtc2hhZG93LWNvbG9yKTsKCX0KCW5hdiA+IGRpdiB7CgkJb3ZlcmZsb3c6IGluaGVyaXQgIWltcG9ydGFudDsKCQlwb3NpdGlvbjogcmVsYXRpdmUgIWltcG9ydGFudDsKCQltYXgtd2lkdGg6IGluaXRpYWwgIWltcG9ydGFudDsKCQltYXgtaGVpZ2h0OiBpbml0aWFsICFpbXBvcnRhbnQ7Cgl9CglkaXY6aGFzKD4gaW5wdXRbdHlwZT1zZWFyY2hdKSB7CgkJZGlzcGxheTogbm9uZTsKCX0KCWRpdi5xdW90ZSB7CgkJb3ZlcmZsb3cteDogc2Nyb2xsOwoJCW92ZXJmbG93LXk6IHZpc2libGU7Cgl9Cn0KCm5hdiB7CglwYWRkaW5nOiAwIDAuNWVtOwoJbWFyZ2luOiAwOwoJZmxleDogMSAxIDA7CgltaW4td2lkdGg6IDM1MHB4OwoJbWF4LXdpZHRoOiAzNTBweDsKCWJveC1zaGFkb3c6IDAgMCAxMHB4IHZhcigtLWJveC1zaGFkb3ctY29sb3IpOwoJYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbmF2LWJhY2tncm91bmQtY29sb3IpOwp9CgpuYXYgPiBkaXYgewoJcG9zaXRpb246IGZpeGVkOwoJbWF4LXdpZHRoOiAzNTBweDsKCW1heC1oZWlnaHQ6IDEwMCU7CglvdmVyZmxvdzogc2Nyb2xsOwoJdG9wOiAwOwoJbGVmdDogMDsKCXBhZGRpbmc6IDAgMC41ZW07CgltYXJnaW46IDA7Cn0KCm5hdiA+IGRpdiA+IGRpdiB7CglwYWRkaW5nOiAwLjVlbTsKCXBhZGRpbmctdG9wOiAwOwoJcGFkZGluZy1ib3R0b206IDFlbTsKfQoKYXJ0aWNsZSB7CglmbGV4OiAzIDEgMDsKICBzY3JvbGwtYmVoYXZpb3I6IHNtb290aDsKCW92ZXJmbG93OiBzY3JvbGw7CgloZWlnaHQ6IDEwMHZoOwoJdGV4dC1hbGlnbjoganVzdGlmeTsKCWJhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHRyYW5zcGFyZW50LHJnYmEodmFyKC0tbWFpbi1iYWNrZ3JvdW5kKSwwLjYpLCByZ2JhKHZhcigtLW1haW4tYmFja2dyb3VuZCksMC44KSwgcmdiYSh2YXIoLS1tYWluLWJhY2tncm91bmQpLDAuNiksIHRyYW5zcGFyZW50KTsKCXBhZGRpbmc6IDA7CgltYXJnaW46IDA7Cn0KCmFydGljbGUgPiBkaXYgewoJcGFkZGluZy1yaWdodDogMS41ZW07CglwYWRkaW5nLWxlZnQ6IDEuNWVtOwoJcGFkZGluZy1ib3R0b206IDFlbTsKfQoKY29kZSB7CgkKfQoKZGl2LnF1b3RlIHsKCWNvbG9yOiB2YXIoLS1jb2RlLWZvcmVncm91bmQtY29sb3IpOwoJYmFja2dyb3VuZDogdmFyKC0tY29kZS1iYWNrZ3JvdW5kLWNvbG9yKTsKCXBhZGRpbmc6IDFlbTsKCWJvcmRlci1yYWRpdXM6IDBweCAxNXB4IDE1cHggMHB4OwoJYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCB2YXIoLS1xdW90ZS1sZWZ0LWNvbG9yKTsKCWZvbnQtc3R5bGU6IGl0YWxpYzsKCW1hcmdpbjogMWVtOwp9Cgpjb2RlOm5vdChwcmUgPiBjb2RlKSB7Cgljb2xvcjogaW5oZXJpdDsKCWJhY2tncm91bmQ6IHZhcigtLWNvZGUtYmFja2dyb3VuZC1jb2xvcik7Cglib3JkZXItcmFkaXVzOiA1cHg7CglwYWRkaW5nOiAwIDAuMmVtOwoJbWFyZ2luOiAwIDJweDsKCW91dGxpbmU6IDJweCBzb2xpZCB2YXIoLS1jb2RlLWJhY2tncm91bmQtY29sb3IpOwp9CgpwcmUgPiBjb2RlIHsKCW91dGxpbmU6IG5vbmU7CglsaW5lLWhlaWdodDogMS40OwoJdGFiLXNpemU6IDI7Cn0KCnByZTpoYXMoY29kZSkgewoJY29sb3I6IHZhcigtLWNvZGUtZm9yZWdyb3VuZC1jb2xvcik7CgliYWNrZ3JvdW5kOiB2YXIoLS1jb2RlLWJhY2tncm91bmQtY29sb3IpOwoJcGFkZGluZzogMWVtOwoJYm9yZGVyLXJhZGl1czogMTVweDsKCXBvc2l0aW9uOiByZWxhdGl2ZTsKCXotaW5kZXg6IDE7CglvdmVyZmxvdy14OiBzY3JvbGw7CglvdmVyZmxvdy15OiB2aXNpYmxlOwp9CgpwcmU6aGFzKGNvZGUubGFuZ3VhZ2UtY2FyYm9uKTo6YmVmb3JlIHsKCWNvbnRlbnQ6ICJDYXJib24iOwoJdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKCXBvc2l0aW9uOiBhYnNvbHV0ZTsKCXRvcDogMWVtOwoJcmlnaHQ6IDFlbTsKCWNvbG9yOiB2YXIoLS1jb2RlLWluZm8tY29sb3IpOwoJZm9udC13ZWlnaHQ6IGJvbGQ7Cn0KCnAsIHVsID4gbGkgewoJdGV4dC1hbGlnbjoganVzdGlmeTsKCW92ZXJmbG93LXdyYXA6IGJyZWFrLXdvcmQ7CgloeXBoZW5zOiBhdXRvOwp9CgphcnRpY2xlIHVsID4gbGkgewoJcGFkZGluZy1ib3R0b206IDAuMjVlbTsKfQoKZGl2LmRlc2NyaXB0aW9uIHVsIHsKICBwYWRkaW5nLXRvcDogMC41ZW07CglwYWRkaW5nLWJvdHRvbTogMC41ZW07Cn0KCmEgewoJY29sb3I6IHZhcigtLWxpbmstY29sb3IpOwoJdGV4dC1kZWNvcmF0aW9uLXN0eWxlOiBkb3R0ZWQ7Cn0KCmE6aG92ZXIgewoJY29sb3I6IHZhcigtLWhvdmVyLWxpbmstY29sb3IpOwoJdGV4dC1kZWNvcmF0aW9uLXN0eWxlOiBzb2xpZDsKfQoKYTp2aXNpdGVkIHsKCWNvbG9yOiB2YXIoLS12aXNpdGVkLWxpbmstY29sb3IpOwp9CgphOnZpc2l0ZWQ6aG92ZXIgewoJY29sb3I6IHZhcigtLWhvdmVyLXZpc2l0ZWQtbGluay1jb2xvcik7Cgl0ZXh0LWRlY29yYXRpb24tc3R5bGU6IHNvbGlkOwp9CgpoMSwgaDIsIGgzLCBoNCwgaDUgewoJbWFyZ2luOiAwOwoJbWFyZ2luLWJvdHRvbTogMTBweDsKCXBhZGRpbmc6IDAuNWVtOwoJcGFkZGluZy10b3A6IDIwcHg7CglwYWRkaW5nLWJvdHRvbTogMnB4OwoJei1pbmRleDogMjsKCWNvbG9yOiB2YXIoLS1oZWFkZXItY29sb3IpOwp9CgphcnRpY2xlIGgxLCBhcnRpY2xlIGgyLCBhcnRpY2xlIGgzLCBhcnRpY2xlIGg0LCBhcnRpY2xlIGg1IHsKLyoJcG9zaXRpb246IHN0aWNreTsKCXBvc2l0aW9uOiAtd2Via2l0LXN0aWNreTsKCXRvcDogMDsqLwoJCn0KCmgxIHsKCWZvbnQtd2VpZ2h0OiA4MDA7Cglib3JkZXItYm90dG9tOiByZ2JhKHZhcigtLWxpbmUtY29sb3IpLCAxKSBkb3R0ZWQgMnB4Owp9CgpoMiB7Cglmb250LXdlaWdodDogODAwOwoJYm9yZGVyLWJvdHRvbTogcmdiYSh2YXIoLS1saW5lLWNvbG9yKSwgMC43NSkgZG90dGVkIDJweDsKfQoKaDMsIGg0LCBoNSB7Cglmb250LXdlaWdodDogNjAwOwoJYm9yZGVyLWJvdHRvbTogcmdiYSh2YXIoLS1saW5lLWNvbG9yKSwgMC4zMykgZG90dGVkIDJweDsKfQoKaDEgPiBhLCBoMiA+IGEsIGgzID4gYSwgaDQgPiBhLCBoNSA+IGEgewoJY29sb3I6IGluaGVyaXQgIWltcG9ydGFudDsKCXRleHQtZGVjb3JhdGlvbjogaW5oZXJpdDsKfQoKaDE6dGFyZ2V0OjphZnRlciwgaDI6dGFyZ2V0OjphZnRlciwgaDM6dGFyZ2V0OjphZnRlciwgaDQ6dGFyZ2V0OjphZnRlciwgaDU6dGFyZ2V0OjphZnRlciB7Cgl0ZXh0LWRlY29yYXRpb246IGluaGVyaXQ7Cgljb250ZW50OiAiIOKak++4jiI7CiAgZm9udC1zaXplOiAxNHB4Owp9CgpoMSA+IGE6aG92ZXIsIGgyID4gYTpob3ZlciwgaDMgPiBhOmhvdmVyLCBoNCA+IGE6aG92ZXIsIGg1ID4gYTpob3ZlciB7Cgljb2xvcjogdmFyKC0taG92ZXItbGluay1jb2xvcik7Cn0KCmRpdjpoYXMoPiBpbnB1dFt0eXBlPXNlYXJjaF0pIHsKCXBvc2l0aW9uOiBmaXhlZDsKCXRvcDogMDsKCXJpZ2h0OiAwOwoJei1pbmRleDogMTAwMDsKCXBhZGRpbmc6IDAuNWVtOwoJYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbmF2LWJhY2tncm91bmQtY29sb3IpOwoJYm94LXNoYWRvdzogMCAwIDEwcHggcmdiYSgwLDAsMCwwLjMpOwoJYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogMTBweDsKfQoKZGl2ID4gaW5wdXRbdHlwZT1zZWFyY2hdIHsKCWJhY2tncm91bmQtY29sb3I6IHZhcigtLW5hdi1iYWNrZ3JvdW5kLWNvbG9yKTsKCWJvcmRlcjogMnB4IHNvbGlkIHZhcigtLXRleHQtY29sb3IpOwoJY29sb3I6IHZhcigtLXRleHQtY29sb3IpOwoJd2lkdGg6IDMwMHB4Owp9CgpkaXYucGFwZXItaW5mbyB7CglwYWRkaW5nOiAwOwoJcGFkZGluZy10b3A6IDFlbTsKCQoJLmtleSB7CgkJZm9udC13ZWlnaHQ6IGJvbGQ7Cgl9CgkKCWRpdiB7Cgl9Cn0KCnVsIHsKCXBhZGRpbmc6IDA7CgltYXJnaW46IDA7CglwYWRkaW5nLWxlZnQ6IDJlbTsKfQoKbGkgPiB1bCB7CglwYWRkaW5nLWxlZnQ6IDAuNWVtOwp9Cgp1bCA+IGxpIHsKCXBhZGRpbmctbGVmdDogMC41ZW07Cn0KCmNvZGUgLmVycm9yLCBjb2RlIC5iZWZvcmUgewoJCWxpbmUtaGVpZ2h0OiAxLjk7Cn0KCmNvZGUgLmVycm9yID4gKiwgY29kZSAuYmVmb3JlID4gKiB7CgliYWNrZ3JvdW5kLWNvbG9yOiAjRkY4ODg4ICFpbXBvcnRhbnQ7Cgljb2xvcjogYmxhY2sgIWltcG9ydGFudDsKCUBtZWRpYSAocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspIHsKCQljb2xvcjogd2hpdGU7Cgl9Cglib3JkZXI6IDNweCBzb2xpZCAjRkY4ODg4OwoJZm9udC13ZWlnaHQ6IGJvbGQ7Cn0KCmNvZGUgLmFmdGVyID4gKiB7CgliYWNrZ3JvdW5kLWNvbG9yOiBsaWdodGdyZWVuICFpbXBvcnRhbnQ7Cgljb2xvcjogYmxhY2sgIWltcG9ydGFudDsKCUBtZWRpYSAocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspIHsKCQljb2xvcjogd2hpdGU7Cgl9Cglib3JkZXI6IDNweCBzb2xpZCBsaWdodGdyZWVuOwoJZm9udC13ZWlnaHQ6IGJvbGQ7Cn0KCmNvZGUgLnVuY2hhbmdlZCA+ICogewoJYmFja2dyb3VuZC1jb2xvcjogbGlnaHR5ZWxsb3cgIWltcG9ydGFudDsKCWNvbG9yOiBibGFjayAhaW1wb3J0YW50OwoJQG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyaykgewoJCWNvbG9yOiB3aGl0ZTsKCX0KCWJvcmRlcjogM3B4IHNvbGlkIGxpZ2h0eWVsbG93OwoJZm9udC13ZWlnaHQ6IGJvbGQ7Cn0KCmNvZGUgLmludmlzaWJsZSB7Cgl2aXNpYmlsaXR5OiBoaWRkZW47Cn0KCi5jaGFuZ2VzIHsKCWRpc3BsYXk6IGlubGluZS1ibG9jazsKfQoKLndvcmRpbmcgaDEsIC53b3JkaW5nIGgyIHsKCWZvbnQtc2l6ZTogaW5oZXJpdDsKCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKCWJvcmRlcjogbm9uZTsKCXBhZGRpbmc6IDA7CgltYXJnaW46IDA7Cn0KCi53b3JkaW5nIHAgewoJcGFkZGluZzogMDsKCXBhZGRpbmctdG9wOiAwLjVlbTsKCW1hcmdpbjogMDsKfQoKLndvcmRpbmcgYSB7Cgl0ZXh0LWRlY29yYXRpb246IG5vbmU7Cgljb2xvcjogaW5oZXJpdDsKfQoKLndvcmRpbmcgYTpob3ZlciB7Cgl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKCWNvbG9yOiB2YXIoLS1saW5rLWNvbG9yKTsKfQoKLndvcmRpbmcgY29kZSB7CgliYWNrZ3JvdW5kOiBpbmhlcml0ICFpbXBvcnRhbnQ7Cglib3JkZXI6IG5vbmU7CglvdXRsaW5lOiBub25lOwp9CgkKLndvcmRpbmcgewoJZm9udC1mYW1pbHk6ICJOb3RvIFNlcmlmIjsKCQoJcGFkZGluZzogMC41ZW0gMWVtOwoJcGFkZGluZy1ib3R0b206IDFlbTsKCWNvbG9yOiB2YXIoLS1jb2RlLWZvcmVncm91bmQtY29sb3IpOwoJYmFja2dyb3VuZDogdmFyKC0tY29kZS1iYWNrZ3JvdW5kLWNvbG9yKTsKCWxpbmUtaGVpZ2h0OiAxLjU1OwoJCglib3JkZXItcmFkaXVzOiAxNXB4OwoJcG9zaXRpb246IHJlbGF0aXZlOwoJei1pbmRleDogMTsKCW92ZXJmbG93LXg6IHZpc2libGU7CglvdmVyZmxvdy15OiB2aXNpYmxlOwp9CgkKLndvcmRpbmcgLmFkZGVkLCBwcmUgLmFkZGVkIHsKCWJhY2tncm91bmQtY29sb3I6IGxpZ2h0Z3JlZW47CiAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgdGV4dC1kZWNvcmF0aW9uLWNvbG9yOiBncmVlbjsKICB0ZXh0LWRlY29yYXRpb24tdGhpY2tuZXNzOiAycHggIWltcG9ydGFudDsKCXotaW5kZXg6IDgwOwoJcGFkZGluZzogM3B4OwoJQG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyaykgewoJCWNvbG9yOiBibGFjazsKCX0KfQoJCi53b3JkaW5nIC5yZW1vdmVkIHsKCWJhY2tncm91bmQtY29sb3I6ICNGRjg4ODg7Cgl6LWluZGV4OiA1MDsKCXBhZGRpbmc6IDNweDsKICB0ZXh0LWRlY29yYXRpb246IGxpbmUtdGhyb3VnaDsKICB0ZXh0LWRlY29yYXRpb24tY29sb3I6IHJlZDsKICB0ZXh0LWRlY29yYXRpb24tdGhpY2tuZXNzOiAycHggIWltcG9ydGFudDsKCUBtZWRpYSAocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspIHsKCQljb2xvcjogYmxhY2s7Cgl9Cn0KCQoud29yZGluZyAubm90ZSB7Cglmb250LXNpemU6IDAuOGVtOwp9CgkKLndvcmRpbmcJKyAud29yZGluZyB7CgltYXJnaW4tdG9wOiAwLjVlbTsKfQoJCi53b3JkaW5nIHByZTpoYXMoY29kZSkgewoJYm9yZGVyOiAxcHggc29saWQgdmFyKC0tY29kZS1pbmZvLWNvbG9yKTsKCWJvcmRlci1yYWRpdXM6IDA7CglwYWRkaW5nOiAwZW07Cgl6LWluZGV4OiAxOwoJb3ZlcmZsb3cteDogc2Nyb2xsOwp9CgkKLndvcmRpbmcJY29kZSAuYWRkZWRlZCBzcGFuIHsKCWNvbG9yOiBibGFjayAhaW1wb3J0YW50Owp9Cgp0YWJsZS5wb2xsIHsKICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwogIG1hcmdpbi10b3A6IDIwcHg7Cn0KCnRhYmxlLnBvbGwgdGgsIHRhYmxlLnBvbGwgdGQgewogIGJvcmRlcjogMDsKICBwYWRkaW5nOiAwIDEwcHg7CiAgdGV4dC1hbGlnbjogY2VudGVyOwogIGJvcmRlcjogMnB4IHNvbGlkIHJnYmEoMTI4LDEyOCwxMjgsMC4yKTsKfQoKdGFibGUucG9sbCB0ZDpmaXJzdC1jaGlsZCwgdGFibGUucG9sbCB0aDpmaXJzdC1jaGlsZCB7CiBib3JkZXItbGVmdDogbm9uZTsKfQoKdGFibGUucG9sbCB0ZDpsYXN0LWNoaWxkLCB0YWJsZS5wb2xsIHRoOmxhc3QtY2hpbGQgewogYm9yZGVyLXJpZ2h0OiBub25lOwp9Cgp0YWJsZS5wb2xsIHRyOmZpcnN0LWNoaWxkIHRoLCB0YWJsZS5wb2xsIHRyOmZpcnN0LWNoaWxkIHRkIHsKICBib3JkZXItdG9wOiBub25lOwp9Cgp0YWJsZS5wb2xsIHRyOmxhc3QtY2hpbGQgdGgsIHRhYmxlLnBvbGwgdHI6bGFzdC1jaGlsZCB0ZCB7CiAgYm9yZGVyLWJvdHRvbTogbm9uZTsKfQoKLndvcmRpbmcgLmRlc2NyaXB0aW9uIHsKICBwYWRkaW5nLWJvdHRvbTogMWVtOwp9Cgoud29yZGluZyAuY2FwcyB7CiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKfQoKdGFibGUgdGgudGFibGUtZ3JvdXAgewoJbWF4LXdpZHRoOiAyZW07Cn0KCnRhYmxlIHRoLnRhYmxlLWdyb3VwID4gc3BhbiB7CgltYXgtd2lkdGg6IDJlbTsKCWRpc3BsYXk6IGJsb2NrOwoJb3ZlcmZsb3c6IHZpc2libGU7Cgl0ZXh0LWFsaWduOiBjZW50ZXI7Cgl0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMWVtKTsKfQoKdGFibGUgdGgudGFibGUtZ3JvdXAgPiBzcGFuID4gc3BhbiB7CglkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cgl0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSkgcm90YXRlKC05MGRlZyk7Cgl3aWR0aDogYXV0bzsKfQoKdGFibGUuYmVmb3JlLWFmdGVyIHRoLCB0YWJsZS5iZWZvcmUtYWZ0ZXIgdGQgIHsKICBoZWlnaHQ6IDMwcHg7Cn0KCgoKdGFibGUuYmVmb3JlLWFmdGVyIC5ncmVlbiB7CiAgY29sb3I6IGdyZWVuOwp9Cgp0YWJsZS5iZWZvcmUtYWZ0ZXIgLm9yYW5nZSB7CiAgY29sb3I6IG9yYW5nZTsKfQoKdGFibGUuYmVmb3JlLWFmdGVyIC5yZWQtbm9ybWFsIHsKICBjb2xvcjogcmVkOwp9Cgp0YWJsZS5iZWZvcmUtYWZ0ZXIgLmluLXByb2dyZXNzIHsKCWNvbG9yOiBibHVlOwoJYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLDIzMSwyNTUsMC41KTsKfQoKdGFibGUuYmVmb3JlLWFmdGVyIC5wcm9wb3NpbmcgewoJY29sb3I6IGdyZWVuOwoJYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLDI1NSwwLDAuNSk7Cn0KCnRhYmxlLmJlZm9yZS1hZnRlciAubm90LXByb3Bvc2luZyB7Cgljb2xvcjogcmVkOwoJYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsMCwwLDAuMjUpOwp9Cgp0YWJsZS5iZWZvcmUtYWZ0ZXIgLm5ldmVyLXByb3Bvc2luZyB7Cgljb2xvcjogcmVkOwoJYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsMCwwLDAuMjUpOwp9Cgp0YWJsZS5iZWZvcmUtYWZ0ZXIgLnByb3Bvc2VkLXJlYWR5LWZvci1mdXR1cmUgewoJY29sb3I6IGdyZWVuOwoJYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyMDMsMjI5LDcsMC41KTsKfQoKdGFibGUuYmVmb3JlLWFmdGVyIC5wcm9wb3NlZC1yZWFkeS1mb3ItZnV0dXJlMiB7Cgljb2xvcjogZ3JlZW47CgliYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI1NSwxOTgsMCwwLjUpOwp9Cgp0YWJsZS5iZWZvcmUtYWZ0ZXIgLnJlZCB7CiAgY29sb3I6IHJlZDsKICBmb250LXNpemU6IDI0cHg7CiAgbGluZS1oZWlnaHQ6IDE2cHg7Cn0KCnRkIGEsIHRkIGE6dmlzaXRlZCwgdGQgYTpob3ZlciB7Cgljb2xvcjogaW5oZXJpdDsKfQoKZGl2LndvcmRpbmctbm90ZSB7CiAgYmFja2dyb3VuZDogcmdiKHZhcigtLW1haW4tYmFja2dyb3VuZCkpOwogIGJveC1zaGFkb3c6IDVweCAwIDEwcHggdmFyKC0tdGhpbi1ib3gtc2hhZG93LWNvbG9yKSBpbnNldDsKICBib3JkZXItcmFkaXVzOiAxNXB4OwogIGNvbG9yOiB2YXIoLS10ZXh0LWNvbG9yKTsKICBwYWRkaW5nOiAxMHB4OwogIG1hcmdpbjogMTBweCAyMHB4OwogIGZvbnQtc2l6ZTogMTJweDsKfQoKLnBhcm51bSB7Cglmb250LXNpemU6IDEycHg7CgltYXJnaW4tcmlnaHQ6IDAuMjVlbTsKCWRpc3BsYXk6IGlubGluZS1ibG9jazsKfQoKbGk6aGFzKD4gLnBhcm51bSkgewoJbGlzdC1zdHlsZS1wb3NpdGlvbjogaW5zaWRlOwoJcG9zaXRpb246IHJlbGF0aXZlOwp9CgpsaSA+IC5wYXJudW0gewoJcG9zaXRpb246IGFic29sdXRlOwoJbGVmdDogLTMwcHg7Cglib3R0b206IDJweDsKfQoKdGFibGUuYmVmb3JlLWFmdGVyIHRkLmRpc2FibGUtYm90dG9tLCB0YWJsZS5iZWZvcmUtYWZ0ZXIgdGguZGlzYWJsZS1ib3R0b20gewoJYm9yZGVyLWJvdHRvbTogbm9uZTsKfQp0YWJsZS5iZWZvcmUtYWZ0ZXIgdGgubGVmdCwgdGFibGUuYmVmb3JlLWFmdGVyIHRkLmxlZnQgewoJdGV4dC1hbGlnbjogbGVmdDsKfQoKdGQgYS5ub3RlOmFmdGVyIHsKCXZlcnRpY2FsLWFsaWduOiBzdXBlcjsKCWZvbnQtc2l6ZTogNzUlOwoJbWFyZ2luLWxlZnQ6IDAuNWVtOwp9Cgp0ZCBhLm5vdGUubjE6YWZ0ZXIgewoJY29udGVudDogIjEiOwp9Cgp0ZCBhLm5vdGUubjI6YWZ0ZXIgewoJY29udGVudDogIjIiOwp9Cgp0ZCBhLm5vdGUubjM6YWZ0ZXIgewoJY29udGVudDogIjMiOwp9Cgp0ZCBhLm5vdGUubjQ6YWZ0ZXIgewoJY29udGVudDogIjQiOwp9Cgp0ZCBhLm5vdGUubjU6YWZ0ZXIgewoJY29udGVudDogIjUiOwp9">
<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> P3125R1</div>
	<div><span class="key">Date:</span> <time>2024-10-16</time></div>
	<div><span class="key">Audience:</span> SG1 &amp; LEWG</div>
	<div><span class="key">Reply-to:</span> <a href="mailto:cpp@hanicka.net">Hana Dusíková</a></div>
</div>

<h2 id="table-of-contents"><a href="#table-of-contents">Table of contents</a></h2>
<ul>
	<li><a href="#history">Revision history</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="#schemas-design">Schema design</a>
        <ul>
          <li><a href="#useful-schemas">Actually useful schemas</a></li>
          <li><a href="#recovering-pointer">Recovering clean pointer</a></li>
        </ul>
      </li>
      <li><a href="#constructor-safety">Constructor safety</a>
        <ul>
          <li><a href="#additional-constructor-safety">Preconditions of constructors</a></li>
          <li><a href="#sanitizer-interaction">Interaction with sanitizers</a></li>
        </ul>
      </li>
      <li><a href="#casting">Pointer casting</a></li>
      <li><a href="#other-things">pointer_traits, iterator_traits, 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 type to semantically represent tagged pointer of various schemes. This standardizes existing practice which currently can't be expressed in C++ without triggering undefined behaviour. This proposal also makes this technique available during constant evaluation which allows number of use-cases to be implementable in <code>constexpr</code>.</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/p3125r0.pdf">R0</a>&#x2005;→&#x2005;R1: proposing and explaining design based on existing implementation</li>
	</ul>
	<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">// nodes are always have at least alignment 2
using hamt_node_pointer = std::tagged_ptr&lt;const void, bool, std::custom_alignment_tag&lt;2&gt;&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::tagged_ptr&lt;T, ownership, std::alignment_low_bits_tag&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>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> 
	<h3 id="library-part"><a href="#library-part">Implementation in the library</a></h3>
	<p>Library is providing a "smart" non-owning pointer type named <code>tagged_ptr</code> which allows user to provide pointee type, tag type, and <em>tagging scheme</em> how the tag is stored.</p>
	<p>There are various schemas provided for various tagging approaches to allow the library interact with them as this is intended as low-level tool to safely abstract existign code.</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> and <em>aliasing</em> pointers. <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>tagged_ptr</code> back from it. Existence of this interface allows ability to store such pointers in existing interfaces (atomic, other smart pointers).</p>
	<p><em>Aliasing pointer</em> is a pointer which can be dereferenced and points at original pointed object, but can have different representation and hence comparing it with original pointer will yield tagging scheme specific result. This is implemented as a fast-track (non-default) interface on platforms with special tagging schemes (Aarch64 upper byte of pointer can be safely changed.)</p>
	<h4 id="available-schemas"><a href="#available-schemas">Available tagging schemas</a></h4>
	<p>Schemas provided in the library are covering all types of pointer tagging (deduced alignment bits, custom alignment bits, pointer shifting, custom bitmask), default is deduced alignment bits schema. Intention is to allow users / vendors to build specific schemas on standard provided one.</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 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>Main objective of this design is to allow various tagging schemas for storing a few bits of information inside a pointer. Some more advanced use-cases can be build on top of current design and my intention is to provide a safe way for tagging, not solve every use-case there is.</p>
	<pre><code class="language-cpp">template &lt;typename Pointee, typename TagType, typename Schema&gt; class tagged_ptr {
	dirty_pointer _pointer{nullptr};
public:
	using schema = typename Schema::schema&lt;Pointee, TagType&gt;;
	using clean_pointer = schema::clean_pointer;
	using dirty_pointer = schema::dirty_pointer; 
	using tag_type = schema::tag_type;
	
	using difference_type = std::pointer_traits&lt;clean_pointer&gt;::difference_type;
	using element_type = std::pointer_traits&lt;clean_pointer&gt;::element_type;
	
	// constructors
	tagged_ptr() = default;
	constexpr tagged_ptr(nullptr_t) noexcept;
	tagged_ptr(const tagged_ptr &) = default;
	tagged_ptr(tagged_ptr &&) = default;
	
	// to construct from already tagged pointer from external facility
	constexpr tagged_ptr(std::already_tagged_t, dirty_pointer ptr) noexcept;
	
	// to store and tag pointer (only if eligible)
	constexpr tagged_ptr(clean_pointer ptr, tag_type tag);
	
	// to store and tag pointer for over-aligned pointers which wouldn't be eligible otherwise
	template &lt;size_t Alignment&gt; constexpr tagged_ptr(std::overaligned_pointer_t&lt;Alignment&gt;, clean_pointer ptr, tag_type tag);
	
	// to communicate knowledge about unused bits in pointer to make it eligible
	template &lt;uintptr_t UnusedBits&gt; constexpr tagged_ptr(std::known_unused_bits_t&lt;UnusedBits&gt;, clean_pointer ptr, tag_type tag);
	
	// destructor
	~tagged_ptr() = default;
	
	// accessors
	constexpr dirty_pointer unsafe_dirty_pointer() const noexcept;
	constexpr clean_pointer aliasing_pointer() const noexcept; // fast-path if available otherwise .pointer()
	constexpr clean_pointer pointer() const noexcept;
	constexpr tag_type tag() const noexcept;
	
	constexpr decltype(auto) operator*() const noexcept; // *pointer()
	constexpr clean_pointer operator->() const noexcept; // *pointer()
	constexpr decltype(auto) operator[](auto... args) const noexcept; // only for multidimensional arrays
	constexpr decltype(auto) operator[](difference_type diff) const noexcept; // only for arrays
	
	// support for tuple protocol to access [pointer(), tag()]
	template &lt;size_t I&gt; friend constexpr decltype(auto) get(tagged_ptr _pair) noexcept; 
	
	constexpr explicit operator bool() const noexcept; // pointer() != nullptr
	
	// swap
	friend constexpr void swap(tagged_ptr & lhs, tagged_ptr & rhs) noexcept;
	
	// all the things which makes this ordinary-ish pointer
	constexpr auto & operator++() noexcept;
	constexpr auto operator++(int) noexcept;
	constexpr auto & operator--() noexcept;
	constexpr auto operator--(int) noexcept;
	constexpr auto & operator+=(difference_type diff) noexcept;
	constexpr auto & operator-=(difference_type diff) noexcept;
	friend constexpr auto operator+(tagged_ptr lhs, difference_type diff) noexcept;
	friend constexpr auto operator+(difference_type diff, tagged_ptr rhs) noexcept;
	friend constexpr auto operator-(tagged_ptr lhs, difference_type diff) noexcept;
	friend constexpr auto operator-(difference_type diff, tagged_ptr rhs) noexcept;
	
	// difference only of pointer() - pointer()
	friend constexpr ptrdiff_t operator-(tagged_ptr lhs, tagged_ptr rhs) noexcept;
	
	// comparing {pointer(), tag()} &lt;=&gt; {pointer(), tag()}
	friend constexpr auto operator&lt;=&gt;(tagged_ptr lhs, tagged_ptr rhs) noexcept;
	friend bool operator==(tagged_ptr, tagged_ptr) = default;
	
	// comparing only pointer() part
	friend constexpr auto operator&lt;=&gt;(tagged_ptr lhs, clean_pointer rhs) noexcept;
	friend constexpr bool operator==(tagged_ptr lhs, clean_pointer rhs) noexcept;
	friend constexpr bool operator==(tagged_ptr lhs, nullptr_t rhs) noexcept; // same as operator bool
};
	</code></pre>
	<p>There is more, like <code>pointer_traits</code>, <code>iterator_traits</code>, <code>tuple_size</code>, and <code>tuple_element</code> but these are all straight-forward for a pointer-like object.</p>
	<h3 id="schemas-design"><a href="#schemas-design">Schema design</a></h3>
	<p>Schema is trait-like type which provides functionality of encoding pointer, recovering pointer and tag out of encoded pointer. As all functionality is depending on pointee type and tag type, everything is a template inside of other type. This approach is important as symbol name of tagged_ptr will visible contain its semantic type, not implementation details (eg. <code>tagged_ptr&lt;int, bool, alignment_low_bits_tag&gt;</code>).</p>
	<p>To explain properly let's start with simple design of a no-op tagging schema (not proposed):</p>
	<pre><code class="language-cpp">struct no_tag {
  template &lt;typename Pointee, typename Tag&gt; struct schema {
    using clean_pointer = Pointee *;
    using dirty_pointer = uintptr_t; // or void * or clean_pointer itself
    using tag_type = Tag;

		// inform tagged_ptr about which bits are used
    static constexpr auto used_bits = 0u;

    static constexpr dirty_pointer encode_pointer_with_tag(clean_pointer ptr, tag_type) noexcept {
      return <em>magic_constexpr_reinterpret_cast</em>&lt;dirty_pointer&gt;(ptr);
    }
		
    static constexpr clean_pointer recover_pointer(dirty_pointer tptr) noexcept {
      return <em>magic_constexpr_reinterpret_cast</em>&lt;clean_pointer&gt;(tptr);
    }
		
		// there is no fast-path, it's not needed to be provided
    // static constexpr clean_pointer recover_aliasing_pointer(dirty_pointer tptr) noexcept {
    //   return recover_pointer(tptr); 
    // }
		
    static constexpr tag_type recover_tag(dirty_pointer) noexcept {
      return tag_type{}; // 0 bit of information here
    }
  };
};
	</code></pre>
	<p>Each schema has its typedefs which allows to change types on boundaries of <code>tagged_ptr</code> type. Schema also provides information about used bits so <code>tagged_ptr</code>'s constructors can have static checks to protect users.</p>
	<p>Main functionality are functions: <code>encode_pointer_with_tag</code>, <code>recover_pointer</code>, <code>recover_tag</code>, and optional <code>recover_aliasing_pointer</code>. These functions are building blocks for <code>tagged_ptr</code> which only provides additional safety and name for different type of pointer, but it's not doing anything special.</p>
	<h4 id="useful-schemas"><a href="#useful-schemas">Actually useful schemas</a></h3>
	<p>To provide any actual value, library needs to provide some building blocks. To be used by <code>tagged_ptr</code> or even some other user-code (for unforeseen and extended use-cases.</p>
	<pre><code class="language-cpp">template &lt;uintptr_t Mask&gt; struct bitmask_tag {
  template &lt;typename Pointee, typename Tag&gt; struct schema {
    using clean_pointer = Pointee *;
    using dirty_pointer = void *; // it's still pointer, but you can't dereference it
    using tag_type = Tag;
    
    static constexpr auto used_bits = Mask;

    static constexpr dirty_pointer encode_pointer_with_tag(clean_pointer ptr, tag_type value) noexcept {
      #if __has_builtin(<em>magical_pointer_tagging_builtin</em>)
        return static_cast&lt;dirty_pointer&gt;(<em>magical_pointer_tagging_builtin</em>(ptr, static_cast&lt;uintptr_t&gt;(value), Mask));
      #else
        return reinterpret_cast&lt;dirty_pointer&gt;((reinterpret_cast&lt;uintptr_t&gt;(ptr) & static_cast&lt;uintptr_t&gt;(Mask)) | (static_cast&lt;uintptr_t&gt;(value) & ~static_cast&lt;uintptr_t&gt;(Mask)));
      #endif
    }
    static constexpr clean_pointer recover_pointer(dirty_pointer tptr) noexcept {
      #if __has_builtin(<em>magical_pointer_recovering_builtin</em>)
        return static_cast&lt;clean_pointer&gt;(<em>magical_pointer_recovering_builtin</em>(tptr, ~Mask));
      #else
        return reinterpret_cast&lt;clean_pointer&gt;(reinterpret_cast&lt;uintptr_t&gt;(tptr) & ~static_cast&lt;uintptr_t&gt;(Mask));
      #endif
    }
    static constexpr tag_type recover_tag(dirty_pointer tptr) noexcept {
      #if __has_builtin(<em>magical_tag_recovering_builtin</em>)
        return static_cast&lt;tag_type&gt;(<em>magical_tag_recovering_builtin</em>(tptr, Mask));
      #else
        return static_cast&lt;tag_type&gt;(reinterpret_cast&lt;uintptr_t&gt;(tptr) & static_cast&lt;uintptr_t&gt;(Mask));
      #endif
    }
  };
};</code></pre>
<p>This is the most important schema providing most of the functionality, but it's not user-friendly to provide specific bits. Sometimes you want to provide specific alignment instead:</p>
<pre><code class="language-cpp">template &lt;unsigned Alignment&gt; struct custom_alignment_tag {
  static_assert(std::has_single_bit(Alignment), "alignment must be power of 2");
  static constexpr uintptr_t mask = static_cast&lt;uintptr_t&gt;(Alignment) - 1u;
  
  template &lt;typename Pointee, typename Tag&gt; struct schema: bitmask_tag&lt;mask&gt;::template schema&lt;Pointee, Tag&gt; {
    using _underlying_schema = bitmask_tag&lt;mask&gt;::template schema&lt;Pointee, Tag&gt;;
    
    using typename _underlying_schema::clean_pointer;
    using typename _underlying_schema::dirty_pointer;
    using typename _underlying_schema::tag_type;
  
    static constexpr dirty_pointer encode_pointer_with_tag(clean_pointer _ptr, tag_type _value) {
      // we can add precondition the pointer is actually aligned to be compatible with this schema
      _LIBCPP_ASSERT_ARGUMENT_WITHIN_DOMAIN(std::__is_ptr_aligned(_ptr, Alignment), "Pointer must be aligned by provided alignment for tagging");
      return _underlying_schema::encode_pointer_with_tag(_ptr, _value);
    }
  };
};</code></pre>
<p>This schema shows how easily you can build on top existing schemas. But we can go further...</p>
<pre><code class="language-cpp">struct alignment_low_bits_tag {
  template &lt;typename Pointee, typename Tag&gt; using schema = typename custom_alignment_tag&lt;alignof(Pointee)&gt;::template schema&lt;Pointee, Tag&gt;;
};</code></pre>
<p>And just like this we gave a name to a tagging schema which clearly communicates it uses pointer's alignment low bits for tagging.</p>
  <p>But in order to be functionaly complete we also need to support pointer shifting tagging schema:</p>
  <pre><code class="language-cpp">template &lt;unsigned Bits&gt; struct left_shift_tag {
  static constexpr unsigned _shift = Bits;
  static constexpr uintptr_t _mask = (uintptr_t{1u} &lt;&lt; _shift) - 1u;

  template &lt;typename T, typename Tag&gt; struct schema {
    using clean_pointer = T *;
    using dirty_pointer = void *;
    using tag_type = Tag;
    
    static constexpr uintptr_t used_bits = ~((~uintptr_t{0}) &gt;&gt; _shift);

    static constexpr dirty_pointer encode_pointer_with_tag(clean_pointer ptr, tag_type value) noexcept {
      #if __has_builtin(<em>magical_pointer_shifting_and_tagging_builtin</em>)
        return static_cast&lt;dirty_pointer&gt;(<em>magical_pointer_shifting_and_tagging_builtin</em>((ptr), static_cast&lt;uintptr_t&gt;(value), _shift));
      #else
        return reinterpret_cast&lt;dirty_pointer&gt;((reinterpret_cast&lt;uintptr_t&gt;(ptr) &lt;&lt; _shift) | (static_cast&lt;uintptr_t&gt;(value) & ((1ull &lt;&lt; static_cast&lt;uintptr_t&gt;(_shift)) - 1ull)));
      #endif
    }
    static constexpr clean_pointer recover_pointer(dirty_pointer tpptr) noexcept {
      #if __has_builtin(<em>magical_pointer_unshiftinf_builtin</em>)
        return static_cast&lt;clean_pointer&gt;(<em>magical_pointer_unshiftinf_builtin</em>(tpptr, _shift));
      #else
        return reinterpret_cast&lt;clean_pointer&gt;(reinterpret_cast&lt;uintptr_t&gt;(tpptr) &gt;&gt; _shift);
      #endif
    }
    static constexpr tag_type recover_tag(dirty_pointer tptr) noexcept {
      #if __has_builtin(<em>magical_tag_recovering_builtin</em>)
        return static_cast&lt;tag_type&gt;(<em>magical_tag_recovering_builtin</em>(tptr, _mask));
      #else
        return static_cast&lt;tag_type&gt;(reinterpret_cast&lt;uintptr_t&gt;(tptr) & static_cast&lt;uintptr_t&gt;(_mask));
      #endif      
    }
  };
};</code></pre>
  <p>With this generic pointer tagging schema we can build a named one:</p>
  <pre><code class="language-cpp">struct low_byte_tag {
  template &lt;typename T, typename Tag&gt; using schema = typename left_shift_tag&lt;8&gt;::template schema&lt;T, Tag&gt;;
};</code></pre>
  <p>These were all proposed tagging schemas, but vendors can decide to provide useful tagging schema for AArch64 platform:</p>
  <pre><code class="language-cpp">struct upper_byte_tag {
  template &lt;typename T&gt; static constexpr unsigned _shift = sizeof(T *) * 8ull - 8ull;
  template &lt;typename T&gt; static constexpr uintptr_t _mask = 0b1111'1111ull &lt;&lt; _shift&lt;T&gt;;
  
  template &lt;typename T, typename Tag&gt; struct schema: bitmask_tag&lt;_mask&lt;T&gt;&gt;::template schema&lt;T, Tag&gt; {
    using _underlying_schema = bitmask_tag&lt;_mask&lt;T&gt;&gt;::template schema&lt;T, Tag&gt;;
    
    using typename _underlying_schema::clean_pointer;
    using typename _underlying_schema::dirty_pointer;
    using typename _underlying_schema::tag_type;
  
    // only difference against the mask is a presence of fast path 
    // functionality specific for target platform
    static constexpr clean_pointer recover_aliasing_pointer(dirty_pointer _ptr) noexcept {
      return (clean_pointer)_ptr;
    }
    
    using _underlying_schema::encode_pointer_with_tag;
    using _underlying_schema::recover_pointer;
    using _underlying_schema::recover_tag;
  };
};</code></pre>
  <h4 id="recovering-pointer"><a href="#recovering-pointer">Recovering clean pointer</a></h4>
  <p>On certain platforms it's expected from pointers to have some bits set to specific values to be dereferencable, this is supposed to happen in schema's pointer recovery, not just masking with zeros.</p>
  <h3 id="constructor-safety"><a href="#constructor-safety">Constructor safety</a></h3>
  <p>Biggest problems is we don't know what bits are available for tagging other than alignment. I propose to add a static <em>implementation specific</em> value in <code>pointer_traits::free_bits</code> for raw pointers communicating what bits are guarantee to be available.</p>
	<pre><code class="language-cpp">constexpr tagged_ptr(pointer ptr, tag_type tag) noexcept;
template &lt;size_t Alignment&gt; constexpr tagged_ptr(std::overaligned_pointer_t&lt;Alignment&gt;, clean_pointer ptr, tag_type tag) noexcept;
template &lt;uintptr_t UnusedBits&gt; constexpr tagged_ptr(std::known_unused_bits_t&lt;UnusedBits&gt;, clean_pointer ptr, tag_type tag) noexcept;</code></pre>
  <p>First constructor <code>tagged_ptr(pointer ptr, tag_type tag)</code> will be available only if pointer has free bits compatible with <code>tagged_ptr</code>'s tagging schema.</p>
  <p>Second constructor allows user to communicate over-alignment, provided bits calculated from <code>Alignment</code> are added before checking if the pointer is eligible.</p>
  <p>Last constructor allows user to communicate specific bits of pointer are available for tagging, this API is there so user can use schemas which are depending on runtime properties and <code>pointer_traits</code> free bits information can't be guaranteed.</p>
  <h4 id="additional-constructor-safety"><a href="#additional-constructor-safety">Preconditions 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>
  <h4 id="sanitizer-interaction"><a href="#sanitizer-interaction">Interaction with sanitizers</a></h4>
  <p>When building with an upper bits using sanitizer enabled, library should mask out some bits from <code>pointer_traits::free_bits</code>.</p>
	<h3 id="casting"><a href="#casting">Pointer casting</a></h3>
	<p>Design provides same casting mechanism as <code>shared_ptr</code>:</p>
	<pre><code class="language-cpp">template &lt;typename DesiredPointee, typename Pointee, typename TagType, typename Schema&gt;
constexpr auto const_pointer_cast(tagged_ptr&lt;Pointee, TagType, Schema&gt; in) {
  return tagged_ptr&lt;DesiredPointee, TagType, Schema&gt;{const_cast&lt;DesiredPointee*&gt;(in.pointer()), in.tag()};
}

template &lt;typename DesiredPointee, typename Pointee, typename TagType, typename Schema&gt;
constexpr auto static_pointer_cast(tagged_ptr&lt;Pointee, TagType, Schema&gt; in) {
  return tagged_ptr&lt;DesiredPointee, TagType, Schema&gt;{static_cast&lt;DesiredPointee*&gt;(in.pointer()), in.tag()};
}

template &lt;typename DesiredPointee, typename Pointee, typename TagType, typename Schema&gt;
constexpr auto dynamic_pointer_cast(tagged_ptr&lt;Pointee, TagType, Schema&gt; in) {
  return tagged_ptr&lt;DesiredPointee, TagType, Schema&gt;{dynamic_cast&lt;DesiredPointee*&gt;(in.pointer()), in.tag()};
}

// not constexpr
template &lt;typename DesiredPointee, typename Pointee, typename TagType, typename Schema&gt;
auto reinterpret_pointer_cast(tagged_ptr&lt;Pointee, TagType, Schema&gt; in) {
  return tagged_ptr&lt;DesiredPointee, TagType, Schema&gt;{reinterpret_cast&lt;DesiredPointee*&gt;(in.pointer()), in.tag()};
}

template &lt;typename DesiredSchema, typename Pointee, typename TagType, typename Schema&gt;
constexpr auto scheme_pointer_cast(tagged_ptr&lt;Pointee, TagType, Schema&gt; in) noexcept {
  return tagged_ptr&lt;Pointee, TagType, DesiredSchema&gt;{in.pointer(), in.tag()};
}
</code></pre>
<h3 id="other-things"><a href="#other-things">pointer_traits, iterator_traits, tuple protocol</a></h3>
<pre><code class="language-cpp">template &lt;typename _T, typename _Tag, typename _Schema&gt; 
static constexpr auto to_address(tagged_ptr&lt;_T, _Tag, _Schema&gt; p) noexcept -&gt; tagged_ptr&lt;_T, _Tag, _Schema&gt;::element_type * {
  return p.pointer();
}

// iterator traits
template &lt;typename _T, typename _Tag, typename _Schema&gt;
struct iterator_traits&lt;tagged_ptr&lt;_T, _Tag, _Schema&gt;&gt; {
  using _tagged_ptr = tagged_ptr&lt;_T, _Tag, _Schema&gt;;
  
  using iterator_category = std::random_access_iterator_tag;
  using iterator_concept = std::contiguous_iterator_tag;
  
  using value_type = _tagged_ptr::element_type;
  using reference = value_type &;
  using pointer = _tagged_ptr::clean_pointer;
  using difference_type = _tagged_ptr::difference_type;
};

// pointer traits
template &lt;typename _T&gt;
struct pointer_traits&lt;_T *&gt; {
  // everything is same just add this:
  static constexpr uintptr_t free_bits = /* implementation specific value */;
};

template &lt;typename _T, typename _Tag, typename _Schema&gt;
struct pointer_traits&lt;tagged_ptr&lt;_T, _Tag, _Schema&gt;&gt; {
  using _tagged_ptr = tagged_ptr&lt;_T, _Tag, _Schema&gt;;
  using pointer = _tagged_ptr::clean_pointer;
  using element_type = _tagged_ptr::element_type;
  using difference_type = _tagged_ptr::difference_type;

  template &lt;typename _Up&gt; using rebind = typename _tagged_ptr::template rebind&lt;_Up&gt;;

  static constexpr uintptr_t free_bits = _tagged_ptr::dirty_pointer_free_bits;

public:
  constexpr static _tagged_ptr pointer_to(pointer ptr) _NOEXCEPT {
    return _tagged_ptr{ptr};
  }
};

// support for tuple protocol so we can split tagged pointer to structured bindings:
// auto [ptr, tag] = tagged_ptr
template &lt;typename _T, typename _Tag, typename _Schema&gt;
struct tuple_size&lt;tagged_ptr&lt;_T, _Tag, _Schema&gt;&gt;: std::integral_constant&lt;std::size_t, 2&gt; {};

template &lt;std::size_t I, typename _T, typename _Tag, typename _Schema&gt;
struct tuple_element&lt;I, tagged_ptr&lt;_T, _Tag, _Schema&gt;&gt; {
  using _pair_type = tagged_ptr&lt;_T, _Tag, _Schema&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_tagging 2024??L</code></span>
	</div>
	</div>
</div></div></article>
</div><script>
	hljs.addPlugin(mergeHTMLPlugin);
	hljs.highlightAll();
</script>
</body>
</html>
