https://ipfs.io/ipfs/QmbjVqNZcUBDUvVCKfUz4xQMPiW1oGwywmEDBSoRFiMafb
sha256
a19240258381e45dd578ddb6cb9a6e1fc05969b3764da295700b2564b7e52ba8 files.html
base64
PCFET0NUWVBFIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgdXNlci1zY2FsYWJsZT1ubyIvPgogICAgPG1ldGEgY2hhcnNldD0iVVRGLTgiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cDovL3N2Z2ljb25zLnNwYXJray5mci9zdmdpY29ucy5jc3MiLz4KICAgIDxzdHlsZT4KICAgICAgKiB7CiAgICAgICAgb3ZlcnNjcm9sbC1iZWhhdmlvci15OiBjb250YWluOwogICAgICB9CiAgICAgIAogICAgICBib2R5IHsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICB3aWR0aDogMTAwdnc7CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIGZvbnQtZmFtaWx5OiAiTm90byBTZXJpZiI7CiAgICAgIH0KICAgICAgCiAgICAgIC5wbGFjZWhvbGRlciB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgICBwYWRkaW5nOiAxZW07CiAgICAgIH0KICAgICAgCiAgICAgIGgxIHsKICAgICAgICBmb250LXNpemU6IDFlbTsKICAgICAgICBtYXJnaW4tdG9wOiAwOwogICAgICB9CiAgICAgIAogICAgICAjcXVlcnlkaXNwbGF5LCAKICAgICAgI2hlYWRlciB7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgfQogICAgICAKICAgICAgI3JlbGF5cywKICAgICAgI2xvZ3MsIAogICAgICAjcHJpdmtleSB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgd2lkdGg6IDE4ZW07CiAgICAgICAgYmFja2dyb3VuZDogIzExMTsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQogICAgICAKICAgICAgI3JlbGF5cywKICAgICAgI2xvZ3MgewogICAgICAgIGhlaWdodDogNmVtOwogICAgICB9CiAgICAgIAogICAgICAjbG9ncyB7CiAgICAgICAgaGVpZ2h0OiA4ZW07CiAgICAgICAgb3ZlcmZsb3c6IHNjcm9sbDsKICAgICAgICBmb250LXNpemU6IC44ZW07CiAgICAgIH0KICAgICAgCiAgICAgIHNlbGVjdCB7CiAgICAgICAgd2lkdGg6IDRlbTsKICAgICAgfQogICAgICAKICAgICAgI3JlbGF5cywgCiAgICAgIGlucHV0LnN1Ym1pdCB7CiAgICAgICAgYm9yZGVyLXJhZGl1czogLjVlbTsKICAgICAgfQogICAgICAKICAgICAgI3F1ZXJ5ZGlzcGxheSAudGV4dCwgCiAgICAgICNoZWFkZXIgYSwKICAgICAgI21lZGlhLWNvbnRhaW5lciB7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KCiAgICAgICNoZWFkZXIgYSwgCiAgICAgIGZvcm0sIAogICAgICAjcXVlcnlkaXNwbGF5IHsKICAgICAgICB6LWluZGV4OiAxOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQogICAgICAKICAgICAgQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAzMGVtKSB7CiAgICAgICAgI2hlYWRlciAudGl0bGUgewogICAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgI3F1ZXJ5ZGlzcGxheSB7CiAgICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIH0KICAgICAgfQoKICAgICAgZm9ybSB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB9CiAgICAgIAogICAgICAjcXVlcnkgewogICAgICAgIHdpZHRoOiA2ZW07CiAgICAgIH0KICAgICAgCiAgICAgICNsb2FkaW5nIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDBweDsKICAgICAgICBsZWZ0OiAzMGVtOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CiAgICAgIAogICAgICBhIHsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgICAgIH0KCiAgICAgIHZpZGVvIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAKICAgICAgI21lZGlhLWNvbnRhaW5lciB2aWRlbyB7CiAgICAgICAgd2lkdGg6IDEwMCUgIWltcG9ydGFudDsKICAgICAgICBoZWlnaHQ6IDEwMCUgIWltcG9ydGFudDsKICAgICAgICBtYXJnaW4tdG9wOiAwICFpbXBvcnRhbnQ7CiAgICAgIH0KICAgICAgCiAgICAgIC50eXBlIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgICAgei1pbmRleDogMTsKICAgICAgfQogICAgICAKICAgICAgI2ltYWdlLXF1ZXJ5IHsKICAgICAgICB3aWR0aDogNWVtOwogICAgICB9CiAgICAgIAogICAgICBhIHsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQogICAgICAKICAgICAgI3F1ZXJ5ZGlzcGxheSwKICAgICAgYS5idXR0b24sCiAgICAgIGlucHV0LnN1Ym1pdCB7CiAgICAgICAgY29sb3I6ICM5OTk7CiAgICAgIH0KICAgICAgCiAgICAgICNoZWFkZXIgI3F1ZXJ5ZGlzcGxheSB7CiAgICAgICAgcGFkZGluZzogMCAxZW07CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICB9CgogICAgICAjcXVlcnlkaXNwbGF5IC50ZXh0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgbWluLXdpZHRoOiAzZW07CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIG1heC13aWR0aDogOGVtOwogICAgICB9CgogICAgICAjaGVhZGVyIGEsCiAgICAgICNoZWFkZXIgc3BhbiB7CiAgICAgICAgcGFkZGluZzogMC41ZW07CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGJhY2tncm91bmQ6ICMwMDA7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KCiAgICAgICNoZWFkZXIgewogICAgICAgIHBhZGRpbmc6IDAuNDVlbSAwOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgIH0KCiAgICAgICNoZWFkZXIgLml0ZW1zIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICBtYXJnaW4tdG9wOiAuM2VtOwogICAgICB9CgogICAgICBwIHsKICAgICAgICBtYXJnaW4tdG9wOiAwOwogICAgICB9CiAgICAgIAogICAgICAubGFiZWwgewogICAgICAgIHBhZGRpbmc6IC44ZW0gLjhlbSAuOGVtIDA7CiAgICAgIH0KCiAgICAgICNpbWFnZXMgLnF1ZXJ5IHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIH0KCiAgICAgICNtZWRpYS1jb250YWluZXIgewogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwKTsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIHotaW5kZXg6IDQ7CiAgICAgIH0KICAgICAgCiAgICAgICNpbWFnZS1jb250YWluZXIgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogICAgICAKICAgICAgI2ltYWdlIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIG1heC13aWR0aDogMTAwdnc7CiAgICAgICAgbWF4LWhlaWdodDogMTAwdmg7CiAgICAgIH0KICAgICAgICAKICAgICAgI2ltYWdlcyB7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgI2ltYWdlcyAuaXRlbSB7CiAgICAgICAgd2lkdGg6IDI1dnc7CiAgICAgICAgaGVpZ2h0OiAyNXZ3OwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQoKICAgICAgLmRpYWxvZyBpbWcgewogICAgICAgIHdpZHRoOiAxNXZ3OwogICAgICB9CiAgICAgIAogICAgICAjbWVkaWEtY29udGFpbmVyIHZpZGVvIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICB9CiAgICAgIAogICAgICBib2R5Om5vdCgubm9zdHIpICNoZWFkZXIgLmljb25zLCAKICAgICAgLmZpbHRlci1saWtlcyAjaW1hZ2VzID4gLml0ZW06bm90KC5yZWFjdGVkKSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSwgCiAgICAgICNpbWFnZS1xdWVyeSwKICAgICAgI2ltYWdlLXVzZXIgewogICAgICAgIHotaW5kZXg6IDI7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDN2dzsKICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHBhZGRpbmc6IDAgMXZ3OwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSwgCiAgICAgICNpbWFnZS1xdWVyeSwgCiAgICAgIC52aWRlb3N2ZywKICAgICAgLmltYWdlc3ZnIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsMCwwLDAuNik7CiAgICAgIH0KICAgICAgCiAgICAgIC5xdWVyeSwgCiAgICAgIC5saWtlLCAKICAgICAgI2ltYWdlLXF1ZXJ5IHsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgZm9udC1zaXplOiBtaW4oMy41dncsIDEuNWVtKTsKICAgICAgICBtYXgtd2lkdGg6IDVlbTsKICAgICAgfQogICAgICAKICAgICAgI2ltYWdlLXF1ZXJ5IHsKICAgICAgICBwYWRkaW5nOiAuNmVtIC40ZW0gLjFlbSAuNGVtOwogICAgICAgIG1heC13aWR0aDogNWVtOwogICAgICB9CiAgICAgIAogICAgICAubGlrZS5yZWFjdGVkLAogICAgICAuZmlsdGVyLWxpa2VzICNmaWx0ZXItbGlrZXMgewogICAgICAgIGJhY2tncm91bmQ6IHJlZDsKICAgICAgfQoKICAgICAgI2ltYWdlLXF1ZXJ5LAogICAgICAjaW1hZ2UtdXNlciB7CiAgICAgICAgZm9udC1zaXplOiAzZW07CiAgICAgIH0KICAgICAgCiAgICAgICNpbWFnZS1xdWVyeSwKICAgICAgI2ltYWdlLXVzZXIsCiAgICAgICNtZWRpYS1mb290ZXIgLmxpa2UgewogICAgICAgIHotaW5kZXg6IDU7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICB9CiAgICAgIAogICAgICAjaW1hZ2UtcXVlcnksCiAgICAgICNpbWFnZS11c2VyIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQoKICAgICAgI2ltYWdlLXVzZXIgewogICAgICAgIGJvdHRvbTogMS45ZW07CiAgICAgICAgZm9udC1zaXplOiAxLjhlbTsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiAuNjVlbTsKICAgICAgICBtYXgtd2lkdGg6IDhlbTsKICAgICAgfQogICAgICAKICAgICAgLmxpa2UgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgbGVmdDogMDsKICAgICAgICByaWdodDogYXV0bzsKICAgICAgICBwYWRkaW5nOiAuMmVtOwogICAgICAgIHdpZHRoOiAxZW07CiAgICAgICAgaGVpZ2h0OiAxZW07CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgfQoKICAgICAgLm5vc3RyIC5saWtlIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsgIAogICAgICB9CgogICAgICAjbWVkaWEtZm9vdGVyIC5saWtlIHsKICAgICAgICBmb250LXNpemU6IDIuNGVtOwogICAgICB9CgogICAgICAjbWVkaWEtZm9vdGVyIHsKICAgICAgICBkaXNwbGF5OiBub25lOyAgCiAgICAgIH0KICAKICAgICAgI2ltYWdlcyAuaW1nIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgYmFja2dyb3VuZC1zaXplOiBjb3ZlcjsKICAgICAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0OwogICAgICAgIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlcjsKICAgICAgfQoKICAgICAgI21lbnUtY29udGVudCAuaXRlbXMgLmJ1dHRvbi5hY3RpdmUgewogICAgICAgIGJhY2tncm91bmQ6ICM0NDQ7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KICAgICAgCiAgICAgICNpbWFnZXMgPiAuYWN0aXZlIHsKICAgICAgICBvdXRsaW5lOiAuM2VtIHNvbGlkIGdyZWVuOwogICAgICAgIHotaW5kZXg6IDE7CiAgICAgIH0KCiAgICAgIC5oZWFydHN2ZyBwYXRoLAogICAgICAuaGVhZGVyLWljb24gc3ZnIHBhdGggewogICAgICAgIHN0cm9rZTogI2ZmZjsKICAgICAgfQogIAogICAgICAudmlkZW9zdmcsCiAgICAgIC5pbWFnZXN2ZyB7CiAgICAgICAgd2lkdGg6IGNhbGMobWluKDR2dywgMmVtKSk7CiAgICAgICAgaGVpZ2h0OiBjYWxjKG1pbig0dncsIDJlbSkpOwogICAgICAgIHBhZGRpbmc6IDAgLjJlbTsKICAgICAgfQogICAgICAKICAgICAgLnZpZGVvc3ZnIHBhdGgsCiAgICAgIC5pbWFnZXN2ZyBwYXRoIHsKICAgICAgICBmaWxsOiAjZmZmOwogICAgICB9CiAgICAgIAogICAgICBhI21lbnUsIAogICAgICAuaGVhZGVyLWljb24gewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIGJhY2tncm91bmQ6ICMwMDA7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgIH0KCiAgICAgIC5pY29ucyB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIHotaW5kZXg6IDI7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgfQogICAgICAKICAgICAgYSNtZW51IHsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICBwYWRkaW5nOiAwIC41ZW07CiAgICAgICAgbWFyZ2luLXRvcDogLS4zZW07CiAgICAgICAgaGVpZ2h0OiAyLjNlbTsKICAgICAgfQogICAgICAKICAgICAgI2hlYWRlciAuaGVhZGVyLWljb24gewogICAgICAgIHBhZGRpbmc6IC4yZW07CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICAgIHdpZHRoOiAxLjVlbTsKICAgICAgICBoZWlnaHQ6IDEuNWVtOwogICAgICAgIG1hcmdpbjogLjFlbSAuNWVtOwogICAgICAgIGZsb2F0OiByaWdodDsKICAgICAgfQogICAgICAKICAgICAgLmhlYWRlci1pY29uIHN2ZyB7CiAgICAgICAgd2lkdGg6IDEuNWVtOwogICAgICAgIGhlaWdodDogMS41ZW07CiAgICAgIH0KICAgICAgIAogICAgICAubWVudXN2ZyB7CiAgICAgICAgd2lkdGg6IDJlbTsKICAgICAgICBoZWlnaHQ6IDJlbTsKICAgICAgfQoKICAgICAgLm1lbnVzdmcgcGF0aCB7CiAgICAgICAgZmlsbDogI2ZmZjsKICAgICAgfQoKICAgICAgI21lbnUtY29udGVudCB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICBoZWlnaHQ6IDEwMHZoOwogICAgICAgIHdpZHRoOiAxOGVtOwogICAgICAgIG1hcmdpbi1sZWZ0OiAtMThlbTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMjIyOwogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICB6LWluZGV4OiAzOyAKICAgICAgICBvdmVyZmxvdzogc2Nyb2xsOwogICAgICB9CgogICAgICAjbWVudS1jb250ZW50LnZpc2libGUgewogICAgICAgIG1hcmdpbi1sZWZ0OiAwOwogICAgICB9CiAgICAgIAogICAgICAjbWVudS1jb250ZW50IC5pdGVtcyB7CiAgICAgICAgcGFkZGluZzogMWVtOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CiAgICAgIAogICAgICAjbWVudS1jb250ZW50IC5pdGVtcyBhLmJ1dHRvbiwKICAgICAgaW5wdXQuc3VibWl0IHsKICAgICAgICBwYWRkaW5nOiAuNWVtIC43ZW07CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIGJhY2tncm91bmQ6ICMxMTE7CiAgICAgIH0KCiAgICAgICNvdmVybGF5IHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIGJhY2tncm91bmQ6ICMwMDA7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIHotaW5kZXg6IDM7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIG9wYWNpdHk6IC41OwogICAgICB9CgogICAgICAudmlzaWJsZSB7CiAgICAgICAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDsKICAgICAgfQogICAgICAKICAgICAgI3NoYXJlLWRpYWxvZyB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgd2lkdGg6IGNhbGMoMTAwdncgLSA2ZW0pOwogICAgICAgIGhlaWdodDogNzAlOwogICAgICAgIGJhY2tncm91bmQ6ICNmZmY7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMWVtOwogICAgICAgIHotaW5kZXg6IDQ7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDJlbTsKICAgICAgICBtYXJnaW4tdG9wOiAyZW07CiAgICAgICAgcGFkZGluZzogMWVtOwogICAgICB9CiAgICAgIAogICAgICBoMiB7CiAgICAgICAgbWFyZ2luLXRvcDogMDsKICAgICAgfQogICAgICAKICAgICAgc3ZnIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgI3RlbXBsYXRlIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvaGVhZD4KICA8Ym9keT4KICAgIDxkaXYgaWQ9InRlbXBsYXRlIj4KICAgICAgPHN2ZyBjbGFzcz0iaGVhcnRzdmcgc3ZnLWljb24iIHZpZXdCb3g9IjAgMCAyMCAyMCI+CiAgICAgICAgPHBhdGggZD0iTTkuNzE5LDE3LjA3M2wtNi41NjItNi41MWMtMC4yNy0wLjI2OC0wLjUwNC0wLjU2Ny0wLjY5Ni0wLjg4OEMxLjM4NSw3Ljg5LDEuNjcsNS42MTMsMy4xNTUsNC4xNGMwLjg2NC0wLjg1NiwyLjAxMi0xLjMyOSwzLjIzMy0xLjMyOWMxLjkyNCwwLDMuMTE1LDEuMTIsMy42MTIsMS43NTJjMC40OTktMC42MzQsMS42ODktMS43NTIsMy42MTItMS43NTJjMS4yMjEsMCwyLjM2OSwwLjQ3MiwzLjIzMywxLjMyOWMxLjQ4NCwxLjQ3MywxLjc3MSwzLjc1LDAuNjkzLDUuNTM3Yy0wLjE5LDAuMzItMC40MjUsMC42MTgtMC42OTUsMC44ODdsLTYuNTYyLDYuNTFDMTAuMTI1LDE3LjIyOSw5Ljg3NSwxNy4yMjksOS43MTksMTcuMDczIE02LjM4OCwzLjYxQzUuMzc5LDMuNjEsNC40MzEsNCwzLjcxNyw0LjcwN0MyLjQ5NSw1LjkyLDIuMjU5LDcuNzk0LDMuMTQ1LDkuMjY1YzAuMTU4LDAuMjY1LDAuMzUxLDAuNTEsMC41NzQsMC43MzFMMTAsMTYuMjI4bDYuMjgxLTYuMjMyYzAuMjI0LTAuMjIxLDAuNDE2LTAuNDY2LDAuNTczLTAuNzI5YzAuODg3LTEuNDcyLDAuNjUxLTMuMzQ2LTAuNTcxLTQuNTZDMTUuNTcsNCwxNC42MjEsMy42MSwxMy42MTIsMy42MWMtMS40MywwLTIuNjM5LDAuNzg2LTMuMjY4LDEuODYzYy0wLjE1NCwwLjI2NC0wLjUzNiwwLjI2NC0wLjY5LDBDOS4wMjksNC4zOTcsNy44MiwzLjYxLDYuMzg4LDMuNjEiPjwvcGF0aD4KICAgICAgPC9zdmc+CiAgICAgIDxzdmcgY2xhc3M9InZpZGVvc3ZnIHN2Zy1pY29uIiB2aWV3Qm94PSIwIDAgMjAgMjAiPgoJCQkJPHBhdGggZD0iTTE4LjE3NSw0LjE0MkgxLjk1MUMxLjcwMyw0LjE0MiwxLjUsNC4zNDQsMS41LDQuNTkydjEwLjgxNmMwLDAuMjQ3LDAuMjAzLDAuNDUsMC40NTEsMC40NWgxNi4yMjRjMC4yNDcsMCwwLjQ1LTAuMjAzLDAuNDUtMC40NVY0LjU5MkMxOC42MjUsNC4zNDQsMTguNDIyLDQuMTQyLDE4LjE3NSw0LjE0MiBNNC42NTUsMTQuOTU3SDIuNDAxdi0xLjgwM2gyLjI1M1YxNC45NTd6TTQuNjU1LDEyLjI1NEgyLjQwMXYtMS44MDNoMi4yNTNWMTIuMjU0eiBNNC42NTUsOS41NDlIMi40MDFWNy43NDdoMi4yNTNWOS41NDl6IE00LjY1NSw2Ljg0NkgyLjQwMVY1LjA0M2gyLjI1M1Y2Ljg0NnpNMTQuNTY5LDE0Ljk1N0g1LjU1NlY1LjA0M2g5LjAxM1YxNC45NTd6IE0xNy43MjQsMTQuOTU3aC0yLjI1M3YtMS44MDNoMi4yNTNWMTQuOTU3eiBNMTcuNzI0LDEyLjI1NGgtMi4yNTN2LTEuODAzaDIuMjUzVjEyLjI1NHpNMTcuNzI0LDkuNTQ5aC0yLjI1M1Y3Ljc0N2gyLjI1M1Y5LjU0OXogTTE3LjcyNCw2Ljg0NmgtMi4yNTNWNS4wNDNoMi4yNTNWNi44NDZ6Ij48L3BhdGg+CgkJCTwvc3ZnPgoJCQk8c3ZnIGNsYXNzPSJpbWFnZXN2ZyBzdmctaWNvbiIgdmlld0JveD0iMCAwIDIwIDIwIj4KCQkJCTxwYXRoIGQ9Ik0xOC41NTUsMTUuMzU0VjQuNTkyYzAtMC4yNDgtMC4yMDItMC40NTEtMC40NS0wLjQ1MUgxLjg4OGMtMC4yNDgsMC0wLjQ1MSwwLjIwMy0wLjQ1MSwwLjQ1MXYxMC44MDhjMCwwLjU1OSwwLjc1MSwwLjQ1MSwwLjQ1MSwwLjQ1MWgxNi4yMTdoMC4wMDVDMTguNzkzLDE1Ljg1MSwxOC40NzgsMTQuODE0LDE4LjU1NSwxNS4zNTQgTTIuOCwxNC45NDlsNC45NDQtNi40NjRsNC4xNDQsNS40MTljMC4wMDMsMC4wMDMsMC4wMDMsMC4wMDMsMC4wMDMsMC4wMDVsMC43OTcsMS4wNEgyLjh6IE0xMy44MjIsMTQuOTQ5bC0xLjAwNi0xLjMxN2wxLjY4OS0yLjIxOGwyLjY4OCwzLjUzNUgxMy44MjJ6IE0xNy42NTQsMTQuMDY0bC0yLjc5MS0zLjY2NmMtMC4xODEtMC4yMzctMC41MzUtMC4yMzctMC43MTYsMGwtMS44OTksMi40OTNsLTQuMTQ2LTUuNDJjLTAuMTgtMC4yMzctMC41MzYtMC4yMzctMC43MTYsMGwtNS4wNDcsNi41OThWNS4wNDJoMTUuMzE2VjE0LjA2NHogTTEyLjQ3NCw2LjM5M2MtMC44NjksMC0xLjU3NywwLjcwNy0xLjU3NywxLjU3NnMwLjcwOCwxLjU3NiwxLjU3NywxLjU3NnMxLjU3Ny0wLjcwNywxLjU3Ny0xLjU3NlMxMy4zNDMsNi4zOTMsMTIuNDc0LDYuMzkzIE0xMi40NzQsOC42NDVjLTAuMzcxLDAtMC42NzYtMC4zMDQtMC42NzYtMC42NzZzMC4zMDUtMC42NzYsMC42NzYtMC42NzZjMC4zNzIsMCwwLjY3NiwwLjMwNCwwLjY3NiwwLjY3NlMxMi44NDYsOC42NDUsMTIuNDc0LDguNjQ1Ij48L3BhdGg+CgkJCTwvc3ZnPgogICAgICA8ZGl2IGlkPSJjb2xzY3NzIj4KICAgICAgLmNvbHMke2NvbHN9ICNpbWFnZXMgLml0ZW0gewogICAgICAgIHdpZHRoOiBjYWxjKDEwMHZ3IC8gJHtjb2xzfSk7CiAgICAgIH0KCiAgICAgIC5jb2xzJHtjb2xzfSAjaW1hZ2VzIC5pdGVtIHsKICAgICAgICBoZWlnaHQ6IGNhbGMoMTAwdncgLyAke2NvbHN9KTsKICAgICAgfQogICAgICAKICAgICAgLmNvbHMke2NvbHN9IC5xdWVyeSwKICAgICAgLmNvbHMke2NvbHN9IC5saWtlIHsKICAgICAgICBmb250LXNpemU6IG1pbigxNHZ3ICogKDEgLyAke2NvbHN9KSwgNmVtICogKDEgLyAke2NvbHN9KSkKICAgICAgfQogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgPGRpdiBpZD0ic2hhcmUtZGlhbG9nIiBjbGFzcz0iZGlhbG9nIj4KICAgICAgPGgyPnNoYXJlPC9oMj4KICAgICAgPGZvcm0gaWQ9InNoYXJlLWZvcm0iIGFjdGlvbj0iIyI+CiAgICAgICAgPHAgY2xhc3M9ImNvbnRlbnQiPjwvcD4KICAgICAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiBjbGFzcz0ic3VibWl0IiB2YWx1ZT0ib2siLz4KICAgICAgPC9mb3JtPgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJtZWRpYS1mb290ZXIiPgogICAgICA8YSBpZD0iaW1hZ2UtbGlrZSIgY2xhc3M9Imxpa2UiIGhyZWY9IiMiPjwvYT4KICAgICAgPGEgaWQ9ImltYWdlLXF1ZXJ5IiBjbGFzcz0ibGluayIgaHJlZj0iIyI+PC9hPgogICAgICA8YSBpZD0iaW1hZ2UtdXNlciIgY2xhc3M9ImxpbmsiIGhyZWY9IiMiPjwvYT4KICAgIDwvZGl2PgogICAgPGNlbnRlciBpZD0ibWVkaWEtY29udGFpbmVyIj4KICAgICAgPGRpdiBpZD0iaW1hZ2UtY29udGFpbmVyIj4KICAgICAgICA8aW1nIGlkPSJpbWFnZSIvPgogICAgICA8L2Rpdj4KICAgIDwvY2VudGVyPgogICAgPGRpdiBpZD0ib3ZlcmxheSIgY2xhc3M9ImRpYWxvZyI+PC9kaXY+CiAgICA8ZGl2IGlkPSJtZW51LWNvbnRlbnQiIGNsYXNzPSJkaWFsb2ciPgogICAgICA8ZGl2IGNsYXNzPSJpdGVtcyI+CiAgICAgICAgPGgxPjxhIGNsYXNzPSJ0aXRsZSIgaHJlZj0iIyI+ZmlsZXMuaHRtbDwvYT48L2gxPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5hdXRvcGxheTwvZGl2PgogICAgICAgIDxhIGNsYXNzPSJidXR0b24gc2V0YXV0b3BsYXkiIGRhdGEtYXV0b3BsYXk9Im9uIiBocmVmPSIjIj5vbjwvYT4KICAgICAgICA8YSBjbGFzcz0iYnV0dG9uIHNldGF1dG9wbGF5IiBkYXRhLWF1dG9wbGF5PSJvZmYiIGhyZWY9IiMiPm9mZjwvYT4KICAgICAgICA8YSBjbGFzcz0iYnV0dG9uIHNldGF1dG9wbGF5IiBkYXRhLWF1dG9wbGF5PSJob3ZlciIgaHJlZj0iIyI+bW91c2VvdmVyPC9hPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5jb2x1bW5zPC9kaXY+CiAgICAgICAgPGEgY2xhc3M9ImJ1dHRvbiBzZXRjb2xzIiBkYXRhLWNvbHM9IjEiIGhyZWY9IiMiPjE8L2E+CiAgICAgICAgPGEgY2xhc3M9ImJ1dHRvbiBzZXRjb2xzIiBkYXRhLWNvbHM9IjIiIGhyZWY9IiMiPjI8L2E+CiAgICAgICAgPGEgY2xhc3M9ImJ1dHRvbiBzZXRjb2xzIiBkYXRhLWNvbHM9IjQiIGhyZWY9IiMiPjQ8L2E+CiAgICAgICAgPGEgY2xhc3M9ImJ1dHRvbiBzZXRjb2xzIiBkYXRhLWNvbHM9IjYiIGhyZWY9IiMiPjY8L2E+CiAgICAgICAgPGEgY2xhc3M9ImJ1dHRvbiBzZXRjb2xzIiBkYXRhLWNvbHM9IjEwIiBocmVmPSIjIj4xMDwvYT4KICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+Y29ubmVjdGlvbnM8L2Rpdj4KICAgICAgICA8ZGl2IGlkPSJjb25uY291bnQiPjA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+cmVsYXlzOjwvZGl2PgogICAgICAgIDxwPlBsZWFzZSB1c2UgcmVsYXlzIHdpdGggTklQLTUwIChzZWFyY2gpIGZ1bmN0aW9uYWxpdHk8L3A+CiAgICAgICAgPGZvcm0gYWN0aW9uPSIjIiBpZD0icmVsYXlzLWZvcm0iPgogICAgICAgICAgPHRleHRhcmVhIGlkPSJyZWxheXMiPjwvdGV4dGFyZWE+CiAgICAgICAgICA8aW5wdXQgY2xhc3M9InN1Ym1pdCIgdHlwZT0ic3VibWl0IiB2YWx1ZT0ic2F2ZSByZWxheXMiLz4KICAgICAgICA8L2Zvcm0+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPnByaXZhdGUga2V5OjwvZGl2PgogICAgICAgIDxwPklmIHlvdSBjYW50IHVzZSBicm93c2VyIGFkZG9uIChtb2JpbGUpPC9wPgogICAgICAgIDxmb3JtIGFjdGlvbj0iIyIgaWQ9InByaXZrZXktZm9ybSI+CiAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9InByaXZrZXkiLz4KICAgICAgICAgIDxpbnB1dCBjbGFzcz0ic3VibWl0IiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJzYXZlIGtleSIvPgogICAgICAgIDwvZm9ybT4KICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+bG9nczwvZGl2PgogICAgICAgIDxkaXYgaWQ9ImxvZ3MiPjwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5sYXRlc3QgcmVsZWFzZTo8L2Rpdj4KICAgICAgICA8YSBjbGFzcz0iYnV0dG9uIGxpbmsiIGlkPSJyZWxlYXNlIiBocmVmPSIjIj48L2E+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJoZWFkZXIiPgogICAgICA8ZGl2IGNsYXNzPSJpY29ucyI+CiAgICAgICAgPGEgaWQ9ImZpbHRlci1saWtlcyIgaHJlZj0iIyIgY2xhc3M9ImhlYWRlci1pY29uIj48L2E+CiAgICAgICAgPGEgaWQ9InNoYXJlIiBocmVmPSIjIiBjbGFzcz0iaGVhZGVyLWljb24iPgogICAgICAgICAgPHN2ZyBjbGFzcz0ic3ZnLWljb24iIHZpZXdCb3g9IjAgMCAyMCAyMCI+CgkJCQkgICAgPHBhdGggZD0iTTE0LjY4LDEyLjYyMWMtMC45LDAtMS43MDIsMC40My0yLjIxNiwxLjA5bC00LjU0OS0yLjYzN2MwLjI4NC0wLjY5MSwwLjI4NC0xLjQ1NywwLTIuMTQ2bDQuNTQ5LTIuNjM4YzAuNTE0LDAuNjYxLDEuMzE1LDEuMDksMi4yMTYsMS4wOWMxLjU0OSwwLDIuODA5LTEuMjYsMi44MDktMi44MDhjMC0xLjU0OC0xLjI2LTIuODA5LTIuODA5LTIuODA5Yy0xLjU0OCwwLTIuODA4LDEuMjYtMi44MDgsMi44MDljMCwwLjM4LDAuMDc2LDAuNzQxLDAuMjE0LDEuMDczbC00LjU1LDIuNjM4Yy0wLjUxNS0wLjY2MS0xLjMxNi0xLjA5LTIuMjE3LTEuMDljLTEuNTQ4LDAtMi44MDgsMS4yNi0yLjgwOCwyLjgwOXMxLjI2LDIuODA4LDIuODA4LDIuODA4YzAuOSwwLDEuNzAyLTAuNDMsMi4yMTctMS4wOWw0LjU1LDIuNjM3Yy0wLjEzOCwwLjMzMi0wLjIxNCwwLjY5My0wLjIxNCwxLjA3NGMwLDEuNTQ5LDEuMjYsMi44MDksMi44MDgsMi44MDljMS41NDksMCwyLjgwOS0xLjI2LDIuODA5LTIuODA5UzE2LjIyOSwxMi42MjEsMTQuNjgsMTIuNjIxTTE0LjY4LDIuNTEyYzEuMTM2LDAsMi4wNiwwLjkyMywyLjA2LDIuMDZTMTUuODE1LDYuNjMsMTQuNjgsNi42M3MtMi4wNTktMC45MjMtMi4wNTktMi4wNTlTMTMuNTQ0LDIuNTEyLDE0LjY4LDIuNTEyTTUuMzE5LDEyLjA2MWMtMS4xMzYsMC0yLjA2LTAuOTI0LTIuMDYtMi4wNnMwLjkyMy0yLjA1OSwyLjA2LTIuMDU5YzEuMTM1LDAsMi4wNiwwLjkyMywyLjA2LDIuMDU5UzYuNDU0LDEyLjA2MSw1LjMxOSwxMi4wNjFNMTQuNjgsMTcuNDg4Yy0xLjEzNiwwLTIuMDU5LTAuOTIyLTIuMDU5LTIuMDU5czAuOTIzLTIuMDYxLDIuMDU5LTIuMDYxczIuMDYsMC45MjQsMi4wNiwyLjA2MVMxNS44MTUsMTcuNDg4LDE0LjY4LDE3LjQ4OCI+PC9wYXRoPgoJCQkgICAgPC9zdmc+CgkJCSAgPC9hPgoJCQk8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iaXRlbXMiPgogICAgICAgIDxhIGNsYXNzPSJ0aXRsZSIgaHJlZj0iIyI+ZmlsZXMuaHRtbDwvYT4KICAgICAgICA8YSBpZD0ibWVudSIgaHJlZj0iIyI+CiAgICAgICAgICA8c3ZnIGNsYXNzPSJtZW51c3ZnIHN2Zy1pY29uIiB2aWV3Qm94PSIwIDAgMjAgMjAiPgoJCSAgICAgICAgPHBhdGggZD0iTTEwLDEuNDQ1Yy00LjcyNiwwLTguNTU1LDMuODI5LTguNTU1LDguNTU1YzAsNC43MjUsMy44MjksOC41NTUsOC41NTUsOC41NTVjNC43MjUsMCw4LjU1NS0zLjgzLDguNTU1LTguNTU1QzE4LjU1NSw1LjI3NCwxNC43MjUsMS40NDUsMTAsMS40NDUgTTEwLDE3LjY1NGMtNC4yMjEsMC03LjY1NC0zLjQzNC03LjY1NC03LjY1NGMwLTQuMjIxLDMuNDMzLTcuNjU0LDcuNjU0LTcuNjU0YzQuMjIyLDAsNy42NTQsMy40MzMsNy42NTQsNy42NTRDMTcuNjU0LDE0LjIyMSwxNC4yMjIsMTcuNjU0LDEwLDE3LjY1NCBNMTQuMzksMTBjMCwwLjI0OC0wLjIwMywwLjQ1LTAuNDUsMC40NUg2LjA2Yy0wLjI0OCwwLTAuNDUtMC4yMDMtMC40NS0wLjQ1czAuMjAzLTAuNDUsMC40NS0wLjQ1aDcuODc5QzE0LjE4Nyw5LjU1LDE0LjM5LDkuNzUyLDE0LjM5LDEwIE0xNC4zOSwxMi43MDJjMCwwLjI0Ny0wLjIwMywwLjQ0OS0wLjQ1LDAuNDQ5SDYuMDZjLTAuMjQ4LDAtMC40NS0wLjIwMi0wLjQ1LTAuNDQ5YzAtMC4yNDgsMC4yMDMtMC40NTEsMC40NS0wLjQ1MWg3Ljg3OUMxNC4xODcsMTIuMjUxLDE0LjM5LDEyLjQ1NCwxNC4zOSwxMi43MDIgTTE0LjM5LDcuMjk4YzAsMC4yNDgtMC4yMDMsMC40NS0wLjQ1LDAuNDVINi4wNmMtMC4yNDgsMC0wLjQ1LTAuMjAzLTAuNDUtMC40NXMwLjIwMy0wLjQ1LDAuNDUtMC40NWg3Ljg3OUMxNC4xODcsNi44NDgsMTQuMzksNy4wNTEsMTQuMzksNy4yOTgiPjwvcGF0aD4KCSAgICAgICAgPC9zdmc+CiAgICAgICAgPC9hPgogICAgICAgIDxmb3JtIGlkPSJxdWVyeS1mb3JtIiBhY3Rpb249IiMiPgogICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJxdWVyeSIgbmFtZT0icXVlcnkiIGlkPSIiIC8+CiAgICAgICAgICA8c2VsZWN0IGlkPSJxdWVyeS10eXBlIj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iYWxsIj5hbGw8L29wdGlvbj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaW1hZ2UiPmltYWdlczwvb3B0aW9uPgogICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJ2aWRlbyI+dmlkZW9zPC9vcHRpb24+CiAgICAgICAgICA8L3NlbGVjdD4KICAgICAgICAgIDxpbnB1dCBpZD0iZ28iIHR5cGU9InN1Ym1pdCIgdmFsdWU9ImdvIi8+CiAgICAgICAgPC9mb3JtPgogICAgICAgIDxzcGFuIGlkPSJxdWVyeWRpc3BsYXkiPgogICAgICAgICAgPHNwYW4gY2xhc3M9InRleHQiPjwvc3Bhbj4KICAgICAgICA8L3NwYW4+CiAgICAgICAgPGRpdiBpZD0ibG9hZGluZyI+dXBkYXRpbmc8L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgY2xhc3M9InBsYWNlaG9sZGVyIj5Tb21ldGhpbmcgc2hvdWxkIGxvYWQgc29vbiwgbWF5YmUuPC9kaXY+CiAgICA8ZGl2IGlkPSJpbWFnZXMiPjwvZGl2PgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vdW5wa2cuY29tL25vc3RyLXRvb2xzL2xpYi9ub3N0ci5idW5kbGUuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vc2xvd2xpLmdpdGh1Yi5pby9iZWNoMzItYnVmZmVyL2Fzc2V0cy9qcy9iZWNoMzItYnVmZmVyLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0PgogICAgICBjb25zdCB1cGRhdGVzcHVia2V5ID0gImFlNWM2ZTBiNzQ2NjBkMjE5NGM4MjU0YjVjMmM4MjU2NzY1NzZiZTAyOTczNzlmYTIwNTIzMTE0YTZhODVlODciCiAgICAgIGNvbnN0IHF1ZXJpZXMgPSB7IAogICAgICAgICJhdXRob3IiOiAnWyJSRVEiLCI8ST4iLHsia2luZHMiOlsxXSwiYXV0aG9ycyI6WyI8UD4iXX1dJwogICAgICB9CiAgICAgIHFzKCIjcmVsYXlzIikudmFsdWUgPSByZWxheXMoKS5qb2luKCJcbiIpCiAgICAgIHFzKCIjcHJpdmtleSIpLnZhbHVlID0gcHJpdmtleSgpCiAgICAgIGNvbnN0IGNvbG9wdHMgPSBbMSwgMiwgNCwgNiwgMTBdCgogICAgICBjb2xzID0gKCkgPT4gcGFyc2VJbnQoc2V0dGluZygiY29scyIsIGNvbG9wdHNbMl0pLCAxMCkKICAgICAgYXV0b3BsYXkgPSAoKSA9PiBzZXR0aW5nKCJhdXRvcGxheSIsICJvZmYiKQogICAgICBsaW1pdCA9ICgpID0+IHBhcnNlSW50KHNldHRpbmcoImxpbWl0IiwgMTUpLCAxMCkKICAgICAgZ2FsbGVyeSA9ICgpID0+IHsKICAgICAgICBsZXQgZ2FsbGVyeW1hdGNoZXIgPSBsb2NhdGlvbi5zZWFyY2gubWF0Y2goL2dhbGxlcnk9KFthLXowLTldKykvKQogICAgICAgIHJldHVybiBnYWxsZXJ5bWF0Y2hlciAmJiBnYWxsZXJ5bWF0Y2hlclsxXQogICAgICB9CiAgICAgIHZpZXdwdWJrZXkgPSAoKSA9PiB7CiAgICAgICAgbGV0IHB1YmtleW1hdGNoZXIgPSBsb2NhdGlvbi5zZWFyY2gubWF0Y2goL3B1YmtleT0oW2EtejAtOV0rKS8pCiAgICAgICAgcmV0dXJuIHB1YmtleW1hdGNoZXIgJiYgcHVia2V5bWF0Y2hlclsxXQogICAgICB9CiAgICAgIAogICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoImNvbHMiICsgY29scygpKQoKICAgICAgbGV0IHByb3RvY29sID0gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlLykgPyAibm9zdHI6IiA6ICJ3ZWIrbm9zdHI6IgogICAgICBsZXQgc29ja2V0cyA9IFtdCiAgICAgIGxldCByZXNoYW5kbGVycyA9IFtdCiAgICAgIGxldCB1cmxzID0gW10KICAgICAgbGV0IGxpa2VzID0gW10KICAgICAgbGV0IG5ld2xpa2VzID0gW10KICAgICAgbGV0IGlkY291bnRlciA9IDAKICAgICAgbGV0IHF1ZXJ5d2FpdCA9IG51bGwKICAgICAgbGV0IHByaW1hbHNvY2tldCA9IG51bGwKICAgICAgbGV0IHR5cGVzID0gewogICAgICAgIGltYWdlOiBbInBuZyIsICJqcGciLCAianBlZyIsICJ3ZWJwIl0sCiAgICAgICAgdmlkZW86IFsibXA0IiwgIndlYm0iXQogICAgICB9CiAgICAgIGxldCBpbWdyZWdleCA9IC9odHRwKHxzKVw6XC9cL1teIFxuXSo/XC4ocG5nfGpwZ3xqcGVnfHdlYnApL2dpCiAgICAgIGxldCB2aWRlb3JlZ2V4ID0gL2h0dHAofHMpXDpcL1wvW14gXG5dKj9cLihtcDR8d2VibSkvZ2kKICAgICAgbGV0IHZpZGVvZXh0cmVnZXggPSAvXC4obXA0fHdlYm0pJC9pCiAgICAgIGxldCBpbWdleHRyZWdleCA9IC9cLihwbmd8anBnfGpwZWd8d2VicCkkL2kKICAgICAgd2FpdG1zID0gNTAwMDAKICAgICAgcXVlcnlzdHIgPSAiIgogICAgICBsZXQgcXVlcnljb3VudCA9IDAKICAgICAgbGV0IGhvdmVyZWR2aWRlbyA9IG51bGwKICAgICAgCiAgICAgIHVwZGF0ZXF1ZXJ5KCkKICAgICAgcXMoIiNpbWFnZS1saWtlIikuaW5uZXJIVE1MID0gcXMoIiNmaWx0ZXItbGlrZXMiKS5pbm5lckhUTUwgPSBxcygiI3RlbXBsYXRlIC5oZWFydHN2ZyIpLm91dGVySFRNTAogICAgICBzZXRhY3RpdmUoInNldGNvbHMiLCAiY29scyIsIGNvbHMoKSkKICAgICAgc2V0YWN0aXZlKCJzZXRhdXRvcGxheSIsICJhdXRvcGxheSIsIGF1dG9wbGF5KCkpCiAgICAgIAogICAgICBmdW5jdGlvbiBmcm9tSGV4U3RyaW5nKHN0cil7CiAgICAgICAgbGV0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KHN0ci5sZW5ndGggLyAyKQogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnVmZmVyLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBidWZmZXJbaV0gPSBwYXJzZUludChzdHIuc3Vic3RyKDIgKiBpLCAyKSwgMTYpCiAgICAgICAgfQogICAgICAgIHJldHVybiBidWZmZXIKICAgICAgfQogIAogICAgICBmdW5jdGlvbiByZWxheXMoKXsKICAgICAgICBjb25zdCBvYmogPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCJyZWxheXMiKSkKICAgICAgICBjb25zdCByID0gb2JqICYmIG9iai5maWx0ZXIociA9PiByLm1hdGNoKC93c3M6XC9cLy4rLykpIHx8IFtdCiAgICAgICAgCiAgICAgICAgcmV0dXJuIHIubGVuZ3RoID4gMCAmJiByIHx8IFsKICAgICAgICAgICJ3c3M6Ly9yZWxheS5ub3N0ci5iYW5kIiwKICAgICAgICAgICJ3c3M6Ly9uYi5yZWxheS5jZW50ZXIiLCAKICAgICAgICAgICJ3c3M6Ly9ub3N0ci5jb21waWxlLWVycm9yLm5ldCIKICAgICAgICBdCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHByaXZrZXkoKXsKICAgICAgICBsZXQga2V5ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oInByaXZrZXkiKSB8fCAiIgogICAgICAgIAogICAgICAgIGlmKGtleS5sZW5ndGggPT0gNjMpewogICAgICAgICAga2V5ID0gTm9zdHJUb29scy5uaXAxOS5kZWNvZGUoa2V5KS5kYXRhCiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJldHVybiBrZXkubGVuZ3RoID09IDY0ICYmIGtleSB8fCBudWxsCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHNldHRpbmcoa2V5LCBkZWZhdWx0dmFsdWUpewogICAgICAgIGNvbnN0IHYgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkpCiAgICAgICAgcmV0dXJuIHYgJiYgb3B0aW9uKCJzZXQiICsga2V5LCBrZXksIHYpICYmIHYgfHwgZGVmYXVsdHZhbHVlCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIG9wdGlvbihjLCBrZXksIHZhbCl7CiAgICAgICAgcmV0dXJuIHFzKCIuIiArIGMgKyAiW2RhdGEtIiArIGtleSArICI9JyIgKyB2YWwgKyAiJ10iKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBxcyhxKXsKICAgICAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihxKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBxc2EocSl7CiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChxKSkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gZ2lkKGkpewogICAgICAgIHJldHVybiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBxdWVyeXR5cGUoKXsKICAgICAgICByZXR1cm4gcXMoIiNxdWVyeS10eXBlIikudmFsdWUgfHwgImFsbCIKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gdXBkYXRlcXVlcnkoKXsKICAgICAgICBsZXQgc3RyID0gKGdhbGxlcnkoKSAmJiAiZzoiICsgZ2FsbGVyeSgpKQogICAgICAgIHN0ciA9IHN0ciB8fCAodmlld3B1YmtleSgpICYmICJrOiIgKyB2aWV3cHVia2V5KCkpCiAgICAgICAgc3RyID0gc3RyIHx8IGRlY29kZVVSSUNvbXBvbmVudChsb2NhdGlvbi5oYXNoLnN1YnN0cmluZygxKSkgIAogICAgICAgIGxldCBwYXJ0cyA9IHN0ci5zcGxpdCgiLyIpCiAgICAgICAgcXMoIiNxdWVyeWRpc3BsYXkgLnRleHQiKS5pbm5lclRleHQgPSBwYXJ0c1swXQogICAgICAgIHF1ZXJ5c3RyID0gcGFydHNbMF0KICAgICAgICBxcygiI3F1ZXJ5IikudmFsdWUgPSBwYXJ0c1swXQogICAgICAgIHFzKCIjcXVlcnktdHlwZSIpLnZhbHVlID0gcGFydHNbMV0gfHwgImFsbCIKICAgICAgfQoKICAgICAgZnVuY3Rpb24gYWN0aXZlKCl7CiAgICAgICAgcmV0dXJuIHFzKCIjaW1hZ2VzIC5hY3RpdmUiKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBpbWFnZW9mZnNldChvZmZzZXQpewogICAgICAgIGNvbnN0IGltYWdlcyA9IHFzYSgiI2ltYWdlcyA+IC5pdGVtIikuZmlsdGVyKG4gPT4gbi5vZmZzZXRQYXJlbnQpLmZpbHRlcihlID0+IGUuY2xhc3NMaXN0LmNvbnRhaW5zKCJ2aXNpYmxlIikpCiAgICAgICAgcmV0dXJuIGltYWdlc1tpbWFnZXMuaW5kZXhPZihhY3RpdmUoKSkrb2Zmc2V0XQogICAgICB9CgogICAgICBmdW5jdGlvbiBsYXN0YWN0aXZlKCl7CiAgICAgICAgcmV0dXJuIHFzYSgiI2ltYWdlcyAuYWN0aXZlIikucG9wKCkgICAgICAKICAgICAgfQoKICAgICAgZnVuY3Rpb24gbWVudSgpewogICAgICAgIHFzYSgiI21lbnUtY29udGVudCwgI292ZXJsYXkiKS5mb3JFYWNoKG4gPT4gbi5jbGFzc0xpc3QudG9nZ2xlKCJ2aXNpYmxlIikpCiAgICAgIH0KICAKICAgICAgZnVuY3Rpb24gc2V0YWN0aXZlKGMsIGtleSwgdmFsKXsKICAgICAgICBxc2EoIi4iICsgYykuZm9yRWFjaChuID0+IG4uY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikpCiAgICAgICAgY29uc3Qgb3B0aW9uID0gcXMoIi4iICsgYyArICJbZGF0YS0iICsga2V5ICsgIj0nIiArIHZhbCArICInXSIpCiAgICAgICAgb3B0aW9uPy5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBzY3JvbGx2aXNpYmxlKG4sIG9mZnNldCl7CiAgICAgICAgb2Zmc2V0ID0gb2Zmc2V0IHx8IDAKICAgICAgICByZXR1cm4gKG4ub2Zmc2V0VG9wICsgbi5vZmZzZXRIZWlnaHQpID49IChzY3JvbGxZIC0gb2Zmc2V0KQogICAgICAgICAgJiYgbi5vZmZzZXRUb3AgPD0gKHNjcm9sbFkgKyB2aXN1YWxWaWV3cG9ydC5oZWlnaHQgKyBvZmZzZXQpCiAgICAgIH0KCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZWltYWdlc2xvYWQoKXsKICAgICAgICBxc2EoIiNpbWFnZXMgLml0ZW0uaW1nIikuZm9yRWFjaChhc3luYyBpbWcgPT4gewogICAgICAgICAgaWYoc2Nyb2xsdmlzaWJsZShpbWcsIHZpc3VhbFZpZXdwb3J0LmhlaWdodCAvIDIpKXsKICAgICAgICAgICAgaW1nLnN0eWxlLmJhY2tncm91bmRJbWFnZSA9ICJ1cmwoIiArIGltZ1siZGF0YS1zcmMiXSArICIpIgogICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgIGltZy5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgPSAiIgogICAgICAgICAgfQogICAgICAgIH0pCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZWFsbHZpZGVvcGxheSgpewogICAgICAgIHFzYSgiI2ltYWdlcyAuaXRlbS52aWRlbyIpLmZvckVhY2goYXN5bmMgbiA9PiB1cGRhdGV2aWRlb3BsYXkobikpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHByZXZpZXd1cmxzKCl7CiAgICAgICAgcmV0dXJuIHFzYSgiI2ltYWdlcyAuaXRlbSIpLmZpbHRlcihuID0+IG4ub2Zmc2V0UGFyZW50KS5zbGljZSgwLCA0KS5tYXAobiA9PiBuWyJkYXRhLWl0ZW0iXS51cmwpCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZXZpZGVvcGxheShuKXsKICAgICAgICBjb25zdCBhcGxheSA9IGF1dG9wbGF5KCkKICAgICAgICBjb25zdCB2ID0gbi5xdWVyeVNlbGVjdG9yKCJ2aWRlbyIpCiAgICAgICAgCiAgICAgICAgaWYoYXBsYXkgIT0gIm9uIil7CiAgICAgICAgICB2Lm11dGVkID0gZmFsc2UKICAgICAgICAgIHYucGF1c2UoKQogICAgICAgIH1lbHNlewogICAgICAgICAgdi5tdXRlZCA9IHRydWUKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoIXNjcm9sbHZpc2libGUobikpewogICAgICAgICAgaWYodi5yZWFkeVN0YXRlID09IDQpewogICAgICAgICAgICB2LnBhdXNlKCkKICAgICAgICAgIH1lbHNlewogICAgICAgICAgICB2LnByZWxvYWQgPSAibm9uZSIKICAgICAgICAgIH0KICAgICAgICB9ZWxzZSBpZih2LnJlYWR5U3RhdGUgIT0gNCl7CiAgICAgICAgICB2LnByZWxvYWQgPSAiYXV0byIKICAgICAgICB9CiAgICAgICAgZWxzZSBpZihhcGxheSA9PSAib24iIHx8IChhcGxheSA9PSAiaG92ZXIiICYmIHYgPT0gaG92ZXJlZHZpZGVvKSl7CiAgICAgICAgICB2LnBsYXkoKQogICAgICAgIH0KICAgICAgfQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIiwgZSA9PiB7CiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKQogICAgICAgIHVwZGF0ZWltYWdlc2xvYWQoKQogICAgICAgIHVwZGF0ZWFsbHZpZGVvcGxheSgpCiAgICAgIH0pCiAgICAgIAogICAgICBsZXQgdG91Y2ggPSBudWxsCiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IiwgZSA9PiB0b3VjaCA9IGUuY2hhbmdlZFRvdWNoZXNbMF0pCiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsIGUgPT4gewogICAgICAgIGNvbnN0IHhkaWZmID0gZS5jaGFuZ2VkVG91Y2hlc1swXS5zY3JlZW5YIC0gdG91Y2guc2NyZWVuWAoKICAgICAgICBpZih4ZGlmZiA8IC01MCl7CiAgICAgICAgICBzd2lwZSgxKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZih4ZGlmZiA+IDUwKXsKICAgICAgICAgIHN3aXBlKC0xKQogICAgICAgIH0KICAgICAgfSkKICAgICAgCiAgICAgIHFzKCIjcXVlcnktZm9ybSIpLmFkZEV2ZW50TGlzdGVuZXIoInN1Ym1pdCIsIGUgPT4gewogICAgICAgIGUucHJldmVudERlZmF1bHQoKQogICAgICAgIHdpbmRvdy5oaXN0b3J5LnB1c2hTdGF0ZShudWxsLCBudWxsLCBsb2NhdGlvbi5wYXRobmFtZSkKICAgICAgICBsb2NhdGlvbi5oYXNoID0gIiMiICsgZW5jb2RlVVJJQ29tcG9uZW50KHFzKCIjcXVlcnkiKS52YWx1ZSArICIvIiArIHF1ZXJ5dHlwZSgpKQogICAgICAgIHVwZGF0ZXF1ZXJ5KCkKICAgICAgICBxdWVyeXdhaXQucmVzb2x2ZSgpCiAgICAgIH0pCgogICAgICBxcygiI3JlbGF5cy1mb3JtIikuYWRkRXZlbnRMaXN0ZW5lcigic3VibWl0IiwgYXN5bmMgZSA9PiB7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCiAgICAgICAgbGV0IHIgPSBKU09OLnN0cmluZ2lmeShxcygiI3JlbGF5cyIpLnZhbHVlLnNwbGl0KCJcbiIpKQogICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJyZWxheXMiLCByKQogICAgICAgIGRpc2Nvbm5lY3QoKQogICAgICB9KQogICAgICAKICAgICAgcXMoIiNzaGFyZS1mb3JtIikuYWRkRXZlbnRMaXN0ZW5lcigic3VibWl0IiwgYXN5bmMgZSA9PiB7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCiAgICAgICAgCiAgICAgICAgaWYocXMoIiNzaGFyZS1mb3JtIC5zdWJtaXQiKS52YWx1ZSA9PSAiY2xvc2UiKXsKICAgICAgICAgIHFzYSgiLmRpYWxvZy52aXNpYmxlIikuZm9yRWFjaChuID0+IG4uY2xhc3NMaXN0LnJlbW92ZSgidmlzaWJsZSIpKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGNvbnN0IGV2ZW50cyA9IHFzYSgiI2ltYWdlcyAuaXRlbSIpLmZpbHRlcihuID0+IG4ub2Zmc2V0UGFyZW50KS5tYXAobiA9PiBuWyJkYXRhLWV2ZW50Il0uaWQpCiAgICAgICAgY29uc3QgZXZlbnQgPSBhd2FpdCBwdWJsaXNoKHsKICAgICAgICAgICJraW5kIjogMzMzLAogICAgICAgICAgImNvbnRlbnQiOiBKU09OLnN0cmluZ2lmeShldmVudHMpLAogICAgICAgICAgInRhZ3MiOiBbXQogICAgICAgIH0pCgogICAgICAgIGF3YWl0IHdhaXRyZXMobnVsbCwgIk9LIikKCiAgICAgICAgY29uc3QgdXJsID0gd2luZG93LmxvY2F0aW9uLm9yaWdpbiArIHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZQogICAgICAgIAogICAgICAgIGNvbnN0IGNvbnRlbnQgPSAiVGhpcyBpcyBhIGdhbGxlcnkgb2YgIiArIGV2ZW50cy5sZW5ndGgKICAgICAgICAgICAgKyAiIGltYWdlcy92aWRlb3Mgc2hhcmVkIGZyb20gZmlsZXMuaHRtbC4gQ2hlY2sgaXQgb3V0IGhlcmU6ICIgKyB1cmwgKyAiP2dhbGxlcnk9IiArIGV2ZW50LmlkCiAgICAgICAgICAgICsgIlxuXG4iICsgcHJldmlld3VybHMoKS5qb2luKCJcbiIpCiAgICAgICAgCiAgICAgICAgY29uc3QgcHVibGlzaGVkZXZlbnQgPSBhd2FpdCBwdWJsaXNoKHsKICAgICAgICAgICJraW5kIjogMSwKICAgICAgICAgICJjb250ZW50IjogY29udGVudCwKICAgICAgICAgICJ0YWdzIjogWwogICAgICAgICAgICBbIiNlIiwgZXZlbnQuaWRdLCAKICAgICAgICAgICAgWyIjcCIsIGV2ZW50LnB1YmtleV0KICAgICAgICAgIF0KICAgICAgICB9KQoKICAgICAgICBhd2FpdCB3YWl0cmVzKG51bGwsICJPSyIpCiAgICAgICAgCiAgICAgICAgY29uc3QgYmVjaDMyaWQgPSBiZWNoMzIuZW5jb2RlKCJub3RlIiwgZnJvbUhleFN0cmluZyhwdWJsaXNoZWRldmVudC5pZCkpCiAgICAgICAgcXMoIiNzaGFyZS1mb3JtIC5jb250ZW50IikuaW5uZXJIVE1MID0gJ05vdGUgcHVibGlzaGVkIDxhIGhyZWY9IicgKyBwcm90b2NvbCArIGJlY2gzMmlkICsgJyI+JyArIGJlY2gzMmlkICsgJzwvYT4nCiAgICAgICAgcXMoIiNzaGFyZS1mb3JtIC5zdWJtaXQiKS52YWx1ZSA9ICJjbG9zZSIKICAgICAgfSkKCiAgICAgIHFzKCIjcHJpdmtleS1mb3JtIikuYWRkRXZlbnRMaXN0ZW5lcigic3VibWl0IiwgYXN5bmMgZSA9PiB7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCiAgICAgICAgY29uc3Qga2V5ID0gcXMoIiNwcml2a2V5IikudmFsdWUKCiAgICAgICAgaWYoa2V5Lmxlbmd0aCAhPSA2NCAmJiBrZXkubGVuZ3RoICE9IDYzKXsKICAgICAgICAgIGFsZXJ0KCJrZXkgc2hvdWxkIGJlIDYzIG9yIDY0IGNoYXJhY3RlcnMgbG9uZyIpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oInByaXZrZXkiLCBrZXkpCiAgICAgICAgYWxlcnQoImtleSBzYXZlZCIpCiAgICAgIH0pCiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLCBhc3luYyAoZSkgPT4gewogICAgICAgIGlmKGF1dG9wbGF5KCkgPT0gImhvdmVyIiAmJiBlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInZpZGVvLWNvbnRhaW5lciIpKXsKICAgICAgICAgIGhvdmVyZWR2aWRlbyA9IGUudGFyZ2V0LnF1ZXJ5U2VsZWN0b3IoInZpZGVvIikKICAgICAgICAgIGhvdmVyZWR2aWRlby5wbGF5KCkKICAgICAgICB9CiAgICAgIH0pCiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsIGFzeW5jIChlKSA9PiB7CiAgICAgICAgaG92ZXJlZHZpZGVvID0gZmFsc2UKICAgICAgICBpZighcXMoIiNtZWRpYS1jb250YWluZXIiKS5jbGFzc0xpc3QuY29udGFpbnMoInZpc2libGUiKSAmJiBhdXRvcGxheSgpID09ICJob3ZlciIgJiYgZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ2aWRlby1jb250YWluZXIiKSl7CiAgICAgICAgICBxc2EoInZpZGVvIikuZm9yRWFjaCh2ID0+IHYucGF1c2UoKSkKICAgICAgICB9CiAgICAgIH0pCiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGFzeW5jIChlKSA9PiB7CiAgICAgICAgaWYoZS50YXJnZXQudHlwZSA9PSAic3VibWl0IiB8fCAoZS50YXJnZXQudGFnTmFtZSA9PSAiQSIgJiYgZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJsaW5rIikpKXsKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgIAogICAgICAgIGlmKGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygidGl0bGUiKSl7CiAgICAgICAgICBxcygiI3F1ZXJ5IikudmFsdWUgPSAiIgogICAgICAgICAgcXMoIiNxdWVyeS10eXBlIikudmFsdWUgPSAiYWxsIgogICAgICAgICAgcXMoIiNnbyIpLmNsaWNrKCkKICAgICAgICB9CgogICAgICAgIGUucHJldmVudERlZmF1bHQoKQoKICAgICAgICBpZihlLnRhcmdldC5pZCA9PSAiZmlsdGVyLWxpa2VzIil7CiAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC50b2dnbGUoImZpbHRlci1saWtlcyIpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoZS50YXJnZXQuaWQgPT0gInNoYXJlIil7CiAgICAgICAgICBjb25zdCBldmVudHMgPSBxc2EoIiNpbWFnZXMgLml0ZW0iKS5maWx0ZXIobiA9PiBuLm9mZnNldFBhcmVudCkubWFwKG4gPT4gblsiZGF0YS1ldmVudCJdLmlkKQogICAgICAgICAgLy9jb25zdCB0ZXh0ID0ge3R5cGU6ICIiLCBldmVudHM6IH0KICAgICAgICAgIHFzKCIjc2hhcmUtZGlhbG9nIC5jb250ZW50IikuaW5uZXJIVE1MID0gIjxwPlNoYXJlIGxpbmsgdG8gdGhpcyBnYWxsZXJ5IG9mICIgKyBldmVudHMubGVuZ3RoICsgIiBpbWFnZXMvdmlkZW9zIHRvIHlvdXIgbm9zdHIgcHJvZmlsZT88L3A+IgogICAgICAgICAgcXMoIiNzaGFyZS1kaWFsb2cgLmNvbnRlbnQiKS5pbm5lckhUTUwgKz0gcHJldmlld3VybHMoKS5tYXAodXJsID0+ICc8aW1nIHNyYz0iJyt1cmwrJyIvPicpLmpvaW4oIiAiKQogICAgICAgICAgcXMoIiNzaGFyZS1mb3JtIC5zdWJtaXQiKS52YWx1ZSA9ICJwdWJsaXNoIgogICAgICAgICAgcXNhKCIjc2hhcmUtZGlhbG9nLCAjb3ZlcmxheSIpLmZvckVhY2gobiA9PiBuLmNsYXNzTGlzdC50b2dnbGUoInZpc2libGUiKSkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYoZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJzaG93IikpewogICAgICAgICAgYWN0aXZlKCk/LmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpCiAgICAgICAgICBjb25zdCBpZCA9IGUudGFyZ2V0LmlkIHx8IGUudGFyZ2V0WyJkYXRhLWl0ZW0taWQiXQogICAgICAgICAgZ2lkKGlkKS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgc2hvdyhpZCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihlLnRhcmdldC50YWdOYW1lICE9ICJBIiAmJiAocXMoIiNpbWFnZS1jb250YWluZXIiKSA9PSBlLnRhcmdldCB8fCBxcygiI2ltYWdlIikgPT0gZS50YXJnZXQgfHwgcXMoIiNtZWRpYS1jb250YWluZXIgdmlkZW8iKSA9PSBlLnRhcmdldCkpewogICAgICAgICAgaGlkZW1lZGlhKCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYoZS50YXJnZXQuaWQgPT0gIm1lbnUiKXsKICAgICAgICAgIG1lbnUoKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICBpZihlLnRhcmdldC5pZCA9PSAib3ZlcmxheSIpewogICAgICAgICAgcXNhKCIuZGlhbG9nLnZpc2libGUiKS5mb3JFYWNoKG4gPT4gbi5jbGFzc0xpc3QucmVtb3ZlKCJ2aXNpYmxlIikpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJzZXRjb2xzIikpewogICAgICAgICAgZm9yKGxldCBjIG9mIGNvbG9wdHMpewogICAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoImNvbHMiICsgYykKICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCJjb2xzIiArIGUudGFyZ2V0LmRhdGFzZXQuY29scykKICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJjb2xzIiwgZS50YXJnZXQuZGF0YXNldC5jb2xzKQogICAgICAgICAgc2V0YWN0aXZlKCJzZXRjb2xzIiwgImNvbHMiLCBjb2xzKCkpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgCiAgICAgICAgaWYoZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJzZXRhdXRvcGxheSIpKXsKICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJhdXRvcGxheSIsIGUudGFyZ2V0LmRhdGFzZXQuYXV0b3BsYXkpCiAgICAgICAgICBzZXRhY3RpdmUoInNldGF1dG9wbGF5IiwgImF1dG9wbGF5IiwgYXV0b3BsYXkoKSkKICAgICAgICAgIHVwZGF0ZWFsbHZpZGVvcGxheSgpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJsaWtlIikgJiYgbGlrZShlLnRhcmdldCkKICAgICAgfSkKICAgICAgCiAgICAgIGZ1bmN0aW9uIGhhc2tleSgpewogICAgICAgIHJldHVybiB3aW5kb3cubm9zdHIgfHwgcHJpdmtleSgpCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHB1YmtleSgpewogICAgICAgIHJldHVybiB3aW5kb3cubm9zdHIgJiYgYXdhaXQgd2luZG93Lm5vc3RyLmdldFB1YmxpY0tleSgpIHx8IE5vc3RyVG9vbHMuZ2V0UHVibGljS2V5KHByaXZrZXkoKSkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gc2lnbihldmVudCl7CiAgICAgICAgaWYod2luZG93Lm5vc3RyKXsKICAgICAgICAgIHJldHVybiBhd2FpdCBub3N0ci5zaWduRXZlbnQoZXZlbnQpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGV2ZW50LnNpZyA9IE5vc3RyVG9vbHMuZ2V0U2lnbmF0dXJlKGV2ZW50LCBwcml2a2V5KCkpCiAgICAgICAgcmV0dXJuIGV2ZW50CiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIGxpa2UobGluayl7CiAgICAgICAgY29uc3QgZXZlbnQgPSBsaW5rLnBhcmVudEVsZW1lbnRbImRhdGEtZXZlbnQiXQogICAgICAgIAogICAgICAgIGF3YWl0IHB1Ymxpc2goewogICAgICAgICAgImtpbmQiOiA3LAogICAgICAgICAgImNvbnRlbnQiOiAiKyIsCiAgICAgICAgICAidGFncyI6IFsKICAgICAgICAgICAgWyJlIiwgZXZlbnQuaWRdLAogICAgICAgICAgICBbInAiLCBldmVudC5wdWJrZXldCiAgICAgICAgICBdCiAgICAgICAgfSkKCiAgICAgICAgbGluay5jbGFzc0xpc3QuYWRkKCJyZWFjdGVkIikKCiAgICAgICAgY29uc3QgaW1hZ2VpZCA9IGxpbmtbImRhdGEtaXRlbS1pZCJdIHx8IGxpbmsuZGF0YXNldC5pbWFnZUlkCiAgICAgICAgCiAgICAgICAgaWYoaW1hZ2VpZCl7CiAgICAgICAgICBnaWQoaW1hZ2VpZCkucXVlcnlTZWxlY3RvcigiLmxpa2UiKS5jbGFzc0xpc3QuYWRkKCJyZWFjdGVkIikKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHByZXBhcmVfZXZlbnQoZXZlbnQpewogICAgICAgIGV2ZW50LnB1YmtleSA9IGF3YWl0IHB1YmtleSgpCiAgICAgICAgZXZlbnQuY3JlYXRlZF9hdCA9IHBhcnNlSW50KERhdGUubm93KCkgLyAxMDAwLCAxMCkKICAgICAgICBldmVudC5pZCA9IE5vc3RyVG9vbHMuZ2V0RXZlbnRIYXNoKGV2ZW50KQogICAgICAgIHJldHVybiBldmVudAogICAgICB9CiAgICAgICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gcHVibGlzaChldmVudCl7CiAgICAgICAgZXZlbnQgPSBhd2FpdCBwcmVwYXJlX2V2ZW50KGV2ZW50KQogICAgICAgIGxldCBzaWduZWRldmVudCA9IGF3YWl0IHNpZ24oZXZlbnQpCiAgICAgICAgbGV0IGpzb24gPSBKU09OLnN0cmluZ2lmeShbIkVWRU5UIiwgc2lnbmVkZXZlbnRdKQogICAgICAgIHNvY2tldHMuZm9yRWFjaChzID0+IHMuc2VuZChqc29uKSkKICAgICAgICAKICAgICAgICByZXR1cm4gZXZlbnQKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gc3dpcGUob2Zmc2V0KXsKICAgICAgICBpZihpbWFnZW9mZnNldChvZmZzZXQpKXsKICAgICAgICAgIGltYWdlb2Zmc2V0KG9mZnNldCkuY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgICAgIHRoaXNbb2Zmc2V0ID09IC0xICYmICJsYXN0YWN0aXZlIiB8fCAiYWN0aXZlIl0oKS5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKQogICAgICAgICAgdXBkYXRlc2hvdygpCiAgICAgICAgfQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiB1cGRhdGVzaG93KCl7CiAgICAgICAgaWYocXMoIiNtZWRpYS1jb250YWluZXIiKS5jbGFzc0xpc3QuY29udGFpbnMoInZpc2libGUiKSl7CiAgICAgICAgICBoaWRldmlkZW8oKQogICAgICAgICAgc2hvdyhhY3RpdmUoKS5pZCkKICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLCBlID0+IHsKICAgICAgICBpZihbIlRhYiIsICJBcnJvd0xlZnQiLCAiQXJyb3dSaWdodCIsICJBcnJvd1VwIiwgIkFycm93RG93biJdLmluY2x1ZGVzKGUua2V5KSl7CiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJFc2NhcGUiKXsKICAgICAgICAgIG1lbnUoKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGUua2V5ID09ICJFbnRlciIgJiYgZS50YXJnZXQudGFnTmFtZSA9PSAiQk9EWSIpewogICAgICAgICAgaWYocXMoIiNtZWRpYS1jb250YWluZXIiKS5jbGFzc0xpc3QuY29udGFucygidmlzaWJsZSIpKXsKICAgICAgICAgICAgaGlkZW1lZGlhKCkKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIHNob3coYWN0aXZlKCkuaWQpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJBcnJvd1VwIiAmJiBpbWFnZW9mZnNldCgtY29scygpKSl7CiAgICAgICAgICBpbWFnZW9mZnNldCgtY29scygpKS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgbGFzdGFjdGl2ZSgpLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpCiAgICAgICAgICB1cGRhdGVzaG93KCkKICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJBcnJvd0Rvd24iICYmIGltYWdlb2Zmc2V0KGNvbHMoKSkpewogICAgICAgICAgaW1hZ2VvZmZzZXQoY29scygpKS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgYWN0aXZlKCkuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikKICAgICAgICAgIHVwZGF0ZXNob3coKQogICAgICAgIH0KCiAgICAgICAgaWYoZS5rZXkgPT0gIkFycm93TGVmdCIpewogICAgICAgICAgc3dpcGUoLTEpCiAgICAgICAgfQoKICAgICAgICBpZihlLmtleSA9PSAiQXJyb3dSaWdodCIpewogICAgICAgICAgc3dpcGUoMSkKICAgICAgICB9CiAgICAgIH0pCgogICAgICBhc3luYyBmdW5jdGlvbiBoYW5kbGVxdWVyeXJlcyhyZXMsIHNvY2tldCwgcSwgdHlwZSwgc3RpbWUpewogICAgICAgIHNhdmUoc29ja2V0LCByZXMsIHEsIHR5cGUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSkKICAgICAgICBsb2coInF1ZXJ5IHJlcyIsIHJlcy5sZW5ndGgsIHNvY2tldC51cmwpCiAgICAgICAgcXVlcnljb3VudC0tCiAgICAgICAgaWYocXVlcnljb3VudCA9PSAwKXsKICAgICAgICAgIHFzKCIjbG9hZGluZyIpLmNsYXNzTGlzdC5yZW1vdmUoInZpc2libGUiKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBsZXQgd2FpdCA9IHdhaXRtcyAtIChEYXRlLm5vdygpIC0gc3RpbWUpCiAgICAgICAgcXVlcnl3YWl0ID0gc2xlZXAod2FpdCkKICAgICAgICBhd2FpdCBxdWVyeXdhaXQucHJvbWlzZQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBwcmltYWxnbG9iYWwoc29ja2V0KXsKICAgICAgICBsb2coImdsb2JhbCIsIHNvY2tldC51cmwpCiAgICAgICAgcXVlcnljb3VudCsrCiAgICAgICAgcXMoIiNsb2FkaW5nIikuY2xhc3NMaXN0LmFkZCgidmlzaWJsZSIpCiAgICAgICAgbGV0IHN0aW1lID0gRGF0ZS5ub3coKQogICAgICAgIGxldCBxaWQgPSAiZ2xvYmFsXyIgKyAoKytpZGNvdW50ZXIpCiAgICAgICAgbGV0IHFpZGxpa2VzID0gImxpa2VzXyIgKyAoKytpZGNvdW50ZXIpCgogICAgICAgIGlmKG5ld2xpa2VzLmxlbmd0aCA+IDApewogICAgICAgICAgcHJpbWFsc29ja2V0LnNlbmQoSlNPTi5zdHJpbmdpZnkoWwogICAgICAgICAgICAiUkVRIiwgCiAgICAgICAgICAgIHFpZGxpa2VzLCAKICAgICAgICAgICAgewogICAgICAgICAgICAgICJjYWNoZSI6IFsKICAgICAgICAgICAgICAgICJldmVudHMiLCB7CiAgICAgICAgICAgICAgICAgICJldmVudF9pZHMiOiBuZXdsaWtlcwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIF0KICAgICAgICAgICAgfQogICAgICAgICAgXSkpCgogICAgICAgICAgY29uc3QgbGlrZV9ldmVudHMgPSAoYXdhaXQgd2FpdHJlcyhxaWRsaWtlcykpWzBdCiAgICAgICAgICBuZXdsaWtlcy5zcGxpY2UoMCkKICAgICAgICAgIAogICAgICAgICAgYXdhaXQgc2F2ZShzb2NrZXQsIGxpa2VfZXZlbnRzLCAiIiwgImFsbCIsIHRydWUsIHRydWUsIGZhbHNlKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBzb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeShbCiAgICAgICAgICAiUkVRIiwgCiAgICAgICAgICBxaWQsIAogICAgICAgICAgewogICAgICAgICAgICAiY2FjaGUiOiBbCiAgICAgICAgICAgICAgImV4cGxvcmUiLCAKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAidGltZWZyYW1lIjogImxhdGVzdCIsCiAgICAgICAgICAgICAgICAic2NvcGUiOiAiZ2xvYmFsIiwKICAgICAgICAgICAgICAgICJsaW1pdCI6IDUwCiAgICAgICAgICAgICAgfQogICAgICAgICAgICBdCiAgICAgICAgICB9CiAgICAgICAgXSkpCiAgICAgICAgCiAgICAgICAgY29uc3QgcmVzID0gKGF3YWl0IHdhaXRyZXMocWlkKSlbMF0KICAgICAgICBhd2FpdCBoYW5kbGVxdWVyeXJlcyhyZXMuZmlsdGVyKGUgPT4gZS5raW5kID09IDEpLCBzb2NrZXQsICIiLCAiYWxsIiwgc3RpbWUpCiAgICAgICAgcHJpbWFsZ2xvYmFsKHNvY2tldCkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gcXVlcnkoc29ja2V0LCBwcmltYWwpewogICAgICAgIGxvZygicXVlcnkiLCBzb2NrZXQudXJsKQogICAgICAgIHF1ZXJ5Y291bnQrKwogICAgICAgIHFzKCIjbG9hZGluZyIpLmNsYXNzTGlzdC5hZGQoInZpc2libGUiKQogICAgICAgIAogICAgICAgIGxldCBzdGltZSA9IERhdGUubm93KCkKICAgICAgICBsZXQgcSA9IHF1ZXJ5c3RyLnRyaW0oKQogICAgICAgIGxldCB0eXBlID0gcXVlcnl0eXBlKCkKICAgICAgICBsZXQgaSA9ICsraWRjb3VudGVyCiAgICAgICAgbGV0IHFpZCA9ICJxdWVyeV8iICsgaQogICAgICAgIGNvbnN0IGxpa2VzcmVzID0gYXdhaXQgcXVlcnlsaWtlcyhzb2NrZXQpCiAgICAgICAgCiAgICAgICAgbGlrZXNyZXMuZm9yRWFjaChldmVudGlkID0+IHsKICAgICAgICAgIGlmKCFsaWtlcy5pbmNsdWRlcyhldmVudGlkKSl7CiAgICAgICAgICAgIGxpa2VzLnB1c2goZXZlbnRpZCkKICAgICAgICAgICAgbmV3bGlrZXMucHVzaChldmVudGlkKQogICAgICAgICAgfQogICAgICAgIH0pCiAgICAgICAgCiAgICAgICAgbGV0IGdhbGxlcnltYXRjaCA9IHF1ZXJ5c3RyLm1hdGNoKC9nOihbYS16MC05XSspLykKICAgICAgICBsZXQgcHVia2V5bWF0Y2ggPSBxdWVyeXN0ci5tYXRjaCgvazooW2EtejAtOV0rKS8pCiAgICAgICAgbGV0IHJlcyA9IG51bGwKICAgICAgICAKICAgICAgICBpZihnYWxsZXJ5bWF0Y2gpewogICAgICAgICAgY29uc3QgZ2FsbGVyeXJlcyA9IGF3YWl0IHF1ZXJ5ZXZlbnRzKHNvY2tldCwgWzMzM10sIFtnYWxsZXJ5bWF0Y2hbMV1dLCBudWxsKQogICAgICAgICAgY29uc3QgZXZlbnRpZHMgPSBKU09OLnBhcnNlKGdhbGxlcnlyZXNbMF0uY29udGVudCkKICAgICAgICAgIHJlcyA9IGF3YWl0IHF1ZXJ5ZXZlbnRzKHNvY2tldCwgWzFdLCBldmVudGlkcywgbnVsbCkKICAgICAgICB9CiAgICAgICAgZWxzZSBpZihwdWJrZXltYXRjaCl7CiAgICAgICAgICByZXMgPSBhd2FpdCBxdWVyeWV2ZW50cyhzb2NrZXQsIFsxXSwgbnVsbCwgW3B1YmtleW1hdGNoWzFdXSkKICAgICAgICB9CiAgICAgICAgZWxzZXsKICAgICAgICAgIGxldCBmaWx0ZXJzID0gW10KCiAgICAgICAgICBmaWx0ZXJzLnB1c2goLi4uKHR5cGVzW3R5cGVdIHx8IFtdKS5tYXAoKHQpID0+IHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICBraW5kczogWzFdLCAKICAgICAgICAgICAgICBzZWFyY2g6ICIuIiArIHQsCiAgICAgICAgICAgICAgbGltaXQ6IDIwCiAgICAgICAgICAgIH0KICAgICAgICAgIH0pKQogICAgICAgICAgCiAgICAgICAgICBpZihxLmxlbmd0aCA+IDApewogICAgICAgICAgICBmaWx0ZXJzLnB1c2goe2tpbmRzOiBbMV0sIHNlYXJjaDogcX0pCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIGlmKGZpbHRlcnMubGVuZ3RoID09IDApewogICAgICAgICAgICBmaWx0ZXJzLnB1c2goe2tpbmRzOiBbMV19KQogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBjb25zdCBzZWFyY2hvYmogPSBbIlJFUSIsIHFpZCwgLi4uZmlsdGVyc10KICAgICAgICAgIGNvbnN0IHNlYXJjaGpzb24gPSBKU09OLnN0cmluZ2lmeShzZWFyY2hvYmopCiAgICAgICAgICBzb2NrZXQuc2VuZChzZWFyY2hqc29uKQogICAgICAgICAgCiAgICAgICAgICByZXMgPSAoYXdhaXQgd2FpdHJlcyhxaWQpKVswXQogICAgICAgICAgCiAgICAgICAgICByZXMgPSByZXMuZmlsdGVyKG8gPT4gewogICAgICAgICAgICBpZihxLmxlbmd0aCA+IDApewogICAgICAgICAgICAgIGZvcihsZXQgd29yZCBvZiBxLnNwbGl0KCIgIikpewogICAgICAgICAgICAgICAgaWYoby5jb250ZW50LnRvTG93ZXJDYXNlKCkuaW5kZXhPZih3b3JkLnRvTG93ZXJDYXNlKCkpID09IC0xKXsKICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdHJ1ZQogICAgICAgICAgfSkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgYXdhaXQgaGFuZGxlcXVlcnlyZXMocmVzLCBzb2NrZXQsIHEsIHR5cGUsIHN0aW1lKQogICAgICAgIHF1ZXJ5KHNvY2tldCkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gcXVlcnlsaWtlcyhzb2NrZXQpewogICAgICAgIGlmKCFoYXNrZXkoKSl7CiAgICAgICAgICByZXR1cm4gW10KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgY29uc3QgbXlwdWJrZXkgPSBhd2FpdCBwdWJrZXkoKQogICAgICAgIGNvbnN0IGV2ZW50cyA9IGF3YWl0IHF1ZXJ5ZXZlbnRzKHNvY2tldCwgWzddLCBudWxsLCBbbXlwdWJrZXldKQogICAgICAgIHJldHVybiBldmVudHMubWFwKGUgPT4gZS50YWdzLmZpbmQodCA9PiB0WzBdID09ICJlIilbMV0pCiAgICAgIH0KCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHF1ZXJ5ZXZlbnRzKHNvY2tldCwga2luZHMsIGV2ZW50aWRzLCBhdXRob3JzKXsKICAgICAgICBjb25zdCBxdWVyeWlkID0gImV2ZW50c18iICsgKCsraWRjb3VudGVyKQogICAgICAgIGNvbnN0IGZpbHRlcnMgPSB7fQogICAgICAgIAogICAgICAgIGZpbHRlcnMua2luZHMgPSBraW5kcwogICAgICAgIAogICAgICAgIGlmKGV2ZW50aWRzKXsKICAgICAgICAgIGZpbHRlcnNbImlkcyJdID0gZXZlbnRpZHMKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoYXV0aG9ycyl7CiAgICAgICAgICBmaWx0ZXJzWyJhdXRob3JzIl0gPSBhdXRob3JzCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGNvbnN0IGpzb24gPSBKU09OLnN0cmluZ2lmeShbCiAgICAgICAgICAiUkVRIiwgCiAgICAgICAgICBxdWVyeWlkLCAKICAgICAgICAgIGZpbHRlcnMKICAgICAgICBdKQogICAgICAgIAogICAgICAgIHNvY2tldC5zZW5kKGpzb24pCiAgICAgICAgCiAgICAgICAgcmV0dXJuIChhd2FpdCB3YWl0cmVzKHF1ZXJ5aWQpKVswXSB8fCBbXQogICAgICB9CgogICAgICBhc3luYyBmdW5jdGlvbiBzYXZlKHNvY2tldCwgZXZlbnRzLCBxLCBxdHlwZSwgcmVhY3RlZCwgYXBwZW5kLCBxdWVyeW1ldGEpewogICAgICAgIGxldCBldmVudHB1YmtleXMgPSBbXQogICAgICAgIGxldCByZXN1bHRzID0gW10KICAgICAgICBjb25zdCBldmVudGlkcyA9IGV2ZW50cy5tYXAoZSA9PiBlLmlkKQogICAgICAgIGxldCBuZXd1cmxzID0gW10KICAgICAgICAKICAgICAgICBmb3IobGV0IGV2ZW50IG9mIGV2ZW50cyl7CiAgICAgICAgICBsZXQgdXJsc21hdGNoID0gW10KICAgICAgICAgIAogICAgICAgICAgaWYocXR5cGUgIT0gInZpZGVvIil7CiAgICAgICAgICAgIHVybHNtYXRjaC5wdXNoKC4uLihldmVudC5jb250ZW50Lm1hdGNoKGltZ3JlZ2V4KSB8fCBbXSkpCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIGlmKHF0eXBlICE9ICJpbWFnZSIpewogICAgICAgICAgICB1cmxzbWF0Y2gucHVzaCguLi4oZXZlbnQuY29udGVudC5tYXRjaCh2aWRlb3JlZ2V4KSB8fCBbXSkpCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIHVybHNtYXRjaCA9IHVybHNtYXRjaC5maWx0ZXIodXJsID0+ICF1cmxzLmluY2x1ZGVzKHVybCkpCgogICAgICAgICAgaWYodXJsc21hdGNoLmxlbmd0aCA+IDApewogICAgICAgICAgICBuZXd1cmxzLnB1c2goewogICAgICAgICAgICAgIGV2ZW50OiBldmVudCwKICAgICAgICAgICAgICB1cmxzOiB1cmxzbWF0Y2gKICAgICAgICAgICAgfSkKICAgICAgICAgICAgCiAgICAgICAgICAgIHVybHMucHVzaCguLi51cmxzbWF0Y2gpCiAgICAgICAgICAgIGV2ZW50cHVia2V5cy5pbmNsdWRlcyhldmVudC5wdWJrZXkpIHx8IGV2ZW50cHVia2V5cy5wdXNoKGV2ZW50LnB1YmtleSkKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgbG9nKCJxdWVyeSBtZXRhIiwgc29ja2V0LnVybCkKICAgICAgICBsZXQgbWV0YWV2ZW50cyA9IChxdWVyeW1ldGEgJiYgYXdhaXQgcXVlcnlldmVudHMoc29ja2V0LCBbMF0sIG51bGwsIGV2ZW50cHVia2V5cykgfHwgW10pCiAgICAgICAgCiAgICAgICAgZm9yKGxldCBlbnRyeSBvZiBuZXd1cmxzKXsKICAgICAgICAgIGZvcihsZXQgdXJsIG9mIGVudHJ5LnVybHMpewogICAgICAgICAgICByZXN1bHRzLnB1c2goewogICAgICAgICAgICAgIHJlYWN0ZWQ6IHJlYWN0ZWQgfHwgbGlrZXMuaW5jbHVkZXMoZW50cnkuZXZlbnQuaWQpLCAKICAgICAgICAgICAgICB1cmw6IHVybCwgCiAgICAgICAgICAgICAgZXZlbnQ6IGVudHJ5LmV2ZW50LCAKICAgICAgICAgICAgICBiZWNoMzJpZDogYmVjaDMyLmVuY29kZSgibm90ZSIsIGZyb21IZXhTdHJpbmcoZW50cnkuZXZlbnQuaWQpKSwKICAgICAgICAgICAgICBtZXRhOiBtZXRhZXZlbnRzLmZpbmQobyA9PiBvLnB1YmtleSA9PSBlbnRyeS5ldmVudC5wdWJrZXkpCiAgICAgICAgICAgIH0pCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGxvZygic2F2ZSByZXMiLCByZXN1bHRzLmxlbmd0aCwgc29ja2V0LnVybCkKICAgICAgICB1cGRhdGVjb250ZW50KHJlc3VsdHMsIHEsIGFwcGVuZCkKICAgICAgfQogICAgICAKICAgICAgbGV0IGxvYWRlZCA9IDAKICAgICAgCiAgICAgIGZ1bmN0aW9uIHVwZGF0ZWNvbnRlbnQocmVzdWx0cywgcSwgYXBwZW5kKXsKICAgICAgICByZXN1bHRzLnJldmVyc2UoKS5mb3JFYWNoKGl0ZW0gPT4gewogICAgICAgICAgY29uc3QgdHlwZSA9IGl0ZW0udXJsLm1hdGNoKHZpZGVvZXh0cmVnZXgpICYmICJ2aWRlbyIgfHwgImltYWdlIgogICAgICAgICAgY29uc3QgdGV4dCA9IChxIHx8ICJ2aWV3IG5vdGUiKS5zdWJzdHJpbmcoLTMwKQogICAgICAgICAgY29uc3QgaWQgPSAiaXRlbV8iICsgKCsraWRjb3VudGVyKQogICAgICAgICAgY29uc3QgY29udGVudGVsZW1lbnRzID0gJzxkaXYgY2xhc3M9InR5cGUiPicgKyBxcygiI3RlbXBsYXRlIC4iICsgdHlwZSArICJzdmciKS5vdXRlckhUTUwgKyAnPC9kaXY+PGEgY2xhc3M9Imxpa2UnICsgKGl0ZW0ucmVhY3RlZCA/ICcgcmVhY3RlZCcgOiAnJykgKyAnIiBkYXRhLWl0ZW0taWQ9IicgKyBpZCArIAogICAgICAgICAgICAnIiBocmVmPSIjIj4nICsgcXMoIiN0ZW1wbGF0ZSAuaGVhcnRzdmciKS5vdXRlckhUTUwgKyAnPC9hPjxhIGNsYXNzPSJxdWVyeSBsaW5rIiBocmVmPSInICsgcHJvdG9jb2wgKyAKICAgICAgICAgICAgaXRlbS5iZWNoMzJpZCArICciPicgKyB0ZXh0ICsgJzwvYT4nCiAgICAgICAgICBsZXQgcm9vdCA9IG51bGwKICAgICAgICAgIGxldCB2ID0gbnVsbAogICAgICAgICAgCiAgICAgICAgICBpZihpdGVtLnVybC5tYXRjaCh2aWRlb2V4dHJlZ2V4KSl7CiAgICAgICAgICAgIHJvb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKQogICAgICAgICAgICByb290LmNsYXNzTGlzdC5hZGQoInZpZGVvLWNvbnRhaW5lciIpCiAgICAgICAgICAgIHJvb3QuaW5uZXJIVE1MID0gY29udGVudGVsZW1lbnRzCiAgICAgICAgICAgIAogICAgICAgICAgICB2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKQogICAgICAgICAgICB2LmNsYXNzTGlzdC5hZGQoInNob3ciKQogICAgICAgICAgICB2WyJkYXRhLWl0ZW0taWQiXSA9IGlkCiAgICAgICAgICAgIHYucHJlbG9hZCA9ICJub25lIgogICAgICAgICAgICB2Lmxvb3AgPSB0cnVlCiAgICAgICAgICAgIHYucGxheXNpbmxpbmUgPSAiIgogICAgICAgICAgICAKICAgICAgICAgICAgdi5vbmNhbnBsYXkgPSBhc3luYyBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICBjb25zdCBhc3BlY3QgPSB0aGlzLnZpZGVvV2lkdGggLyB0aGlzLnZpZGVvSGVpZ2h0CiAgICAgICAgICAgICAgaWYoYXNwZWN0ID4gMSl7CiAgICAgICAgICAgICAgICB0aGlzLnN0eWxlLndpZHRoID0gKGFzcGVjdCAqIDEwMCkgKyAiJSIKICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgIHRoaXMuc3R5bGUuaGVpZ2h0ID0gKDEgLyBhc3BlY3QgKiAxMDApICsgIiUiCiAgICAgICAgICAgICAgICB0aGlzLnN0eWxlLm1hcmdpblRvcCA9IC0oKDEgLyBhc3BlY3QgKiAxMDAgLSAxMDApIC8gMikgKyAiJSIKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgdXBkYXRldmlkZW9wbGF5KHRoaXMucGFyZW50RWxlbWVudCkKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY29uc3QgZXh0ID0gaXRlbS51cmwubWF0Y2godmlkZW9leHRyZWdleClbMV0KICAgICAgICAgICAgdi5pbm5lckhUTUwgPSAnPHNvdXJjZSBzcmM9IicgKyBpdGVtLnVybCArICciIHR5cGU9InZpZGVvLycgKyBleHQgKyAnIj48L3NvdXJjZT4nCiAgICAgICAgICAgIAogICAgICAgICAgICByb290LmFwcGVuZCh2KQogICAgICAgICAgfWVsc2UgaWYoaXRlbS51cmwubWF0Y2goaW1nZXh0cmVnZXgpKXsKICAgICAgICAgICAgcm9vdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKQogICAgICAgICAgICByb290LmhyZWYgPSAiIyIKICAgICAgICAgICAgcm9vdC5pbm5lckhUTUwgPSBjb250ZW50ZWxlbWVudHMKICAgICAgICAgICAgICAKICAgICAgICAgICAgaWYodHlwZSA9PSAiaW1hZ2UiKXsKICAgICAgICAgICAgICAvL2xldCBpbWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKQogICAgICAgICAgICAgIC8vaW1nLmFsdCA9IGl0ZW0udXJsCiAgICAgICAgICAgICAgcm9vdFsiZGF0YS1zcmMiXSA9IGl0ZW0udXJsCiAgICAgICAgICAgICAgcm9vdC5jbGFzc0xpc3QuYWRkKCJpbWciKQogICAgICAgICAgICAgIC8vaW1nLmNsYXNzTGlzdC5hZGQoImRhdGEiKQogICAgICAgICAgICAgIC8vcm9vdC5hcHBlbmQoaW1nKQogICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICByb290LmlubmVySFRNTCArPSAnPHNwYW4gY2xhc3M9ImZpbGUiPicgKyBpdGVtLnVybCArICc8L3NwYW4+JwogICAgICAgICAgICB9CiAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIHJvb3QuaWQgPSBpZAogICAgICAgICAgcm9vdC5jbGFzc0xpc3QuYWRkKCd2aXNpYmxlJykKICAgICAgICAgIHJvb3RbImRhdGEtaXRlbSJdID0gaXRlbQogICAgICAgICAgcm9vdFsiZGF0YS1ldmVudCJdID0gaXRlbS5ldmVudAogICAgICAgICAgcm9vdFsiZGF0YS1xdWVyeSJdID0gcQogICAgICAgICAgcm9vdFsiZGF0YS10ZXh0Il0gPSB0ZXh0CiAgICAgICAgICAKICAgICAgICAgIHJvb3QuY2xhc3NMaXN0LmFkZCh0eXBlKQogICAgICAgICAgcm9vdC5jbGFzc0xpc3QuYWRkKCJpdGVtIikKICAgICAgICAgIHJvb3QuY2xhc3NMaXN0LmFkZCgic2hvdyIpCiAgICAgICAgICAKICAgICAgICAgIGlmKGl0ZW0ucmVhY3RlZCl7CiAgICAgICAgICAgIHJvb3QuY2xhc3NMaXN0LmFkZCgicmVhY3RlZCIpCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIHFzKCIjaW1hZ2VzIilbYXBwZW5kICYmICJhcHBlbmQiIHx8ICJwcmVwZW5kIl0ocm9vdCkKICAgICAgICAgIAogICAgICAgICAgaWYodil7CiAgICAgICAgICAgIHVwZGF0ZXZpZGVvcGxheShyb290KQogICAgICAgICAgfQogICAgICAgIH0pCgogICAgICAgIHVwZGF0ZWltYWdlc2xvYWQoKQogICAgICAgIAogICAgICAgIGlmKGFjdGl2ZSgpID09IG51bGwpewogICAgICAgICAgcXMoIiNpbWFnZXMgLml0ZW0iKT8uY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGhpZGVtZWRpYSgpewogICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAic2Nyb2xsIgogICAgICAgIHFzYSgiI21lZGlhLWNvbnRhaW5lciwgI2ltYWdlLCAjbWVkaWEtZm9vdGVyIikuZm9yRWFjaChuID0+IG4uY2xhc3NMaXN0LnJlbW92ZSgidmlzaWJsZSIpKQogICAgICAgIGdpZCgiaW1hZ2UtbGlrZSIpLmNsYXNzTGlzdC5yZW1vdmUoInJlYWN0ZWQiKQogICAgICAgIGhpZGV2aWRlbygpCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGhpZGV2aWRlbygpewogICAgICAgIGNvbnN0IHYgPSBxcygiI21lZGlhLWNvbnRhaW5lciB2aWRlbyIpCiAgICAgICAgCiAgICAgICAgaWYodil7CiAgICAgICAgICB2Lm11dGVkID0gdHJ1ZQogICAgICAgICAgdi5jbGFzc0xpc3QuYWRkKCJzaG93IikKICAgICAgICAgIGdpZCh2WyJkYXRhLWl0ZW0taWQiXSkuYXBwZW5kQ2hpbGQodikKICAgICAgICAgIHVwZGF0ZXZpZGVvcGxheSh2LnBhcmVudEVsZW1lbnQpCiAgICAgICAgfQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiB3YWl0cmVzKGtleSwgdHlwZSl7CiAgICAgICAgbGV0IHJlc2hhbmRsZXIgPSBmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpewogICAgICAgICAgdGhpcy50eXBlID0gdHlwZSB8fCAiRU9TRSIKICAgICAgICAgIHRoaXMuZXZlbnRzID0gW10KICAgICAgICAgIHRoaXMuaGFuZGxlID0gZnVuY3Rpb24ocmVzKXsKICAgICAgICAgICAgbGV0IG8gPSBKU09OLnBhcnNlKHJlcy5kYXRhKQogICAgICAgICAgICBpZihrZXkgPT0gbnVsbCB8fCBvWzFdID09IGtleSl7CiAgICAgICAgICAgICAgaWYob1swXSA9PSB0aGlzLnR5cGUpewogICAgICAgICAgICAgICAgcmVzb2x2ZShbdGhpcy5ldmVudHMsIG9dKQogICAgICAgICAgICAgICAgcmVzaGFuZGxlcnMuc3BsaWNlKHJlc2hhbmRsZXJzLmluZGV4T2YodGhpcyksIDEpCiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIHRoaXMuZXZlbnRzLnB1c2gob1syXSkKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gewogICAgICAgICAgbGV0IGhhbmRsZXIgPSBuZXcgcmVzaGFuZGxlcihyZXNvbHZlLCByZWplY3QpCiAgICAgICAgICByZXNoYW5kbGVycy5wdXNoKGhhbmRsZXIpCiAgICAgICAgfSkKICAgICAgfQogICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIGNoZWNrdXBkYXRlKHNvY2tldCl7CiAgICAgICAgY29uc3QgdXBkYXRlc3JlcyA9IGF3YWl0IHF1ZXJ5ZXZlbnRzKHNvY2tldCwgWzFdLCBudWxsLCBbdXBkYXRlc3B1YmtleV0pCiAgICAgICAgY29uc3QgdXBkYXRlbm90ZSA9IHVwZGF0ZXNyZXMuZmluZChuID0+IG4uY29udGVudC5tYXRjaCgvXmh0dHBzXDpcL1wvLykpCiAgICAgICAgCiAgICAgICAgaWYoIXVwZGF0ZW5vdGUpewogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGNvbnN0IGFnZSA9IE1hdGgucm91bmQoKERhdGUubm93KCkgLyAxMDAwIC0gdXBkYXRlbm90ZS5jcmVhdGVkX2F0KSAvIDM2MDAgLyAyNCkKICAgICAgICBjb25zdCBub3RlaWQgPSBiZWNoMzIuZW5jb2RlKCJub3RlIiwgZnJvbUhleFN0cmluZyh1cGRhdGVub3RlLmlkKSkKICAgICAgICBxcygiI3JlbGVhc2UiKS5ocmVmID0gcHJvdG9jb2wgKyBub3RlaWQKICAgICAgICBxcygiI3JlbGVhc2UiKS5pbm5lclRleHQgPSAoYWdlID09IDAgJiYgInRvZGF5IiB8fCBhZ2UgKyAiIGRheShzKSBhZ28iKQogICAgICB9CgogICAgICBmdW5jdGlvbiBzbGVlcChtcyl7CiAgICAgICAgcmV0dXJuIG5ldyBmdW5jdGlvbigpewogICAgICAgICAgbGV0IHRpbWVvdXQgPSBudWxsCiAgICAgICAgICBsZXQgciA9IG51bGwKICAgICAgICAgIAogICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgcHJvbWlzZTogbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KXsKICAgICAgICAgICAgICB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiByZXNvbHZlKCksIG1zKQogICAgICAgICAgICAgIHIgPSByZXNvbHZlCiAgICAgICAgICAgIH0pLAogICAgICAgICAgICByZXNvbHZlOiBmdW5jdGlvbigpewogICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KQogICAgICAgICAgICAgIHIoKQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBzaG93KGlkKXsKICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gImhpZGRlbiIKICAgICAgICBjb25zdCBpdGVtID0gZ2lkKGlkKVsiZGF0YS1pdGVtIl0KICAgICAgICBjb25zdCBtZWRpYSA9IGdpZCgibWVkaWEtY29udGFpbmVyIikKICAgICAgICBjb25zdCBpbWFnZSA9IGdpZCgiaW1hZ2UiKQoKICAgICAgICBpZihpdGVtLnVybC5tYXRjaCh2aWRlb2V4dHJlZ2V4KSl7CiAgICAgICAgICBpbWFnZS5jbGFzc0xpc3QucmVtb3ZlKCJ2aXNpYmxlIikKICAgICAgICAgIGNvbnN0IHYgPSBnaWQoaWQpLnF1ZXJ5U2VsZWN0b3IoInZpZGVvIikKICAgICAgICAgIHFzKCIjbWVkaWEtY29udGFpbmVyIikuYXBwZW5kQ2hpbGQodikKICAgICAgICAgIHYubXV0ZWQgPSBmYWxzZQogICAgICAgICAgdi5jbGFzc0xpc3QucmVtb3ZlKCJzaG93IikKICAgICAgICAgIHYucGxheSgpCiAgICAgICAgfWVsc2V7CiAgICAgICAgICBpbWFnZS5zcmMgPSBpdGVtLnVybAogICAgICAgICAgaW1hZ2UuY2xhc3NMaXN0LmFkZCgidmlzaWJsZSIpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGl0ZW0ubWV0YSl7CiAgICAgICAgICBjb25zdCBtZXRhY29udGVudCA9IEpTT04ucGFyc2UoaXRlbS5tZXRhLmNvbnRlbnQpCiAgICAgICAgICBjb25zdCBuYW1lID0gbWV0YWNvbnRlbnQuZGlzcGxheV9uYW1lIHx8IG1ldGFjb250ZW50Lm5hbWUKICAgICAgICAgIHFzKCIjaW1hZ2UtdXNlciIpLmNsYXNzTGlzdC5hZGQoInZpc2libGUiKQogICAgICAgICAgcXMoIiNpbWFnZS11c2VyIikuaHJlZiA9ICI/cHVia2V5PSIgKyBpdGVtLm1ldGEucHVia2V5Ly9wcm90b2NvbCArIGJlY2gzMi5lbmNvZGUoIm5wdWIiLCBmcm9tSGV4U3RyaW5nKGl0ZW0ubWV0YS5wdWJrZXkpKQogICAgICAgICAgcXMoIiNpbWFnZS11c2VyIikuaW5uZXJUZXh0ID0gbmFtZQogICAgICAgIH1lbHNlewogICAgICAgICAgcXMoIiNpbWFnZS11c2VyIikuY2xhc3NMaXN0LnJlbW92ZSgidmlzaWJsZSIpCiAgICAgICAgfQoKICAgICAgICBnaWQoImltYWdlLWxpa2UiKVsiZGF0YS1pdGVtLWlkIl0gPSBpZAogICAgICAgIGdpZCgibWVkaWEtZm9vdGVyIilbImRhdGEtZXZlbnQiXSA9IGl0ZW0uZXZlbnQKCiAgICAgICAgaWYoaXRlbS5yZWFjdGVkKXsKICAgICAgICAgIGdpZCgiaW1hZ2UtbGlrZSIpLmNsYXNzTGlzdC5hZGQoInJlYWN0ZWQiKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBjb25zdCBhID0gcXMoIiNpbWFnZS1xdWVyeSIpCiAgICAgICAgYS5ocmVmID0gcHJvdG9jb2wgKyBpdGVtLmJlY2gzMmlkCiAgICAgICAgYS5pbm5lclRleHQgPSBnaWQoaWQpWyJkYXRhLXRleHQiXQogICAgICAgIAogICAgICAgIGdpZCgibWVkaWEtY29udGFpbmVyIikuY2xhc3NMaXN0LmFkZCgidmlzaWJsZSIpCiAgICAgICAgZ2lkKCJtZWRpYS1mb290ZXIiKS5jbGFzc0xpc3QuYWRkKCJ2aXNpYmxlIikKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gY29ubmNvdW50KCl7CiAgICAgICAgcmV0dXJuIHNvY2tldHMuZmlsdGVyKHIgPT4gci5yZWFkeVN0YXRlID09IDEpLmxlbmd0aAogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBkaXNjb25uZWN0KCl7CiAgICAgICAgZm9yKGxldCBzb2NrZXQgb2Ygc29ja2V0cyl7CiAgICAgICAgICBzb2NrZXQuY2xvc2UoKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBzb2NrZXRzLnNwbGljZSgwKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBsb2cobXNnKXsKICAgICAgICBsZXQgc2Nyb2xsID0gcXMoIiNsb2dzIikuc2Nyb2xsVG9wID09IHFzKCIjbG9ncyIpLnNjcm9sbFRvcE1heAogICAgICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpCiAgICAgICAgZGl2LmlubmVyVGV4dCA9IEFycmF5LmZyb20oYXJndW1lbnRzKS5qb2luKCIgIikKICAgICAgICBxcygiI2xvZ3MiKS5hcHBlbmQoZGl2KQogICAgICAgIAogICAgICAgIHNjcm9sbCAmJiBxcygiI2xvZ3MiKS5zY3JvbGxUbygwLCBxcygiI2xvZ3MiKS5zY3JvbGxUb3BNYXgpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIGNvbm5lY3QodXJsKXsKICAgICAgICBsb2coImNvbm5lY3RpbmciLCB1cmwpCiAgICAgICAgbGV0IHNvY2tldCA9IG5ldyBXZWJTb2NrZXQodXJsKQogICAgICAgIAogICAgICAgIHNvY2tldC5vbm1lc3NhZ2UgPSBtZXNzYWdlID0+IHJlc2hhbmRsZXJzLmZvckVhY2gocmggPT4gcmguaGFuZGxlKG1lc3NhZ2UpKQogICAgICAgIAogICAgICAgIHNvY2tldC5vbmNsb3NlID0gYXN5bmMgZnVuY3Rpb24oKXsKICAgICAgICAgIHNvY2tldHMuc3BsaWNlKHNvY2tldHMuaW5kZXhPZihzb2NrZXQpLCAxKQogICAgICAgICAgcXMoIiNjb25uY291bnQiKS5pbm5lclRleHQgPSBjb25uY291bnQoKSArIChwcmltYWxzb2NrZXQgJiYgMSkKICAgICAgICAgIGxvZygiZGlzY29ubmVjdGVkIiwgdGhpcy51cmwsIGNvbm5jb3VudCgpKQogICAgICAgICAgYXdhaXQgc2xlZXAoMTAwMCkucHJvbWlzZQogICAgICAgICAgY29ubmVjdCh0aGlzLnVybCkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgc29ja2V0Lm9ub3BlbiA9IGZ1bmN0aW9uKCl7CiAgICAgICAgICBxcygiI2Nvbm5jb3VudCIpLmlubmVyVGV4dCA9IGNvbm5jb3VudCgpICsgKHByaW1hbHNvY2tldCAmJiAxKQogICAgICAgICAgbG9nKCJjb25uZWN0ZWQiLCB0aGlzLnVybCwgY29ubmNvdW50KCkpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJldHVybiBzb2NrZXQKICAgICAgfQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsIGFzeW5jICgpID0+IHsKICAgICAgICBwcmltYWxzb2NrZXQgPSBjb25uZWN0KCJ3c3M6Ly9jYWNoZTMucHJpbWFsLm5ldC9jYWNoZTE3IikKICAgICAgICBwcmltYWxzb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcigib3BlbiIsIGZ1bmN0aW9uKCl7CiAgICAgICAgICBwcmltYWxnbG9iYWwodGhpcykKICAgICAgICB9KQogICAgICAgIAogICAgICAgIHByaW1hbHNvY2tldC5hZGRFdmVudExpc3RlbmVyKCJjbG9zZSIsIGZ1bmN0aW9uKCl7CiAgICAgICAgICBwcmltYWxzb2NrZXQgPSBudWxsCiAgICAgICAgfSkKICAgICAgICAKICAgICAgICBmb3IobGV0IHVybCBvZiByZWxheXMoKSl7CiAgICAgICAgICBjb25zdCBzb2NrZXQgPSBjb25uZWN0KHVybCkKICAgICAgICAgIHNvY2tldHMucHVzaChzb2NrZXQpCiAgICAgICAgICAKICAgICAgICAgIHNvY2tldC5hZGRFdmVudExpc3RlbmVyKCJvcGVuIiwgZnVuY3Rpb24oKXsKICAgICAgICAgICAgY2hlY2t1cGRhdGUodGhpcykKICAgICAgICAgICAgcXVlcnkodGhpcykKICAgICAgICAgIH0pCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGF3YWl0IHNsZWVwKDEwMCkucHJvbWlzZQogICAgICAgIAogICAgICAgIGlmKGhhc2tleSgpKXsKICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgibm9zdHIiKQogICAgICAgIH0KICAgICAgfSkKICAgICAgCiAgICAgIGZvcihsZXQgYyBvZiBjb2xvcHRzKXsKICAgICAgICBkb2N1bWVudC53cml0ZSgnPHN0eWxlPicgKyBjb2xzY3NzLmlubmVyVGV4dC5yZXBsYWNlKC9cJFx7Y29sc1x9L2csIGMpICsgJzwvc3R5bGU+JykKICAgICAgfQogICAgPC9zY3JpcHQ+CiAgPC9ib2R5Pgo8L2h0bWw+Cg==