https://ipfs.io/ipfs/QmVtjwLKwwRFPiTajUdgvLu6gNyfjXM77biytoJjyEnEQr
sha256
f24e6328efe79c8cc78aa2fe28afcc77106c607c35274043fbc32e8c5cf02eaa files.html
base64
PCFET0NUWVBFIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgdXNlci1zY2FsYWJsZT1ubyIvPgogICAgPG1ldGEgY2hhcnNldD0iVVRGLTgiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cDovL3N2Z2ljb25zLnNwYXJray5mci9zdmdpY29ucy5jc3MiLz4KICAgIDxzdHlsZT4KICAgICAgKiB7CiAgICAgICAgb3ZlcnNjcm9sbC1iZWhhdmlvci15OiBjb250YWluOwogICAgICB9CiAgICAgIAogICAgICBib2R5IHsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICB3aWR0aDogMTAwdnc7CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIGZvbnQtZmFtaWx5OiAiTm90byBTZXJpZiI7CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeWRpc3BsYXksIAogICAgICAjaGVhZGVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICB9CiAgICAgIAogICAgICAjcmVsYXlzLAogICAgICAjbG9ncywgCiAgICAgICNwcml2a2V5IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB3aWR0aDogMThlbTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMTExOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CiAgICAgIAogICAgICAjcmVsYXlzLAogICAgICAjbG9ncyB7CiAgICAgICAgaGVpZ2h0OiA2ZW07CiAgICAgIH0KICAgICAgCiAgICAgICNsb2dzIHsKICAgICAgICBoZWlnaHQ6IDhlbTsKICAgICAgICBvdmVyZmxvdzogc2Nyb2xsOwogICAgICAgIGZvbnQtc2l6ZTogLjhlbTsKICAgICAgfQogICAgICAKICAgICAgc2VsZWN0IHsKICAgICAgICB3aWR0aDogNGVtOwogICAgICB9CiAgICAgIAogICAgICAjcmVsYXlzLCAKICAgICAgaW5wdXQuc3VibWl0IHsKICAgICAgICBib3JkZXItcmFkaXVzOiAuNWVtOwogICAgICB9CiAgICAgIAogICAgICAjcXVlcnlkaXNwbGF5IC50ZXh0LCAKICAgICAgI2hlYWRlciBhLAogICAgICAjbWVkaWEtY29udGFpbmVyIHsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQoKICAgICAgI2hlYWRlciBhLCAKICAgICAgZm9ybSwgCiAgICAgICNxdWVyeWRpc3BsYXkgewogICAgICAgIHotaW5kZXg6IDE7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CiAgICAgIAogICAgICBAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDMwZW0pIHsKICAgICAgICAjcXVlcnlkaXNwbGF5IHsKICAgICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgfQogICAgICB9CgogICAgICBmb3JtIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeSB7CiAgICAgICAgd2lkdGg6IDZlbTsKICAgICAgfQogICAgICAKICAgICAgI2xvYWRpbmcgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMHB4OwogICAgICAgIGxlZnQ6IDI3ZW07CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KICAgICAgCiAgICAgIGEgewogICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgICAgfQoKICAgICAgdmlkZW8gewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogIAogICAgICAjbWVkaWEtY29udGFpbmVyIHZpZGVvIHsKICAgICAgICB3aWR0aDogMTAwJSAhaW1wb3J0YW50OwogICAgICAgIGhlaWdodDogMTAwJSAhaW1wb3J0YW50OwogICAgICAgIG1hcmdpbi10b3A6IDAgIWltcG9ydGFudDsKICAgICAgfQogICAgICAKICAgICAgLnR5cGUgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgICB6LWluZGV4OiAxOwogICAgICB9CiAgICAgIAogICAgICAjaW1hZ2UtcXVlcnkgewogICAgICAgIHdpZHRoOiA1ZW07CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeWRpc3BsYXksCiAgICAgIGEsCiAgICAgIGlucHV0LnN1Ym1pdCB7CiAgICAgICAgY29sb3I6ICM5OTk7CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeWRpc3BsYXkgewogICAgICAgIHBhZGRpbmc6IDAgMWVtOwogICAgICB9CgogICAgICAjcXVlcnlkaXNwbGF5IC50ZXh0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgbWluLXdpZHRoOiAzZW07CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQoKICAgICAgI2hlYWRlciBhLAogICAgICAjaGVhZGVyIHNwYW4gewogICAgICAgIHBhZGRpbmc6IDAuNWVtOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CgogICAgICAjaGVhZGVyIHsKICAgICAgICBwYWRkaW5nOiAwLjQ1ZW0gMDsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICB9CgogICAgICAjaGVhZGVyIC5pdGVtcyB7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgIH0KICAgICAgCiAgICAgICNoZWFkZXIgLml0ZW1zIHsKICAgICAgICBtYXJnaW4tdG9wOiAuM2VtOwogICAgICB9CgogICAgICBwIHsKICAgICAgICBtYXJnaW4tdG9wOiAwOwogICAgICB9CiAgICAgIAogICAgICAubGFiZWwgewogICAgICAgIHBhZGRpbmc6IC44ZW0gLjhlbSAuOGVtIDA7CiAgICAgIH0KCiAgICAgICNpbWFnZXMgLnF1ZXJ5IHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIH0KCiAgICAgICNtZWRpYS1jb250YWluZXIgewogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwKTsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIHotaW5kZXg6IDQ7CiAgICAgIH0KICAgICAgCiAgICAgICNpbWFnZS1jb250YWluZXIgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogICAgICAKICAgICAgI2ltYWdlIHsKICAgICAgICBtYXgtd2lkdGg6IDEwMHZ3OwogICAgICAgIG1heC1oZWlnaHQ6IDEwMHZoOwogICAgICB9CiAgICAgICAgCiAgICAgICNpbWFnZXMgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KICAgICAgCiAgICAgICNpbWFnZXMgLml0ZW0gewogICAgICAgIHdpZHRoOiAyNXZ3OwogICAgICB9CgogICAgICAjaW1hZ2VzIC5pdGVtIHsKICAgICAgICBoZWlnaHQ6IDI1dnc7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgI21lZGlhLWNvbnRhaW5lciB2aWRlbyB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgfQogICAgICAKICAgICAgYm9keTpub3QoLm5vc3RyKSAjZmlsdGVyLWxpa2VzLCAKICAgICAgLmZpbHRlci1saWtlcyAjaW1hZ2VzID4gLml0ZW06bm90KC5yZWFjdGVkKSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSwgCiAgICAgICNpbWFnZS1xdWVyeSwKICAgICAgI2ltYWdlLXVzZXIgewogICAgICAgIHotaW5kZXg6IDI7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDN2dzsKICAgICAgfQogICAgICAKICAgICAgLnF1ZXJ5LCAKICAgICAgLmxpa2UgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBwYWRkaW5nOiAwIDF2dzsKICAgICAgfQogICAgICAKICAgICAgLnF1ZXJ5LCAKICAgICAgLmxpa2UsIAogICAgICAjaW1hZ2UtcXVlcnksIAogICAgICAudmlkZW9zdmcsCiAgICAgIC5pbWFnZXN2ZyB7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLDAsMCwwLjYpOwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSwgCiAgICAgICNpbWFnZS1xdWVyeSB7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGZvbnQtc2l6ZTogbWluKDMuNXZ3LCAxLjVlbSk7CiAgICAgICAgbWF4LXdpZHRoOiA1ZW07CiAgICAgIH0KICAgICAgCiAgICAgICNpbWFnZS1xdWVyeSB7CiAgICAgICAgcGFkZGluZzogLjZlbSAuNGVtIC4xZW0gLjRlbTsKICAgICAgICBtYXgtd2lkdGg6IDVlbTsKICAgICAgfQogICAgICAKICAgICAgLmxpa2UucmVhY3RlZCwKICAgICAgLmZpbHRlci1saWtlcyAjZmlsdGVyLWxpa2VzIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZWQ7CiAgICAgIH0KCiAgICAgICNpbWFnZS1xdWVyeSwKICAgICAgI2ltYWdlLXVzZXIgewogICAgICAgIGZvbnQtc2l6ZTogM2VtOwogICAgICB9CiAgICAgIAogICAgICAjaW1hZ2UtcXVlcnksCiAgICAgICNpbWFnZS11c2VyLAogICAgICAjbWVkaWEtZm9vdGVyIC5saWtlIHsKICAgICAgICB6LWluZGV4OiA1OwogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgfQogICAgICAKICAgICAgI2ltYWdlLXF1ZXJ5LAogICAgICAjaW1hZ2UtdXNlciB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgICNpbWFnZS11c2VyIHsKICAgICAgICBib3R0b206IDEuOWVtOwogICAgICAgIGZvbnQtc2l6ZTogMS44ZW07CiAgICAgICAgcGFkZGluZy1yaWdodDogLjY1ZW07CiAgICAgICAgbWF4LXdpZHRoOiA4ZW07CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgIH0KICAgICAgCiAgICAgIC5saWtlIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IGF1dG87CiAgICAgICAgcGFkZGluZzogLjJlbTsKICAgICAgICB3aWR0aDogMWVtOwogICAgICAgIGhlaWdodDogMWVtOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgIH0KCiAgICAgIC5ub3N0ciAubGlrZSB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7ICAKICAgICAgfQoKICAgICAgI21lZGlhLWZvb3RlciAubGlrZSB7CiAgICAgICAgZm9udC1zaXplOiAyLjRlbTsKICAgICAgfQoKICAgICAgI21lZGlhLWZvb3RlciB7CiAgICAgICAgZGlzcGxheTogbm9uZTsgIAogICAgICB9CiAgCiAgICAgICNpbWFnZXMgLmltZyB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGZsb2F0OiBsZWZ0OwogICAgICAgIGJhY2tncm91bmQtc2l6ZTogY292ZXI7CiAgICAgICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsKICAgICAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXI7CiAgICAgIH0KCiAgICAgICNtZW51LWNvbnRlbnQgLml0ZW1zIC5hY3RpdmUgewogICAgICAgIGJhY2tncm91bmQ6ICM0NDQ7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KICAgICAgCiAgICAgICNpbWFnZXMgPiAuYWN0aXZlIHsKICAgICAgICBvdXRsaW5lOiAuM2VtIHNvbGlkIGdyZWVuOwogICAgICAgIHotaW5kZXg6IDE7CiAgICAgIH0KCiAgICAgIC5oZWFydHN2ZyBwYXRoLAogICAgICAuaGVhZGVyLWljb24gc3ZnIHBhdGggewogICAgICAgIHN0cm9rZTogI2ZmZjsKICAgICAgfQogIAogICAgICAudmlkZW9zdmcsCiAgICAgIC5pbWFnZXN2ZyB7CiAgICAgICAgd2lkdGg6IGNhbGMobWluKDR2dywgMmVtKSk7CiAgICAgICAgaGVpZ2h0OiBjYWxjKG1pbig0dncsIDJlbSkpOwogICAgICAgIHBhZGRpbmc6IDAgLjJlbTsKICAgICAgfQogICAgICAKICAgICAgLnZpZGVvc3ZnIHBhdGgsCiAgICAgIC5pbWFnZXN2ZyBwYXRoIHsKICAgICAgICBmaWxsOiAjZmZmOwogICAgICB9CiAgICAgIAogICAgICBhI21lbnUsIAogICAgICAuaGVhZGVyLWljb24gewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIG1hcmdpbi10b3A6IC0uM2VtOwogICAgICAgIGJhY2tncm91bmQ6ICMwMDA7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgIH0KCiAgICAgIC5pY29ucyB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIHotaW5kZXg6IDI7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgfQogICAgICAKICAgICAgYSNtZW51IHsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICBwYWRkaW5nOiAwIC4zZW0gMCAuNWVtOwogICAgICAgIGhlaWdodDogMi4xZW07CiAgICAgIH0KICAgICAgCiAgICAgICNoZWFkZXIgLmhlYWRlci1pY29uIHsKICAgICAgICBwYWRkaW5nOiAuMmVtOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgICB3aWR0aDogMS41ZW07CiAgICAgICAgaGVpZ2h0OiAxLjVlbTsKICAgICAgICBtYXJnaW46IC4xZW0gLjVlbTsKICAgICAgICBmbG9hdDogcmlnaHQ7CiAgICAgIH0KICAgICAgCiAgICAgIC5oZWFkZXItaWNvbiBzdmcgewogICAgICAgIHdpZHRoOiAxLjVlbTsKICAgICAgICBoZWlnaHQ6IDEuNWVtOwogICAgICB9CiAgICAgICAKICAgICAgLm1lbnVzdmcgewogICAgICAgIHdpZHRoOiAyZW07CiAgICAgICAgaGVpZ2h0OiAyZW07CiAgICAgIH0KCiAgICAgIC5tZW51c3ZnIHBhdGggewogICAgICAgIGZpbGw6ICNmZmY7CiAgICAgIH0KCiAgICAgICNtZW51LWNvbnRlbnQgewogICAgICAgIGZsb2F0OiBsZWZ0OwogICAgICAgIGhlaWdodDogMTAwdmg7CiAgICAgICAgd2lkdGg6IDE4ZW07CiAgICAgICAgbWFyZ2luLWxlZnQ6IC0xOGVtOwogICAgICAgIGJhY2tncm91bmQ6ICMyMjI7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIHotaW5kZXg6IDM7IAogICAgICAgIG92ZXJmbG93OiBzY3JvbGw7CiAgICAgIH0KCiAgICAgICNtZW51LWNvbnRlbnQub3BlbiB7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDA7CiAgICAgIH0KICAgICAgCiAgICAgICNtZW51LWNvbnRlbnQgLml0ZW1zIHsKICAgICAgICBwYWRkaW5nOiAwIDFlbSAxZW0gMWVtOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CiAgICAgIAogICAgICAjbWVudS1jb250ZW50IC5pdGVtcyBhLAogICAgICBpbnB1dC5zdWJtaXQgewogICAgICAgIHBhZGRpbmc6IC41ZW0gLjdlbTsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgYmFja2dyb3VuZDogIzExMTsKICAgICAgfQoKICAgICAgI292ZXJsYXkgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgei1pbmRleDogMzsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgb3BhY2l0eTogLjU7CiAgICAgIH0KCiAgICAgIC5vcGVuIHsKICAgICAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50OwogICAgICB9CiAgICAgIAogICAgICAjc2hhcmUtZGlhbG9nIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICB3aWR0aDogY2FsYygxMDB2dyAtIDRlbSk7CiAgICAgICAgaGVpZ2h0OiA1MCU7CiAgICAgICAgYmFja2dyb3VuZDogI2ZmZjsKICAgICAgICBib3JkZXItcmFkaXVzOiAxZW07CiAgICAgICAgei1pbmRleDogNDsKICAgICAgICBtYXJnaW4tbGVmdDogMmVtOwogICAgICAgIG1hcmdpbi10b3A6IDJlbTsKICAgICAgICBwYWRkaW5nOiAxZW07CiAgICAgIH0KICAgICAgCiAgICAgIGgyIHsKICAgICAgICBtYXJnaW4tdG9wOiAwOwogICAgICB9CiAgICAgIAogICAgICBzdmcgewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CgogICAgICAjdGVtcGxhdGUgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC9oZWFkPgogIDxib2R5PgogICAgPGRpdiBpZD0idGVtcGxhdGUiPgogICAgICA8c3ZnIGNsYXNzPSJoZWFydHN2ZyBzdmctaWNvbiIgdmlld0JveD0iMCAwIDIwIDIwIj4KICAgICAgICA8cGF0aCBkPSJNOS43MTksMTcuMDczbC02LjU2Mi02LjUxYy0wLjI3LTAuMjY4LTAuNTA0LTAuNTY3LTAuNjk2LTAuODg4QzEuMzg1LDcuODksMS42Nyw1LjYxMywzLjE1NSw0LjE0YzAuODY0LTAuODU2LDIuMDEyLTEuMzI5LDMuMjMzLTEuMzI5YzEuOTI0LDAsMy4xMTUsMS4xMiwzLjYxMiwxLjc1MmMwLjQ5OS0wLjYzNCwxLjY4OS0xLjc1MiwzLjYxMi0xLjc1MmMxLjIyMSwwLDIuMzY5LDAuNDcyLDMuMjMzLDEuMzI5YzEuNDg0LDEuNDczLDEuNzcxLDMuNzUsMC42OTMsNS41MzdjLTAuMTksMC4zMi0wLjQyNSwwLjYxOC0wLjY5NSwwLjg4N2wtNi41NjIsNi41MUMxMC4xMjUsMTcuMjI5LDkuODc1LDE3LjIyOSw5LjcxOSwxNy4wNzMgTTYuMzg4LDMuNjFDNS4zNzksMy42MSw0LjQzMSw0LDMuNzE3LDQuNzA3QzIuNDk1LDUuOTIsMi4yNTksNy43OTQsMy4xNDUsOS4yNjVjMC4xNTgsMC4yNjUsMC4zNTEsMC41MSwwLjU3NCwwLjczMUwxMCwxNi4yMjhsNi4yODEtNi4yMzJjMC4yMjQtMC4yMjEsMC40MTYtMC40NjYsMC41NzMtMC43MjljMC44ODctMS40NzIsMC42NTEtMy4zNDYtMC41NzEtNC41NkMxNS41Nyw0LDE0LjYyMSwzLjYxLDEzLjYxMiwzLjYxYy0xLjQzLDAtMi42MzksMC43ODYtMy4yNjgsMS44NjNjLTAuMTU0LDAuMjY0LTAuNTM2LDAuMjY0LTAuNjksMEM5LjAyOSw0LjM5Nyw3LjgyLDMuNjEsNi4zODgsMy42MSI+PC9wYXRoPgogICAgICA8L3N2Zz4KICAgICAgPHN2ZyBjbGFzcz0idmlkZW9zdmcgc3ZnLWljb24iIHZpZXdCb3g9IjAgMCAyMCAyMCI+CgkJCQk8cGF0aCBkPSJNMTguMTc1LDQuMTQySDEuOTUxQzEuNzAzLDQuMTQyLDEuNSw0LjM0NCwxLjUsNC41OTJ2MTAuODE2YzAsMC4yNDcsMC4yMDMsMC40NSwwLjQ1MSwwLjQ1aDE2LjIyNGMwLjI0NywwLDAuNDUtMC4yMDMsMC40NS0wLjQ1VjQuNTkyQzE4LjYyNSw0LjM0NCwxOC40MjIsNC4xNDIsMTguMTc1LDQuMTQyIE00LjY1NSwxNC45NTdIMi40MDF2LTEuODAzaDIuMjUzVjE0Ljk1N3pNNC42NTUsMTIuMjU0SDIuNDAxdi0xLjgwM2gyLjI1M1YxMi4yNTR6IE00LjY1NSw5LjU0OUgyLjQwMVY3Ljc0N2gyLjI1M1Y5LjU0OXogTTQuNjU1LDYuODQ2SDIuNDAxVjUuMDQzaDIuMjUzVjYuODQ2ek0xNC41NjksMTQuOTU3SDUuNTU2VjUuMDQzaDkuMDEzVjE0Ljk1N3ogTTE3LjcyNCwxNC45NTdoLTIuMjUzdi0xLjgwM2gyLjI1M1YxNC45NTd6IE0xNy43MjQsMTIuMjU0aC0yLjI1M3YtMS44MDNoMi4yNTNWMTIuMjU0ek0xNy43MjQsOS41NDloLTIuMjUzVjcuNzQ3aDIuMjUzVjkuNTQ5eiBNMTcuNzI0LDYuODQ2aC0yLjI1M1Y1LjA0M2gyLjI1M1Y2Ljg0NnoiPjwvcGF0aD4KCQkJPC9zdmc+CgkJCTxzdmcgY2xhc3M9ImltYWdlc3ZnIHN2Zy1pY29uIiB2aWV3Qm94PSIwIDAgMjAgMjAiPgoJCQkJPHBhdGggZD0iTTE4LjU1NSwxNS4zNTRWNC41OTJjMC0wLjI0OC0wLjIwMi0wLjQ1MS0wLjQ1LTAuNDUxSDEuODg4Yy0wLjI0OCwwLTAuNDUxLDAuMjAzLTAuNDUxLDAuNDUxdjEwLjgwOGMwLDAuNTU5LDAuNzUxLDAuNDUxLDAuNDUxLDAuNDUxaDE2LjIxN2gwLjAwNUMxOC43OTMsMTUuODUxLDE4LjQ3OCwxNC44MTQsMTguNTU1LDE1LjM1NCBNMi44LDE0Ljk0OWw0Ljk0NC02LjQ2NGw0LjE0NCw1LjQxOWMwLjAwMywwLjAwMywwLjAwMywwLjAwMywwLjAwMywwLjAwNWwwLjc5NywxLjA0SDIuOHogTTEzLjgyMiwxNC45NDlsLTEuMDA2LTEuMzE3bDEuNjg5LTIuMjE4bDIuNjg4LDMuNTM1SDEzLjgyMnogTTE3LjY1NCwxNC4wNjRsLTIuNzkxLTMuNjY2Yy0wLjE4MS0wLjIzNy0wLjUzNS0wLjIzNy0wLjcxNiwwbC0xLjg5OSwyLjQ5M2wtNC4xNDYtNS40MmMtMC4xOC0wLjIzNy0wLjUzNi0wLjIzNy0wLjcxNiwwbC01LjA0Nyw2LjU5OFY1LjA0MmgxNS4zMTZWMTQuMDY0eiBNMTIuNDc0LDYuMzkzYy0wLjg2OSwwLTEuNTc3LDAuNzA3LTEuNTc3LDEuNTc2czAuNzA4LDEuNTc2LDEuNTc3LDEuNTc2czEuNTc3LTAuNzA3LDEuNTc3LTEuNTc2UzEzLjM0Myw2LjM5MywxMi40NzQsNi4zOTMgTTEyLjQ3NCw4LjY0NWMtMC4zNzEsMC0wLjY3Ni0wLjMwNC0wLjY3Ni0wLjY3NnMwLjMwNS0wLjY3NiwwLjY3Ni0wLjY3NmMwLjM3MiwwLDAuNjc2LDAuMzA0LDAuNjc2LDAuNjc2UzEyLjg0Niw4LjY0NSwxMi40NzQsOC42NDUiPjwvcGF0aD4KCQkJPC9zdmc+CiAgICAgIDxkaXYgaWQ9ImNvbHNjc3MiPgogICAgICAuY29scyR7Y29sc30gI2ltYWdlcyAuaXRlbSB7CiAgICAgICAgd2lkdGg6IGNhbGMoMTAwdncgLyAke2NvbHN9KTsKICAgICAgfQoKICAgICAgLmNvbHMke2NvbHN9ICNpbWFnZXMgLml0ZW0gewogICAgICAgIGhlaWdodDogY2FsYygxMDB2dyAvICR7Y29sc30pOwogICAgICB9CiAgICAgIAogICAgICAuY29scyR7Y29sc30gLnF1ZXJ5LAogICAgICAuY29scyR7Y29sc30gLmxpa2UgewogICAgICAgIGZvbnQtc2l6ZTogbWluKDE0dncgKiAoMSAvICR7Y29sc30pLCA2ZW0gKiAoMSAvICR7Y29sc30pKQogICAgICB9CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJzaGFyZS1kaWFsb2ciPgogICAgICA8aDI+c2hhcmU8L2gyPgogICAgICA8Zm9ybSBpZD0ic2hhcmUtZm9ybSIgYWN0aW9uPSIjIj4KICAgICAgICA8cCBjbGFzcz0iY29udGVudCI+PC9wPgogICAgICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiIGNsYXNzPSJzdWJtaXQiIHZhbHVlPSJvayIvPgogICAgICA8L2Zvcm0+CiAgICA8L2Rpdj4KICAgIDxkaXYgaWQ9Im1lZGlhLWZvb3RlciI+CiAgICAgIDxhIGlkPSJpbWFnZS1saWtlIiBjbGFzcz0ibGlrZSIgaHJlZj0iIyI+PC9hPgogICAgICA8YSBpZD0iaW1hZ2UtcXVlcnkiIGhyZWY9IiMiPjwvYT4KICAgICAgPGEgaWQ9ImltYWdlLXVzZXIiIGhyZWY9IiMiPjwvYT4KICAgIDwvZGl2PgogICAgPGNlbnRlciBpZD0ibWVkaWEtY29udGFpbmVyIj4KICAgICAgPGRpdiBpZD0iaW1hZ2UtY29udGFpbmVyIj4KICAgICAgICA8aW1nIGlkPSJpbWFnZSIvPgogICAgICA8L2Rpdj4KICAgIDwvY2VudGVyPgogICAgPGRpdiBpZD0ib3ZlcmxheSI+PC9kaXY+CiAgICA8ZGl2IGlkPSJtZW51LWNvbnRlbnQiIGNsYXNzPSJ0ZXN0Ij4KICAgICAgPGRpdiBjbGFzcz0iaXRlbXMiPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5hdXRvcGxheTwvZGl2PgogICAgICAgIDxhIGNsYXNzPSJzZXRhdXRvcGxheSIgZGF0YS1hdXRvcGxheT0ib24iIGhyZWY9IiMiPm9uPC9hPgogICAgICAgIDxhIGNsYXNzPSJzZXRhdXRvcGxheSIgZGF0YS1hdXRvcGxheT0ib2ZmIiBocmVmPSIjIj5vZmY8L2E+CiAgICAgICAgPGEgY2xhc3M9InNldGF1dG9wbGF5IiBkYXRhLWF1dG9wbGF5PSJob3ZlciIgaHJlZj0iIyI+bW91c2VvdmVyPC9hPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5jb2x1bW5zPC9kaXY+CiAgICAgICAgPGEgY2xhc3M9InNldGNvbHMiIGRhdGEtY29scz0iMSIgaHJlZj0iIyI+MTwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0Y29scyIgZGF0YS1jb2xzPSIyIiBocmVmPSIjIj4yPC9hPgogICAgICAgIDxhIGNsYXNzPSJzZXRjb2xzIiBkYXRhLWNvbHM9IjQiIGhyZWY9IiMiPjQ8L2E+CiAgICAgICAgPGEgY2xhc3M9InNldGNvbHMiIGRhdGEtY29scz0iNiIgaHJlZj0iIyI+NjwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0Y29scyIgZGF0YS1jb2xzPSIxMCIgaHJlZj0iIyI+MTA8L2E+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPmNvbm5lY3Rpb25zPC9kaXY+CiAgICAgICAgPGRpdiBpZD0iY29ubmNvdW50Ij4wPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPnJlbGF5czo8L2Rpdj4KICAgICAgICA8cD5QbGVhc2UgdXNlIHJlbGF5cyB3aXRoIE5JUC01MCAoc2VhcmNoKSBmdW5jdGlvbmFsaXR5PC9wPgogICAgICAgIDxmb3JtIGFjdGlvbj0iIyIgaWQ9InJlbGF5cy1mb3JtIj4KICAgICAgICAgIDx0ZXh0YXJlYSBpZD0icmVsYXlzIj48L3RleHRhcmVhPgogICAgICAgICAgPGlucHV0IGNsYXNzPSJzdWJtaXQiIHR5cGU9InN1Ym1pdCIgdmFsdWU9InNhdmUgcmVsYXlzIi8+CiAgICAgICAgPC9mb3JtPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5wcml2YXRlIGtleTo8L2Rpdj4KICAgICAgICA8cD5JZiB5b3UgY2FudCB1c2UgYnJvd3NlciBhZGRvbiAobW9iaWxlKTwvcD4KICAgICAgICA8Zm9ybSBhY3Rpb249IiMiIGlkPSJwcml2a2V5LWZvcm0iPgogICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJwcml2a2V5Ii8+CiAgICAgICAgICA8aW5wdXQgY2xhc3M9InN1Ym1pdCIgdHlwZT0ic3VibWl0IiB2YWx1ZT0ic2F2ZSBrZXkiLz4KICAgICAgICA8L2Zvcm0+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPmxvZ3M8L2Rpdj4KICAgICAgICA8ZGl2IGlkPSJsb2dzIj48L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+bGF0ZXN0IHJlbGVhc2U6PC9kaXY+CiAgICAgICAgPGEgaWQ9InJlbGVhc2UiIGhyZWY9IiMiPjwvYT4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgaWQ9ImhlYWRlciI+CiAgICAgIDxkaXYgY2xhc3M9Imljb25zIj4KICAgICAgICA8YSBpZD0iZmlsdGVyLWxpa2VzIiBocmVmPSIjIiBjbGFzcz0iaGVhZGVyLWljb24iPjwvYT4KICAgICAgICA8YSBpZD0ic2hhcmUiIGhyZWY9IiMiIGNsYXNzPSJoZWFkZXItaWNvbiI+CiAgICAgICAgICA8c3ZnIGNsYXNzPSJzdmctaWNvbiIgdmlld0JveD0iMCAwIDIwIDIwIj4KCQkJCSAgICA8cGF0aCBkPSJNMTQuNjgsMTIuNjIxYy0wLjksMC0xLjcwMiwwLjQzLTIuMjE2LDEuMDlsLTQuNTQ5LTIuNjM3YzAuMjg0LTAuNjkxLDAuMjg0LTEuNDU3LDAtMi4xNDZsNC41NDktMi42MzhjMC41MTQsMC42NjEsMS4zMTUsMS4wOSwyLjIxNiwxLjA5YzEuNTQ5LDAsMi44MDktMS4yNiwyLjgwOS0yLjgwOGMwLTEuNTQ4LTEuMjYtMi44MDktMi44MDktMi44MDljLTEuNTQ4LDAtMi44MDgsMS4yNi0yLjgwOCwyLjgwOWMwLDAuMzgsMC4wNzYsMC43NDEsMC4yMTQsMS4wNzNsLTQuNTUsMi42MzhjLTAuNTE1LTAuNjYxLTEuMzE2LTEuMDktMi4yMTctMS4wOWMtMS41NDgsMC0yLjgwOCwxLjI2LTIuODA4LDIuODA5czEuMjYsMi44MDgsMi44MDgsMi44MDhjMC45LDAsMS43MDItMC40MywyLjIxNy0xLjA5bDQuNTUsMi42MzdjLTAuMTM4LDAuMzMyLTAuMjE0LDAuNjkzLTAuMjE0LDEuMDc0YzAsMS41NDksMS4yNiwyLjgwOSwyLjgwOCwyLjgwOWMxLjU0OSwwLDIuODA5LTEuMjYsMi44MDktMi44MDlTMTYuMjI5LDEyLjYyMSwxNC42OCwxMi42MjFNMTQuNjgsMi41MTJjMS4xMzYsMCwyLjA2LDAuOTIzLDIuMDYsMi4wNlMxNS44MTUsNi42MywxNC42OCw2LjYzcy0yLjA1OS0wLjkyMy0yLjA1OS0yLjA1OVMxMy41NDQsMi41MTIsMTQuNjgsMi41MTJNNS4zMTksMTIuMDYxYy0xLjEzNiwwLTIuMDYtMC45MjQtMi4wNi0yLjA2czAuOTIzLTIuMDU5LDIuMDYtMi4wNTljMS4xMzUsMCwyLjA2LDAuOTIzLDIuMDYsMi4wNTlTNi40NTQsMTIuMDYxLDUuMzE5LDEyLjA2MU0xNC42OCwxNy40ODhjLTEuMTM2LDAtMi4wNTktMC45MjItMi4wNTktMi4wNTlzMC45MjMtMi4wNjEsMi4wNTktMi4wNjFzMi4wNiwwLjkyNCwyLjA2LDIuMDYxUzE1LjgxNSwxNy40ODgsMTQuNjgsMTcuNDg4Ij48L3BhdGg+CgkJCSAgICA8L3N2Zz4KCQkJICA8L2E+CgkJCTwvZGl2PgoJCQkKICAgICAgPGRpdiBjbGFzcz0iaXRlbXMiPgogICAgICAgIDxhIGlkPSJtZW51IiBocmVmPSIjIj4KICAgICAgICAgIDxzdmcgY2xhc3M9Im1lbnVzdmcgc3ZnLWljb24iIHZpZXdCb3g9IjAgMCAyMCAyMCI+CgkJICAgICAgICA8cGF0aCBkPSJNMTAsMS40NDVjLTQuNzI2LDAtOC41NTUsMy44MjktOC41NTUsOC41NTVjMCw0LjcyNSwzLjgyOSw4LjU1NSw4LjU1NSw4LjU1NWM0LjcyNSwwLDguNTU1LTMuODMsOC41NTUtOC41NTVDMTguNTU1LDUuMjc0LDE0LjcyNSwxLjQ0NSwxMCwxLjQ0NSBNMTAsMTcuNjU0Yy00LjIyMSwwLTcuNjU0LTMuNDM0LTcuNjU0LTcuNjU0YzAtNC4yMjEsMy40MzMtNy42NTQsNy42NTQtNy42NTRjNC4yMjIsMCw3LjY1NCwzLjQzMyw3LjY1NCw3LjY1NEMxNy42NTQsMTQuMjIxLDE0LjIyMiwxNy42NTQsMTAsMTcuNjU0IE0xNC4zOSwxMGMwLDAuMjQ4LTAuMjAzLDAuNDUtMC40NSwwLjQ1SDYuMDZjLTAuMjQ4LDAtMC40NS0wLjIwMy0wLjQ1LTAuNDVzMC4yMDMtMC40NSwwLjQ1LTAuNDVoNy44NzlDMTQuMTg3LDkuNTUsMTQuMzksOS43NTIsMTQuMzksMTAgTTE0LjM5LDEyLjcwMmMwLDAuMjQ3LTAuMjAzLDAuNDQ5LTAuNDUsMC40NDlINi4wNmMtMC4yNDgsMC0wLjQ1LTAuMjAyLTAuNDUtMC40NDljMC0wLjI0OCwwLjIwMy0wLjQ1MSwwLjQ1LTAuNDUxaDcuODc5QzE0LjE4NywxMi4yNTEsMTQuMzksMTIuNDU0LDE0LjM5LDEyLjcwMiBNMTQuMzksNy4yOThjMCwwLjI0OC0wLjIwMywwLjQ1LTAuNDUsMC40NUg2LjA2Yy0wLjI0OCwwLTAuNDUtMC4yMDMtMC40NS0wLjQ1czAuMjAzLTAuNDUsMC40NS0wLjQ1aDcuODc5QzE0LjE4Nyw2Ljg0OCwxNC4zOSw3LjA1MSwxNC4zOSw3LjI5OCI+PC9wYXRoPgoJICAgICAgICA8L3N2Zz4KICAgICAgICA8L2E+CiAgICAgICAgPGEgaWQ9InRpdGxlIiBocmVmPSIjIj5maWxlcy5odG1sPC9hPgogICAgICAgIDxmb3JtIGlkPSJxdWVyeS1mb3JtIiBhY3Rpb249IiMiPgogICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJxdWVyeSIgbmFtZT0icXVlcnkiIGlkPSIiIC8+CiAgICAgICAgICA8c2VsZWN0IGlkPSJxdWVyeS10eXBlIj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iYWxsIj5hbGw8L29wdGlvbj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaW1hZ2UiPmltYWdlczwvb3B0aW9uPgogICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJ2aWRlbyI+dmlkZW9zPC9vcHRpb24+CiAgICAgICAgICA8L3NlbGVjdD4KICAgICAgICAgIDxpbnB1dCBpZD0iZ28iIHR5cGU9InN1Ym1pdCIgdmFsdWU9ImdvIi8+CiAgICAgICAgPC9mb3JtPgogICAgICAgIDxzcGFuIGlkPSJxdWVyeWRpc3BsYXkiPgogICAgICAgICAgPHNwYW4gY2xhc3M9InRleHQiPjwvc3Bhbj4KICAgICAgICA8L3NwYW4+CiAgICAgICAgPGRpdiBpZD0ibG9hZGluZyI+dXBkYXRpbmc8L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgaWQ9ImltYWdlcyI+PC9kaXY+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly91bnBrZy5jb20vbm9zdHItdG9vbHMvbGliL25vc3RyLmJ1bmRsZS5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9zbG93bGkuZ2l0aHViLmlvL2JlY2gzMi1idWZmZXIvYXNzZXRzL2pzL2JlY2gzMi1idWZmZXIubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQ+CiAgICAgIGNvbnN0IHVwZGF0ZXNwdWJrZXkgPSAiYWU1YzZlMGI3NDY2MGQyMTk0YzgyNTRiNWMyYzgyNTY3NjU3NmJlMDI5NzM3OWZhMjA1MjMxMTRhNmE4NWU4NyIKICAgICAgY29uc3QgcXVlcmllcyA9IHsKICAgICAgICAiZ2xvYmFsIjogJ1siUkVRIiwiPEk+Iix7ImNhY2hlIjpbImV4cGxvcmUiLHsidGltZWZyYW1lIjoibGF0ZXN0Iiwic2NvcGUiOiJnbG9iYWwiLCJsaW1pdCI6PEw+fV19XScsIAogICAgICAgICJhdXRob3IiOiAnWyJSRVEiLCI8ST4iLHsia2luZHMiOlsxXSwiYXV0aG9ycyI6WyI8UD4iXX1dJywKICAgICAgICAicmVhY3Rpb25zIjogJ1siUkVRIiwiPEk+IiwgeyJraW5kcyI6WzddLCIjZSI6IDxFPn1dJwogICAgICB9CiAgICAgIHFzKCIjcmVsYXlzIikudmFsdWUgPSByZWxheXMoKS5qb2luKCJcbiIpCiAgICAgIHFzKCIjcHJpdmtleSIpLnZhbHVlID0gcHJpdmtleSgpCiAgICAgIGNvbnN0IGNvbG9wdHMgPSBbMSwgMiwgNCwgNiwgMTBdCgogICAgICBjb2xzID0gKCkgPT4gcGFyc2VJbnQoc2V0dGluZygiY29scyIsIGNvbG9wdHNbMV0pLCAxMCkKICAgICAgYXV0b3BsYXkgPSAoKSA9PiBzZXR0aW5nKCJhdXRvcGxheSIsICJvZmYiKQogICAgICBsaW1pdCA9ICgpID0+IHBhcnNlSW50KHNldHRpbmcoImxpbWl0IiwgMTUpLCAxMCkKICAgICAgZ2FsbGVyeSA9ICgpID0+IHsKICAgICAgICBsZXQgZ2FsbGVyeW1hdGNoZXIgPSBsb2NhdGlvbi5zZWFyY2gubWF0Y2goL2dhbGxlcnk9KFthLXowLTldKykvKQogICAgICAgIHJldHVybiBnYWxsZXJ5bWF0Y2hlciAmJiBnYWxsZXJ5bWF0Y2hlclsxXQogICAgICB9CiAgICAgIAogICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoImNvbHMiICsgY29scygpKQoKICAgICAgbGV0IHByb3RvY29sID0gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlLykgPyAibm9zdHI6IiA6ICJ3ZWIrbm9zdHI6IgogICAgICBsZXQgc29ja2V0cyA9IFtdCiAgICAgIGxldCByZXNoYW5kbGVycyA9IFtdCiAgICAgIGxldCB1cmxzID0gW10KICAgICAgbGV0IGxpa2VzID0gW10KICAgICAgbGV0IG5ld2xpa2VzID0gW10KICAgICAgbGV0IGlkY291bnRlciA9IDAKICAgICAgbGV0IHF1ZXJ5d2FpdCA9IG51bGwKICAgICAgbGV0IHByaW1hbHNvY2tldCA9IG51bGwKICAgICAgbGV0IHR5cGVzID0gewogICAgICAgIGltYWdlOiBbInBuZyIsICJqcGciLCAianBlZyIsICJ3ZWJwIl0sCiAgICAgICAgdmlkZW86IFsibXA0IiwgIndlYm0iXQogICAgICB9CiAgICAgIGxldCBpbWdyZWdleCA9IC9odHRwKHxzKVw6XC9cL1teIFxuXSo/XC4ocG5nfGpwZ3xqcGVnfHdlYnApL2dpCiAgICAgIGxldCB2aWRlb3JlZ2V4ID0gL2h0dHAofHMpXDpcL1wvW14gXG5dKj9cLihtcDR8d2VibSkvZ2kKICAgICAgbGV0IHZpZGVvZXh0cmVnZXggPSAvXC4obXA0fHdlYm0pJC9pCiAgICAgIGxldCBpbWdleHRyZWdleCA9IC9cLihwbmd8anBnfGpwZWd8d2VicCkkL2kKICAgICAgd2FpdG1zID0gNTAwMDAKICAgICAgcXVlcnlzdHIgPSAiIgogICAgICBsZXQgcXVlcnljb3VudCA9IDAKICAgICAgbGV0IGhvdmVyZWR2aWRlbyA9IG51bGwKICAgICAgCiAgICAgIHVwZGF0ZXF1ZXJ5KCkKICAgICAgcXMoIiNpbWFnZS1saWtlIikuaW5uZXJIVE1MID0gcXMoIiNmaWx0ZXItbGlrZXMiKS5pbm5lckhUTUwgPSBxcygiI3RlbXBsYXRlIC5oZWFydHN2ZyIpLm91dGVySFRNTAogICAgICBzZXRhY3RpdmUoInNldGNvbHMiLCAiY29scyIsIGNvbHMoKSkKICAgICAgc2V0YWN0aXZlKCJzZXRhdXRvcGxheSIsICJhdXRvcGxheSIsIGF1dG9wbGF5KCkpCiAgICAgIAogICAgICBmdW5jdGlvbiBmcm9tSGV4U3RyaW5nKHN0cil7CiAgICAgICAgbGV0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KHN0ci5sZW5ndGggLyAyKQogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnVmZmVyLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBidWZmZXJbaV0gPSBwYXJzZUludChzdHIuc3Vic3RyKDIgKiBpLCAyKSwgMTYpCiAgICAgICAgfQogICAgICAgIHJldHVybiBidWZmZXIKICAgICAgfQogIAogICAgICBmdW5jdGlvbiByZWxheXMoKXsKICAgICAgICBjb25zdCBvYmogPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCJyZWxheXMiKSkKICAgICAgICBjb25zdCByID0gb2JqICYmIG9iai5maWx0ZXIociA9PiByLm1hdGNoKC93c3M6XC9cLy4rLykpIHx8IFtdCiAgICAgICAgCiAgICAgICAgcmV0dXJuIHIubGVuZ3RoID4gMCAmJiByIHx8IFsKICAgICAgICAgICJ3c3M6Ly9yZWxheS5ub3N0ci5iYW5kIiwKICAgICAgICAgICJ3c3M6Ly9uYi5yZWxheS5jZW50ZXIiLCAKICAgICAgICAgICJ3c3M6Ly9ub3N0ci5jb21waWxlLWVycm9yLm5ldCIKICAgICAgICBdCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHByaXZrZXkoKXsKICAgICAgICBsZXQga2V5ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oInByaXZrZXkiKSB8fCAiIgogICAgICAgIAogICAgICAgIGlmKGtleS5sZW5ndGggPT0gNjMpewogICAgICAgICAga2V5ID0gTm9zdHJUb29scy5uaXAxOS5kZWNvZGUoa2V5KS5kYXRhCiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJldHVybiBrZXkubGVuZ3RoID09IDY0ICYmIGtleSB8fCBudWxsCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHNldHRpbmcoa2V5LCBkZWZhdWx0dmFsdWUpewogICAgICAgIGNvbnN0IHYgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkpCiAgICAgICAgcmV0dXJuIHYgJiYgb3B0aW9uKCJzZXQiICsga2V5LCBrZXksIHYpICYmIHYgfHwgZGVmYXVsdHZhbHVlCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIG9wdGlvbihjLCBrZXksIHZhbCl7CiAgICAgICAgcmV0dXJuIHFzKCIuIiArIGMgKyAiW2RhdGEtIiArIGtleSArICI9JyIgKyB2YWwgKyAiJ10iKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBxcyhxKXsKICAgICAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihxKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBxc2EocSl7CiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChxKSkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gZ2lkKGkpewogICAgICAgIHJldHVybiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBxdWVyeXR5cGUoKXsKICAgICAgICByZXR1cm4gcXMoIiNxdWVyeS10eXBlIikudmFsdWUgfHwgImFsbCIKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gdXBkYXRlcXVlcnkoKXsKICAgICAgICBsZXQgcGFydHMgPSAoZ2FsbGVyeSgpICYmICgiZzoiICsgZ2FsbGVyeSgpKSB8fCBkZWNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaGFzaC5zdWJzdHJpbmcoMSkpKS5zcGxpdCgiLyIpCiAgICAgICAgcXMoIiNxdWVyeWRpc3BsYXkgLnRleHQiKS5pbm5lclRleHQgPSBwYXJ0c1swXS5zdWJzdHJpbmcoMCwgMjApCiAgICAgICAgcXVlcnlzdHIgPSBwYXJ0c1swXQogICAgICAgIHFzKCIjcXVlcnkiKS52YWx1ZSA9IHBhcnRzWzBdCiAgICAgICAgcXMoIiNxdWVyeS10eXBlIikudmFsdWUgPSBwYXJ0c1sxXSB8fCAiYWxsIgogICAgICB9CgogICAgICBmdW5jdGlvbiBhY3RpdmUoKXsKICAgICAgICByZXR1cm4gcXMoIiNpbWFnZXMgLmFjdGl2ZSIpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIGltYWdlb2Zmc2V0KG9mZnNldCl7CiAgICAgICAgY29uc3QgaW1hZ2VzID0gcXNhKCIjaW1hZ2VzID4gLml0ZW0iKS5maWx0ZXIoZSA9PiBlLnN0eWxlLmRpc3BsYXkgPT0gImJsb2NrIikKICAgICAgICByZXR1cm4gaW1hZ2VzW2ltYWdlcy5pbmRleE9mKGFjdGl2ZSgpKStvZmZzZXRdCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGxhc3RhY3RpdmUoKXsKICAgICAgICByZXR1cm4gcXNhKCIjaW1hZ2VzIC5hY3RpdmUiKS5wb3AoKSAgICAgIAogICAgICB9CgogICAgICBmdW5jdGlvbiBtZW51KCl7CiAgICAgICAgcXNhKCIjbWVudS1jb250ZW50LCAjb3ZlcmxheSIpLmZvckVhY2gobiA9PiBuLmNsYXNzTGlzdC50b2dnbGUoIm9wZW4iKSkKICAgICAgfQogIAogICAgICBmdW5jdGlvbiBzZXRhY3RpdmUoYywga2V5LCB2YWwpewogICAgICAgIHFzYSgiLiIgKyBjKS5mb3JFYWNoKG4gPT4gbi5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKSkKICAgICAgICBjb25zdCBvcHRpb24gPSBxcygiLiIgKyBjICsgIltkYXRhLSIgKyBrZXkgKyAiPSciICsgdmFsICsgIiddIikKICAgICAgICBvcHRpb24/LmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHNjcm9sbHZpc2libGUobiwgb2Zmc2V0KXsKICAgICAgICBvZmZzZXQgPSBvZmZzZXQgfHwgMAogICAgICAgIHJldHVybiAobi5vZmZzZXRUb3AgKyBuLm9mZnNldEhlaWdodCkgPj0gKHNjcm9sbFkgLSBvZmZzZXQpCiAgICAgICAgICAmJiBuLm9mZnNldFRvcCA8PSAoc2Nyb2xsWSArIHZpc3VhbFZpZXdwb3J0LmhlaWdodCArIG9mZnNldCkKICAgICAgfQoKICAgICAgYXN5bmMgZnVuY3Rpb24gdXBkYXRlaW1hZ2VzbG9hZCgpewogICAgICAgIHFzYSgiI2ltYWdlcyAuaXRlbS5pbWciKS5mb3JFYWNoKGFzeW5jIGltZyA9PiB7CiAgICAgICAgICBpZihzY3JvbGx2aXNpYmxlKGltZywgdmlzdWFsVmlld3BvcnQuaGVpZ2h0IC8gMikpewogICAgICAgICAgICBpbWcuc3R5bGUuYmFja2dyb3VuZEltYWdlID0gInVybCgiICsgaW1nWyJkYXRhLXNyYyJdICsgIikiCiAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgaW1nLnN0eWxlLmJhY2tncm91bmRJbWFnZSA9ICIiCiAgICAgICAgICB9CiAgICAgICAgfSkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gdXBkYXRlYWxsdmlkZW9wbGF5KCl7CiAgICAgICAgcXNhKCIjaW1hZ2VzIC5pdGVtLnZpZGVvIikuZm9yRWFjaChhc3luYyBuID0+IHVwZGF0ZXZpZGVvcGxheShuKSkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gdXBkYXRldmlkZW9wbGF5KG4pewogICAgICAgIGNvbnN0IGFwbGF5ID0gYXV0b3BsYXkoKQogICAgICAgIGNvbnN0IHYgPSBuLnF1ZXJ5U2VsZWN0b3IoInZpZGVvIikKICAgICAgICAKICAgICAgICBpZihhcGxheSAhPSAib24iKXsKICAgICAgICAgIHYubXV0ZWQgPSBmYWxzZQogICAgICAgICAgdi5wYXVzZSgpCiAgICAgICAgfWVsc2V7CiAgICAgICAgICB2Lm11dGVkID0gdHJ1ZQogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZighc2Nyb2xsdmlzaWJsZShuKSl7CiAgICAgICAgICBpZih2LnJlYWR5U3RhdGUgPT0gNCl7CiAgICAgICAgICAgIHYucGF1c2UoKQogICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgIHYucHJlbG9hZCA9ICJub25lIgogICAgICAgICAgfQogICAgICAgIH1lbHNlIGlmKHYucmVhZHlTdGF0ZSAhPSA0KXsKICAgICAgICAgIHYucHJlbG9hZCA9ICJhdXRvIgogICAgICAgIH0KICAgICAgICBlbHNlIGlmKGFwbGF5ID09ICJvbiIgfHwgKGFwbGF5ID09ICJob3ZlciIgJiYgdiA9PSBob3ZlcmVkdmlkZW8pKXsKICAgICAgICAgIHYucGxheSgpCiAgICAgICAgfQogICAgICB9CiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLCBlID0+IHsKICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpCiAgICAgICAgdXBkYXRlaW1hZ2VzbG9hZCgpCiAgICAgICAgdXBkYXRlYWxsdmlkZW9wbGF5KCkKICAgICAgfSkKICAgICAgCiAgICAgIGxldCB0b3VjaCA9IG51bGwKICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLCBlID0+IHRvdWNoID0gZS5jaGFuZ2VkVG91Y2hlc1swXSkKICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIiwgZSA9PiB7CiAgICAgICAgY29uc3QgeGRpZmYgPSBlLmNoYW5nZWRUb3VjaGVzWzBdLnNjcmVlblggLSB0b3VjaC5zY3JlZW5YCgogICAgICAgIGlmKHhkaWZmIDwgLTUwKXsKICAgICAgICAgIHN3aXBlKDEpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKHhkaWZmID4gNTApewogICAgICAgICAgc3dpcGUoLTEpCiAgICAgICAgfQogICAgICB9KQogICAgICAKICAgICAgcXMoIiNxdWVyeS1mb3JtIikuYWRkRXZlbnRMaXN0ZW5lcigic3VibWl0IiwgZSA9PiB7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCiAgICAgICAgd2luZG93Lmhpc3RvcnkucHVzaFN0YXRlKG51bGwsIG51bGwsIGxvY2F0aW9uLnBhdGhuYW1lKQogICAgICAgIGxvY2F0aW9uLmhhc2ggPSAiIyIgKyBlbmNvZGVVUklDb21wb25lbnQocXMoIiNxdWVyeSIpLnZhbHVlICsgIi8iICsgcXVlcnl0eXBlKCkpCiAgICAgICAgdXBkYXRlcXVlcnkoKQogICAgICAgIHF1ZXJ5d2FpdC5yZXNvbHZlKCkKICAgICAgfSkKCiAgICAgIHFzKCIjcmVsYXlzLWZvcm0iKS5hZGRFdmVudExpc3RlbmVyKCJzdWJtaXQiLCBhc3luYyBlID0+IHsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKICAgICAgICBsZXQgciA9IEpTT04uc3RyaW5naWZ5KHFzKCIjcmVsYXlzIikudmFsdWUuc3BsaXQoIlxuIikpCiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oInJlbGF5cyIsIHIpCiAgICAgICAgZGlzY29ubmVjdCgpCiAgICAgIH0pCiAgICAgIAogICAgICBxcygiI3NoYXJlLWZvcm0iKS5hZGRFdmVudExpc3RlbmVyKCJzdWJtaXQiLCBhc3luYyBlID0+IHsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKICAgICAgICAKICAgICAgICBpZihxcygiI3NoYXJlLWZvcm0gLnN1Ym1pdCIpLnZhbHVlID09ICJjbG9zZSIpewogICAgICAgICAgcXNhKCIub3BlbiIpLmZvckVhY2gobiA9PiBuLmNsYXNzTGlzdC5yZW1vdmUoIm9wZW4iKSkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBjb25zdCBldmVudHMgPSBxc2EoIiNpbWFnZXMgLml0ZW0iKS5tYXAobiA9PiBuWyJkYXRhLWV2ZW50Il0uaWQpCiAgICAgICAgY29uc3QgZXZlbnQgPSBhd2FpdCBwdWJsaXNoKHsKICAgICAgICAgICJraW5kIjogMzMzLAogICAgICAgICAgImNvbnRlbnQiOiBKU09OLnN0cmluZ2lmeShldmVudHMpLAogICAgICAgICAgInRhZ3MiOiBbXQogICAgICAgIH0pCgogICAgICAgIGF3YWl0IHdhaXRyZXMobnVsbCwgIk9LIikKCiAgICAgICAgY29uc3QgdXJsID0gd2luZG93LmxvY2F0aW9uLm9yaWdpbiArIHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZQogICAgICAgIAogICAgICAgIGNvbnN0IHB1Ymxpc2hlZGV2ZW50ID0gYXdhaXQgcHVibGlzaCh7CiAgICAgICAgICAia2luZCI6IDEsCiAgICAgICAgICAiY29udGVudCI6ICJUaGlzIGlzIGEgZ2FsbGVyeSBvZiAiICsgZXZlbnRzLmxlbmd0aAogICAgICAgICAgICArICIgaW1hZ2VzL3ZpZGVvcyBzaGFyZWQgZnJvbSBmaWxlcy5odG1sLiBDaGVjayBpdCBvdXQgaGVyZTogIiArIHVybCArICI/Z2FsbGVyeT0iICsgZXZlbnQuaWQsCiAgICAgICAgICAidGFncyI6IFsKICAgICAgICAgICAgWyIjZSIsIGV2ZW50LmlkXSwgCiAgICAgICAgICAgIFsiI3AiLCBldmVudC5wdWJrZXldCiAgICAgICAgICBdCiAgICAgICAgfSkKCiAgICAgICAgYXdhaXQgd2FpdHJlcyhudWxsLCAiT0siKQogICAgICAgIAogICAgICAgIGNvbnN0IGJlY2gzMmlkID0gYmVjaDMyLmVuY29kZSgibm90ZSIsIGZyb21IZXhTdHJpbmcocHVibGlzaGVkZXZlbnQuaWQpKQogICAgICAgIHFzKCIjc2hhcmUtZm9ybSAuY29udGVudCIpLmlubmVySFRNTCA9ICdOb3RlIHB1Ymxpc2hlZCA8YSBocmVmPSInICsgcHJvdG9jb2wgKyBiZWNoMzJpZCArICciPicgKyBiZWNoMzJpZCArICc8L2E+JwogICAgICAgIHFzKCIjc2hhcmUtZm9ybSAuc3VibWl0IikudmFsdWUgPSAiY2xvc2UiCiAgICAgIH0pCgogICAgICBxcygiI3ByaXZrZXktZm9ybSIpLmFkZEV2ZW50TGlzdGVuZXIoInN1Ym1pdCIsIGFzeW5jIGUgPT4gewogICAgICAgIGUucHJldmVudERlZmF1bHQoKQogICAgICAgIGNvbnN0IGtleSA9IHFzKCIjcHJpdmtleSIpLnZhbHVlCgogICAgICAgIGlmKGtleS5sZW5ndGggIT0gNjQgJiYga2V5Lmxlbmd0aCAhPSA2Myl7CiAgICAgICAgICBhbGVydCgia2V5IHNob3VsZCBiZSA2MyBvciA2NCBjaGFyYWN0ZXJzIGxvbmciKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJwcml2a2V5Iiwga2V5KQogICAgICAgIGFsZXJ0KCJrZXkgc2F2ZWQiKQogICAgICB9KQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIiwgYXN5bmMgKGUpID0+IHsKICAgICAgICBpZihhdXRvcGxheSgpID09ICJob3ZlciIgJiYgZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ2aWRlby1jb250YWluZXIiKSl7CiAgICAgICAgICBob3ZlcmVkdmlkZW8gPSBlLnRhcmdldC5xdWVyeVNlbGVjdG9yKCJ2aWRlbyIpCiAgICAgICAgICBob3ZlcmVkdmlkZW8ucGxheSgpCiAgICAgICAgfQogICAgICB9KQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLCBhc3luYyAoZSkgPT4gewogICAgICAgIGhvdmVyZWR2aWRlbyA9IGZhbHNlCiAgICAgICAgaWYocXMoIiNtZWRpYS1jb250YWluZXIiKS5zdHlsZS5kaXNwbGF5ICE9ICJibG9jayIgJiYgYXV0b3BsYXkoKSA9PSAiaG92ZXIiICYmIGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygidmlkZW8tY29udGFpbmVyIikpewogICAgICAgICAgcXNhKCJ2aWRlbyIpLmZvckVhY2godiA9PiB2LnBhdXNlKCkpCiAgICAgICAgfQogICAgICB9KQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBhc3luYyAoZSkgPT4gewogICAgICAgIGlmKGUudGFyZ2V0LnR5cGUgPT0gInN1Ym1pdCIgfHwgKGUudGFyZ2V0LnRhZ05hbWUgPT0gIkEiICYmIGUudGFyZ2V0LmhyZWYubWF0Y2goL14ofHdlYlwrKW5vc3RyXDovKSkpewogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgCiAgICAgICAgaWYoZS50YXJnZXQuaWQgPT0gInRpdGxlIil7CiAgICAgICAgICBxcygiI3F1ZXJ5IikudmFsdWUgPSAiIgogICAgICAgICAgcXMoIiNxdWVyeS10eXBlIikudmFsdWUgPSAiYWxsIgogICAgICAgICAgcXMoIiNnbyIpLmNsaWNrKCkKICAgICAgICB9CgogICAgICAgIGUucHJldmVudERlZmF1bHQoKQoKICAgICAgICBpZihlLnRhcmdldC5pZCA9PSAiZmlsdGVyLWxpa2VzIil7CiAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC50b2dnbGUoImZpbHRlci1saWtlcyIpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoZS50YXJnZXQuaWQgPT0gInNoYXJlIil7CiAgICAgICAgICBjb25zdCBldmVudHMgPSBxc2EoIiNpbWFnZXMgLml0ZW0iKS5tYXAobiA9PiBuWyJkYXRhLWV2ZW50Il0uaWQpCiAgICAgICAgICAvL2NvbnN0IHRleHQgPSB7dHlwZTogIiIsIGV2ZW50czogfQogICAgICAgICAgcXMoIiNzaGFyZS1kaWFsb2cgLmNvbnRlbnQiKS5pbm5lckhUTUwgPSAiPHA+UHVibGlzaCBub3RlIG9mICIgKyBldmVudHMubGVuZ3RoICsgIiBldmVudHMgdG8geW91ciBub3N0ciBwcm9maWxlPzwvcD4iCiAgICAgICAgICBxcygiI3NoYXJlLWZvcm0gLnN1Ym1pdCIpLnZhbHVlID0gInB1Ymxpc2giCiAgICAgICAgICBxc2EoIiNzaGFyZS1kaWFsb2csICNvdmVybGF5IikuZm9yRWFjaChuID0+IG4uY2xhc3NMaXN0LnRvZ2dsZSgib3BlbiIpKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICBpZihlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInNob3ciKSl7CiAgICAgICAgICBhY3RpdmUoKT8uY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikKICAgICAgICAgIGdpZChlLnRhcmdldC5pZCkuY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgICAgIHNob3coZS50YXJnZXQuaWQpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoZS50YXJnZXQudGFnTmFtZSAhPSAiQSIgJiYgKHFzKCIjaW1hZ2UtY29udGFpbmVyIikgPT0gZS50YXJnZXQgfHwgcXMoIiNpbWFnZSIpID09IGUudGFyZ2V0IHx8IHFzKCIjbWVkaWEtY29udGFpbmVyIHZpZGVvIikgPT0gZS50YXJnZXQpKXsKICAgICAgICAgIGhpZGVtZWRpYSgpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CgogICAgICAgIGlmKGUudGFyZ2V0LmlkID09ICJtZW51Iil7CiAgICAgICAgICBtZW51KCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYoZS50YXJnZXQuaWQgPT0gIm92ZXJsYXkiKXsKICAgICAgICAgIHFzYSgiLm9wZW4iKS5mb3JFYWNoKG4gPT4gbi5jbGFzc0xpc3QucmVtb3ZlKCJvcGVuIikpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJzZXRjb2xzIikpewogICAgICAgICAgZm9yKGxldCBjIG9mIGNvbG9wdHMpewogICAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoImNvbHMiICsgYykKICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCJjb2xzIiArIGUudGFyZ2V0LmRhdGFzZXQuY29scykKICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJjb2xzIiwgZS50YXJnZXQuZGF0YXNldC5jb2xzKQogICAgICAgICAgc2V0YWN0aXZlKCJzZXRjb2xzIiwgImNvbHMiLCBjb2xzKCkpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgCiAgICAgICAgaWYoZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJzZXRhdXRvcGxheSIpKXsKICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJhdXRvcGxheSIsIGUudGFyZ2V0LmRhdGFzZXQuYXV0b3BsYXkpCiAgICAgICAgICBzZXRhY3RpdmUoInNldGF1dG9wbGF5IiwgImF1dG9wbGF5IiwgYXV0b3BsYXkoKSkKICAgICAgICAgIHVwZGF0ZWFsbHZpZGVvcGxheSgpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJsaWtlIikgJiYgbGlrZShlLnRhcmdldCkKICAgICAgfSkKICAgICAgCiAgICAgIGZ1bmN0aW9uIGhhc2tleSgpewogICAgICAgIHJldHVybiB3aW5kb3cubm9zdHIgfHwgcHJpdmtleSgpCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHB1YmtleSgpewogICAgICAgIHJldHVybiB3aW5kb3cubm9zdHIgJiYgYXdhaXQgd2luZG93Lm5vc3RyLmdldFB1YmxpY0tleSgpIHx8IE5vc3RyVG9vbHMuZ2V0UHVibGljS2V5KHByaXZrZXkoKSkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gc2lnbihldmVudCl7CiAgICAgICAgaWYod2luZG93Lm5vc3RyKXsKICAgICAgICAgIHJldHVybiBhd2FpdCBub3N0ci5zaWduRXZlbnQoZXZlbnQpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGV2ZW50LnNpZyA9IE5vc3RyVG9vbHMuZ2V0U2lnbmF0dXJlKGV2ZW50LCBwcml2a2V5KCkpCiAgICAgICAgcmV0dXJuIGV2ZW50CiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIGxpa2UobGluayl7CiAgICAgICAgY29uc3QgZXZlbnQgPSBsaW5rLnBhcmVudEVsZW1lbnRbImRhdGEtZXZlbnQiXQogICAgICAgIAogICAgICAgIGF3YWl0IHB1Ymxpc2goewogICAgICAgICAgImtpbmQiOiA3LAogICAgICAgICAgImNvbnRlbnQiOiAiKyIsCiAgICAgICAgICAidGFncyI6IFsKICAgICAgICAgICAgWyJlIiwgZXZlbnQuaWRdLAogICAgICAgICAgICBbInAiLCBldmVudC5wdWJrZXldCiAgICAgICAgICBdCiAgICAgICAgfSkKCiAgICAgICAgbGluay5jbGFzc0xpc3QuYWRkKCJyZWFjdGVkIikKCiAgICAgICAgY29uc3QgaW1hZ2VpZCA9IGxpbmtbImRhdGEtaXRlbS1pZCJdIHx8IGxpbmsuZGF0YXNldC5pbWFnZUlkCiAgICAgICAgCiAgICAgICAgaWYoaW1hZ2VpZCl7CiAgICAgICAgICBnaWQoaW1hZ2VpZCkucXVlcnlTZWxlY3RvcigiLmxpa2UiKS5jbGFzc0xpc3QuYWRkKCJyZWFjdGVkIikKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHByZXBhcmVfZXZlbnQoZXZlbnQpewogICAgICAgIGV2ZW50LnB1YmtleSA9IGF3YWl0IHB1YmtleSgpCiAgICAgICAgZXZlbnQuY3JlYXRlZF9hdCA9IHBhcnNlSW50KERhdGUubm93KCkgLyAxMDAwLCAxMCkKICAgICAgICBjb25zb2xlLmxvZygic2VyaWFsaXplIGV2ZW50IiwgSlNPTi5zdHJpbmdpZnkoZXZlbnQpKQogICAgICAgIGV2ZW50LmlkID0gTm9zdHJUb29scy5nZXRFdmVudEhhc2goZXZlbnQpCiAgICAgICAgY29uc29sZS5sb2coInNlcmlhbGl6ZSBldmVudCBvayIpCiAgICAgICAgcmV0dXJuIGV2ZW50CiAgICAgIH0KICAgICAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBwdWJsaXNoKGV2ZW50KXsKICAgICAgICBldmVudCA9IGF3YWl0IHByZXBhcmVfZXZlbnQoZXZlbnQpCiAgICAgICAgY29uc29sZS5sb2coInNpZ24gZXZlbnQiLCBldmVudCkKICAgICAgICBsZXQgc2lnbmVkZXZlbnQgPSBhd2FpdCBzaWduKGV2ZW50KQogICAgICAgIAogICAgICAgIGNvbnNvbGUubG9nKCJwdWJsaXNoIGV2ZW50Iiwgc2lnbmVkZXZlbnQpCiAgICAgICAgCiAgICAgICAgbGV0IGpzb24gPSBKU09OLnN0cmluZ2lmeShbIkVWRU5UIiwgc2lnbmVkZXZlbnRdKQogICAgICAgIHNvY2tldHMuZm9yRWFjaChzID0+IHMuc2VuZChqc29uKSkKICAgICAgICAKICAgICAgICByZXR1cm4gZXZlbnQKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gc3dpcGUob2Zmc2V0KXsKICAgICAgICBpZihpbWFnZW9mZnNldChvZmZzZXQpKXsKICAgICAgICAgIGltYWdlb2Zmc2V0KG9mZnNldCkuY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgICAgIHRoaXNbb2Zmc2V0ID09IC0xICYmICJsYXN0YWN0aXZlIiB8fCAiYWN0aXZlIl0oKS5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKQogICAgICAgICAgdXBkYXRlc2hvdygpCiAgICAgICAgfQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiB1cGRhdGVzaG93KCl7CiAgICAgICAgaWYocXMoIiNtZWRpYS1jb250YWluZXIiKS5zdHlsZS5kaXNwbGF5ID09ICJibG9jayIpewogICAgICAgICAgaGlkZXZpZGVvKCkKICAgICAgICAgIHNob3coYWN0aXZlKCkuaWQpCiAgICAgICAgfQogICAgICB9CiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIiwgZSA9PiB7CiAgICAgICAgaWYoWyJUYWIiLCAiQXJyb3dMZWZ0IiwgIkFycm93UmlnaHQiLCAiQXJyb3dVcCIsICJBcnJvd0Rvd24iXS5pbmNsdWRlcyhlLmtleSkpewogICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCiAgICAgICAgfQoKICAgICAgICBpZihlLmtleSA9PSAiRXNjYXBlIil7CiAgICAgICAgICBtZW51KCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihlLmtleSA9PSAiRW50ZXIiICYmIGUudGFyZ2V0LnRhZ05hbWUgPT0gIkJPRFkiKXsKICAgICAgICAgIGlmKHFzKCIjbWVkaWEtY29udGFpbmVyIikuc3R5bGUuZGlzcGxheSA9PSAiYmxvY2siKXsKICAgICAgICAgICAgaGlkZW1lZGlhKCkKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIHNob3coYWN0aXZlKCkuaWQpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJBcnJvd1VwIiAmJiBpbWFnZW9mZnNldCgtY29scygpKSl7CiAgICAgICAgICBpbWFnZW9mZnNldCgtY29scygpKS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgbGFzdGFjdGl2ZSgpLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpCiAgICAgICAgICB1cGRhdGVzaG93KCkKICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJBcnJvd0Rvd24iICYmIGltYWdlb2Zmc2V0KGNvbHMoKSkpewogICAgICAgICAgaW1hZ2VvZmZzZXQoY29scygpKS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgYWN0aXZlKCkuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikKICAgICAgICAgIHVwZGF0ZXNob3coKQogICAgICAgIH0KCiAgICAgICAgaWYoZS5rZXkgPT0gIkFycm93TGVmdCIpewogICAgICAgICAgc3dpcGUoLTEpCiAgICAgICAgfQoKICAgICAgICBpZihlLmtleSA9PSAiQXJyb3dSaWdodCIpewogICAgICAgICAgc3dpcGUoMSkKICAgICAgICB9CiAgICAgIH0pCgogICAgICBhc3luYyBmdW5jdGlvbiBoYW5kbGVxdWVyeXJlcyhyZXMsIHNvY2tldCwgcSwgdHlwZSwgc3RpbWUpewogICAgICAgIHNhdmUoc29ja2V0LCByZXMsIHEsIHR5cGUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSkKICAgICAgICBsb2coInF1ZXJ5IHJlcyIsIHJlcy5sZW5ndGgsIHNvY2tldC51cmwpCiAgICAgICAgcXVlcnljb3VudC0tCiAgICAgICAgaWYocXVlcnljb3VudCA9PSAwKXsKICAgICAgICAgIHFzKCIjbG9hZGluZyIpLnN0eWxlLmRpc3BsYXkgPSAibm9uZSIKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgbGV0IHdhaXQgPSB3YWl0bXMgLSAoRGF0ZS5ub3coKSAtIHN0aW1lKQogICAgICAgIHF1ZXJ5d2FpdCA9IHNsZWVwKHdhaXQpCiAgICAgICAgYXdhaXQgcXVlcnl3YWl0LnByb21pc2UKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gcHJpbWFsZ2xvYmFsKHNvY2tldCl7CiAgICAgICAgbG9nKCJnbG9iYWwiLCBzb2NrZXQudXJsKQogICAgICAgIHF1ZXJ5Y291bnQrKwogICAgICAgIHFzKCIjbG9hZGluZyIpLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siCiAgICAgICAgbGV0IHN0aW1lID0gRGF0ZS5ub3coKQogICAgICAgIGxldCBxaWQgPSAiZ2xvYmFsXyIgKyAoKytpZGNvdW50ZXIpCiAgICAgICAgbGV0IHFpZGxpa2VzID0gImxpa2VzXyIgKyAoKytpZGNvdW50ZXIpCgogICAgICAgIGlmKG5ld2xpa2VzLmxlbmd0aCA+IDApewogICAgICAgICAgcHJpbWFsc29ja2V0LnNlbmQoSlNPTi5zdHJpbmdpZnkoWwogICAgICAgICAgICAiUkVRIiwgCiAgICAgICAgICAgIHFpZGxpa2VzLCAKICAgICAgICAgICAgewogICAgICAgICAgICAgICJjYWNoZSI6IFsKICAgICAgICAgICAgICAgICJldmVudHMiLCB7CiAgICAgICAgICAgICAgICAgICJldmVudF9pZHMiOiBuZXdsaWtlcwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIF0KICAgICAgICAgICAgfQogICAgICAgICAgXSkpCgogICAgICAgICAgY29uc3QgbGlrZV9ldmVudHMgPSAoYXdhaXQgd2FpdHJlcyhxaWRsaWtlcykpWzBdCiAgICAgICAgICBuZXdsaWtlcy5zcGxpY2UoMCkKICAgICAgICAgIAogICAgICAgICAgYXdhaXQgc2F2ZShzb2NrZXQsIGxpa2VfZXZlbnRzLCAiIiwgImFsbCIsIHRydWUsIHRydWUsIGZhbHNlKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBzb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeShbCiAgICAgICAgICAiUkVRIiwgCiAgICAgICAgICBxaWQsIAogICAgICAgICAgewogICAgICAgICAgICAiY2FjaGUiOiBbCiAgICAgICAgICAgICAgImV4cGxvcmUiLCAKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAidGltZWZyYW1lIjogImxhdGVzdCIsCiAgICAgICAgICAgICAgICAic2NvcGUiOiAiZ2xvYmFsIiwKICAgICAgICAgICAgICAgICJsaW1pdCI6IDUwCiAgICAgICAgICAgICAgfQogICAgICAgICAgICBdCiAgICAgICAgICB9CiAgICAgICAgXSkpCiAgICAgICAgCiAgICAgICAgY29uc3QgcmVzID0gKGF3YWl0IHdhaXRyZXMocWlkKSlbMF0KICAgICAgICBhd2FpdCBoYW5kbGVxdWVyeXJlcyhyZXMuZmlsdGVyKGUgPT4gZS5raW5kID09IDEpLCBzb2NrZXQsICIiLCAiYWxsIiwgc3RpbWUpCiAgICAgICAgcHJpbWFsZ2xvYmFsKHNvY2tldCkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gcXVlcnkoc29ja2V0LCBwcmltYWwpewogICAgICAgIGxvZygicXVlcnkiLCBzb2NrZXQudXJsKQogICAgICAgIHF1ZXJ5Y291bnQrKwogICAgICAgIHFzKCIjbG9hZGluZyIpLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siCiAgICAgICAgCiAgICAgICAgbGV0IHN0aW1lID0gRGF0ZS5ub3coKQogICAgICAgIGxldCBxID0gcXVlcnlzdHIudHJpbSgpCiAgICAgICAgbGV0IHR5cGUgPSBxdWVyeXR5cGUoKQogICAgICAgIGxldCBpID0gKytpZGNvdW50ZXIKICAgICAgICBsZXQgcWlkID0gInF1ZXJ5XyIgKyBpCiAgICAgICAgY29uc3QgbGlrZXNyZXMgPSBhd2FpdCBxdWVyeWxpa2VzKHNvY2tldCkKICAgICAgICAKICAgICAgICBsaWtlc3Jlcy5mb3JFYWNoKGV2ZW50aWQgPT4gewogICAgICAgICAgaWYoIWxpa2VzLmluY2x1ZGVzKGV2ZW50aWQpKXsKICAgICAgICAgICAgbGlrZXMucHVzaChldmVudGlkKQogICAgICAgICAgICBuZXdsaWtlcy5wdXNoKGV2ZW50aWQpCiAgICAgICAgICB9CiAgICAgICAgfSkKICAgICAgICAKICAgICAgICBsZXQgZ2FsbGVyeW1hdGNoID0gcXVlcnlzdHIubWF0Y2goL2c6KFthLXowLTldKykvKQogICAgICAgIGxldCByZXMgPSBudWxsCiAgICAgICAgCiAgICAgICAgaWYoZ2FsbGVyeW1hdGNoKXsKICAgICAgICAgIGNvbnN0IGdhbGxlcnlyZXMgPSBhd2FpdCBxdWVyeWV2ZW50cyhzb2NrZXQsIFszMzNdLCBbZ2FsbGVyeW1hdGNoWzFdXSwgbnVsbCkKICAgICAgICAgIGNvbnN0IGV2ZW50aWRzID0gSlNPTi5wYXJzZShnYWxsZXJ5cmVzWzBdLmNvbnRlbnQpCiAgICAgICAgICByZXMgPSBhd2FpdCBxdWVyeWV2ZW50cyhzb2NrZXQsIFsxXSwgZXZlbnRpZHMsIG51bGwpCiAgICAgICAgICBjb25zb2xlLmxvZygiZ2FsbGVyeSBjb250ZW50IHJlcyIsIHJlcykKICAgICAgICB9ZWxzZXsKICAgICAgICAgIGxldCBmaWx0ZXJzID0gW10KCiAgICAgICAgICBmaWx0ZXJzLnB1c2goLi4uKHR5cGVzW3R5cGVdIHx8IFtdKS5tYXAoKHQpID0+IHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICBraW5kczogWzFdLCAKICAgICAgICAgICAgICBzZWFyY2g6ICIuIiArIHQsCiAgICAgICAgICAgICAgbGltaXQ6IDIwCiAgICAgICAgICAgIH0KICAgICAgICAgIH0pKQogICAgICAgICAgCiAgICAgICAgICBpZihxLmxlbmd0aCA+IDApewogICAgICAgICAgICBmaWx0ZXJzLnB1c2goe2tpbmRzOiBbMV0sIHNlYXJjaDogcX0pCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIGlmKGZpbHRlcnMubGVuZ3RoID09IDApewogICAgICAgICAgICBmaWx0ZXJzLnB1c2goe2tpbmRzOiBbMV19KQogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBjb25zdCBzZWFyY2hvYmogPSBbIlJFUSIsIHFpZCwgLi4uZmlsdGVyc10KICAgICAgICAgIGNvbnN0IHNlYXJjaGpzb24gPSBKU09OLnN0cmluZ2lmeShzZWFyY2hvYmopCiAgICAgICAgICBzb2NrZXQuc2VuZChzZWFyY2hqc29uKQogICAgICAgICAgCiAgICAgICAgICByZXMgPSAoYXdhaXQgd2FpdHJlcyhxaWQpKVswXQogICAgICAgICAgCiAgICAgICAgICByZXMgPSByZXMuZmlsdGVyKG8gPT4gewogICAgICAgICAgICBpZihxLmxlbmd0aCA+IDApewogICAgICAgICAgICAgIGZvcihsZXQgd29yZCBvZiBxLnNwbGl0KCIgIikpewogICAgICAgICAgICAgICAgaWYoby5jb250ZW50LnRvTG93ZXJDYXNlKCkuaW5kZXhPZih3b3JkLnRvTG93ZXJDYXNlKCkpID09IC0xKXsKICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdHJ1ZQogICAgICAgICAgfSkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgYXdhaXQgaGFuZGxlcXVlcnlyZXMocmVzLCBzb2NrZXQsIHEsIHR5cGUsIHN0aW1lKQogICAgICAgIHF1ZXJ5KHNvY2tldCkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gcXVlcnlsaWtlcyhzb2NrZXQpewogICAgICAgIGlmKCFoYXNrZXkoKSl7CiAgICAgICAgICByZXR1cm4gW10KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgY29uc3QgbXlwdWJrZXkgPSBhd2FpdCBwdWJrZXkoKQogICAgICAgIGNvbnN0IGV2ZW50cyA9IGF3YWl0IHF1ZXJ5ZXZlbnRzKHNvY2tldCwgWzddLCBudWxsLCBbbXlwdWJrZXldKQogICAgICAgIHJldHVybiBldmVudHMubWFwKGUgPT4gZS50YWdzLmZpbmQodCA9PiB0WzBdID09ICJlIilbMV0pCiAgICAgIH0KCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHF1ZXJ5ZXZlbnRzKHNvY2tldCwga2luZHMsIGV2ZW50aWRzLCBhdXRob3JzKXsKICAgICAgICBjb25zdCBxdWVyeWlkID0gImV2ZW50c18iICsgKCsraWRjb3VudGVyKQogICAgICAgIGNvbnN0IGZpbHRlcnMgPSB7fQogICAgICAgIAogICAgICAgIGZpbHRlcnMua2luZHMgPSBraW5kcwogICAgICAgIAogICAgICAgIGlmKGV2ZW50aWRzKXsKICAgICAgICAgIGZpbHRlcnNbImlkcyJdID0gZXZlbnRpZHMKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoYXV0aG9ycyl7CiAgICAgICAgICBmaWx0ZXJzWyJhdXRob3JzIl0gPSBhdXRob3JzCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGNvbnN0IGpzb24gPSBKU09OLnN0cmluZ2lmeShbCiAgICAgICAgICAiUkVRIiwgCiAgICAgICAgICBxdWVyeWlkLCAKICAgICAgICAgIGZpbHRlcnMKICAgICAgICBdKQogICAgICAKICAgICAgICBjb25zb2xlLmxvZygicWUganNvbiIsIGpzb24pCiAgICAgICAgCiAgICAgICAgc29ja2V0LnNlbmQoanNvbikKICAgICAgICAKICAgICAgICByZXR1cm4gKGF3YWl0IHdhaXRyZXMocXVlcnlpZCkpWzBdIHx8IFtdCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHF1ZXJ5cHVia2V5KHNvY2tldCwgcHViayl7CiAgICAgICAgY29uc3QgcXVlcnlpZCA9ICJxdWVyeV8iICsgKCsraWRjb3VudGVyKQogICAgICAgIHNvY2tldC5zZW5kKHF1ZXJpZXMuYXV0aG9yLnJlcGxhY2UoIjxJPiIsIHF1ZXJ5aWQpLnJlcGxhY2UoIjxQPiIsIHB1YmspKQoKICAgICAgICByZXR1cm4gKGF3YWl0IHdhaXRyZXMocXVlcnlpZCkpWzBdCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHNhdmUoc29ja2V0LCBldmVudHMsIHEsIHF0eXBlLCByZWFjdGVkLCBhcHBlbmQsIHF1ZXJ5bWV0YSl7CiAgICAgICAgbGV0IGV2ZW50cHVia2V5cyA9IFtdCiAgICAgICAgbGV0IHJlc3VsdHMgPSBbXQogICAgICAgIGNvbnN0IGV2ZW50aWRzID0gZXZlbnRzLm1hcChlID0+IGUuaWQpCiAgICAgICAgbGV0IG5ld3VybHMgPSBbXQogICAgICAgIAogICAgICAgIGZvcihsZXQgZXZlbnQgb2YgZXZlbnRzKXsKICAgICAgICAgIGxldCB1cmxzbWF0Y2ggPSBbXQogICAgICAgICAgCiAgICAgICAgICBpZihxdHlwZSAhPSAidmlkZW8iKXsKICAgICAgICAgICAgdXJsc21hdGNoLnB1c2goLi4uKGV2ZW50LmNvbnRlbnQubWF0Y2goaW1ncmVnZXgpIHx8IFtdKSkKICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgaWYocXR5cGUgIT0gImltYWdlIil7CiAgICAgICAgICAgIHVybHNtYXRjaC5wdXNoKC4uLihldmVudC5jb250ZW50Lm1hdGNoKHZpZGVvcmVnZXgpIHx8IFtdKSkKICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgdXJsc21hdGNoID0gdXJsc21hdGNoLmZpbHRlcih1cmwgPT4gIXVybHMuaW5jbHVkZXModXJsKSkKCiAgICAgICAgICBpZih1cmxzbWF0Y2gubGVuZ3RoID4gMCl7CiAgICAgICAgICAgIG5ld3VybHMucHVzaCh7CiAgICAgICAgICAgICAgZXZlbnQ6IGV2ZW50LAogICAgICAgICAgICAgIHVybHM6IHVybHNtYXRjaAogICAgICAgICAgICB9KQogICAgICAgICAgICAKICAgICAgICAgICAgdXJscy5wdXNoKC4uLnVybHNtYXRjaCkKICAgICAgICAgICAgZXZlbnRwdWJrZXlzLmluY2x1ZGVzKGV2ZW50LnB1YmtleSkgfHwgZXZlbnRwdWJrZXlzLnB1c2goZXZlbnQucHVia2V5KQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICBsb2coInF1ZXJ5IG1ldGEiLCBzb2NrZXQudXJsKQogICAgICAgIGxldCBtZXRhZXZlbnRzID0gKHF1ZXJ5bWV0YSAmJiBhd2FpdCBxdWVyeWV2ZW50cyhzb2NrZXQsIFswXSwgbnVsbCwgZXZlbnRwdWJrZXlzKSB8fCBbXSkKICAgICAgICAKICAgICAgICBmb3IobGV0IGVudHJ5IG9mIG5ld3VybHMpewogICAgICAgICAgZm9yKGxldCB1cmwgb2YgZW50cnkudXJscyl7CiAgICAgICAgICAgIHJlc3VsdHMucHVzaCh7CiAgICAgICAgICAgICAgcmVhY3RlZDogcmVhY3RlZCB8fCBsaWtlcy5pbmNsdWRlcyhlbnRyeS5ldmVudC5pZCksIAogICAgICAgICAgICAgIHVybDogdXJsLCAKICAgICAgICAgICAgICBldmVudDogZW50cnkuZXZlbnQsIAogICAgICAgICAgICAgIGJlY2gzMmlkOiBiZWNoMzIuZW5jb2RlKCJub3RlIiwgZnJvbUhleFN0cmluZyhlbnRyeS5ldmVudC5pZCkpLAogICAgICAgICAgICAgIG1ldGE6IG1ldGFldmVudHMuZmluZChvID0+IG8ucHVia2V5ID09IGVudHJ5LmV2ZW50LnB1YmtleSkKICAgICAgICAgICAgfSkKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgbG9nKCJzYXZlIHJlcyIsIHJlc3VsdHMubGVuZ3RoLCBzb2NrZXQudXJsKQogICAgICAgIHVwZGF0ZWNvbnRlbnQocmVzdWx0cywgcSwgYXBwZW5kKQogICAgICB9CiAgICAgIAogICAgICBsZXQgbG9hZGVkID0gMAogICAgICAKICAgICAgZnVuY3Rpb24gdXBkYXRlY29udGVudChyZXN1bHRzLCBxLCBhcHBlbmQpewogICAgICAgIHJlc3VsdHMucmV2ZXJzZSgpLmZvckVhY2goaXRlbSA9PiB7CiAgICAgICAgICBjb25zdCB0eXBlID0gaXRlbS51cmwubWF0Y2godmlkZW9leHRyZWdleCkgJiYgInZpZGVvIiB8fCAiaW1hZ2UiCiAgICAgICAgICBjb25zdCB0ZXh0ID0gKHEgfHwgInZpZXcgbm90ZSIpLnN1YnN0cmluZygtMzApCiAgICAgICAgICBjb25zdCBpZCA9ICJpdGVtXyIgKyAoKytpZGNvdW50ZXIpCiAgICAgICAgICBjb25zdCBjb250ZW50ZWxlbWVudHMgPSAnPGRpdiBjbGFzcz0idHlwZSI+JyArIHFzKCIjdGVtcGxhdGUgLiIgKyB0eXBlICsgInN2ZyIpLm91dGVySFRNTCArICc8L2Rpdj48YSBjbGFzcz0ibGlrZScgKyAoaXRlbS5yZWFjdGVkID8gJyByZWFjdGVkJyA6ICcnKSArICciIGRhdGEtaXRlbS1pZD0iJyArIGlkICsgCiAgICAgICAgICAgICciIGhyZWY9IiMiPicgKyBxcygiI3RlbXBsYXRlIC5oZWFydHN2ZyIpLm91dGVySFRNTCArICc8L2E+PGEgY2xhc3M9InF1ZXJ5IiBocmVmPSInICsgcHJvdG9jb2wgKyAKICAgICAgICAgICAgaXRlbS5iZWNoMzJpZCArICciPicgKyB0ZXh0ICsgJzwvYT4nCiAgICAgICAgICBsZXQgcm9vdCA9IG51bGwKICAgICAgICAgIGxldCB2ID0gbnVsbAogICAgICAgICAgCiAgICAgICAgICBpZihpdGVtLnVybC5tYXRjaCh2aWRlb2V4dHJlZ2V4KSl7CiAgICAgICAgICAgIHJvb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKQogICAgICAgICAgICByb290LmNsYXNzTGlzdC5hZGQoInZpZGVvLWNvbnRhaW5lciIpCiAgICAgICAgICAgIHJvb3QuaW5uZXJIVE1MID0gY29udGVudGVsZW1lbnRzCiAgICAgICAgICAgIAogICAgICAgICAgICB2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKQogICAgICAgICAgICB2WyJkYXRhLWl0ZW0taWQiXSA9IGlkCiAgICAgICAgICAgIHYucHJlbG9hZCA9ICJub25lIgogICAgICAgICAgICB2Lmxvb3AgPSB0cnVlCiAgICAgICAgICAgIHYucGxheXNpbmxpbmUgPSAiIgogICAgICAgICAgICAKICAgICAgICAgICAgdi5vbmNhbnBsYXkgPSBhc3luYyBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICBjb25zdCBhc3BlY3QgPSB0aGlzLnZpZGVvV2lkdGggLyB0aGlzLnZpZGVvSGVpZ2h0CiAgICAgICAgICAgICAgaWYoYXNwZWN0ID4gMSl7CiAgICAgICAgICAgICAgICB0aGlzLnN0eWxlLndpZHRoID0gKGFzcGVjdCAqIDEwMCkgKyAiJSIKICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgIHRoaXMuc3R5bGUuaGVpZ2h0ID0gKDEgLyBhc3BlY3QgKiAxMDApICsgIiUiCiAgICAgICAgICAgICAgICB0aGlzLnN0eWxlLm1hcmdpblRvcCA9IC0oKDEgLyBhc3BlY3QgKiAxMDAgLSAxMDApIC8gMikgKyAiJSIKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgdXBkYXRldmlkZW9wbGF5KHRoaXMucGFyZW50RWxlbWVudCkKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY29uc3QgZXh0ID0gaXRlbS51cmwubWF0Y2godmlkZW9leHRyZWdleClbMV0KICAgICAgICAgICAgdi5pbm5lckhUTUwgPSAnPHNvdXJjZSBzcmM9IicgKyBpdGVtLnVybCArICciIHR5cGU9InZpZGVvLycgKyBleHQgKyAnIj48L3NvdXJjZT4nCiAgICAgICAgICAgIAogICAgICAgICAgICByb290LmFwcGVuZCh2KQogICAgICAgICAgfWVsc2UgaWYoaXRlbS51cmwubWF0Y2goaW1nZXh0cmVnZXgpKXsKICAgICAgICAgICAgcm9vdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKQogICAgICAgICAgICByb290LmhyZWYgPSAiIyIKICAgICAgICAgICAgcm9vdC5pbm5lckhUTUwgPSBjb250ZW50ZWxlbWVudHMKICAgICAgICAgICAgICAKICAgICAgICAgICAgaWYodHlwZSA9PSAiaW1hZ2UiKXsKICAgICAgICAgICAgICAvL2xldCBpbWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKQogICAgICAgICAgICAgIC8vaW1nLmFsdCA9IGl0ZW0udXJsCiAgICAgICAgICAgICAgcm9vdFsiZGF0YS1zcmMiXSA9IGl0ZW0udXJsCiAgICAgICAgICAgICAgcm9vdC5jbGFzc0xpc3QuYWRkKCJpbWciKQogICAgICAgICAgICAgIC8vaW1nLmNsYXNzTGlzdC5hZGQoImRhdGEiKQogICAgICAgICAgICAgIC8vcm9vdC5hcHBlbmQoaW1nKQogICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICByb290LmlubmVySFRNTCArPSAnPHNwYW4gY2xhc3M9ImZpbGUiPicgKyBpdGVtLnVybCArICc8L3NwYW4+JwogICAgICAgICAgICB9CiAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIHJvb3QuaWQgPSBpZAogICAgICAgICAgcm9vdC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJwogICAgICAgICAgcm9vdFsiZGF0YS1pdGVtIl0gPSBpdGVtCiAgICAgICAgICByb290WyJkYXRhLWV2ZW50Il0gPSBpdGVtLmV2ZW50CiAgICAgICAgICByb290WyJkYXRhLXF1ZXJ5Il0gPSBxCiAgICAgICAgICByb290WyJkYXRhLXRleHQiXSA9IHRleHQKICAgICAgICAgIAogICAgICAgICAgcm9vdC5jbGFzc0xpc3QuYWRkKHR5cGUpCiAgICAgICAgICByb290LmNsYXNzTGlzdC5hZGQoIml0ZW0iKQogICAgICAgICAgcm9vdC5jbGFzc0xpc3QuYWRkKCJzaG93IikKICAgICAgICAgIAogICAgICAgICAgaWYoaXRlbS5yZWFjdGVkKXsKICAgICAgICAgICAgcm9vdC5jbGFzc0xpc3QuYWRkKCJyZWFjdGVkIikKICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgcXMoIiNpbWFnZXMiKVthcHBlbmQgJiYgImFwcGVuZCIgfHwgInByZXBlbmQiXShyb290KQogICAgICAgICAgCiAgICAgICAgICBpZih2KXsKICAgICAgICAgICAgdXBkYXRldmlkZW9wbGF5KHJvb3QpCiAgICAgICAgICB9CiAgICAgICAgfSkKCiAgICAgICAgdXBkYXRlaW1hZ2VzbG9hZCgpCiAgICAgICAgCiAgICAgICAgaWYoYWN0aXZlKCkgPT0gbnVsbCl7CiAgICAgICAgICBxcygiI2ltYWdlcyAuaXRlbSIpPy5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgIH0KICAgICAgfQoKICAgICAgZnVuY3Rpb24gaGlkZW1lZGlhKCl7CiAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICJzY3JvbGwiCiAgICAgICAgcXNhKCIjbWVkaWEtY29udGFpbmVyLCAjaW1hZ2UsICNtZWRpYS1mb290ZXIiKS5mb3JFYWNoKG4gPT4gbi5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiKQogICAgICAgIGdpZCgiaW1hZ2UtbGlrZSIpLmNsYXNzTGlzdC5yZW1vdmUoInJlYWN0ZWQiKQogICAgICAgIGhpZGV2aWRlbygpCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGhpZGV2aWRlbygpewogICAgICAgIGNvbnN0IHYgPSBxcygiI21lZGlhLWNvbnRhaW5lciB2aWRlbyIpCiAgICAgICAgCiAgICAgICAgaWYodil7CiAgICAgICAgICB2Lm11dGVkID0gdHJ1ZQogICAgICAgICAgZ2lkKHZbImRhdGEtaXRlbS1pZCJdKS5hcHBlbmRDaGlsZCh2KQogICAgICAgICAgdXBkYXRldmlkZW9wbGF5KHYucGFyZW50RWxlbWVudCkKICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHdhaXRyZXMoa2V5LCB0eXBlKXsKICAgICAgICBsZXQgcmVzaGFuZGxlciA9IGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCl7CiAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlIHx8ICJFT1NFIgogICAgICAgICAgdGhpcy5ldmVudHMgPSBbXQogICAgICAgICAgdGhpcy5oYW5kbGUgPSBmdW5jdGlvbihyZXMpewogICAgICAgICAgICBsZXQgbyA9IEpTT04ucGFyc2UocmVzLmRhdGEpCiAgICAgICAgICAgIGlmKGtleSA9PSBudWxsIHx8IG9bMV0gPT0ga2V5KXsKICAgICAgICAgICAgICBpZihvWzBdID09IHRoaXMudHlwZSl7CiAgICAgICAgICAgICAgICByZXNvbHZlKFt0aGlzLmV2ZW50cywgb10pCiAgICAgICAgICAgICAgICByZXNoYW5kbGVycy5zcGxpY2UocmVzaGFuZGxlcnMuaW5kZXhPZih0aGlzKSwgMSkKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgdGhpcy5ldmVudHMucHVzaChvWzJdKQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7CiAgICAgICAgICBsZXQgaGFuZGxlciA9IG5ldyByZXNoYW5kbGVyKHJlc29sdmUsIHJlamVjdCkKICAgICAgICAgIHJlc2hhbmRsZXJzLnB1c2goaGFuZGxlcikKICAgICAgICB9KQogICAgICB9CiAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gY2hlY2t1cGRhdGUoc29ja2V0KXsKICAgICAgICBjb25zdCB1cGRhdGVzcmVzID0gYXdhaXQgcXVlcnlwdWJrZXkoc29ja2V0LCB1cGRhdGVzcHVia2V5KQogICAgICAgIGNvbnN0IHVwZGF0ZW5vdGUgPSB1cGRhdGVzcmVzLmZpbmQobiA9PiBuLmNvbnRlbnQubWF0Y2goL15odHRwc1w6XC9cLy8pKQogICAgICAgIAogICAgICAgIGlmKCF1cGRhdGVub3RlKXsKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBjb25zdCBhZ2UgPSBNYXRoLnJvdW5kKChEYXRlLm5vdygpIC8gMTAwMCAtIHVwZGF0ZW5vdGUuY3JlYXRlZF9hdCkgLyAzNjAwIC8gMjQpCiAgICAgICAgY29uc3Qgbm90ZWlkID0gYmVjaDMyLmVuY29kZSgibm90ZSIsIGZyb21IZXhTdHJpbmcodXBkYXRlbm90ZS5pZCkpCiAgICAgICAgcXMoIiNyZWxlYXNlIikuaHJlZiA9IHByb3RvY29sICsgbm90ZWlkCiAgICAgICAgcXMoIiNyZWxlYXNlIikuaW5uZXJUZXh0ID0gKGFnZSA9PSAwICYmICJ0b2RheSIgfHwgYWdlICsgIiBkYXkocykgYWdvIikKICAgICAgfQoKICAgICAgZnVuY3Rpb24gc2xlZXAobXMpewogICAgICAgIHJldHVybiBuZXcgZnVuY3Rpb24oKXsKICAgICAgICAgIGxldCB0aW1lb3V0ID0gbnVsbAogICAgICAgICAgbGV0IHIgPSBudWxsCiAgICAgICAgICAKICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHByb21pc2U6IG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCl7CiAgICAgICAgICAgICAgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gcmVzb2x2ZSgpLCBtcykKICAgICAgICAgICAgICByID0gcmVzb2x2ZQogICAgICAgICAgICB9KSwKICAgICAgICAgICAgcmVzb2x2ZTogZnVuY3Rpb24oKXsKICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dCkKICAgICAgICAgICAgICByKCkKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gc2hvdyhpZCl7CiAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICJoaWRkZW4iCiAgICAgICAgY29uc3QgaXRlbSA9IGdpZChpZClbImRhdGEtaXRlbSJdCiAgICAgICAgY29uc3QgbWVkaWEgPSBnaWQoIm1lZGlhLWNvbnRhaW5lciIpCiAgICAgICAgY29uc3QgaW1hZ2UgPSBnaWQoImltYWdlIikKCiAgICAgICAgaWYoaXRlbS51cmwubWF0Y2godmlkZW9leHRyZWdleCkpewogICAgICAgICAgaW1hZ2Uuc3R5bGUuZGlzcGxheSA9ICJub25lIgogICAgICAgICAgY29uc3QgdiA9IGdpZChpZCkucXVlcnlTZWxlY3RvcigidmlkZW8iKQogICAgICAgICAgcXMoIiNtZWRpYS1jb250YWluZXIiKS5hcHBlbmRDaGlsZCh2KQogICAgICAgICAgdi5tdXRlZCA9IGZhbHNlCiAgICAgICAgICB2LnBsYXkoKQogICAgICAgIH1lbHNlewogICAgICAgICAgaW1hZ2Uuc3JjID0gaXRlbS51cmwKICAgICAgICAgIGltYWdlLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGl0ZW0ubWV0YSl7CiAgICAgICAgICBjb25zdCBtZXRhY29udGVudCA9IEpTT04ucGFyc2UoaXRlbS5tZXRhLmNvbnRlbnQpCiAgICAgICAgICBjb25zdCBuYW1lID0gbWV0YWNvbnRlbnQuZGlzcGxheV9uYW1lIHx8IG1ldGFjb250ZW50Lm5hbWUKICAgICAgICAgIHFzKCIjaW1hZ2UtdXNlciIpLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siCiAgICAgICAgICBxcygiI2ltYWdlLXVzZXIiKS5ocmVmID0gcHJvdG9jb2wgKyBiZWNoMzIuZW5jb2RlKCJucHViIiwgZnJvbUhleFN0cmluZyhpdGVtLm1ldGEucHVia2V5KSkKICAgICAgICAgIHFzKCIjaW1hZ2UtdXNlciIpLmlubmVyVGV4dCA9IG5hbWUKICAgICAgICB9ZWxzZXsKICAgICAgICAgIHFzKCIjaW1hZ2UtdXNlciIpLnN0eWxlLmRpc3BsYXkgPSAibm9uZSIKICAgICAgICB9CgogICAgICAgIGdpZCgiaW1hZ2UtbGlrZSIpWyJkYXRhLWl0ZW0taWQiXSA9IGlkCiAgICAgICAgZ2lkKCJtZWRpYS1mb290ZXIiKVsiZGF0YS1ldmVudCJdID0gaXRlbS5ldmVudAoKICAgICAgICBpZihpdGVtLnJlYWN0ZWQpewogICAgICAgICAgZ2lkKCJpbWFnZS1saWtlIikuY2xhc3NMaXN0LmFkZCgicmVhY3RlZCIpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGNvbnN0IGEgPSBxcygiI2ltYWdlLXF1ZXJ5IikKICAgICAgICBhLmhyZWYgPSBwcm90b2NvbCArIGl0ZW0uYmVjaDMyaWQKICAgICAgICBhLmlubmVyVGV4dCA9IGdpZChpZClbImRhdGEtdGV4dCJdCiAgICAgICAgICAKICAgICAgICBtZWRpYS5zdHlsZS5kaXNwbGF5ID0gZ2lkKCJtZWRpYS1mb290ZXIiKS5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIgogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBjb25uY291bnQoKXsKICAgICAgICByZXR1cm4gc29ja2V0cy5maWx0ZXIociA9PiByLnJlYWR5U3RhdGUgPT0gMSkubGVuZ3RoCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIGRpc2Nvbm5lY3QoKXsKICAgICAgICBmb3IobGV0IHNvY2tldCBvZiBzb2NrZXRzKXsKICAgICAgICAgIHNvY2tldC5jbG9zZSgpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIHNvY2tldHMuc3BsaWNlKDApCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIGxvZyhtc2cpewogICAgICAgIGxldCBzY3JvbGwgPSBxcygiI2xvZ3MiKS5zY3JvbGxUb3AgPT0gcXMoIiNsb2dzIikuc2Nyb2xsVG9wTWF4CiAgICAgICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikKICAgICAgICBkaXYuaW5uZXJUZXh0ID0gQXJyYXkuZnJvbShhcmd1bWVudHMpLmpvaW4oIiAiKQogICAgICAgIHFzKCIjbG9ncyIpLmFwcGVuZChkaXYpCiAgICAgICAgCiAgICAgICAgc2Nyb2xsICYmIHFzKCIjbG9ncyIpLnNjcm9sbFRvKDAsIHFzKCIjbG9ncyIpLnNjcm9sbFRvcE1heCkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gY29ubmVjdCh1cmwpewogICAgICAgIGxvZygiY29ubmVjdGluZyIsIHVybCkKICAgICAgICBsZXQgc29ja2V0ID0gbmV3IFdlYlNvY2tldCh1cmwpCiAgICAgICAgCiAgICAgICAgc29ja2V0Lm9ubWVzc2FnZSA9IG1lc3NhZ2UgPT4gcmVzaGFuZGxlcnMuZm9yRWFjaChyaCA9PiByaC5oYW5kbGUobWVzc2FnZSkpCiAgICAgICAgCiAgICAgICAgc29ja2V0Lm9uY2xvc2UgPSBhc3luYyBmdW5jdGlvbigpewogICAgICAgICAgc29ja2V0cy5zcGxpY2Uoc29ja2V0cy5pbmRleE9mKHNvY2tldCksIDEpCiAgICAgICAgICBxcygiI2Nvbm5jb3VudCIpLmlubmVyVGV4dCA9IGNvbm5jb3VudCgpICsgKHByaW1hbHNvY2tldCAmJiAxKQogICAgICAgICAgbG9nKCJkaXNjb25uZWN0ZWQiLCB0aGlzLnVybCwgY29ubmNvdW50KCkpCiAgICAgICAgICBhd2FpdCBzbGVlcCgxMDAwKS5wcm9taXNlCiAgICAgICAgICBjb25uZWN0KHRoaXMudXJsKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBzb2NrZXQub25vcGVuID0gZnVuY3Rpb24oKXsKICAgICAgICAgIHFzKCIjY29ubmNvdW50IikuaW5uZXJUZXh0ID0gY29ubmNvdW50KCkgKyAocHJpbWFsc29ja2V0ICYmIDEpCiAgICAgICAgICBsb2coImNvbm5lY3RlZCIsIHRoaXMudXJsLCBjb25uY291bnQoKSkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgcmV0dXJuIHNvY2tldAogICAgICB9CiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJsb2FkIiwgYXN5bmMgKCkgPT4gewogICAgICAgIHByaW1hbHNvY2tldCA9IGNvbm5lY3QoIndzczovL2NhY2hlMy5wcmltYWwubmV0L2NhY2hlMTciKQogICAgICAgIHByaW1hbHNvY2tldC5hZGRFdmVudExpc3RlbmVyKCJvcGVuIiwgZnVuY3Rpb24oKXsKICAgICAgICAgIHByaW1hbGdsb2JhbCh0aGlzKQogICAgICAgIH0pCiAgICAgICAgCiAgICAgICAgcHJpbWFsc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoImNsb3NlIiwgZnVuY3Rpb24oKXsKICAgICAgICAgIHByaW1hbHNvY2tldCA9IG51bGwKICAgICAgICB9KQogICAgICAgIAogICAgICAgIGZvcihsZXQgdXJsIG9mIHJlbGF5cygpKXsKICAgICAgICAgIGNvbnN0IHNvY2tldCA9IGNvbm5lY3QodXJsKQogICAgICAgICAgc29ja2V0cy5wdXNoKHNvY2tldCkKICAgICAgICAgIAogICAgICAgICAgc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoIm9wZW4iLCBmdW5jdGlvbigpewogICAgICAgICAgICBjaGVja3VwZGF0ZSh0aGlzKQogICAgICAgICAgICBxdWVyeSh0aGlzKQogICAgICAgICAgfSkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgYXdhaXQgc2xlZXAoMTAwKS5wcm9taXNlCiAgICAgICAgCiAgICAgICAgaWYoaGFza2V5KCkpewogICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCJub3N0ciIpCiAgICAgICAgfQogICAgICB9KQogICAgICAKICAgICAgZm9yKGxldCBjIG9mIGNvbG9wdHMpewogICAgICAgIGRvY3VtZW50LndyaXRlKCc8c3R5bGU+JyArIGNvbHNjc3MuaW5uZXJUZXh0LnJlcGxhY2UoL1wkXHtjb2xzXH0vZywgYykgKyAnPC9zdHlsZT4nKQogICAgICB9CiAgICA8L3NjcmlwdD4KICA8L2JvZHk+CjwvaHRtbD4K