Why Nostr? What is Njump?
2023-07-27 12:16:41

dev on Nostr: files.html, add single column option sha256 ...

https://ipfs.io/ipfs/QmZMyWmLsSoU87vtqjPaVoNukwJ83S2NBs98fSDAgKrTym

files.html, add single column option

sha256
942ff547df74448d52fb45a5094dff0977098f3835b70cbbf1c8dbd4e0950367 files.html

base64
PCFET0NUWVBFIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgdXNlci1zY2FsYWJsZT1ubyIvPgogICAgPG1ldGEgY2hhcnNldD0iVVRGLTgiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cDovL3N2Z2ljb25zLnNwYXJray5mci9zdmdpY29ucy5jc3MiLz4KICAgIDxzdHlsZT4KICAgICAgYm9keSB7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgICAgd2lkdGg6IDEwMHZ3OwogICAgICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgICAgICBmb250LWZhbWlseTogIk5vdG8gU2VyaWYiOwogICAgICB9CiAgICAgIAogICAgICAjcXVlcnlkaXNwbGF5LCAKICAgICAgI2hlYWRlciB7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgfQogICAgICAKICAgICAgI3JlbGF5cywKICAgICAgI2xvZ3MsIAogICAgICAjcHJpdmtleSB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgd2lkdGg6IDE4ZW07CiAgICAgICAgYmFja2dyb3VuZDogIzExMTsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQogICAgICAKICAgICAgI3JlbGF5cywKICAgICAgI2xvZ3MgewogICAgICAgIGhlaWdodDogNmVtOwogICAgICB9CiAgICAgIAogICAgICAjbG9ncyB7CiAgICAgICAgaGVpZ2h0OiA4ZW07CiAgICAgICAgb3ZlcmZsb3c6IHNjcm9sbDsKICAgICAgICBmb250LXNpemU6IC44ZW07CiAgICAgIH0KICAgICAgCiAgICAgIHNlbGVjdCB7CiAgICAgICAgd2lkdGg6IDRlbTsKICAgICAgfQogICAgICAKICAgICAgI3JlbGF5cywgCiAgICAgIGlucHV0LnN1Ym1pdCB7CiAgICAgICAgYm9yZGVyLXJhZGl1czogLjVlbTsKICAgICAgfQogICAgICAKICAgICAgI3F1ZXJ5ZGlzcGxheSAudGV4dCwgCiAgICAgICNoZWFkZXIgYSwKICAgICAgI21lZGlhLWNvbnRhaW5lciB7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KCiAgICAgICNoZWFkZXIgYSwgCiAgICAgIGZvcm0sIAogICAgICAjcXVlcnlkaXNwbGF5IHsKICAgICAgICB6LWluZGV4OiAxOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQogICAgICAKICAgICAgQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAzMGVtKSB7CiAgICAgICAgI3F1ZXJ5ZGlzcGxheSwKICAgICAgICAjY29udHJvbGluZm8gewogICAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGZvcm0gewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQogICAgICAKICAgICAgI3F1ZXJ5IHsKICAgICAgICB3aWR0aDogNmVtOwogICAgICB9CiAgICAgIAogICAgICAjbG9hZGluZyB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAwcHg7CiAgICAgICAgbGVmdDogMjdlbTsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQogICAgICAKICAgICAgYSB7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogICAgICB9CgogICAgICB2aWRlbyB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CiAgCiAgICAgICNtZWRpYS1jb250YWluZXIgdmlkZW8gewogICAgICAgIHdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7CiAgICAgICAgaGVpZ2h0OiAxMDAlICFpbXBvcnRhbnQ7CiAgICAgICAgbWFyZ2luLXRvcDogMCAhaW1wb3J0YW50OwogICAgICB9CiAgICAgIAogICAgICAudHlwZSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICAgIHotaW5kZXg6IDE7CiAgICAgIH0KICAgICAgCiAgICAgICNwaWMtcXVlcnkgewogICAgICAgIHdpZHRoOiA1ZW07CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeWRpc3BsYXksIAogICAgICAjY29udHJvbGluZm8sCiAgICAgIGEsCiAgICAgIGlucHV0LnN1Ym1pdCB7CiAgICAgICAgY29sb3I6ICM5OTk7CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeWRpc3BsYXkgewogICAgICAgIHBhZGRpbmc6IDAgMWVtOwogICAgICB9CgogICAgICAjcXVlcnlkaXNwbGF5IC50ZXh0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgbWluLXdpZHRoOiAzZW07CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQoKICAgICAgI2hlYWRlciBhLAogICAgICAjaGVhZGVyIHNwYW4gewogICAgICAgIHBhZGRpbmc6IDAuNWVtOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CgogICAgICAjaGVhZGVyIHsKICAgICAgICBwYWRkaW5nOiAwLjQ1ZW0gMDsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICB9CgogICAgICAjaGVhZGVyIC5pdGVtcyB7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgIH0KICAgICAgCiAgICAgICNoZWFkZXIgLml0ZW1zLCAKICAgICAgI2NvbnRyb2xpbmZvIHsKICAgICAgICBtYXJnaW4tdG9wOiAuM2VtOwogICAgICB9CgogICAgICBwIHsKICAgICAgICBtYXJnaW4tdG9wOiAwOwogICAgICB9CiAgICAgIAogICAgICAubGFiZWwgewogICAgICAgIHBhZGRpbmc6IC44ZW0gLjhlbSAuOGVtIDA7CiAgICAgIH0KCiAgICAgIHNwYW4jY29udHJvbGluZm8sIAogICAgICAjcGljcyBhID4gYSwKICAgICAgI3BpY3MgLnF1ZXJ5IHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIH0KICAgICAgCiAgICAgIHNwYW4jY29udHJvbGluZm8gewogICAgICAgIHJpZ2h0OiAyZW07CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICBwYWRkaW5nOiAwIDFlbTsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIH0KCiAgICAgICNtZWRpYS1jb250YWluZXIgewogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwKTsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIHotaW5kZXg6IDQ7CiAgICAgIH0KICAgICAgCiAgICAgICNwaWMtY29udGFpbmVyIHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgICAgCiAgICAgICNwaWMgewogICAgICAgIG1heC13aWR0aDogMTAwdnc7CiAgICAgICAgbWF4LWhlaWdodDogMTAwdmg7CiAgICAgIH0KICAgICAgICAKICAgICAgI3BpY3MgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KICAgICAgCiAgICAgICNwaWNzID4gYSwgCiAgICAgICNwaWNzIGltZywKICAgICAgI3BpY3MgLmZpbGUsCiAgICAgICNwaWNzIC52aWRlby1jb250YWluZXIgewogICAgICAgIHdpZHRoOiAyNXZ3OwogICAgICB9CgogICAgICAjcGljcyA+IGEsCiAgICAgICNwaWNzIC5maWxlLAogICAgICAjcGljcyAudmlkZW8tY29udGFpbmVyIHsKICAgICAgICBoZWlnaHQ6IDI1dnc7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICBib3JkZXI6IDAuM2VtIHNvbGlkIHRyYW5zcGFyZW50OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDAuM2VtOwogICAgICAgIG1hcmdpbjogLTAuM2VtOwogICAgICB9CgogICAgICAjcGljcyA+IC5maWxlIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQogICAgICAKICAgICAgI21lZGlhLWNvbnRhaW5lciB2aWRlbyB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgfQogICAgICAKICAgICAgYm9keTpub3QoLm5vc3RyKSAjZmlsdGVyLWxpa2VzLCAKICAgICAgLmZpbHRlci1saWtlcyAjcGljcyA+IC5pdGVtOm5vdCgucmVhY3RlZCkgewogICAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgICAgfQogICAgICAKICAgICAgLnF1ZXJ5LCAKICAgICAgLmxpa2UsIAogICAgICAjcGljLXF1ZXJ5LAogICAgICAjcGljLXVzZXIgewogICAgICAgIHotaW5kZXg6IDI7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDN2dzsKICAgICAgfQogICAgICAKICAgICAgLnF1ZXJ5LCAKICAgICAgLmxpa2UgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBwYWRkaW5nOiAwIDF2dzsKICAgICAgfQogICAgICAKICAgICAgLnF1ZXJ5LCAKICAgICAgLmxpa2UsIAogICAgICAjcGljLXF1ZXJ5IHsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgZm9udC1zaXplOiBtaW4oMy41dncsIDEuNWVtKTsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsMCwwLDAuNik7CiAgICAgICAgbWF4LXdpZHRoOiA1ZW07CiAgICAgIH0KICAgICAgCiAgICAgICNwaWMtcXVlcnkgewogICAgICAgIHBhZGRpbmc6IC42ZW0gLjRlbSAuMWVtIC40ZW07CiAgICAgICAgbWF4LXdpZHRoOiA1ZW07CiAgICAgIH0KICAgICAgCiAgICAgIC5saWtlLnJlYWN0ZWQsCiAgICAgIC5maWx0ZXItbGlrZXMgI2ZpbHRlci1saWtlcyB7CiAgICAgICAgYmFja2dyb3VuZDogcmVkOwogICAgICB9CgogICAgICAjcGljLXF1ZXJ5LAogICAgICAjcGljLXVzZXIgewogICAgICAgIGZvbnQtc2l6ZTogM2VtOwogICAgICB9CiAgICAgIAogICAgICAjcGljLXF1ZXJ5LAogICAgICAjcGljLXVzZXIsCiAgICAgICNtZWRpYS1mb290ZXIgLmxpa2UgewogICAgICAgIHotaW5kZXg6IDU7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICB9CiAgICAgIAogICAgICAjcGljLXF1ZXJ5LAogICAgICAjcGljLXVzZXIgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CgogICAgICAjcGljLXVzZXIgewogICAgICAgIGJvdHRvbTogMS45ZW07CiAgICAgICAgZm9udC1zaXplOiAxLjhlbTsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiAuNjVlbTsKICAgICAgICBtYXgtd2lkdGg6IDhlbTsKICAgICAgICBvdmVyZmxvdy14OiBoaWRkZW47CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgICAgfQogICAgICAKICAgICAgLmxpa2UgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgbGVmdDogMDsKICAgICAgICByaWdodDogYXV0bzsKICAgICAgICBwYWRkaW5nOiAuMmVtOwogICAgICAgIHdpZHRoOiAxZW07CiAgICAgICAgaGVpZ2h0OiAxZW07CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgfQoKICAgICAgLm5vc3RyIC5saWtlIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsgIAogICAgICB9CgogICAgICAjbWVkaWEtZm9vdGVyIC5saWtlIHsKICAgICAgICBmb250LXNpemU6IDIuNGVtOwogICAgICB9CgogICAgICAjbWVkaWEtZm9vdGVyIHsKICAgICAgICBkaXNwbGF5OiBub25lOyAgCiAgICAgIH0KICAKICAgICAgI3BpY3MgaW1nIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgIH0KCiAgICAgICNtZW51LWNvbnRlbnQgLml0ZW1zIC5hY3RpdmUgewogICAgICAgIGJhY2tncm91bmQ6ICM0NDQ7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KICAgICAgCiAgICAgICNwaWNzID4gLmFjdGl2ZSB7CiAgICAgICAgYm9yZGVyLWNvbG9yOiBncmVlbjsKICAgICAgICB6LWluZGV4OiAxOwogICAgICB9CgogICAgICAuaGVhcnRzdmcgcGF0aCB7CiAgICAgICAgc3Ryb2tlOiAjZmZmOwogICAgICB9CiAgCiAgICAgIGEjbWVudSwgYSNmaWx0ZXItbGlrZXMgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIG1hcmdpbi10b3A6IC0uM2VtOwogICAgICAgIGJhY2tncm91bmQ6ICMwMDA7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgIH0KCiAgICAgIGEjbWVudSB7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgcGFkZGluZzogMCAuM2VtIDAgLjVlbTsKICAgICAgICBoZWlnaHQ6IDIuMWVtOwogICAgICB9CiAgICAgIAogICAgICBhI2ZpbHRlci1saWtlcyB7CiAgICAgICAgcGFkZGluZzogLjJlbTsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgd2lkdGg6IDEuNWVtOwogICAgICAgIGhlaWdodDogMS41ZW07CiAgICAgICAgbWFyZ2luOiAuMWVtIC41ZW07CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHJpZ2h0OiAwOwogICAgICB9CiAgICAgIAogICAgICBhI2ZpbHRlci1saWtlcyBzdmcgewogICAgICAgIHdpZHRoOiAxLjVlbTsKICAgICAgICBoZWlnaHQ6IDEuNWVtOwogICAgICB9CiAgICAgICAKICAgICAgLm1lbnVzdmcgewogICAgICAgIHdpZHRoOiAyZW07CiAgICAgICAgaGVpZ2h0OiAyZW07CiAgICAgIH0KCiAgICAgIC5tZW51c3ZnIHBhdGggewogICAgICAgIGZpbGw6ICNmZmY7CiAgICAgIH0KCiAgICAgICNtZW51LWNvbnRlbnQgewogICAgICAgIGZsb2F0OiBsZWZ0OwogICAgICAgIGhlaWdodDogMTAwdmg7CiAgICAgICAgd2lkdGg6IDE4ZW07CiAgICAgICAgbWFyZ2luLWxlZnQ6IC0xOGVtOwogICAgICAgIGJhY2tncm91bmQ6ICMyMjI7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIHotaW5kZXg6IDM7IAogICAgICAgIG92ZXJmbG93OiBzY3JvbGw7CiAgICAgIH0KCiAgICAgICNtZW51LWNvbnRlbnQub3BlbiB7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDA7CiAgICAgIH0KICAgICAgCiAgICAgICNtZW51LWNvbnRlbnQgLml0ZW1zIHsKICAgICAgICBwYWRkaW5nOiAwIDFlbSAxZW0gMWVtOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CiAgICAgIAogICAgICAjbWVudS1jb250ZW50IC5pdGVtcyBhLAogICAgICBpbnB1dC5zdWJtaXQgewogICAgICAgIHBhZGRpbmc6IC41ZW0gLjdlbTsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgYmFja2dyb3VuZDogIzExMTsKICAgICAgfQoKICAgICAgI21lbnUtb3ZlcmxheSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICB6LWluZGV4OiAzOwogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICBvcGFjaXR5OiAuNTsKICAgICAgfQoKICAgICAgI21lbnUtb3ZlcmxheS5vcGVuIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQogICAgICAKICAgICAgc3ZnLCAKICAgICAgaW1nLCAKICAgICAgLnZpZGVvIHZpZGVvIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgI3RlbXBsYXRlIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvaGVhZD4KICA8Ym9keT4KICAgIDxkaXYgaWQ9InRlbXBsYXRlIj4KICAgICAgPHN2ZyBjbGFzcz0iaGVhcnRzdmcgc3ZnLWljb24iIHZpZXdCb3g9IjAgMCAyMCAyMCI+CiAgICAgICAgPHBhdGggZD0iTTkuNzE5LDE3LjA3M2wtNi41NjItNi41MWMtMC4yNy0wLjI2OC0wLjUwNC0wLjU2Ny0wLjY5Ni0wLjg4OEMxLjM4NSw3Ljg5LDEuNjcsNS42MTMsMy4xNTUsNC4xNGMwLjg2NC0wLjg1NiwyLjAxMi0xLjMyOSwzLjIzMy0xLjMyOWMxLjkyNCwwLDMuMTE1LDEuMTIsMy42MTIsMS43NTJjMC40OTktMC42MzQsMS42ODktMS43NTIsMy42MTItMS43NTJjMS4yMjEsMCwyLjM2OSwwLjQ3MiwzLjIzMywxLjMyOWMxLjQ4NCwxLjQ3MywxLjc3MSwzLjc1LDAuNjkzLDUuNTM3Yy0wLjE5LDAuMzItMC40MjUsMC42MTgtMC42OTUsMC44ODdsLTYuNTYyLDYuNTFDMTAuMTI1LDE3LjIyOSw5Ljg3NSwxNy4yMjksOS43MTksMTcuMDczIE02LjM4OCwzLjYxQzUuMzc5LDMuNjEsNC40MzEsNCwzLjcxNyw0LjcwN0MyLjQ5NSw1LjkyLDIuMjU5LDcuNzk0LDMuMTQ1LDkuMjY1YzAuMTU4LDAuMjY1LDAuMzUxLDAuNTEsMC41NzQsMC43MzFMMTAsMTYuMjI4bDYuMjgxLTYuMjMyYzAuMjI0LTAuMjIxLDAuNDE2LTAuNDY2LDAuNTczLTAuNzI5YzAuODg3LTEuNDcyLDAuNjUxLTMuMzQ2LTAuNTcxLTQuNTZDMTUuNTcsNCwxNC42MjEsMy42MSwxMy42MTIsMy42MWMtMS40MywwLTIuNjM5LDAuNzg2LTMuMjY4LDEuODYzYy0wLjE1NCwwLjI2NC0wLjUzNiwwLjI2NC0wLjY5LDBDOS4wMjksNC4zOTcsNy44MiwzLjYxLDYuMzg4LDMuNjEiPjwvcGF0aD4KICAgICAgPC9zdmc+CiAgICAgIDxkaXYgaWQ9ImNvbHNjc3MiPgogICAgICAuY29scyR7Y29sc30gI3BpY3MgPiBhLCAKICAgICAgLmNvbHMke2NvbHN9ICNwaWNzIGltZywKICAgICAgLmNvbHMke2NvbHN9ICNwaWNzIC5maWxlLAogICAgICAuY29scyR7Y29sc30gI3BpY3MgLnZpZGVvLWNvbnRhaW5lciB7CiAgICAgICAgd2lkdGg6IGNhbGMoMTAwdncgLyAke2NvbHN9KTsKICAgICAgfQoKICAgICAgLmNvbHMke2NvbHN9ICNwaWNzID4gYSwKICAgICAgLmNvbHMke2NvbHN9ICNwaWNzID4gLmZpbGUsCiAgICAgIC5jb2xzJHtjb2xzfSAjcGljcyA+IC52aWRlby1jb250YWluZXIgewogICAgICAgIGhlaWdodDogY2FsYygxMDB2dyAvICR7Y29sc30pOwogICAgICB9CiAgICAgIAogICAgICAuY29scyR7Y29sc30gLnF1ZXJ5LAogICAgICAuY29scyR7Y29sc30gLmxpa2UgewogICAgICAgIGZvbnQtc2l6ZTogbWluKDE0dncgKiAoMSAvICR7Y29sc30pLCA2ZW0gKiAoMSAvICR7Y29sc30pKQogICAgICB9CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJtZWRpYS1mb290ZXIiPgogICAgICA8YSBpZD0icGljLWxpa2UiIGNsYXNzPSJsaWtlIiBocmVmPSIjIj48L2E+CiAgICAgIDxhIGlkPSJwaWMtcXVlcnkiIGhyZWY9IiMiPjwvYT4KICAgICAgPGEgaWQ9InBpYy11c2VyIiBocmVmPSIjIj48L2E+CiAgICA8L2Rpdj4KICAgIDxjZW50ZXIgaWQ9Im1lZGlhLWNvbnRhaW5lciI+CiAgICAgIDxkaXYgaWQ9InBpYy1jb250YWluZXIiPgogICAgICAgIDxpbWcgaWQ9InBpYyIvPgogICAgICA8L2Rpdj4KICAgIDwvY2VudGVyPgogICAgPGRpdiBpZD0ibWVudS1vdmVybGF5Ij48L2Rpdj4KICAgIDxkaXYgaWQ9Im1lbnUtY29udGVudCIgY2xhc3M9InRlc3QiPgogICAgICA8ZGl2IGNsYXNzPSJpdGVtcyI+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPmF1dG9wbGF5OjwvZGl2PgogICAgICAgIDxhIGNsYXNzPSJzZXRhdXRvcGxheSIgZGF0YS1hdXRvcGxheT0ib24iIGhyZWY9IiMiPm9uPC9hPgogICAgICAgIDxhIGNsYXNzPSJzZXRhdXRvcGxheSIgZGF0YS1hdXRvcGxheT0ib2ZmIiBocmVmPSIjIj5vZmY8L2E+CiAgICAgICAgPGEgY2xhc3M9InNldGF1dG9wbGF5IiBkYXRhLWF1dG9wbGF5PSJob3ZlciIgaHJlZj0iIyI+bW91c2VvdmVyPC9hPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5jb2xzOjwvZGl2PgogICAgICAgIDxhIGNsYXNzPSJzZXRjb2xzIiBkYXRhLWNvbHM9IjEiIGhyZWY9IiMiPjE8L2E+CiAgICAgICAgPGEgY2xhc3M9InNldGNvbHMiIGRhdGEtY29scz0iMiIgaHJlZj0iIyI+MjwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0Y29scyIgZGF0YS1jb2xzPSI0IiBocmVmPSIjIj40PC9hPgogICAgICAgIDxhIGNsYXNzPSJzZXRjb2xzIiBkYXRhLWNvbHM9IjYiIGhyZWY9IiMiPjY8L2E+CiAgICAgICAgPGEgY2xhc3M9InNldGNvbHMiIGRhdGEtY29scz0iMTAiIGhyZWY9IiMiPjEwPC9hPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5jb25uZWN0aW9uczo8L2Rpdj4KICAgICAgICA8ZGl2IGlkPSJjb25uY291bnQiPjA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+cmVsYXlzOjwvZGl2PgogICAgICAgIDxwPlBsZWFzZSB1c2UgcmVsYXlzIHdpdGggTklQLTUwIChzZWFyY2gpIGZ1bmN0aW9uYWxpdHk8L3A+CiAgICAgICAgPGZvcm0gYWN0aW9uPSIjIiBpZD0icmVsYXlzLWZvcm0iPgogICAgICAgICAgPHRleHRhcmVhIGlkPSJyZWxheXMiPjwvdGV4dGFyZWE+CiAgICAgICAgICA8aW5wdXQgY2xhc3M9InN1Ym1pdCIgdHlwZT0ic3VibWl0IiB2YWx1ZT0ic2F2ZSByZWxheXMiLz4KICAgICAgICA8L2Zvcm0+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPnByaXZhdGUga2V5OjwvZGl2PgogICAgICAgIDxwPklmIHlvdSBjYW50IHVzZSBicm93c2VyIGFkZG9uIChtb2JpbGUpPC9wPgogICAgICAgIDxmb3JtIGFjdGlvbj0iIyIgaWQ9InByaXZrZXktZm9ybSI+CiAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9InByaXZrZXkiLz4KICAgICAgICAgIDxpbnB1dCBjbGFzcz0ic3VibWl0IiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJzYXZlIGtleSIvPgogICAgICAgIDwvZm9ybT4KICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+bG9nczo8L2Rpdj4KICAgICAgICA8ZGl2IGlkPSJsb2dzIj48L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+bGF0ZXN0IHJlbGVhc2U6PC9kaXY+CiAgICAgICAgPGEgaWQ9InJlbGVhc2UiIGhyZWY9IiMiPjwvYT4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgaWQ9ImhlYWRlciI+CiAgICAgIDxzcGFuIGlkPSJjb250cm9saW5mbyI+Y29udHJvbHM6IGFycm93cywgZW50ZXIsIGVzYzwvc3Bhbj4KICAgICAgPGEgaWQ9ImZpbHRlci1saWtlcyIgaHJlZj0iIyI+PC9hPgogICAgICA8ZGl2IGNsYXNzPSJpdGVtcyI+CiAgICAgICAgPGEgaWQ9Im1lbnUiIGhyZWY9IiMiPgogICAgICAgICAgPHN2ZyBjbGFzcz0ibWVudXN2ZyBzdmctaWNvbiIgdmlld0JveD0iMCAwIDIwIDIwIj4KCQkgICAgICAgIDxwYXRoIGQ9Ik0xMCwxLjQ0NWMtNC43MjYsMC04LjU1NSwzLjgyOS04LjU1NSw4LjU1NWMwLDQuNzI1LDMuODI5LDguNTU1LDguNTU1LDguNTU1YzQuNzI1LDAsOC41NTUtMy44Myw4LjU1NS04LjU1NUMxOC41NTUsNS4yNzQsMTQuNzI1LDEuNDQ1LDEwLDEuNDQ1IE0xMCwxNy42NTRjLTQuMjIxLDAtNy42NTQtMy40MzQtNy42NTQtNy42NTRjMC00LjIyMSwzLjQzMy03LjY1NCw3LjY1NC03LjY1NGM0LjIyMiwwLDcuNjU0LDMuNDMzLDcuNjU0LDcuNjU0QzE3LjY1NCwxNC4yMjEsMTQuMjIyLDE3LjY1NCwxMCwxNy42NTQgTTE0LjM5LDEwYzAsMC4yNDgtMC4yMDMsMC40NS0wLjQ1LDAuNDVINi4wNmMtMC4yNDgsMC0wLjQ1LTAuMjAzLTAuNDUtMC40NXMwLjIwMy0wLjQ1LDAuNDUtMC40NWg3Ljg3OUMxNC4xODcsOS41NSwxNC4zOSw5Ljc1MiwxNC4zOSwxMCBNMTQuMzksMTIuNzAyYzAsMC4yNDctMC4yMDMsMC40NDktMC40NSwwLjQ0OUg2LjA2Yy0wLjI0OCwwLTAuNDUtMC4yMDItMC40NS0wLjQ0OWMwLTAuMjQ4LDAuMjAzLTAuNDUxLDAuNDUtMC40NTFoNy44NzlDMTQuMTg3LDEyLjI1MSwxNC4zOSwxMi40NTQsMTQuMzksMTIuNzAyIE0xNC4zOSw3LjI5OGMwLDAuMjQ4LTAuMjAzLDAuNDUtMC40NSwwLjQ1SDYuMDZjLTAuMjQ4LDAtMC40NS0wLjIwMy0wLjQ1LTAuNDVzMC4yMDMtMC40NSwwLjQ1LTAuNDVoNy44NzlDMTQuMTg3LDYuODQ4LDE0LjM5LDcuMDUxLDE0LjM5LDcuMjk4Ij48L3BhdGg+CgkgICAgICAgIDwvc3ZnPgogICAgICAgIDwvYT4KICAgICAgICA8YSBpZD0idGl0bGUiIGhyZWY9IiMiPmZpbGVzLmh0bWw8L2E+CiAgICAgICAgPGZvcm0gaWQ9InF1ZXJ5LWZvcm0iIGFjdGlvbj0iIyI+CiAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9InF1ZXJ5IiBuYW1lPSJxdWVyeSIgaWQ9IiIgLz4KICAgICAgICAgIDxzZWxlY3QgaWQ9InF1ZXJ5LXR5cGUiPgogICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJhbGwiPmFsbDwvb3B0aW9uPgogICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJpbWFnZSI+aW1hZ2VzPC9vcHRpb24+CiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9InZpZGVvIj52aWRlb3M8L29wdGlvbj4KICAgICAgICAgIDwvc2VsZWN0PgogICAgICAgICAgPGlucHV0IGlkPSJnbyIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iZ28iLz4KICAgICAgICA8L2Zvcm0+CiAgICAgICAgPHNwYW4gaWQ9InF1ZXJ5ZGlzcGxheSI+CiAgICAgICAgICA8c3BhbiBjbGFzcz0idGV4dCI+PC9zcGFuPgogICAgICAgIDwvc3Bhbj4KICAgICAgICA8ZGl2IGlkPSJsb2FkaW5nIj51cGRhdGluZzwvZGl2PgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgPGRpdiBpZD0icGljcyI+PC9kaXY+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly91bnBrZy5jb20vbm9zdHItdG9vbHMvbGliL25vc3RyLmJ1bmRsZS5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9zbG93bGkuZ2l0aHViLmlvL2JlY2gzMi1idWZmZXIvYXNzZXRzL2pzL2JlY2gzMi1idWZmZXIubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQ+CiAgICAgIGNvbnN0IHVwZGF0ZXNwdWJrZXkgPSAiYWU1YzZlMGI3NDY2MGQyMTk0YzgyNTRiNWMyYzgyNTY3NjU3NmJlMDI5NzM3OWZhMjA1MjMxMTRhNmE4NWU4NyIKICAgICAgY29uc3QgcXVlcmllcyA9IHsKICAgICAgICAiZ2xvYmFsIjogJ1siUkVRIiwiPEk+Iix7ImNhY2hlIjpbImV4cGxvcmUiLHsidGltZWZyYW1lIjoibGF0ZXN0Iiwic2NvcGUiOiJnbG9iYWwiLCJsaW1pdCI6PEw+fV19XScsIAogICAgICAgICJhdXRob3IiOiAnWyJSRVEiLCI8ST4iLHsia2luZHMiOlsxXSwiYXV0aG9ycyI6WyI8UD4iXX1dJywKICAgICAgICAicmVhY3Rpb25zIjogJ1siUkVRIiwiPEk+IiwgeyJraW5kcyI6WzddLCIjZSI6IDxFPn1dJwogICAgICB9CiAgICAgIHFzKCIjcmVsYXlzIikudmFsdWUgPSByZWxheXMoKS5qb2luKCJcbiIpCiAgICAgIHFzKCIjcHJpdmtleSIpLnZhbHVlID0gcHJpdmtleSgpCiAgICAgIGNvbnN0IGNvbG9wdHMgPSBbMSwgMiwgNCwgNiwgMTBdCgogICAgICBjb2xzID0gKCkgPT4gcGFyc2VJbnQoc2V0dGluZygiY29scyIsIGNvbG9wdHNbMV0pLCAxMCkKICAgICAgYXV0b3BsYXkgPSAoKSA9PiBzZXR0aW5nKCJhdXRvcGxheSIsICJvZmYiKQogICAgICBsaW1pdCA9ICgpID0+IHBhcnNlSW50KHNldHRpbmcoImxpbWl0IiwgMTUpLCAxMCkKCiAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgiY29scyIgKyBjb2xzKCkpCiAgICAgIAogICAgICBsZXQgcHJvdG9jb2wgPSBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9Nb2JpbGUvKSA/ICJub3N0cjoiIDogIndlYitub3N0cjoiCiAgICAgIGxldCBzb2NrZXRzID0gW10KICAgICAgbGV0IHJlc2hhbmRsZXJzID0gW10KICAgICAgbGV0IHVybHMgPSBbXQogICAgICBsZXQgbGlrZXMgPSBbXQogICAgICBsZXQgbmV3bGlrZXMgPSBbXQogICAgICBsZXQgcmVhY3RlZCA9IFtdCiAgICAgIGxldCBpZGNvdW50ZXIgPSAwCiAgICAgIGxldCBxdWVyeXdhaXQgPSBudWxsCiAgICAgIGxldCBwcmltYWxzb2NrZXQgPSBudWxsCiAgICAgIGxldCB0eXBlcyA9IHsKICAgICAgICBpbWFnZTogWyJwbmciLCAianBnIiwgImpwZWciLCAid2VicCJdLAogICAgICAgIHZpZGVvOiBbIm1wNCIsICJ3ZWJtIl0KICAgICAgfQogICAgICBsZXQgaW1ncmVnZXggPSAvaHR0cCh8cylcOlwvXC9bXiBcbl0qP1wuKHBuZ3xqcGd8anBlZ3x3ZWJwKS9naQogICAgICBsZXQgdmlkZW9yZWdleCA9IC9odHRwKHxzKVw6XC9cL1teIFxuXSo/XC4obXA0fHdlYm0pL2dpCiAgICAgIGxldCB2aWRlb2V4dHJlZ2V4ID0gL1wuKG1wNHx3ZWJtKSQvaQogICAgICB3YWl0bXMgPSA1MDAwCiAgICAgIHF1ZXJ5c3RyID0gIiIKICAgICAgbGFzdHF1ZXJ5c3RyID0gIiIKICAgICAgbGFzdHF1ZXJ5dHlwZSA9ICIiCiAgICAgIGxldCBxdWVyeWNvdW50ID0gMAogICAgICBsZXQgaG92ZXJlZHZpZGVvID0gbnVsbAogICAgICAKICAgICAgdXBkYXRlcXVlcnkoKQogICAgICBxcygiI3BpYy1saWtlIikuaW5uZXJIVE1MID0gcXMoIiNmaWx0ZXItbGlrZXMiKS5pbm5lckhUTUwgPSBxcygiI3RlbXBsYXRlIC5oZWFydHN2ZyIpLm91dGVySFRNTAogICAgICBzZXRhY3RpdmUoInNldGNvbHMiLCAiY29scyIsIGNvbHMoKSkKICAgICAgc2V0YWN0aXZlKCJzZXRhdXRvcGxheSIsICJhdXRvcGxheSIsIGF1dG9wbGF5KCkpCgogICAgICBmdW5jdGlvbiBmcm9tSGV4U3RyaW5nKHN0cil7CiAgICAgICAgbGV0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KHN0ci5sZW5ndGggLyAyKQogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnVmZmVyLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBidWZmZXJbaV0gPSBwYXJzZUludChzdHIuc3Vic3RyKDIgKiBpLCAyKSwgMTYpCiAgICAgICAgfQogICAgICAgIHJldHVybiBidWZmZXIKICAgICAgfQogIAogICAgICBmdW5jdGlvbiByZWxheXMoKXsKICAgICAgICBjb25zdCBvYmogPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCJyZWxheXMiKSkKICAgICAgICBjb25zdCByID0gb2JqICYmIG9iai5maWx0ZXIociA9PiByLm1hdGNoKC93c3M6XC9cLy4rLykpIHx8IFtdCiAgICAgICAgCiAgICAgICAgcmV0dXJuIHIubGVuZ3RoID4gMCAmJiByIHx8IFsKICAgICAgICAgICJ3c3M6Ly9yZWxheS5ub3N0ci5iYW5kIiwKICAgICAgICAgICJ3c3M6Ly9uYi5yZWxheS5jZW50ZXIiLCAKICAgICAgICAgICJ3c3M6Ly9ub3N0ci5jb21waWxlLWVycm9yLm5ldCIKICAgICAgICBdCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHByaXZrZXkoKXsKICAgICAgICBsZXQga2V5ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oInByaXZrZXkiKSB8fCAiIgogICAgICAgIAogICAgICAgIGlmKGtleS5sZW5ndGggPT0gNjMpewogICAgICAgICAga2V5ID0gTm9zdHJUb29scy5uaXAxOS5kZWNvZGUoa2V5KS5kYXRhCiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJldHVybiBrZXkubGVuZ3RoID09IDY0ICYmIGtleSB8fCBudWxsCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHNldHRpbmcoa2V5LCBkZWZhdWx0dmFsdWUpewogICAgICAgIGNvbnN0IHYgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkpCiAgICAgICAgcmV0dXJuIHYgJiYgb3B0aW9uKCJzZXQiICsga2V5LCBrZXksIHYpICYmIHYgfHwgZGVmYXVsdHZhbHVlCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIG9wdGlvbihjLCBrZXksIHZhbCl7CiAgICAgICAgcmV0dXJuIHFzKCIuIiArIGMgKyAiW2RhdGEtIiArIGtleSArICI9JyIgKyB2YWwgKyAiJ10iKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBxcyhxKXsKICAgICAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihxKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBxc2EocSl7CiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChxKSkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gZ2lkKGkpewogICAgICAgIHJldHVybiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBxdWVyeXR5cGUoKXsKICAgICAgICByZXR1cm4gcXMoIiNxdWVyeS10eXBlIikudmFsdWUgfHwgImFsbCIKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gdXBkYXRlcXVlcnkoKXsKICAgICAgICBsZXQgcGFydHMgPSBkZWNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaGFzaC5zdWJzdHJpbmcoMSkpLnNwbGl0KCIvIikKICAgICAgICBxdWVyeXN0ciA9IHFzKCIjcXVlcnlkaXNwbGF5IC50ZXh0IikuaW5uZXJUZXh0ID0gcGFydHNbMF0KICAgICAgICBxcygiI3F1ZXJ5IikudmFsdWUgPSBwYXJ0c1swXQogICAgICAgIHFzKCIjcXVlcnktdHlwZSIpLnZhbHVlID0gcGFydHNbMV0gfHwgImFsbCIKICAgICAgfQoKICAgICAgZnVuY3Rpb24gYWN0aXZlKCl7CiAgICAgICAgcmV0dXJuIHFzKCIjcGljcyAuYWN0aXZlIikKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gcGljb2Zmc2V0KG9mZnNldCl7CiAgICAgICAgY29uc3QgcGljcyA9IHFzYSgiI3BpY3MgPiAuaXRlbSIpLmZpbHRlcihlID0+IGUuc3R5bGUuZGlzcGxheSA9PSAiYmxvY2siKQogICAgICAgIHJldHVybiBwaWNzW3BpY3MuaW5kZXhPZihhY3RpdmUoKSkrb2Zmc2V0XQogICAgICB9CgogICAgICBmdW5jdGlvbiBsYXN0YWN0aXZlKCl7CiAgICAgICAgcmV0dXJuIHFzYSgiI3BpY3MgLmFjdGl2ZSIpLnBvcCgpICAgICAgCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIG1lbnUoKXsKICAgICAgICBxc2EoIiNtZW51LWNvbnRlbnQsICNtZW51LW92ZXJsYXkiKS5mb3JFYWNoKG4gPT4gbi5jbGFzc0xpc3QudG9nZ2xlKCJvcGVuIikpCiAgICAgIH0KICAKICAgICAgZnVuY3Rpb24gc2V0YWN0aXZlKGMsIGtleSwgdmFsKXsKICAgICAgICBxc2EoIi4iICsgYykuZm9yRWFjaChuID0+IG4uY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikpCiAgICAgICAgY29uc3Qgb3B0aW9uID0gcXMoIi4iICsgYyArICJbZGF0YS0iICsga2V5ICsgIj0nIiArIHZhbCArICInXSIpCiAgICAgICAgb3B0aW9uPy5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiB1cGRhdGVhbGx2aWRlb3BsYXkoKXsKICAgICAgICBxc2EoIiNwaWNzIHZpZGVvIikuZm9yRWFjaChhc3luYyB2ID0+IHVwZGF0ZXZpZGVvcGxheSh2KSkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gdXBkYXRldmlkZW9wbGF5KHYpewogICAgICAgIGNvbnN0IGFwbGF5ID0gYXV0b3BsYXkoKQogICAgICAgIAogICAgICAgIGlmKGFwbGF5ICE9ICJvbiIpewogICAgICAgICAgdi5tdXRlZCA9IGZhbHNlCiAgICAgICAgICB2LnBhdXNlKCkKICAgICAgICB9ZWxzZXsKICAgICAgICAgIHYubXV0ZWQgPSB0cnVlCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGNvbnN0IG4gPSB2LnBhcmVudEVsZW1lbnQKICAgICAgICAKICAgICAgICBpZigobi5vZmZzZXRUb3AgKyBuLm9mZnNldEhlaWdodCkgPCBzY3JvbGxZIAogICAgICAgIHx8IG4ub2Zmc2V0VG9wID4gKHNjcm9sbFkgKyB2aXN1YWxWaWV3cG9ydC5oZWlnaHQpKXsKICAgICAgICAgIGlmKHYucmVhZHlTdGF0ZSA9PSA0KXsKICAgICAgICAgICAgdi5wYXVzZSgpCiAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgdi5wcmVsb2FkID0gIm5vbmUiCiAgICAgICAgICB9CiAgICAgICAgfWVsc2UgaWYodi5yZWFkeVN0YXRlICE9IDQpewogICAgICAgICAgdi5wcmVsb2FkID0gImF1dG8iCiAgICAgICAgfQogICAgICAgIGVsc2UgaWYoYXBsYXkgPT0gIm9uIiB8fCAoYXBsYXkgPT0gImhvdmVyIiAmJiB2ID09IGhvdmVyZWR2aWRlbykpewogICAgICAgICAgdi5wbGF5KCkKICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoInNjcm9sbCIsICgpID0+IHVwZGF0ZWFsbHZpZGVvcGxheSgpKQogICAgICAKICAgICAgbGV0IHRvdWNoID0gbnVsbAogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsIGUgPT4gewogICAgICAgIHRvdWNoID0gZS5jaGFuZ2VkVG91Y2hlc1swXQogICAgICB9KQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLCBlID0+IHsKICAgICAgICBjb25zdCB4ZGlmZiA9IGUuY2hhbmdlZFRvdWNoZXNbMF0uc2NyZWVuWCAtIHRvdWNoLnNjcmVlblgKICAgICAgICBjb25zdCB5ZGlmZiA9IGUuY2hhbmdlZFRvdWNoZXNbMF0uc2NyZWVuWSAtIHRvdWNoLnNjcmVlblkKICAgICAgICAKICAgICAgICBpZih4ZGlmZiA8IC01MCl7CiAgICAgICAgICBuZXh0KCkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoeGRpZmYgPiA1MCl7CiAgICAgICAgICBwcmV2KCkKICAgICAgICB9CiAgICAgIH0pCiAgICAgIAogICAgICBxcygiI3F1ZXJ5LWZvcm0iKS5hZGRFdmVudExpc3RlbmVyKCJzdWJtaXQiLCBlID0+IHsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKICAgICAgICBsb2NhdGlvbi5oYXNoID0gIiMiICsgZW5jb2RlVVJJQ29tcG9uZW50KHFzKCIjcXVlcnkiKS52YWx1ZSArICIvIiArIHF1ZXJ5dHlwZSgpKQogICAgICAgIHVwZGF0ZXF1ZXJ5KCkKICAgICAgICBxdWVyeXdhaXQucmVzb2x2ZSgpCiAgICAgIH0pCgogICAgICBxcygiI3JlbGF5cy1mb3JtIikuYWRkRXZlbnRMaXN0ZW5lcigic3VibWl0IiwgYXN5bmMgZSA9PiB7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCiAgICAgICAgbGV0IHIgPSBKU09OLnN0cmluZ2lmeShxcygiI3JlbGF5cyIpLnZhbHVlLnNwbGl0KCJcbiIpKQogICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJyZWxheXMiLCByKQogICAgICAgIGRpc2Nvbm5lY3QoKQogICAgICB9KQoKICAgICAgcXMoIiNwcml2a2V5LWZvcm0iKS5hZGRFdmVudExpc3RlbmVyKCJzdWJtaXQiLCBhc3luYyBlID0+IHsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKICAgICAgICBjb25zdCBrZXkgPSBxcygiI3ByaXZrZXkiKS52YWx1ZQoKICAgICAgICBpZihrZXkubGVuZ3RoICE9IDY0ICYmIGtleS5sZW5ndGggIT0gNjMpewogICAgICAgICAgYWxlcnQoImtleSBzaG91bGQgYmUgNjMgb3IgNjQgY2hhcmFjdGVycyBsb25nIikKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgicHJpdmtleSIsIGtleSkKICAgICAgICBhbGVydCgia2V5IHNhdmVkIikKICAgICAgfSkKICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsIGFzeW5jIChlKSA9PiB7CiAgICAgICAgaWYoYXV0b3BsYXkoKSA9PSAiaG92ZXIiICYmIGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygidmlkZW8tY29udGFpbmVyIikpewogICAgICAgICAgaG92ZXJlZHZpZGVvID0gZS50YXJnZXQucXVlcnlTZWxlY3RvcigidmlkZW8iKQogICAgICAgICAgaG92ZXJlZHZpZGVvLnBsYXkoKQogICAgICAgIH0KICAgICAgfSkKICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IiwgYXN5bmMgKGUpID0+IHsKICAgICAgICBob3ZlcmVkdmlkZW8gPSBmYWxzZQogICAgICAgIGlmKHFzKCIjbWVkaWEtY29udGFpbmVyIikuc3R5bGUuZGlzcGxheSAhPSAiYmxvY2siICYmIGF1dG9wbGF5KCkgPT0gImhvdmVyIiAmJiBlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInZpZGVvLWNvbnRhaW5lciIpKXsKICAgICAgICAgIHFzYSgidmlkZW8iKS5mb3JFYWNoKHYgPT4gdi5wYXVzZSgpKQogICAgICAgIH0KICAgICAgfSkKICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgYXN5bmMgKGUpID0+IHsKICAgICAgICBpZihlLnRhcmdldC50eXBlID09ICJzdWJtaXQiIHx8IChlLnRhcmdldC50YWdOYW1lID09ICJBIiAmJiBlLnRhcmdldC5ocmVmLm1hdGNoKC9eKHx3ZWJcKylub3N0clw6LykpKXsKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgIAogICAgICAgIGlmKGUudGFyZ2V0LmlkID09ICJ0aXRsZSIpewogICAgICAgICAgcXMoIiNxdWVyeSIpLnZhbHVlID0gIiIKICAgICAgICAgIHFzKCIjcXVlcnktdHlwZSIpLnZhbHVlID0gImFsbCIKICAgICAgICAgIHFzKCIjZ28iKS5jbGljaygpCiAgICAgICAgfQoKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKCiAgICAgICAgaWYoZS50YXJnZXQuaWQgPT0gImZpbHRlci1saWtlcyIpewogICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QudG9nZ2xlKCJmaWx0ZXItbGlrZXMiKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygic2hvdyIpKXsKICAgICAgICAgIGFjdGl2ZSgpPy5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKQogICAgICAgICAgZ2lkKGUudGFyZ2V0LmlkKS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgc2hvdyhlLnRhcmdldC5pZCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihlLnRhcmdldC50YWdOYW1lICE9ICJBIiAmJiAocXMoIiNwaWMtY29udGFpbmVyIikgPT0gZS50YXJnZXQgfHwgcXMoIiNtZWRpYS1jb250YWluZXIgdmlkZW8iKSA9PSBlLnRhcmdldCkpewogICAgICAgICAgaGlkZW1lZGlhKCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYoZS50YXJnZXQuaWQgPT0gIm1lbnUiIHx8IGUudGFyZ2V0LmlkID09ICJtZW51LW92ZXJsYXkiKXsKICAgICAgICAgIG1lbnUoKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICBpZihlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInNldGNvbHMiKSl7CiAgICAgICAgICBmb3IobGV0IGMgb2YgY29sb3B0cyl7CiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgiY29scyIgKyBjKQogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoImNvbHMiICsgZS50YXJnZXQuZGF0YXNldC5jb2xzKQogICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oImNvbHMiLCBlLnRhcmdldC5kYXRhc2V0LmNvbHMpCiAgICAgICAgICBzZXRhY3RpdmUoInNldGNvbHMiLCAiY29scyIsIGNvbHMoKSkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAKICAgICAgICBpZihlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInNldGF1dG9wbGF5IikpewogICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oImF1dG9wbGF5IiwgZS50YXJnZXQuZGF0YXNldC5hdXRvcGxheSkKICAgICAgICAgIHNldGFjdGl2ZSgic2V0YXV0b3BsYXkiLCAiYXV0b3BsYXkiLCBhdXRvcGxheSgpKQogICAgICAgICAgdXBkYXRlYWxsdmlkZW9wbGF5KCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoImxpa2UiKSl7CiAgICAgICAgICBsaWtlKGUudGFyZ2V0KQogICAgICAgIH0KICAgICAgfSkKICAgICAgCiAgICAgIGZ1bmN0aW9uIGhhc2tleSgpewogICAgICAgIHJldHVybiB3aW5kb3cubm9zdHIgfHwgcHJpdmtleSgpCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHB1YmtleSgpewogICAgICAgIHJldHVybiB3aW5kb3cubm9zdHIgJiYgYXdhaXQgd2luZG93Lm5vc3RyLmdldFB1YmxpY0tleSgpIHx8IE5vc3RyVG9vbHMuZ2V0UHVibGljS2V5KHByaXZrZXkoKSkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gc2lnbihldmVudCl7CiAgICAgICAgaWYod2luZG93Lm5vc3RyKXsKICAgICAgICAgIHJldHVybiBhd2FpdCBub3N0ci5zaWduRXZlbnQoZXZlbnQpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGV2ZW50LnNpZyA9IE5vc3RyVG9vbHMuZ2V0U2lnbmF0dXJlKGV2ZW50LCBwcml2a2V5KCkpCiAgICAgICAgcmV0dXJuIGV2ZW50CiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIGxpa2UobGluayl7CiAgICAgICAgY29uc3QgZXZlbnQgPSBsaW5rLnBhcmVudEVsZW1lbnRbImRhdGEtZXZlbnQiXQogICAgICAgIGNvbnN0IHB1YmsgPSBhd2FpdCBwdWJrZXkoKQogICAgICAgIGNvbnN0IGxpa2UgPSBhd2FpdCBzaWduKHsKICAgICAgICAgICJraW5kIjogNywKICAgICAgICAgICJjb250ZW50IjogIisiLAogICAgICAgICAgInRhZ3MiOiBbCiAgICAgICAgICAgIFsiZSIsIGV2ZW50LmlkXSwKICAgICAgICAgICAgWyJwIiwgZXZlbnQucHVia2V5XQogICAgICAgICAgXSwKICAgICAgICAgICJwdWJrZXkiOiBwdWJrLAogICAgICAgICAgImNyZWF0ZWRfYXQiOiBwYXJzZUludChEYXRlLm5vdygpIC8gMTAwMCAsIDEwKQogICAgICAgIH0pCiAgICAgICAgCiAgICAgICAgY29uc3QgbGlrZWpzb24gPSBKU09OLnN0cmluZ2lmeShbIkVWRU5UIiwgbGlrZV0pCiAgICAgICAgc29ja2V0cy5mb3JFYWNoKHMgPT4gcy5zZW5kKGxpa2Vqc29uKSkKICAgICAgICBjb25zb2xlLmxvZygic2VudCBsaWtlIiwgbGlrZWpzb24pIAogICAgICAgIGxpbmsuY2xhc3NMaXN0LmFkZCgicmVhY3RlZCIpCgogICAgICAgIGNvbnN0IHBpY2lkID0gbGlua1siZGF0YS1pdGVtLWlkIl0gfHwgbGluay5kYXRhc2V0LnBpY0lkCiAgICAgICAgCiAgICAgICAgaWYocGljaWQpewogICAgICAgICAgZ2lkKHBpY2lkKS5xdWVyeVNlbGVjdG9yKCIubGlrZSIpLmNsYXNzTGlzdC5hZGQoInJlYWN0ZWQiKQogICAgICAgICAgcmVhY3RlZC5wdXNoKHBpY2lkKQogICAgICAgIH0KICAgICAgfQogICAgCiAgICAgIGZ1bmN0aW9uIHByZXYoKXsKICAgICAgICBpZihwaWNvZmZzZXQoLTEpKXsKICAgICAgICAgIHBpY29mZnNldCgtMSkuY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgICAgIGxhc3RhY3RpdmUoKS5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKQogICAgICAgICAgdXBkYXRlc2hvdygpCiAgICAgICAgfQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBuZXh0KCl7CiAgICAgICAgaWYocGljb2Zmc2V0KDEpKXsKICAgICAgICAgIHBpY29mZnNldCgxKS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgYWN0aXZlKCkuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikKICAgICAgICAgIHVwZGF0ZXNob3coKQogICAgICAgIH0KICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gdXBkYXRlc2hvdygpewogICAgICAgIGlmKHFzKCIjbWVkaWEtY29udGFpbmVyIikuc3R5bGUuZGlzcGxheSA9PSAiYmxvY2siKXsKICAgICAgICAgIGhpZGV2aWRlbygpCiAgICAgICAgICBzaG93KGFjdGl2ZSgpLmlkKQogICAgICAgIH0KICAgICAgfQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsIGUgPT4gewogICAgICAgIGlmKFsiVGFiIiwgIkFycm93TGVmdCIsICJBcnJvd1JpZ2h0IiwgIkFycm93VXAiLCAiQXJyb3dEb3duIl0uaW5jbHVkZXMoZS5rZXkpKXsKICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKQogICAgICAgIH0KCiAgICAgICAgaWYoZS5rZXkgPT0gIkVzY2FwZSIpewogICAgICAgICAgbWVudSgpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoZS5rZXkgPT0gIkVudGVyIiAmJiBlLnRhcmdldC50YWdOYW1lID09ICJCT0RZIil7CiAgICAgICAgICBpZihxcygiI21lZGlhLWNvbnRhaW5lciIpLnN0eWxlLmRpc3BsYXkgPT0gImJsb2NrIil7CiAgICAgICAgICAgIGhpZGVtZWRpYSgpCiAgICAgICAgICAgIHJldHVybgogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBzaG93KGFjdGl2ZSgpLmlkKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICBpZihlLmtleSA9PSAiQXJyb3dVcCIgJiYgcGljb2Zmc2V0KC1jb2xzKCkpKXsKICAgICAgICAgIHBpY29mZnNldCgtY29scygpKS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgbGFzdGFjdGl2ZSgpLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpCiAgICAgICAgICB1cGRhdGVzaG93KCkKICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJBcnJvd0Rvd24iICYmIHBpY29mZnNldChjb2xzKCkpKXsKICAgICAgICAgIHBpY29mZnNldChjb2xzKCkpLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgICAgICBhY3RpdmUoKS5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKQogICAgICAgICAgdXBkYXRlc2hvdygpCiAgICAgICAgfQoKICAgICAgICBpZihlLmtleSA9PSAiQXJyb3dMZWZ0Iil7CiAgICAgICAgICBwcmV2KCkKICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJBcnJvd1JpZ2h0Iil7CiAgICAgICAgICBuZXh0KCkKICAgICAgICB9CiAgICAgIH0pCgogICAgICBhc3luYyBmdW5jdGlvbiBoYW5kbGVxdWVyeXJlcyhyZXMsIHNvY2tldCwgcSwgdHlwZSwgc3RpbWUpewogICAgICAgIHNhdmUoc29ja2V0LCByZXMsIHEsIHR5cGUsIGZhbHNlLCBmYWxzZSkKICAgICAgICBsb2coInF1ZXJ5IHJlcyIsIHJlcy5sZW5ndGgsIHNvY2tldC51cmwpCiAgICAgICAgcXVlcnljb3VudC0tCgogICAgICAgIGlmKHF1ZXJ5Y291bnQgPT0gMCl7CiAgICAgICAgICBxcygiI2xvYWRpbmciKS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGxldCB3YWl0ID0gd2FpdG1zIC0gKERhdGUubm93KCkgLSBzdGltZSkKICAgICAgICBxdWVyeXdhaXQgPSBzbGVlcCh3YWl0KQogICAgICAgIGF3YWl0IHF1ZXJ5d2FpdC5wcm9taXNlCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHByaW1hbGdsb2JhbChzb2NrZXQpewogICAgICAgIGxvZygiZ2xvYmFsIiwgc29ja2V0LnVybCkKICAgICAgICBxdWVyeWNvdW50KysKICAgICAgICBxcygiI2xvYWRpbmciKS5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIgogICAgICAgIGxldCBzdGltZSA9IERhdGUubm93KCkKICAgICAgICBsZXQgcWlkID0gImdsb2JhbF8iICsgKCsraWRjb3VudGVyKQogICAgICAgIGxldCBxaWRsaWtlcyA9ICJsaWtlc18iICsgKCsraWRjb3VudGVyKQoKICAgICAgICBpZihuZXdsaWtlcy5sZW5ndGggPiAwKXsKICAgICAgICAgIHByaW1hbHNvY2tldC5zZW5kKEpTT04uc3RyaW5naWZ5KFsKICAgICAgICAgICAgIlJFUSIsIAogICAgICAgICAgICBxaWRsaWtlcywgCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiY2FjaGUiOiBbCiAgICAgICAgICAgICAgICAiZXZlbnRzIiwgewogICAgICAgICAgICAgICAgICAiZXZlbnRfaWRzIjogbmV3bGlrZXMKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBdCiAgICAgICAgICAgIH0KICAgICAgICAgIF0pKQoKICAgICAgICAgIGNvbnN0IGxpa2VfZXZlbnRzID0gYXdhaXQgd2FpdHJlcyhxaWRsaWtlcykKICAgICAgICAgIG5ld2xpa2VzLnNwbGljZSgwKQogICAgICAgICAgCiAgICAgICAgICBhd2FpdCBzYXZlKHNvY2tldCwgbGlrZV9ldmVudHMsICIiLCAiYWxsIiwgdHJ1ZSwgdHJ1ZSkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgc29ja2V0LnNlbmQoSlNPTi5zdHJpbmdpZnkoWwogICAgICAgICAgIlJFUSIsIAogICAgICAgICAgcWlkLCAKICAgICAgICAgIHsKICAgICAgICAgICAgImNhY2hlIjogWwogICAgICAgICAgICAgICJleHBsb3JlIiwgCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInRpbWVmcmFtZSI6ICJsYXRlc3QiLAogICAgICAgICAgICAgICAgInNjb3BlIjogImdsb2JhbCIsCiAgICAgICAgICAgICAgICAibGltaXQiOiAyMAogICAgICAgICAgICAgIH0KICAgICAgICAgICAgXQogICAgICAgICAgfQogICAgICAgIF0pKQogICAgICAgIAogICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHdhaXRyZXMocWlkKQogICAgICAgIGF3YWl0IGhhbmRsZXF1ZXJ5cmVzKHJlcy5maWx0ZXIoZSA9PiBlLmtpbmQgPT0gMSksIHNvY2tldCwgIiIsICJhbGwiLCBzdGltZSkKICAgICAgICBwcmltYWxnbG9iYWwoc29ja2V0KQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBxdWVyeShzb2NrZXQsIHByaW1hbCl7CiAgICAgICAgbG9nKCJxdWVyeSIsIHNvY2tldC51cmwpCiAgICAgICAgcXVlcnljb3VudCsrCiAgICAgICAgcXMoIiNsb2FkaW5nIikuc3R5bGUuZGlzcGxheSA9ICJibG9jayIKICAgICAgICAKICAgICAgICBsZXQgc3RpbWUgPSBEYXRlLm5vdygpCiAgICAgICAgbGV0IHEgPSBxdWVyeXN0ci50cmltKCkKICAgICAgICBsZXQgdHlwZSA9IHF1ZXJ5dHlwZSgpCiAgICAgICAgbGV0IGkgPSArK2lkY291bnRlcgogICAgICAgIGxldCBxaWQgPSAicXVlcnlfIiArIGkKICAgICAgICBsZXQgZmlsdGVycyA9IFtdCgogICAgICAgIGZpbHRlcnMucHVzaCguLi4odHlwZXNbdHlwZV0gfHwgW10pLm1hcCgodCkgPT4gewogICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAga2luZHM6IFsxXSwgCiAgICAgICAgICAgIHNlYXJjaDogIi4iICsgdCwKICAgICAgICAgICAgbGltaXQ6IDIwCiAgICAgICAgICB9CiAgICAgICAgfSkpCiAgICAgICAgCiAgICAgICAgaWYocS5sZW5ndGggPiAwKXsKICAgICAgICAgIGZpbHRlcnMucHVzaCh7a2luZHM6IFsxXSwgc2VhcmNoOiBxfSkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoZmlsdGVycy5sZW5ndGggPT0gMCl7CiAgICAgICAgICBmaWx0ZXJzLnB1c2goe2tpbmRzOiBbMV19KQogICAgICAgIH0KICAgICAgICAKICAgICAgICAKICAgICAgICBjb25zdCBsaWtlc3JlcyA9IGF3YWl0IHF1ZXJ5bGlrZXMoc29ja2V0KQogICAgICAgIAogICAgICAgIGxpa2VzcmVzLmZvckVhY2goZXZlbnRpZCA9PiB7CiAgICAgICAgICBpZighbGlrZXMuaW5jbHVkZXMoZXZlbnRpZCkpewogICAgICAgICAgICBsaWtlcy5wdXNoKGV2ZW50aWQpCiAgICAgICAgICAgIG5ld2xpa2VzLnB1c2goZXZlbnRpZCkKICAgICAgICAgIH0KICAgICAgICB9KQogICAgICAgIAogICAgICAgIGNvbnN0IHNlYXJjaG9iaiA9IFsiUkVRIiwgcWlkLCAuLi5maWx0ZXJzXQogICAgICAgIGNvbnN0IHNlYXJjaGpzb24gPSBKU09OLnN0cmluZ2lmeShzZWFyY2hvYmopCiAgICAgICAgc29ja2V0LnNlbmQoc2VhcmNoanNvbikKICAgICAgICAKICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB3YWl0cmVzKHFpZCkKICAgICAgICBhd2FpdCBoYW5kbGVxdWVyeXJlcyhyZXMsIHNvY2tldCwgcSwgdHlwZSwgc3RpbWUpCiAgICAgICAgcXVlcnkoc29ja2V0KQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBxdWVyeWxpa2VzKHNvY2tldCl7CiAgICAgICAgaWYoIWhhc2tleSgpKXsKICAgICAgICAgIHJldHVybiBbXQogICAgICAgIH0KICAgICAgICAKICAgICAgICBjb25zdCBteXB1YmtleSA9IGF3YWl0IHB1YmtleSgpCiAgICAgICAgY29uc3QgZXZlbnRzID0gYXdhaXQgcXVlcnlldmVudHMoc29ja2V0LCBbN10sIG51bGwsIFtteXB1YmtleV0pCiAgICAgICAgcmV0dXJuIGV2ZW50cy5tYXAoZSA9PiBlLnRhZ3MuZmluZCh0ID0+IHRbMF0gPT0gImUiKVsxXSkKICAgICAgfQoKICAgICAgYXN5bmMgZnVuY3Rpb24gcXVlcnlldmVudHMoc29ja2V0LCBraW5kcywgZXZlbnRpZHMsIGF1dGhvcnMpewogICAgICAgIGNvbnN0IHF1ZXJ5aWQgPSAiZXZlbnRzXyIgKyAoKytpZGNvdW50ZXIpCiAgICAgICAgY29uc3QgZmlsdGVycyA9IHt9CiAgICAgICAgCiAgICAgICAgZmlsdGVycy5raW5kcyA9IGtpbmRzCiAgICAgICAgCiAgICAgICAgaWYoZXZlbnRpZHMpewogICAgICAgICAgZmlsdGVyc1siI2UiXSA9IGV2ZW50aWRzCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGF1dGhvcnMpewogICAgICAgICAgZmlsdGVyc1siYXV0aG9ycyJdID0gYXV0aG9ycwogICAgICAgIH0KICAgICAgICAKICAgICAgICBjb25zdCBqc29uID0gSlNPTi5zdHJpbmdpZnkoWwogICAgICAgICAgIlJFUSIsIAogICAgICAgICAgcXVlcnlpZCwgCiAgICAgICAgICBmaWx0ZXJzCiAgICAgICAgXSkKCiAgICAgICAgc29ja2V0LnNlbmQoanNvbikKICAgICAgICAKICAgICAgICByZXR1cm4gYXdhaXQgd2FpdHJlcyhxdWVyeWlkKSB8fCBbXQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBxdWVyeXB1YmtleShzb2NrZXQsIHB1YmspewogICAgICAgIGNvbnN0IHF1ZXJ5aWQgPSAicXVlcnlfIiArICgrK2lkY291bnRlcikKICAgICAgICBzb2NrZXQuc2VuZChxdWVyaWVzLmF1dGhvci5yZXBsYWNlKCI8ST4iLCBxdWVyeWlkKS5yZXBsYWNlKCI8UD4iLCBwdWJrKSkKCiAgICAgICAgcmV0dXJuIChhd2FpdCB3YWl0cmVzKHF1ZXJ5aWQpKQogICAgICB9CgogICAgICBmdW5jdGlvbiBzYXZlcmVzdWx0cyhldmVudCwgcmVnZXgsIG1ldGFldmVudHMsIHJlYWN0ZWQpewogICAgICAgIGxldCByZXN1bHRzID0gW10KCiAgICAgICAgZm9yKGxldCB1cmwgb2YgZXZlbnQuY29udGVudC5tYXRjaChyZWdleCkgfHwgW10pewogICAgICAgICAgaWYoIXVybHMuaW5jbHVkZXModXJsKSl7CiAgICAgICAgICAgIGNvbnN0IG1ldGEgPSBtZXRhZXZlbnRzLmZpbmQobyA9PiBvLnB1YmtleSA9PSBldmVudC5wdWJrZXkpCgogICAgICAgICAgICB1cmxzLnB1c2godXJsKQogICAgICAgICAgICByZXN1bHRzLnB1c2goewogICAgICAgICAgICAgIHJlYWN0ZWQ6IHJlYWN0ZWQgfHwgbGlrZXMuaW5jbHVkZXMoZXZlbnQuaWQpLCAKICAgICAgICAgICAgICB1cmw6IHVybCwgCiAgICAgICAgICAgICAgZXZlbnQ6IGV2ZW50LCAKICAgICAgICAgICAgICBiZWNoMzJpZDogYmVjaDMyLmVuY29kZSgibm90ZSIsIGZyb21IZXhTdHJpbmcoZXZlbnQuaWQpKSwKICAgICAgICAgICAgICBtZXRhOiBtZXRhCiAgICAgICAgICAgIH0pCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJldHVybiByZXN1bHRzCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHNhdmUoc29ja2V0LCBldmVudGRiLCBxLCBxdHlwZSwgcmVhY3RlZCwgYXBwZW5kKXsKICAgICAgICBsZXQgZXZlbnRwdWJrZXlzID0gW10KICAgICAgICBjb25zdCBldmVudHMgPSBldmVudGRiLmZpbHRlcihvID0+IHsKICAgICAgICAgIGlmKHEubGVuZ3RoID4gMCl7CiAgICAgICAgICAgIGZvcihsZXQgd29yZCBvZiBxLnNwbGl0KCIgIikpewogICAgICAgICAgICAgIGlmKG8uY29udGVudC50b0xvd2VyQ2FzZSgpLmluZGV4T2Yod29yZC50b0xvd2VyQ2FzZSgpKSA9PSAtMSl7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2UKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KCiAgICAgICAgICBldmVudHB1YmtleXMuaW5jbHVkZXMoby5wdWJrZXkpIHx8IGV2ZW50cHVia2V5cy5wdXNoKG8ucHVia2V5KQogICAgICAgICAgcmV0dXJuIHRydWUKICAgICAgICB9KQogICAgICAgIAogICAgICAgIGxldCByZXN1bHRzID0gW10KICAgICAgICBjb25zdCBldmVudGlkcyA9IGV2ZW50cy5tYXAoZSA9PiBlLmlkKQogICAgICAgIGxldCBtZXRhZXZlbnRzID0gW10KCiAgICAgICAgbG9nKCJxdWVyeSBtZXRhIiwgc29ja2V0LnVybCkKICAgICAgICAKICAgICAgICAvL21ldGFldmVudHMucHVzaCguLi4oYXdhaXQgcXVlcnlldmVudHMoc29ja2V0LCBbMF0sIG51bGwsIGV2ZW50cHVia2V5cykpKQoKICAgICAgICBmb3IobGV0IGV2ZW50IG9mIGV2ZW50cyl7CiAgICAgICAgICBpZihxdHlwZSAhPSAidmlkZW8iKXsKICAgICAgICAgICAgcmVzdWx0cy5wdXNoKC4uLnNhdmVyZXN1bHRzKGV2ZW50LCBpbWdyZWdleCwgbWV0YWV2ZW50cywgcmVhY3RlZCkpCiAgICAgICAgICB9CgogICAgICAgICAgaWYocXR5cGUgIT0gImltYWdlIil7CiAgICAgICAgICAgIHJlc3VsdHMucHVzaCguLi5zYXZlcmVzdWx0cyhldmVudCwgdmlkZW9yZWdleCwgbWV0YWV2ZW50cywgcmVhY3RlZCkpCiAgICAgICAgICB9CiAgICAgICAgfQogIAogICAgICAgIGxvZygic2F2ZSByZXMiLCByZXN1bHRzLmxlbmd0aCwgc29ja2V0LnVybCkKICAgICAgICB1cGRhdGVjb250ZW50KHJlc3VsdHMsIHEsIGFwcGVuZCkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gdXBkYXRlY29udGVudChyZXN1bHRzLCBxLCBhcHBlbmQpewogICAgICAgIHJlc3VsdHMucmV2ZXJzZSgpLmZvckVhY2goaXRlbSA9PiB7CiAgICAgICAgICBjb25zdCB0eXBlID0gaXRlbS51cmwubWF0Y2godmlkZW9leHRyZWdleCkgJiYgInZpZGVvIiB8fCAicGljIgogICAgICAgICAgY29uc3QgdGV4dCA9IChxIHx8ICJ2aWV3IG5vdGUiKS5zdWJzdHJpbmcoLTMwKQogICAgICAgICAgY29uc3QgaWQgPSAiaXRlbV8iICsgKCsraWRjb3VudGVyKQogICAgICAgICAgY29uc3QgY29udGVudGVsZW1lbnRzID0gJzxkaXYgY2xhc3M9InR5cGUiPicgKyB0eXBlICsgJzwvZGl2PjxhIGNsYXNzPSJsaWtlJyArIChpdGVtLnJlYWN0ZWQgPyAnIHJlYWN0ZWQnIDogJycpICsgJyIgZGF0YS1pdGVtLWlkPSInICsgaWQgKyAKICAgICAgICAgICAgJyIgaHJlZj0iIyI+JyArIHFzKCIjdGVtcGxhdGUgLmhlYXJ0c3ZnIikub3V0ZXJIVE1MICsgJzwvYT48YSBjbGFzcz0icXVlcnkiIGhyZWY9IicgKyBwcm90b2NvbCArIAogICAgICAgICAgICBpdGVtLmJlY2gzMmlkICsgJyI+JyArIHRleHQgKyAnPC9hPicKICAgICAgICAgIGxldCByb290ID0gbnVsbAogICAgICAgICAgbGV0IHYgPSBudWxsCiAgICAgICAgICAKICAgICAgICAgIGlmKGl0ZW0udXJsLm1hdGNoKHZpZGVvZXh0cmVnZXgpKXsKICAgICAgICAgICAgcm9vdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpCiAgICAgICAgICAgIHJvb3QuY2xhc3NMaXN0LmFkZCgidmlkZW8tY29udGFpbmVyIikKICAgICAgICAgICAgcm9vdC5pbm5lckhUTUwgPSBjb250ZW50ZWxlbWVudHMKICAgICAgICAgICAgCiAgICAgICAgICAgIHYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpCiAgICAgICAgICAgIHZbImRhdGEtaXRlbS1pZCJdID0gaWQKICAgICAgICAgICAgdi5wcmVsb2FkID0gIm5vbmUiCiAgICAgICAgICAgIHYubG9vcCA9IHRydWUKICAgICAgICAgICAgdi5wbGF5c2lubGluZSA9ICIiCiAgICAgICAgICAgIC8vcm9vdC5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIgogICAgICAgICAgICAKICAgICAgICAgICAgdi5vbmNhbnBsYXkgPSBhc3luYyBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICBjb25zdCBhc3BlY3QgPSB0aGlzLnZpZGVvV2lkdGggLyB0aGlzLnZpZGVvSGVpZ2h0CiAgICAgICAgICAgICAgaWYoYXNwZWN0ID4gMSl7CiAgICAgICAgICAgICAgICB0aGlzLnN0eWxlLndpZHRoID0gKGFzcGVjdCAqIDEwMCkgKyAiJSIKICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgIHRoaXMuc3R5bGUuaGVpZ2h0ID0gKDEgLyBhc3BlY3QgKiAxMDApICsgIiUiCiAgICAgICAgICAgICAgICB0aGlzLnN0eWxlLm1hcmdpblRvcCA9IC0oKDEgLyBhc3BlY3QgKiAxMDAgLSAxMDApIC8gMikgKyAiJSIKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgdXBkYXRldmlkZW9wbGF5KHRoaXMpCiAgICAgICAgICAgICAgdGhpcy5wYXJlbnRFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siCiAgICAgICAgICAgIH0KICAgICAgCiAgICAgICAgICAgIGNvbnN0IGV4dCA9IGl0ZW0udXJsLm1hdGNoKHZpZGVvZXh0cmVnZXgpWzFdCiAgICAgICAgICAgIHYuaW5uZXJIVE1MID0gJzxzb3VyY2Ugc3JjPSInICsgaXRlbS51cmwgKyAnIiB0eXBlPSJ2aWRlby8nICsgZXh0ICsgJyI+PC9zb3VyY2U+JwogICAgICAgICAgICAKICAgICAgICAgICAgcm9vdC5hcHBlbmQodikKICAgICAgICAgIH1lbHNlewogICAgICAgICAgICByb290ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpCiAgICAgICAgICAgIHJvb3QuaHJlZiA9ICIjIgogICAgICAgICAgICByb290LmlubmVySFRNTCA9IGNvbnRlbnRlbGVtZW50cwogICAgICAgICAgICAgIAogICAgICAgICAgICBpZih0eXBlID09ICJwaWMiKXsKICAgICAgICAgICAgICByb290LmlubmVySFRNTCArPSAnPGltZyBvbmxvYWQ9ImdpZChcJycgKyBpZCArICdcJykuc3R5bGUuZGlzcGxheT1cJ2Jsb2NrXCciIHNyYz0iJyArIGl0ZW0udXJsICsgJyIvPicKICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgcm9vdC5pbm5lckhUTUwgKz0gJzxzcGFuIGNsYXNzPSJmaWxlIj4nICsgaXRlbS51cmwgKyAnPC9zcGFuPicKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICByb290LmlkID0gaWQKICAgICAgICAgIHJvb3RbImRhdGEtaXRlbSJdID0gaXRlbQogICAgICAgICAgcm9vdFsiZGF0YS1ldmVudCJdID0gaXRlbS5ldmVudAogICAgICAgICAgcm9vdFsiZGF0YS1xdWVyeSJdID0gcQogICAgICAgICAgcm9vdFsiZGF0YS10ZXh0Il0gPSB0ZXh0CiAgICAgICAgICAKICAgICAgICAgIHJvb3QuY2xhc3NMaXN0LmFkZCh0eXBlKQogICAgICAgICAgcm9vdC5jbGFzc0xpc3QuYWRkKCJpdGVtIikKICAgICAgICAgIHJvb3QuY2xhc3NMaXN0LmFkZCgic2hvdyIpCiAgICAgICAgICAKICAgICAgICAgIGlmKGl0ZW0ucmVhY3RlZCl7CiAgICAgICAgICAgIHJvb3QuY2xhc3NMaXN0LmFkZCgicmVhY3RlZCIpCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIHFzKCIjcGljcyIpW2FwcGVuZCAmJiAiYXBwZW5kIiB8fCAicHJlcGVuZCJdKHJvb3QpCiAgICAgICAgICAKICAgICAgICAgIGlmKHYpewogICAgICAgICAgICB1cGRhdGV2aWRlb3BsYXkodikKICAgICAgICAgIH0KICAgICAgICB9KQoKICAgICAgICBpZihhY3RpdmUoKSA9PSBudWxsKXsKICAgICAgICAgIHFzKCIjcGljcyAuaXRlbSIpPy5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgIH0KICAgICAgfQoKICAgICAgZnVuY3Rpb24gaGlkZW1lZGlhKCl7CiAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICJzY3JvbGwiCiAgICAgICAgcXNhKCIjbWVkaWEtY29udGFpbmVyLCAjcGljLCAjbWVkaWEtZm9vdGVyIikuZm9yRWFjaChuID0+IG4uc3R5bGUuZGlzcGxheSA9ICJub25lIikKICAgICAgICBnaWQoInBpYy1saWtlIikuY2xhc3NMaXN0LnJlbW92ZSgicmVhY3RlZCIpCiAgICAgICAgaGlkZXZpZGVvKCkKICAgICAgfQoKICAgICAgZnVuY3Rpb24gaGlkZXZpZGVvKCl7CiAgICAgICAgY29uc3QgdiA9IHFzKCIjbWVkaWEtY29udGFpbmVyIHZpZGVvIikKICAgICAgICAKICAgICAgICBpZih2KXsKICAgICAgICAgIHYubXV0ZWQgPSB0cnVlCiAgICAgICAgICBnaWQodlsiZGF0YS1pdGVtLWlkIl0pLmFwcGVuZENoaWxkKHYpCiAgICAgICAgICB1cGRhdGV2aWRlb3BsYXkodikKICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHdhaXRyZXMoa2V5KXsKICAgICAgICBsZXQgZXZlbnRzID0gW10KICAgICAgICAKICAgICAgICBsZXQgcmVzaGFuZGxlciA9IGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCl7CiAgICAgICAgICB0aGlzLmhhbmRsZSA9IGZ1bmN0aW9uKHJlcyl7CiAgICAgICAgICAgIHRoaXMua2V5ID0ga2V5CiAgICAgICAgICAgIGxldCBvID0gSlNPTi5wYXJzZShyZXMuZGF0YSkKICAgICAgICAgICAgaWYob1sxXSA9PSBrZXkpewogICAgICAgICAgICAgIGlmKG9bMF0gPT0gIkVPU0UiKXsKICAgICAgICAgICAgICAgIHJlc29sdmUoZXZlbnRzKQogICAgICAgICAgICAgICAgcmVzaGFuZGxlcnMuc3BsaWNlKHJlc2hhbmRsZXJzLmluZGV4T2YodGhpcyksIDEpCiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIGV2ZW50cy5wdXNoKG9bMl0pCiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgICAKICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gewogICAgICAgICAgcmVzaGFuZGxlcnMucHVzaChuZXcgcmVzaGFuZGxlcihyZXNvbHZlLCByZWplY3QpKQogICAgICAgIH0pCiAgICAgIH0KICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBjaGVja3VwZGF0ZShzb2NrZXQpewogICAgICAgIGNvbnN0IHVwZGF0ZXNyZXMgPSBhd2FpdCBxdWVyeXB1YmtleShzb2NrZXQsIHVwZGF0ZXNwdWJrZXkpCiAgICAgICAgY29uc3QgdXBkYXRlbm90ZSA9IHVwZGF0ZXNyZXMuZmluZChuID0+IG4uY29udGVudC5tYXRjaCgvXmh0dHBzXDpcL1wvLykpCiAgICAgICAgCiAgICAgICAgaWYoIXVwZGF0ZW5vdGUpewogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGNvbnN0IGFnZSA9IE1hdGgucm91bmQoKERhdGUubm93KCkgLyAxMDAwIC0gdXBkYXRlbm90ZS5jcmVhdGVkX2F0KSAvIDM2MDAgLyAyNCkKICAgICAgICBjb25zdCBub3RlaWQgPSBiZWNoMzIuZW5jb2RlKCJub3RlIiwgZnJvbUhleFN0cmluZyh1cGRhdGVub3RlLmlkKSkKICAgICAgICBxcygiI3JlbGVhc2UiKS5ocmVmID0gcHJvdG9jb2wgKyBub3RlaWQKICAgICAgICBxcygiI3JlbGVhc2UiKS5pbm5lclRleHQgPSAoYWdlID09IDAgJiYgInRvZGF5IiB8fCBhZ2UgKyAiIGRheShzKSBhZ28iKQogICAgICB9CgogICAgICBmdW5jdGlvbiBzbGVlcChtcyl7CiAgICAgICAgcmV0dXJuIG5ldyBmdW5jdGlvbigpewogICAgICAgICAgbGV0IHRpbWVvdXQgPSBudWxsCiAgICAgICAgICBsZXQgciA9IG51bGwKICAgICAgICAgIAogICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgcHJvbWlzZTogbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KXsKICAgICAgICAgICAgICB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiByZXNvbHZlKCksIG1zKQogICAgICAgICAgICAgIHIgPSByZXNvbHZlCiAgICAgICAgICAgIH0pLAogICAgICAgICAgICByZXNvbHZlOiBmdW5jdGlvbigpewogICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KQogICAgICAgICAgICAgIHIoKQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBzaG93KGlkKXsKICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gImhpZGRlbiIKICAgICAgICBjb25zdCBpdGVtID0gZ2lkKGlkKVsiZGF0YS1pdGVtIl0KICAgICAgICBjb25zdCBtZWRpYSA9IGdpZCgibWVkaWEtY29udGFpbmVyIikKICAgICAgICBjb25zdCBwaWMgPSBnaWQoInBpYyIpCgogICAgICAgIGlmKGl0ZW0udXJsLm1hdGNoKHZpZGVvZXh0cmVnZXgpKXsKICAgICAgICAgIHBpYy5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiCiAgICAgICAgICBjb25zdCB2ID0gZ2lkKGlkKS5xdWVyeVNlbGVjdG9yKCJ2aWRlbyIpCiAgICAgICAgICBxcygiI21lZGlhLWNvbnRhaW5lciIpLmFwcGVuZENoaWxkKHYpCiAgICAgICAgICB2Lm11dGVkID0gZmFsc2UKICAgICAgICAgIHYucGxheSgpCiAgICAgICAgfWVsc2V7CiAgICAgICAgICBwaWMuc3JjID0gaXRlbS51cmwKICAgICAgICAgIHBpYy5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIgogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihpdGVtLm1ldGEpewogICAgICAgICAgY29uc3QgbWV0YWNvbnRlbnQgPSBKU09OLnBhcnNlKGl0ZW0ubWV0YS5jb250ZW50KQogICAgICAgICAgY29uc3QgbmFtZSA9IG1ldGFjb250ZW50LmRpc3BsYXlfbmFtZSB8fCBtZXRhY29udGVudC5uYW1lCiAgICAgICAgICBxcygiI3BpYy11c2VyIikuaHJlZiA9IHByb3RvY29sICsgYmVjaDMyLmVuY29kZSgibnB1YiIsIGZyb21IZXhTdHJpbmcoaXRlbS5tZXRhLnB1YmtleSkpCiAgICAgICAgICBxcygiI3BpYy11c2VyIikuaW5uZXJUZXh0ID0gbmFtZQogICAgICAgIH0KCiAgICAgICAgZ2lkKCJwaWMtbGlrZSIpWyJkYXRhLWl0ZW0taWQiXSA9IGlkCiAgICAgICAgZ2lkKCJtZWRpYS1mb290ZXIiKVsiZGF0YS1ldmVudCJdID0gaXRlbS5ldmVudAoKICAgICAgICBpZihpdGVtLnJlYWN0ZWQgfHwgcmVhY3RlZC5pbmNsdWRlcyhpZCkpewogICAgICAgICAgZ2lkKCJwaWMtbGlrZSIpLmNsYXNzTGlzdC5hZGQoInJlYWN0ZWQiKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBjb25zdCBhID0gcXMoIiNwaWMtcXVlcnkiKQogICAgICAgIGEuaHJlZiA9IHByb3RvY29sICsgaXRlbS5iZWNoMzJpZAogICAgICAgIGEuaW5uZXJUZXh0ID0gZ2lkKGlkKVsiZGF0YS10ZXh0Il0KICAgICAgICAgIAogICAgICAgIG1lZGlhLnN0eWxlLmRpc3BsYXkgPSBnaWQoIm1lZGlhLWZvb3RlciIpLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIGNvbm5jb3VudCgpewogICAgICAgIHJldHVybiBzb2NrZXRzLmZpbHRlcihyID0+IHIucmVhZHlTdGF0ZSA9PSAxKS5sZW5ndGgKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gZGlzY29ubmVjdCgpewogICAgICAgIGZvcihsZXQgc29ja2V0IG9mIHNvY2tldHMpewogICAgICAgICAgc29ja2V0LmNsb3NlKCkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgc29ja2V0cy5zcGxpY2UoMCkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gbG9nKG1zZyl7CiAgICAgICAgbGV0IHNjcm9sbCA9IHFzKCIjbG9ncyIpLnNjcm9sbFRvcCA9PSBxcygiI2xvZ3MiKS5zY3JvbGxUb3BNYXgKICAgICAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKQogICAgICAgIGRpdi5pbm5lclRleHQgPSBBcnJheS5mcm9tKGFyZ3VtZW50cykuam9pbigiICIpCiAgICAgICAgcXMoIiNsb2dzIikuYXBwZW5kKGRpdikKICAgICAgICAKICAgICAgICBpZihzY3JvbGwpewogICAgICAgICAgcXMoIiNsb2dzIikuc2Nyb2xsVG8oMCwgcXMoIiNsb2dzIikuc2Nyb2xsVG9wTWF4KQogICAgICAgIH0KICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gY29ubmVjdCh1cmwpewogICAgICAgIGxvZygiY29ubmVjdGluZyIsIHVybCkKICAgICAgICBsZXQgc29ja2V0ID0gbmV3IFdlYlNvY2tldCh1cmwpCiAgICAgICAgCiAgICAgICAgc29ja2V0Lm9ubWVzc2FnZSA9IG1lc3NhZ2UgPT4gcmVzaGFuZGxlcnMuZm9yRWFjaChyaCA9PiByaC5oYW5kbGUobWVzc2FnZSkpCiAgICAgICAgCiAgICAgICAgc29ja2V0Lm9uY2xvc2UgPSBhc3luYyBmdW5jdGlvbigpewogICAgICAgICAgc29ja2V0cy5zcGxpY2Uoc29ja2V0cy5pbmRleE9mKHNvY2tldCksIDEpCiAgICAgICAgICBxcygiI2Nvbm5jb3VudCIpLmlubmVyVGV4dCA9IGNvbm5jb3VudCgpICsgKHByaW1hbHNvY2tldCAmJiAxKQogICAgICAgICAgbG9nKCJkaXNjb25uZWN0ZWQiLCB0aGlzLnVybCwgY29ubmNvdW50KCkpCiAgICAgICAgICBhd2FpdCBzbGVlcCgxMDAwKS5wcm9taXNlCiAgICAgICAgICBjb25uZWN0KHRoaXMudXJsKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBzb2NrZXQub25vcGVuID0gZnVuY3Rpb24oKXsKICAgICAgICAgIHFzKCIjY29ubmNvdW50IikuaW5uZXJUZXh0ID0gY29ubmNvdW50KCkgKyAocHJpbWFsc29ja2V0ICYmIDEpCiAgICAgICAgICBsb2coImNvbm5lY3RlZCIsIHRoaXMudXJsLCBjb25uY291bnQoKSkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgcmV0dXJuIHNvY2tldAogICAgICB9CiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJsb2FkIiwgYXN5bmMgKCkgPT4gewogICAgICAgIHByaW1hbHNvY2tldCA9IGNvbm5lY3QoIndzczovL2NhY2hlMy5wcmltYWwubmV0L2NhY2hlMTciKQogICAgICAgIHByaW1hbHNvY2tldC5hZGRFdmVudExpc3RlbmVyKCJvcGVuIiwgZnVuY3Rpb24oKXsKICAgICAgICAgIHByaW1hbGdsb2JhbCh0aGlzKQogICAgICAgIH0pCiAgICAgICAgCiAgICAgICAgcHJpbWFsc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoImNsb3NlIiwgZnVuY3Rpb24oKXsKICAgICAgICAgIHByaW1hbHNvY2tldCA9IG51bGwKICAgICAgICB9KQogICAgICAgIAogICAgICAgIGZvcihsZXQgdXJsIG9mIHJlbGF5cygpKXsKICAgICAgICAgIGNvbnN0IHNvY2tldCA9IGNvbm5lY3QodXJsKQogICAgICAgICAgc29ja2V0cy5wdXNoKHNvY2tldCkKICAgICAgICAgIAogICAgICAgICAgc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoIm9wZW4iLCBmdW5jdGlvbigpewogICAgICAgICAgICBjaGVja3VwZGF0ZSh0aGlzKQogICAgICAgICAgICBxdWVyeSh0aGlzKQogICAgICAgICAgfSkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgYXdhaXQgc2xlZXAoMTAwKS5wcm9taXNlCiAgICAgICAgCiAgICAgICAgaWYoaGFza2V5KCkpewogICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCJub3N0ciIpCiAgICAgICAgfQogICAgICB9KQogICAgICAKICAgICAgZm9yKGxldCBjIG9mIGNvbG9wdHMpewogICAgICAgIGRvY3VtZW50LndyaXRlKCc8c3R5bGU+JyArIGNvbHNjc3MuaW5uZXJUZXh0LnJlcGxhY2UoL1wkXHtjb2xzXH0vZywgYykgKyAnPC9zdHlsZT4nKQogICAgICB9CiAgICA8L3NjcmlwdD4KICA8L2JvZHk+CjwvaHRtbD4K
Author Public Key
npub14ewxuzm5vcxjr9xgy494ctyz2em9w6lq99ehn73q2gc3ff4gt6rs3nhz9g