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ZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuICovCgpodG1sLCBib2R5IHsKICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOwogIGZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmOwogIGhlaWdodDogMTAwJTsKICBtYXJnaW46IDA7CiAgb3ZlcmZsb3c6IGhpZGRlbjsKICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgd2lkdGg6IDEwMCU7Cn0KCmgxIHsKICBkaXNwbGF5OiBub25lOwogIGZvbnQtc2l6ZTogMTBwdDsKICBmb250LXdlaWdodDogbm9ybWFsOwogIHBhZGRpbmc6IDBwdCAxMHB0Owp9CgpwIHsKICBmb250LXNpemU6IDhwdDsKICBwYWRkaW5nOiAwcHQgMTRwdDsKfQoKI3QgewogIGJhY2tncm91bmQtY29sb3I6ICNmN2Y3Zjc7CiAgY29sb3I6ICM2NDY0NjQ7Cn0KCiNvdXRlciB7CiAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogIGRpc3BsYXk6IGZsZXg7CiAgaGVpZ2h0OiAxMDAlOwogIGp1c3RpZnktY29udGVudDogY2VudGVyOwogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICB3aWR0aDogMTAwJTsKICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwp9CgouaWNvbiB7CiAgbWF4LWhlaWdodDogMTAwJTsKICBtYXgtd2lkdGg6IDEwMCU7CiAgb3BhY2l0eTogLjM7Cn0KCkBtZWRpYSAob3JpZW50YXRpb246IGxhbmRzY2FwZSkgYW5kIChtaW4taGVpZ2h0OiAyZW0pIGFuZCAobWluLXdpZHRoOiAxNGVtKSB7CiAgI291dGVyIHsKICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgfQogIC5pY29uIHsKICAgIG1heC1oZWlnaHQ6IDEwMCU7CiAgICBtYXgtd2lkdGg6IDUwJTsKICB9CiAgaDEgewogICAgZGlzcGxheTogYmxvY2s7CiAgfQp9CgpAbWVkaWEgKG1pbi1oZWlnaHQ6IDdlbSkgYW5kIChtaW4td2lkdGg6IDZlbSkgewogICNvdXRlciB7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogIH0KICAuaWNvbiB7CiAgICBtYXgtaGVpZ2h0OiA1MCU7CiAgICBtYXgtd2lkdGg6IDEwMCU7CiAgfQogIGgxIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogIH0KfQo8L3N0eWxlPgogIDwvaGVhZD4KICA8Ym9keSBpZD0idCIgb25sb2FkPSJub3RpZnlEaWRGaW5pc2hMb2FkaW5nKCk7Ij4KICAgIDxkaXYgaTE4bi12YWx1ZXM9InRpdGxlOm5hbWUiIGlkPSJvdXRlciI+CiAgICAgIDxpbWcgY2xhc3M9Imljb24iCiAgICAgICAgICAgc3JjPSJkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUI0Yld4dWN6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNakF3TUM5emRtY2lJSGRwWkhSb1BTSTBPSEI0SWlCb1pXbG5hSFE5SWpRNGNIZ2lJSFpwWlhkQ2IzZzlJakFnTUNBME9DQTBPQ0lnWm1sc2JEMGlJell5TmpJMk1pSStDaUFnSUNBOGNHRjBhQ0JrUFNKTk1DQXdhRFE0ZGpRNFNEQjZJaUJtYVd4c1BTSnViMjVsSWk4K0NpQWdJQ0E4Y0dGMGFDQmtQU0pOTkRFZ01qSm9MVE4yTFRoak1DMHlMakl4TFRFdU56a3ROQzAwTFRSb0xUaFdOMk13TFRJdU56WXRNaTR5TkMwMUxUVXROWE10TlNBeUxqSTBMVFVnTlhZelNEaGpMVEl1TWpFZ01DMHpMams0SURFdU56a3RNeTQ1T0NBMGJDMHVNREVnTnk0MlNEZGpNaTQ1T0NBd0lEVXVOQ0F5TGpReUlEVXVOQ0ExTGpSVE9TNDVPQ0F6TWk0MElEY2dNekl1TkVnMExqQXhURFFnTkRCak1DQXlMakl4SURFdU56a2dOQ0EwSURSb055NDJkaTB6WXpBdE1pNDVPQ0F5TGpReUxUVXVOQ0ExTGpRdE5TNDBJREl1T1RnZ01DQTFMalFnTWk0ME1pQTFMalFnTlM0MGRqTklNelJqTWk0eU1TQXdJRFF0TVM0M09TQTBMVFIyTFRob00yTXlMamMySURBZ05TMHlMakkwSURVdE5YTXRNaTR5TkMwMUxUVXROWG9pTHo0S1BDOXpkbWMrQ2c9PSI+CiAgICAgIDxoMSBpZD0ibWVzc2FnZSI+JGkxOG57bWVzc2FnZX08L2gxPgogICAgPC9kaXY+CiAgPC9ib2R5Pgo8L2h0bWw+CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KICA8aGVhZD4KICAgIDxtZXRhIGNoYXJzZXQ9InV0Zi04Ij4KICAgIDxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsIHVzZXItc2NhbGFibGU9bm8iPgogICAgPHN0eWxlPi8qIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLiAqLwoKaHRtbCwgYm9keSB7CiAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTsKICBmb250LWZhbWlseTogc2Fucy1zZXJpZjsKICBoZWlnaHQ6IDEwMCU7CiAgbWFyZ2luOiAwOwogIG92ZXJmbG93OiBoaWRkZW47CiAgdGV4dC1hbGlnbjogY2VudGVyOwogIHdpZHRoOiAxMDAlOwp9CgpoMSB7CiAgZGlzcGxheTogbm9uZTsKICBmb250LXNpemU6IDEwcHQ7CiAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKICBwYWRkaW5nOiAwcHQgMTBwdDsKfQoKcCB7CiAgZm9udC1zaXplOiA4cHQ7CiAgcGFkZGluZzogMHB0IDE0cHQ7Cn0KCiN0IHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjdmN2Y3OwogIGNvbG9yOiAjNjQ2NDY0Owp9Cgojb3V0ZXIgewogIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICBkaXNwbGF5OiBmbGV4OwogIGhlaWdodDogMTAwJTsKICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgd2lkdGg6IDEwMCU7CiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKfQoKLmljb24gewogIG1heC1oZWlnaHQ6IDEwMCU7CiAgbWF4LXdpZHRoOiAxMDAlOwogIG9wYWNpdHk6IC4zOwp9CgpAbWVkaWEgKG9yaWVudGF0aW9uOiBsYW5kc2NhcGUpIGFuZCAobWluLWhlaWdodDogMmVtKSBhbmQgKG1pbi13aWR0aDogMTRlbSkgewogICNvdXRlciB7CiAgICBmbGV4LWRpcmVjdGlvbjogcm93OwogIH0KICAuaWNvbiB7CiAgICBtYXgtaGVpZ2h0OiAxMDAlOwogICAgbWF4LXdpZHRoOiA1MCU7CiAgfQogIGgxIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogIH0KfQoKQG1lZGlhIChtaW4taGVpZ2h0OiA3ZW0pIGFuZCAobWluLXdpZHRoOiA2ZW0pIHsKICAjb3V0ZXIgewogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICB9CiAgLmljb24gewogICAgbWF4LWhlaWdodDogNTAlOwogICAgbWF4LXdpZHRoOiAxMDAlOwogIH0KICBoMSB7CiAgICBkaXNwbGF5OiBibG9jazsKICB9Cn0KPC9zdHlsZT4KICA8L2hlYWQ+CiAgPGJvZHkgaWQ9InQiIG9uTG9hZD0iaW5zZXJ0TGluaygpIj4KICAgIDxkaXYgaTE4bi12YWx1ZXM9InRpdGxlOm5hbWUiIGlkPSJvdXRlciI+CiAgICAgIDxpbWcgY2xhc3M9Imljb24iCiAgICAgICAgICAgc3JjPSJkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUI0Yld4dWN6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNakF3TUM5emRtY2lJSGRwWkhSb1BTSTBPSEI0SWlCb1pXbG5hSFE5SWpRNGNIZ2lJSFpwWlhkQ2IzZzlJakFnTUNBME9DQTBPQ0lnWm1sc2JEMGlJell5TmpJMk1pSStDaUFnSUNBOGNHRjBhQ0JrUFNKTk1DQXdhRFE0ZGpRNFNEQjZJaUJtYVd4c1BTSnViMjVsSWk4K0NpQWdJQ0E4Y0dGMGFDQmtQU0pOTkRFZ01qSm9MVE4yTFRoak1DMHlMakl4TFRFdU56a3ROQzAwTFRSb0xUaFdOMk13TFRJdU56WXRNaTR5TkMwMUxUVXROWE10TlNBeUxqSTBMVFVnTlhZelNEaGpMVEl1TWpFZ01DMHpMams0SURFdU56a3RNeTQ1T0NBMGJDMHVNREVnTnk0MlNEZGpNaTQ1T0NBd0lEVXVOQ0F5TGpReUlEVXVOQ0ExTGpSVE9TNDVPQ0F6TWk0MElEY2dNekl1TkVnMExqQXhURFFnTkRCak1DQXlMakl4SURFdU56a2dOQ0EwSURSb055NDJkaTB6WXpBdE1pNDVPQ0F5TGpReUxUVXVOQ0ExTGpRdE5TNDBJREl1T1RnZ01DQTFMalFnTWk0ME1pQTFMalFnTlM0MGRqTklNelJqTWk0eU1TQXdJRFF0TVM0M09TQTBMVFIyTFRob00yTXlMamMySURBZ05TMHlMakkwSURVdE5YTXRNaTR5TkMwMUxUVXROWG9pTHo0S1BDOXpkbWMrQ2c9PSI+CiAgICAgIDxoMSBpZD0ibWVzc2FnZSI+JGkxOG57bWVzc2FnZX08L2gxPgogICAgPC9kaXY+CiAgPC9ib2R5Pgo8L2h0bWw+CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KICA8aGVhZD4KICAgIDxtZXRhIGNoYXJzZXQ9InV0Zi04Ij4KICAgIDxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsIHVzZXItc2NhbGFibGU9bm8iPgogICAgPHN0eWxlPgogICAgICBodG1sLAogICAgICBib2R5IHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIGJvZHkgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmNWY1ZjU7ICAvKiBnb29nbGUtZ3JleS0xMDAgKi8KICAgICAgICBtYXJnaW46IDA7CiAgICAgIH0KCiAgICAgIHN2ZyB7CiAgICAgICAgaGVpZ2h0OiA0MHB4OwogICAgICAgIHdpZHRoOiA0MHB4OwogICAgICB9CgogICAgICBwYXRoIHsKICAgICAgICBmaWxsOiAjYmRiZGJkOyAgLyogZ29vZ2xlLWdyZXktNDAwICovCiAgICAgIH0KCiAgICAgICNpY29uLWNvbnRhaW5lciB7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgI2Zvb3RlciB7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjNDI4NWY0OyAgLyogZ29vZ2xlLWJsdWUtNTAwICovCiAgICAgICAgYm9yZGVyLXJhZGl1czogMnB4OwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBjb2xvcjogd2hpdGU7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgbWF4LWhlaWdodDogNTJweDsKICAgICAgICBtaW4taGVpZ2h0OiAyMHB4OwogICAgICAgIHBhZGRpbmc6IDE0cHggMjRweDsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgIH0KCiAgICAgIHAsCiAgICAgIGEgewogICAgICAgIGxpbmUtaGVpZ2h0OiAyMHB4OwogICAgICB9CgogICAgICBwIHsKICAgICAgICBmb250LWZhbWlseTogUm9ib3RvOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgfQoKICAgICAgYSB7CiAgICAgICAgZm9udC1mYW1pbHk6IFJvYm90byBNZWRpdW07CiAgICAgICAgbWFyZ2luLWxlZnQ6IDQ4cHg7CiAgICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgfQoKICAgICAgYTpsaW5rLAogICAgICBhOnZpc2l0ZWQgewogICAgICAgIGNvbG9yOiB3aGl0ZTsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgICAgIH0KCiAgICA8L3N0eWxlPgogIDwvaGVhZD4KICA8Ym9keT4KICAgIDxkaXYgaWQ9Imljb24tY29udGFpbmVyIj4KICAgICAgPCEtLSBNYXRlcmlhbCBEZXNpZ24gUERGIGljb24gLS0+CiAgICAgIDxzdmcgdmlld2JveD0iMCAwIDI0IDI0Ij4KICAgICAgICA8cGF0aCBkPSJNNyAxMS41aDF2LTFIN3Yxek0xOSAzSDVjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptLTkuNSA4LjVjMCAuODMtLjY3IDEuNS0xLjUgMS41SDd2Mkg1LjVWOUg4Yy44MyAwIDEuNS42NyAxLjUgMS41djF6bTEwLTFIMTd2MWgxLjVWMTNIMTd2MmgtMS41VjloNHYxLjV6bS01IDNjMCAuODMtLjY3IDEuNS0xLjUgMS41aC0yLjVWOUgxM2MuODMgMCAxLjUuNjcgMS41IDEuNXYzem0tMi41IDBoMXYtM2gtMXYzeiI+PC9wYXRoPgogICAgICA8L3N2Zz4KICAgIDwvZGl2PgogICAgPGRpdiBpZD0iZm9vdGVyIiBpMThuLXZhbHVlcz0idGl0bGU6bmFtZSI+CiAgICAgIDxwPiRpMThue2ZpbGVOYW1lfTwvcD4KICAgICAgPGEgaHJlZj0iIyIgb25jbGljaz0icGx1Z2luLm9wZW5QREYoKSI+VmlldyBQREY8L2E+CiAgICA8L2Rpdj4KICA8L2JvZHk+CjwvaHRtbD4KPCFkb2N0eXBlIGh0bWw+CjxodG1sPgo8aGVhZD4KICA8bWV0YSBjaGFyc2V0PSJ1dGYtOCI+CiAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgdXNlci1zY2FsYWJsZT1ubyI+CiAgPHNjcmlwdD4KICAgIGZ1bmN0aW9uIHNldE1lc3NhZ2UobXNnKSB7CiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZXNzYWdlJykudGV4dENvbnRlbnQgPSBtc2c7CiAgICB9CiAgICBmdW5jdGlvbiBub3RpZnlEaWRGaW5pc2hMb2FkaW5nKCkgewogICAgICBpZiAocGx1Z2luLmRpZEZpbmlzaExvYWRpbmcpCiAgICAgICAgcGx1Z2luLmRpZEZpbmlzaExvYWRpbmcoKTsKCiAgICAgIGlmIChwbHVnaW4uZGlkRmluaXNoSWNvblJlcG9zaXRpb25Gb3JUZXN0aW5nKQogICAgICAgIHBsdWdpbi5kaWRGaW5pc2hJY29uUmVwb3NpdGlvbkZvclRlc3RpbmcoKTsKICAgIH0KICA8L3NjcmlwdD4KICA8c3R5bGU+LyogQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuICovCgpodG1sLCBib2R5IHsKICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOwogIGZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmOwogIGhlaWdodDogMTAwJTsKICBtYXJnaW46IDA7CiAgb3ZlcmZsb3c6IGhpZGRlbjsKICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgd2lkdGg6IDEwMCU7Cn0KCmgxIHsKICBkaXNwbGF5OiBub25lOwogIGZvbnQtc2l6ZTogMTBwdDsKICBmb250LXdlaWdodDogbm9ybWFsOwogIHBhZGRpbmc6IDBwdCAxMHB0Owp9CgpwIHsKICBmb250LXNpemU6IDhwdDsKICBwYWRkaW5nOiAwcHQgMTRwdDsKfQoKI3QgewogIGJhY2tncm91bmQtY29sb3I6ICNmN2Y3Zjc7CiAgY29sb3I6ICM2NDY0NjQ7Cn0KCiNvdXRlciB7CiAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogIGRpc3BsYXk6IGZsZXg7CiAgaGVpZ2h0OiAxMDAlOwogIGp1c3RpZnktY29udGVudDogY2VudGVyOwogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICB3aWR0aDogMTAwJTsKICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwp9CgouaWNvbiB7CiAgbWF4LWhlaWdodDogMTAwJTsKICBtYXgtd2lkdGg6IDEwMCU7CiAgb3BhY2l0eTogLjM7Cn0KCkBtZWRpYSAob3JpZW50YXRpb246IGxhbmRzY2FwZSkgYW5kIChtaW4taGVpZ2h0OiAyZW0pIGFuZCAobWluLXdpZHRoOiAxNGVtKSB7CiAgI291dGVyIHsKICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgfQogIC5pY29uIHsKICAgIG1heC1oZWlnaHQ6IDEwMCU7CiAgICBtYXgtd2lkdGg6IDUwJTsKICB9CiAgaDEgewogICAgZGlzcGxheTogYmxvY2s7CiAgfQp9CgpAbWVkaWEgKG1pbi1oZWlnaHQ6IDdlbSkgYW5kIChtaW4td2lkdGg6IDZlbSkgewogICNvdXRlciB7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogIH0KICAuaWNvbiB7CiAgICBtYXgtaGVpZ2h0OiA1MCU7CiAgICBtYXgtd2lkdGg6IDEwMCU7CiAgfQogIGgxIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogIH0KfQo8L3N0eWxlPgogIDxzdHlsZT4KICAjb3V0ZXIgewogICAgY3Vyc29yOiBwb2ludGVyOwogIH0KICA8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5IGlkPSJ0IiBvbmxvYWQ9Im5vdGlmeURpZEZpbmlzaExvYWRpbmcoKTsiPgogIDxkaXYgaTE4bi12YWx1ZXM9InRpdGxlOm5hbWUiIGlkPSJvdXRlciI+CiAgICA8aW1nIGNsYXNzPSJpY29uIgogICAgICAgICBzcmM9ImRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEhOMlp5QjRiV3h1Y3owaWFIUjBjRG92TDNkM2R5NTNNeTV2Y21jdk1qQXdNQzl6ZG1jaUlIZHBaSFJvUFNJME9IQjRJaUJvWldsbmFIUTlJalE0Y0hnaUlIWnBaWGRDYjNnOUlqQWdNQ0EwT0NBME9DSWdabWxzYkQwaUl6WXlOakkyTWlJK0NpQWdJQ0E4Y0dGMGFDQmtQU0pOTUNBd2FEUTRkalE0U0RCNklpQm1hV3hzUFNKdWIyNWxJaTgrQ2lBZ0lDQThjR0YwYUNCa1BTSk5OREVnTWpKb0xUTjJMVGhqTUMweUxqSXhMVEV1TnprdE5DMDBMVFJvTFRoV04yTXdMVEl1TnpZdE1pNHlOQzAxTFRVdE5YTXROU0F5TGpJMExUVWdOWFl6U0RoakxUSXVNakVnTUMwekxqazRJREV1TnprdE15NDVPQ0EwYkMwdU1ERWdOeTQyU0Rkak1pNDVPQ0F3SURVdU5DQXlMalF5SURVdU5DQTFMalJUT1M0NU9DQXpNaTQwSURjZ016SXVORWcwTGpBeFREUWdOREJqTUNBeUxqSXhJREV1TnprZ05DQTBJRFJvTnk0MmRpMHpZekF0TWk0NU9DQXlMalF5TFRVdU5DQTFMalF0TlM0MElESXVPVGdnTUNBMUxqUWdNaTQwTWlBMUxqUWdOUzQwZGpOSU16UmpNaTR5TVNBd0lEUXRNUzQzT1NBMExUUjJMVGhvTTJNeUxqYzJJREFnTlMweUxqSTBJRFV0TlhNdE1pNHlOQzAxTFRVdE5Yb2lMejRLUEM5emRtYytDZz09Ij4KICAgIDxoMSBpZD0ibWVzc2FnZSI+JGkxOG57bWVzc2FnZX08L2gxPgogIDwvZGl2PgogIDxzY3JpcHQ+CiAgICB3aW5kb3cub25rZXlkb3duID0gZnVuY3Rpb24oZSkgewogICAgICBpZiAoZS5rZXkgPT0gJ0VudGVyJyB8fCBlLmtleSA9PSAnICcpIHsKICAgICAgICBwbHVnaW4uc2hvd1Blcm1pc3Npb25CdWJibGUoKTsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIH0KICAgIH07CgogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ291dGVyJykub25jbGljayA9IGZ1bmN0aW9uKCkgewogICAgICBwbHVnaW4uc2hvd1Blcm1pc3Npb25CdWJibGUoKTsKICAgIH07CiAgPC9zY3JpcHQ+CjwvYm9keT4KPC9odG1sPgo8IWRvY3R5cGUgaHRtbD4KPGh0bWw+CjxoZWFkPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCI+CjxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsIHVzZXItc2NhbGFibGU9bm8iPgo8c2NyaXB0PgogIHdpbmRvdy5vbmxvYWQgPSBmdW5jdGlvbigpIHsKICAgIGlmIChwbHVnaW4uZGlkRmluaXNoTG9hZGluZykKICAgICAgcGx1Z2luLmRpZEZpbmlzaExvYWRpbmcoKTsKICB9OwoKICB3aW5kb3cub25rZXlkb3duID0gZnVuY3Rpb24oZSkgewogICAgaWYgKGUua2V5ID09ICdFbnRlcicgfHwgZS5rZXkgPT0gJyAnKSB7CiAgICAgIHBsdWdpbi5sb2FkKCk7CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgIH0KICB9Owo8L3NjcmlwdD4KPHN0eWxlPi8qIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLiAqLwoKaHRtbCwgYm9keSB7CiAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTsKICBmb250LWZhbWlseTogc2Fucy1zZXJpZjsKICBoZWlnaHQ6IDEwMCU7CiAgbWFyZ2luOiAwOwogIG92ZXJmbG93OiBoaWRkZW47CiAgdGV4dC1hbGlnbjogY2VudGVyOwogIHdpZHRoOiAxMDAlOwp9CgpoMSB7CiAgZGlzcGxheTogbm9uZTsKICBmb250LXNpemU6IDEwcHQ7CiAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKICBwYWRkaW5nOiAwcHQgMTBwdDsKfQoKcCB7CiAgZm9udC1zaXplOiA4cHQ7CiAgcGFkZGluZzogMHB0IDE0cHQ7Cn0KCiN0IHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjdmN2Y3OwogIGNvbG9yOiAjNjQ2NDY0Owp9Cgojb3V0ZXIgewogIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICBkaXNwbGF5OiBmbGV4OwogIGhlaWdodDogMTAwJTsKICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgd2lkdGg6IDEwMCU7CiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKfQoKLmljb24gewogIG1heC1oZWlnaHQ6IDEwMCU7CiAgbWF4LXdpZHRoOiAxMDAlOwogIG9wYWNpdHk6IC4zOwp9CgpAbWVkaWEgKG9yaWVudGF0aW9uOiBsYW5kc2NhcGUpIGFuZCAobWluLWhlaWdodDogMmVtKSBhbmQgKG1pbi13aWR0aDogMTRlbSkgewogICNvdXRlciB7CiAgICBmbGV4LWRpcmVjdGlvbjogcm93OwogIH0KICAuaWNvbiB7CiAgICBtYXgtaGVpZ2h0OiAxMDAlOwogICAgbWF4LXdpZHRoOiA1MCU7CiAgfQogIGgxIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogIH0KfQoKQG1lZGlhIChtaW4taGVpZ2h0OiA3ZW0pIGFuZCAobWluLXdpZHRoOiA2ZW0pIHsKICAjb3V0ZXIgewogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICB9CiAgLmljb24gewogICAgbWF4LWhlaWdodDogNTAlOwogICAgbWF4LXdpZHRoOiAxMDAlOwogIH0KICBoMSB7CiAgICBkaXNwbGF5OiBibG9jazsKICB9Cn0KPC9zdHlsZT4KPHN0eWxlPgojb3V0ZXIgewogIGJvcmRlcjogbm9uZTsKICBmbGV4LWRpcmVjdGlvbjogcm93OwogIGN1cnNvcjogcG9pbnRlcjsKfQoKI3NoaWVsZGluZyB7CiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjUpOwogIGhlaWdodDogMTAwJTsKICBsZWZ0OiAwcHg7CiAgcG9zaXRpb246IGFic29sdXRlOwogIHRvcDogMHB4OwogIHdpZHRoOiAxMDAlOwogIHotaW5kZXg6IDI7Cn0KCiNwbHVnaW4taWNvbiB7CiAgb3BhY2l0eTogMC44OwogIG1heC1oZWlnaHQ6IDEwMCU7CiAgbWF4LXdpZHRoOiAxMDAlOwogIG1pbi13aWR0aDogMDsKICBtaW4taGVpZ2h0OiAwOwp9CgojcGx1Z2luLWljb246aG92ZXIgewogIG9wYWNpdHk6IDAuOTU7Cn0KCiNwb3N0ZXIgewogIGhlaWdodDogMTAwJTsKICBvYmplY3QtZml0OiBjb250YWluOwogIHdpZHRoOiAxMDAlOwogIHotaW5kZXg6IDE7Cn0KCiNpbm5lci1jb250YWluZXIgewogIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgZGlzcGxheTogZmxleDsKICBoZWlnaHQ6IDEwMCU7CiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgbGVmdDogMHB4OwogIG1heC1oZWlnaHQ6IDEwMCU7CiAgbWF4LXdpZHRoOiAxMDAlOwogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICB0b3A6IDBweDsKICB3aWR0aDogMTAwJTsKICB6LWluZGV4OiAyOwp9Cjwvc3R5bGU+CjxiYXNlIGkxOG4tdmFsdWVzPSJocmVmOmJhc2V1cmwiPgo8L2hlYWQ+Cgo8Ym9keT4KICA8ZGl2IGkxOG4tdmFsdWVzPSJ0aXRsZTpuYW1lIiBpZD0ib3V0ZXIiPgogICAgPGltZyBpZD0icG9zdGVyIiBpMThuLXZhbHVlcz0ic3Jjc2V0OnBvc3RlciI+CiAgICA8ZGl2IGlkPSJzaGllbGRpbmciPjwvZGl2PgogICAgPGRpdiBpZD0iaW5uZXItY29udGFpbmVyIgogICAgICAgICBpMThuLXZhbHVlcz0iLnN0eWxlLndpZHRoOnZpc2libGVXaWR0aDsuc3R5bGUuaGVpZ2h0OnZpc2libGVIZWlnaHQiPgogICAgICA8aW1nIGlkPSJwbHVnaW4taWNvbiIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQURJQUFBQXlDQVlBQUFBZVA0aXhBQUFBQVhOU1IwSUFyczRjNlFBQUE4ZEpSRUZVYUFYZFdzOXZFa0VVWmt2WlFsb054Sm9ZNDBreEpzRE5vOUdEaWYrQmY0Q0hwakVtSlBvUGVNY2UxRjQwOGRZalFlUEJneWN2M3ZSRzRHQk1QUkVQTFNscENVV2dnTiszbmNWbDZQSnJaNWE2azB4MloyZm52ZS9iZWZQbXpjd2FJYlZwR2VMQ3lFc2lHNUw0UHNvOWtidTRua2oxQ3lzU2FBUTV0cm01dVY2cFZCNGVIeCsvYnJWYW4zdTkzczkrdjE5RmJvbGM1VFBXOFIyK3l6WnNLMlRJcFBGWWY2TFM2UGIyOXJYOS9mME5nUHNJc0Eza1dWT0RiU21Ec2lnVDJUZENaamFidlZ5djE1OEQ5ZUdzeU1lOGYwaVpsQTB5SnJLMkZFNG1reGVyMWVvVG1NanZNWUE4VlZFMmRWQVhtSEM4S1UxbVBwOVBkanFkNzU1UXp0Q1l1cWdUTEpUMVRyUllMTjdUMlF0dS9LaVR1a0dHWThkVGl1M3Q3VDJDb3FhYk1oK2VONGtCTE9qZDVrcFJRY0lIckpOVkNESXo5NHpKTG9YNFJmYUV6SzRwekd6cU1SUG1JRnZFbUpDUnkyVmlFZzVnc2plajIvUFRPOGxnSjVXSlRiam1zZVBGcEErZkpHelI5Y1FJRnE0bVpuQldQWThtSlg4NFloUVJ3Sm5oVEZTRUhYSzdtY3JOWnZNZEdqQlExSnFJRmIweTRzVU1CbTNRN0RsMktwVktkNWp4MVhhMU1nRldFV2dPOVVxRUVhZ0t4U1NCTDdXU3krV3VJcko5cjBLbW13eGloaTR1SXdZcEprSnh0elpUUHhkRTdJWFZhcTFXZTRiR1dreU5tTUhBbXZHcE1JUUZ6cXBwbWc4R3ROVGNjQ1hZU0NRU2I4cmw4bjJRK2FWRzdEOHB4RXpzOXBObHJ0YW0vdVFUWG5UMGlDMmYxNGd1VXlOMnlPY1NPN1RDcGVjRWZGTlh1eENoSHZZK1RlMHBoQ2t6TldJbkI4dVd3K0h3TFdyU25HeFRlNnZTMUFUMkpZdElKQks1b1ptRVUveWZUQ2J6Yld0cjYyNjczZjdnckpqblhtQzN4dm9hdXBxN0hVclNHTk9TY2FveXRTb0VyMWxNY0hOQjF1SkRXWldwV2RodElqN2cxcXZDY2x0UVVVZStwRmZWaUhSK3hCaTgyRVk4SG4rQmU5ZG9kcVRsOEFOaXQxd2l4MFp0dUU1N2lmUEtGY3pNT3lEeEN0cm1KUkVTMlB2c2tSNFdLN3VZSlpQYTRaOHFpTUloM0U2bFVqdUdZVnozcXBQWXlZSGQyK3QydXorOENweWlQWFZ4UW55Y1RxZS9xQ0JCblFLN1JhUjdjSER3ZFFvZ1hsNXhtdEpMQ0pyYmxHUVFBanQzOXEyZ2NSMjJOczhtTk1mWFVEcGpIcUVwNlZxZk5NU08vb0NmempCZWFXemwvR29qWVR6b25Cd2RIWDBhMFBKK284MlVuTkFFNXFIRG9zQXNkVWswRUpzUEpCS1k3U0NTQ2NRR0hZbUVnckpsU2k3QjJNUW1FNlJBSEN1Y1VvRVhDOEpCajAwbUVFZHZOcGxBSEliYVpNeENvWERUendNZzZsSjlQRzJUQ2NRUEF6WVpYdi83WHppY1pBTHhVNDFNNkZ6ODVqUjAydU5FT09jOU56TjRkTXoxT2JNc1g5dVBaMzhCdndadzZ6OTJQSTRBQUFBQVNVVk9SSzVDWUlJPSIgLz4KICAgIDwvZGl2PgogIDwvZGl2PgogIDxzY3JpcHQ+CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncG9zdGVyJykub25lcnJvciA9IGZ1bmN0aW9uKCkgewogICAgICB0aGlzLmhpZGRlbiA9IHRydWU7CiAgICB9OwoKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvdXRlcicpLm9uY2xpY2sgPSBmdW5jdGlvbigpIHsKICAgICAgcGx1Z2luLmxvYWQoKTsKICAgIH07CgogICAgd2luZG93LnJlc2l6ZVBvc3RlciA9IGZ1bmN0aW9uKG1hcmdpbkxlZnQsIG1hcmdpblRvcCwgd2lkdGgsIGhlaWdodCkgewogICAgICB2YXIgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lubmVyLWNvbnRhaW5lcicpOwogICAgICBjb250YWluZXIuc3R5bGUubWFyZ2luTGVmdCA9IG1hcmdpbkxlZnQ7CiAgICAgIGNvbnRhaW5lci5zdHlsZS5tYXJnaW5Ub3AgPSBtYXJnaW5Ub3A7CiAgICAgIGNvbnRhaW5lci5zdHlsZS53aWR0aCA9IHdpZHRoOwogICAgICBjb250YWluZXIuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0OwoKICAgICAgaWYgKHBsdWdpbi5kaWRGaW5pc2hJY29uUmVwb3NpdGlvbkZvclRlc3RpbmcpIHsKICAgICAgICAvLyBEZWZlciB1bnRpbCByZWZsb3cgY29tcGxldGUuCiAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICBwbHVnaW4uZGlkRmluaXNoSWNvblJlcG9zaXRpb25Gb3JUZXN0aW5nKCk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH07CiAgPC9zY3JpcHQ+CjwvYm9keT4KPC9odG1sPgovLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIEN1c3RvbSBiaW5kaW5nIGZvciB0aGUgYXBwIEFQSS4KCnZhciBhcHBOYXRpdmVzID0gcmVxdWlyZU5hdGl2ZSgnYXBwJyk7CnZhciBwcm9jZXNzID0gcmVxdWlyZU5hdGl2ZSgncHJvY2VzcycpOwp2YXIgZXh0ZW5zaW9uSWQgPSBwcm9jZXNzLkdldEV4dGVuc2lvbklkKCk7CnZhciBsb2dBY3Rpdml0eSA9IHJlcXVpcmVOYXRpdmUoJ2FjdGl2aXR5TG9nZ2VyJyk7CgpmdW5jdGlvbiB3cmFwRm9yTG9nZ2luZyhmdW4pIHsKICBpZiAoIWV4dGVuc2lvbklkKQogICAgcmV0dXJuIGZ1bjsgIC8vIG5vdGhpbmcgaW50ZXJlc3RpbmcgdG8gbG9nIHdpdGhvdXQgYW4gZXh0ZW5zaW9uCgogIHJldHVybiBmdW5jdGlvbigpIHsKICAgIC8vIFRPRE8oYXRhbHkpOiBXZSBuZWVkIHRvIG1ha2Ugc3VyZSB3ZSB1c2UgdGhlIHJpZ2h0IHByb3RvdHlwZSBmb3IKICAgIC8vIGZ1bi5hcHBseS4gQXJyYXkgc2xpY2UgY2FuIGVpdGhlciBiZSByZXdyaXR0ZW4gb3Igc2ltaWxhcmx5IGRlZmluZWQuCiAgICBsb2dBY3Rpdml0eS5Mb2dBUElDYWxsKGV4dGVuc2lvbklkLCAiYXBwLiIgKyBmdW4ubmFtZSwKICAgICAgICAkQXJyYXkuc2xpY2UoYXJndW1lbnRzKSk7CiAgICByZXR1cm4gJEZ1bmN0aW9uLmFwcGx5KGZ1biwgdGhpcywgYXJndW1lbnRzKTsKICB9Owp9CgovLyBUaGlzIGJlY29tZXMgY2hyb21lLmFwcAp2YXIgYXBwID0gewogIGdldElzSW5zdGFsbGVkOiB3cmFwRm9yTG9nZ2luZyhhcHBOYXRpdmVzLkdldElzSW5zdGFsbGVkKSwKICBnZXREZXRhaWxzOiB3cmFwRm9yTG9nZ2luZyhhcHBOYXRpdmVzLkdldERldGFpbHMpLAogIHJ1bm5pbmdTdGF0ZTogd3JhcEZvckxvZ2dpbmcoYXBwTmF0aXZlcy5HZXRSdW5uaW5nU3RhdGUpCn07CgovLyBUcmlja3k7ICJnZXRJc0luc3RhbGxlZCIgaXMgYWN0dWFsbHkgZXhwb3NlZCBhcyB0aGUgZ2V0dGVyICJpc0luc3RhbGxlZCIsCi8vIGJ1dCB3ZSBkb24ndCBoYXZlIGEgd2F5IHRvIGV4cHJlc3MgdGhpcyBpbiB0aGUgc2NoZW1hIEpTT04gKG5vciBpcyBpdAovLyB3b3J0aCBpdCBmb3IgdGhpcyBvbmUgc3BlY2lhbCBjYXNlKS4KLy8KLy8gU28sIGRlZmluZSBpdCBtYW51YWxseSwgYW5kIGxldCB0aGUgZ2V0SXNJbnN0YWxsZWQgZnVuY3Rpb24gYWN0IGFzIGl0cwovLyBkb2N1bWVudGF0aW9uLgp2YXIgaXNJbnN0YWxsZWQgPSB3cmFwRm9yTG9nZ2luZyhhcHBOYXRpdmVzLkdldElzSW5zdGFsbGVkKTsKJE9iamVjdC5kZWZpbmVQcm9wZXJ0eSgKICAgIGFwcCwgJ2lzSW5zdGFsbGVkJywKICAgIHsKICAgICAgX19wcm90b19fOiBudWxsLAogICAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICAgIGVudW1lcmFibGU6IHRydWUsCiAgICAgIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBpc0luc3RhbGxlZCgpOyB9LAogICAgfSk7CgovLyBDYWxsZWQgYnkgYXBwX2JpbmRpbmdzLmNjLgpmdW5jdGlvbiBvbkluc3RhbGxTdGF0ZVJlc3BvbnNlKHN0YXRlLCBjYWxsYmFja0lkKSB7CiAgdmFyIGNhbGxiYWNrID0gY2FsbGJhY2tzW2NhbGxiYWNrSWRdOwogIGRlbGV0ZSBjYWxsYmFja3NbY2FsbGJhY2tJZF07CiAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PSAnZnVuY3Rpb24nKSB7CiAgICB0cnkgewogICAgICBjYWxsYmFjayhzdGF0ZSk7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIGNvbnNvbGUuZXJyb3IoJ0V4Y2VwdGlvbiBpbiBjaHJvbWUuYXBwLmluc3RhbGxTdGF0ZSByZXNwb25zZSBoYW5kbGVyOiAnICsKICAgICAgICAgICAgICAgICAgICBlLnN0YWNrKTsKICAgIH0KICB9Cn0KCi8vIFRPRE8oa2FsbWFuKTogbW92ZSB0aGlzIHN0dWZmIHRvIGl0cyBvd24gY3VzdG9tIGJpbmRpbmdzLgp2YXIgY2FsbGJhY2tzID0geyBfX3Byb3RvX186IG51bGwgfTsKdmFyIG5leHRDYWxsYmFja0lkID0gMTsKCmZ1bmN0aW9uIGdldEluc3RhbGxTdGF0ZShjYWxsYmFjaykgewogIHZhciBjYWxsYmFja0lkID0gbmV4dENhbGxiYWNrSWQrKzsKICBjYWxsYmFja3NbY2FsbGJhY2tJZF0gPSBjYWxsYmFjazsKICBhcHBOYXRpdmVzLkdldEluc3RhbGxTdGF0ZShjYWxsYmFja0lkKTsKfQoKJE9iamVjdC5kZWZpbmVQcm9wZXJ0eSgKICAgIGFwcCwgJ2luc3RhbGxTdGF0ZScsCiAgICB7CiAgICAgIF9fcHJvdG9fXzogbnVsbCwKICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICB2YWx1ZTogd3JhcEZvckxvZ2dpbmcoZ2V0SW5zdGFsbFN0YXRlKSwKICAgICAgd3JpdGFibGU6IHRydWUsCiAgICB9KTsKCmV4cG9ydHMuJHNldCgnYmluZGluZycsIGFwcCk7CmV4cG9ydHMuJHNldCgnb25JbnN0YWxsU3RhdGVSZXNwb25zZScsIG9uSW5zdGFsbFN0YXRlUmVzcG9uc2UpOwovLyBDb3B5cmlnaHQgMjAxNCBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQovLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gQ3VzdG9tIGJpbmRpbmdzIGZvciB0aGUgYXV0b21hdGlvbiBBUEkuCnZhciBBdXRvbWF0aW9uTm9kZSA9IHJlcXVpcmUoJ2F1dG9tYXRpb25Ob2RlJykuQXV0b21hdGlvbk5vZGU7CnZhciBBdXRvbWF0aW9uUm9vdE5vZGUgPSByZXF1aXJlKCdhdXRvbWF0aW9uTm9kZScpLkF1dG9tYXRpb25Sb290Tm9kZTsKdmFyIGF1dG9tYXRpb24gPSBhcGlCcmlkZ2UgfHwgcmVxdWlyZSgnYmluZGluZycpLkJpbmRpbmcuY3JlYXRlKCdhdXRvbWF0aW9uJyk7CnZhciBhdXRvbWF0aW9uSW50ZXJuYWwgPQogICAgZ2V0SW50ZXJuYWxBcGkgPwogICAgICAgIGdldEludGVybmFsQXBpKCdhdXRvbWF0aW9uSW50ZXJuYWwnKSA6CiAgICAgICAgcmVxdWlyZSgnYmluZGluZycpLkJpbmRpbmcuY3JlYXRlKCdhdXRvbWF0aW9uSW50ZXJuYWwnKS5nZW5lcmF0ZSgpOwp2YXIgZXhjZXB0aW9uSGFuZGxlciA9IHJlcXVpcmUoJ3VuY2F1Z2h0X2V4Y2VwdGlvbl9oYW5kbGVyJyk7CnZhciBsb2dnaW5nID0gcmVxdWlyZU5hdGl2ZSgnbG9nZ2luZycpOwp2YXIgbmF0aXZlQXV0b21hdGlvbkludGVybmFsID0gcmVxdWlyZU5hdGl2ZSgnYXV0b21hdGlvbkludGVybmFsJyk7CnZhciBEZXN0cm95QWNjZXNzaWJpbGl0eVRyZWUgPQogICAgbmF0aXZlQXV0b21hdGlvbkludGVybmFsLkRlc3Ryb3lBY2Nlc3NpYmlsaXR5VHJlZTsKdmFyIEdldEludEF0dHJpYnV0ZSA9IG5hdGl2ZUF1dG9tYXRpb25JbnRlcm5hbC5HZXRJbnRBdHRyaWJ1dGU7CnZhciBTdGFydENhY2hpbmdBY2Nlc3NpYmlsaXR5VHJlZXMgPQogICAgbmF0aXZlQXV0b21hdGlvbkludGVybmFsLlN0YXJ0Q2FjaGluZ0FjY2Vzc2liaWxpdHlUcmVlczsKdmFyIEFkZFRyZWVDaGFuZ2VPYnNlcnZlciA9IG5hdGl2ZUF1dG9tYXRpb25JbnRlcm5hbC5BZGRUcmVlQ2hhbmdlT2JzZXJ2ZXI7CnZhciBSZW1vdmVUcmVlQ2hhbmdlT2JzZXJ2ZXIgPQogICAgbmF0aXZlQXV0b21hdGlvbkludGVybmFsLlJlbW92ZVRyZWVDaGFuZ2VPYnNlcnZlcjsKdmFyIEdldEZvY3VzTmF0aXZlID0gbmF0aXZlQXV0b21hdGlvbkludGVybmFsLkdldEZvY3VzOwoKdmFyIGpzTGFzdEVycm9yID0gYmluZGluZ1V0aWwgPyB1bmRlZmluZWQgOiByZXF1aXJlKCdsYXN0RXJyb3InKTsKZnVuY3Rpb24gaGFzTGFzdEVycm9yKCkgewogIHJldHVybiBiaW5kaW5nVXRpbCA/CiAgICAgIGJpbmRpbmdVdGlsLmhhc0xhc3RFcnJvcigpIDoganNMYXN0RXJyb3IuaGFzRXJyb3IoY2hyb21lKTsKfQoKLyoqCiAqIEEgbmFtZXNwYWNlIHRvIGV4cG9ydCB1dGlsaXR5IGZ1bmN0aW9ucyB0byBvdGhlciBmaWxlcyBpbiBhdXRvbWF0aW9uLgogKi8Kd2luZG93LmF1dG9tYXRpb25VdGlsID0gZnVuY3Rpb24oKSB7fTsKCi8vIFRPRE8oYWJveGhhbGwpOiBMb29rIGludG8gdXNpbmcgV2Vha01hcAp2YXIgaWRUb0NhbGxiYWNrID0ge307Cgp2YXIgREVTS1RPUF9UUkVFX0lEID0gMDsKCmF1dG9tYXRpb25VdGlsLnN0b3JlVHJlZUNhbGxiYWNrID0gZnVuY3Rpb24oaWQsIGNhbGxiYWNrKSB7CiAgaWYgKCFjYWxsYmFjaykKICAgIHJldHVybjsKCiAgdmFyIHRhcmdldFRyZWUgPSBBdXRvbWF0aW9uUm9vdE5vZGUuZ2V0KGlkKTsKICBpZiAoIXRhcmdldFRyZWUpIHsKICAgIC8vIElmIHdlIGhhdmVuJ3QgY2FjaGVkIHRoZSB0cmVlLCBob2xkIHRoZSBjYWxsYmFjayB1bnRpbCB0aGUgdHJlZSBpcwogICAgLy8gcG9wdWxhdGVkIGJ5IHRoZSBpbml0aWFsIG9uQWNjZXNzaWJpbGl0eUV2ZW50IGNhbGwuCiAgICBpZiAoaWQgaW4gaWRUb0NhbGxiYWNrKQogICAgICBpZFRvQ2FsbGJhY2tbaWRdLnB1c2goY2FsbGJhY2spOwogICAgZWxzZQogICAgICBpZFRvQ2FsbGJhY2tbaWRdID0gW2NhbGxiYWNrXTsKICB9IGVsc2UgewogICAgY2FsbGJhY2sodGFyZ2V0VHJlZSk7CiAgfQp9OwoKLyoqCiAqIEdsb2JhbCBsaXN0IG9mIHRyZWUgY2hhbmdlIG9ic2VydmVycy4KICogQHR5cGUge09iamVjdDxudW1iZXIsIFRyZWVDaGFuZ2VPYnNlcnZlcj59CiAqLwphdXRvbWF0aW9uVXRpbC50cmVlQ2hhbmdlT2JzZXJ2ZXJNYXAgPSB7fTsKCi8qKgogKiBUaGUgaWQgb2YgdGhlIG5leHQgdHJlZSBjaGFuZ2Ugb2JzZXJ2ZXIuCiAqIEB0eXBlIHtudW1iZXJ9CiAqLwphdXRvbWF0aW9uVXRpbC5uZXh0VHJlZUNoYW5nZU9ic2VydmVySWQgPSAxOwoKLyoqCiAqIEB0eXBlIHtBdXRvbWF0aW9uTm9kZX0gVGhlIGN1cnJlbnQgZm9jdXNlZCBub2RlLiBUaGlzIGlzIG9ubHkgdXBkYXRlZAogKiAgIHdoZW4gY2FsbGluZyBhdXRvbWF0aW9uVXRpbC51cGRhdGVGb2N1c2VkTm9kZS4KICovCmF1dG9tYXRpb25VdGlsLmZvY3VzZWROb2RlID0gbnVsbDsKCi8qKgogKiBHZXRzIHRoZSBjdXJyZW50bHkgZm9jdXNlZCBBdXRvbWF0aW9uTm9kZS4KICogQHJldHVybiB7QXV0b21hdGlvbk5vZGV9CiAqLwphdXRvbWF0aW9uVXRpbC5nZXRGb2N1cyA9IGZ1bmN0aW9uKCkgewogIHZhciBmb2N1c2VkTm9kZUluZm8gPSBHZXRGb2N1c05hdGl2ZShERVNLVE9QX1RSRUVfSUQpOwogIGlmICghZm9jdXNlZE5vZGVJbmZvKQogICAgcmV0dXJuIG51bGw7CiAgdmFyIHRyZWUgPSBBdXRvbWF0aW9uUm9vdE5vZGUuZ2V0T3JDcmVhdGUoZm9jdXNlZE5vZGVJbmZvLnRyZWVJZCk7CiAgaWYgKHRyZWUpCiAgICByZXR1cm4gcHJpdmF0ZXModHJlZSkuaW1wbC5nZXQoZm9jdXNlZE5vZGVJbmZvLm5vZGVJZCk7Cn07CgovKioKICogVXBkYXRlIGF1dG9tYXRpb25VdGlsLmZvY3VzZWROb2RlIHRvIGJlIHRoZSBub2RlIHRoYXQgY3VycmVudGx5IGhhcyBmb2N1cy4KICovCmF1dG9tYXRpb25VdGlsLnVwZGF0ZUZvY3VzZWROb2RlID0gZnVuY3Rpb24oKSB7CiAgYXV0b21hdGlvblV0aWwuZm9jdXNlZE5vZGUgPSBhdXRvbWF0aW9uVXRpbC5nZXRGb2N1cygpOwp9OwoKLyoqCiAqIFVwZGF0ZXMgdGhlIGZvY3VzIG9uIGJsdXIuCiAqLwphdXRvbWF0aW9uVXRpbC51cGRhdGVGb2N1c2VkTm9kZU9uQmx1ciA9IGZ1bmN0aW9uKCkgewogIHZhciBmb2N1cyA9IGF1dG9tYXRpb25VdGlsLmdldEZvY3VzKCk7CiAgYXV0b21hdGlvblV0aWwuZm9jdXNlZE5vZGUgPSBmb2N1cyA/IGZvY3VzLnJvb3QgOiBudWxsOwp9OwoKYXV0b21hdGlvbi5yZWdpc3RlckN1c3RvbUhvb2soZnVuY3Rpb24oYmluZGluZ3NBUEkpIHsKICB2YXIgYXBpRnVuY3Rpb25zID0gYmluZGluZ3NBUEkuYXBpRnVuY3Rpb25zOwoKICAvLyBUT0RPKGFib3hoYWxsLCBkdHNlbmcpOiBNYWtlIHRoaXMgcmV0dXJuIHRoZSBzcGVjZWQgQXV0b21hdGlvblJvb3ROb2RlIG9iai4KICBhcGlGdW5jdGlvbnMuc2V0SGFuZGxlUmVxdWVzdCgnZ2V0VHJlZScsIGZ1bmN0aW9uIGdldFRyZWUodGFiSUQsIGNhbGxiYWNrKSB7CiAgICBTdGFydENhY2hpbmdBY2Nlc3NpYmlsaXR5VHJlZXMoKTsKCiAgICAvLyBlbmFibGVUYWIoKSBlbnN1cmVzIHRoZSByZW5kZXJlciBmb3IgdGhlIGFjdGl2ZSBvciBzcGVjaWZpZWQgdGFiIGhhcwogICAgLy8gYWNjZXNzaWJpbGl0eSBlbmFibGVkLCBhbmQgZmV0Y2hlcyBpdHMgYXggdHJlZSBpZCB0byB1c2UgYXMKICAgIC8vIGEga2V5IGluIHRoZSBpZFRvQXV0b21hdGlvblJvb3ROb2RlIG1hcC4gVGhlIGNhbGxiYWNrIHRvCiAgICAvLyBlbmFibGVUYWIgaXMgYm91bmQgdG8gdGhlIGNhbGxiYWNrIHBhc3NlZCBpbiB0byBnZXRUcmVlKCksIHNvIHRoYXQgb25jZQogICAgLy8gdGhlIHRyZWUgaXMgYXZhaWxhYmxlIChlaXRoZXIgZHVlIHRvIGhhdmluZyBiZWVuIGNhY2hlZCBlYXJsaWVyLCBvciBhZnRlcgogICAgLy8gYW4gYWNjZXNzaWJpbGl0eSBldmVudCBvY2N1cnMgd2hpY2ggY2F1c2VzIHRoZSB0cmVlIHRvIGJlIHBvcHVsYXRlZCksIHRoZQogICAgLy8gY2FsbGJhY2sgY2FuIGJlIGNhbGxlZC4KICAgIHZhciBwYXJhbXMgPSB7IHRhYklEOiB0YWJJRCB9OwogICAgYXV0b21hdGlvbkludGVybmFsLmVuYWJsZVRhYihwYXJhbXMsCiAgICAgICAgZnVuY3Rpb24gb25FbmFibGUoaWQpIHsKICAgICAgICAgIGlmIChoYXNMYXN0RXJyb3IoKSkgewogICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgICBhdXRvbWF0aW9uVXRpbC5zdG9yZVRyZWVDYWxsYmFjayhpZCwgY2FsbGJhY2spOwogICAgICAgIH0pOwogIH0pOwoKICB2YXIgZGVza3RvcFRyZWUgPSBudWxsOwogIGFwaUZ1bmN0aW9ucy5zZXRIYW5kbGVSZXF1ZXN0KCdnZXREZXNrdG9wJywgZnVuY3Rpb24oY2FsbGJhY2spIHsKICAgIFN0YXJ0Q2FjaGluZ0FjY2Vzc2liaWxpdHlUcmVlcygpOwogICAgZGVza3RvcFRyZWUgPSBBdXRvbWF0aW9uUm9vdE5vZGUuZ2V0KERFU0tUT1BfVFJFRV9JRCk7CiAgICBpZiAoIWRlc2t0b3BUcmVlKSB7CiAgICAgIGlmIChERVNLVE9QX1RSRUVfSUQgaW4gaWRUb0NhbGxiYWNrKQogICAgICAgIGlkVG9DYWxsYmFja1tERVNLVE9QX1RSRUVfSURdLnB1c2goY2FsbGJhY2spOwogICAgICBlbHNlCiAgICAgICAgaWRUb0NhbGxiYWNrW0RFU0tUT1BfVFJFRV9JRF0gPSBbY2FsbGJhY2tdOwoKICAgICAgLy8gVE9ETyhkdHNlbmcpOiBEaXNhYmxlIGRlc2t0b3AgdHJlZSBvbmNlIGRlc2t0b3Agb2JqZWN0IGdvZXMgb3V0IG9mCiAgICAgIC8vIHNjb3BlLgogICAgICBhdXRvbWF0aW9uSW50ZXJuYWwuZW5hYmxlRGVza3RvcChmdW5jdGlvbigpIHsKICAgICAgICBpZiAoaGFzTGFzdEVycm9yKCkpIHsKICAgICAgICAgIEF1dG9tYXRpb25Sb290Tm9kZS5kZXN0cm95KERFU0tUT1BfVFJFRV9JRCk7CiAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9IGVsc2UgewogICAgICBjYWxsYmFjayhkZXNrdG9wVHJlZSk7CiAgICB9CiAgfSk7CgogIGFwaUZ1bmN0aW9ucy5zZXRIYW5kbGVSZXF1ZXN0KCdnZXRGb2N1cycsIGZ1bmN0aW9uKGNhbGxiYWNrKSB7CiAgICBjYWxsYmFjayhhdXRvbWF0aW9uVXRpbC5nZXRGb2N1cygpKTsKICB9KTsKCiAgZnVuY3Rpb24gcmVtb3ZlVHJlZUNoYW5nZU9ic2VydmVyKG9ic2VydmVyKSB7CiAgICBmb3IgKHZhciBpZCBpbiBhdXRvbWF0aW9uVXRpbC50cmVlQ2hhbmdlT2JzZXJ2ZXJNYXApIHsKICAgICAgaWYgKGF1dG9tYXRpb25VdGlsLnRyZWVDaGFuZ2VPYnNlcnZlck1hcFtpZF0gPT0gb2JzZXJ2ZXIpIHsKICAgICAgICBSZW1vdmVUcmVlQ2hhbmdlT2JzZXJ2ZXIoaWQpOwogICAgICAgIGRlbGV0ZSBhdXRvbWF0aW9uVXRpbC50cmVlQ2hhbmdlT2JzZXJ2ZXJNYXBbaWRdOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfQogIH0KICBhcGlGdW5jdGlvbnMuc2V0SGFuZGxlUmVxdWVzdCgncmVtb3ZlVHJlZUNoYW5nZU9ic2VydmVyJywgZnVuY3Rpb24ob2JzZXJ2ZXIpIHsKICAgIHJlbW92ZVRyZWVDaGFuZ2VPYnNlcnZlcihvYnNlcnZlcik7CiAgfSk7CgogIGZ1bmN0aW9uIGFkZFRyZWVDaGFuZ2VPYnNlcnZlcihmaWx0ZXIsIG9ic2VydmVyKSB7CiAgICByZW1vdmVUcmVlQ2hhbmdlT2JzZXJ2ZXIob2JzZXJ2ZXIpOwogICAgdmFyIGlkID0gYXV0b21hdGlvblV0aWwubmV4dFRyZWVDaGFuZ2VPYnNlcnZlcklkKys7CiAgICBBZGRUcmVlQ2hhbmdlT2JzZXJ2ZXIoaWQsIGZpbHRlcik7CiAgICBhdXRvbWF0aW9uVXRpbC50cmVlQ2hhbmdlT2JzZXJ2ZXJNYXBbaWRdID0gb2JzZXJ2ZXI7CiAgfQogIGFwaUZ1bmN0aW9ucy5zZXRIYW5kbGVSZXF1ZXN0KCdhZGRUcmVlQ2hhbmdlT2JzZXJ2ZXInLAogICAgICBmdW5jdGlvbihmaWx0ZXIsIG9ic2VydmVyKSB7CiAgICBhZGRUcmVlQ2hhbmdlT2JzZXJ2ZXIoZmlsdGVyLCBvYnNlcnZlcik7CiAgfSk7CgogIGFwaUZ1bmN0aW9ucy5zZXRIYW5kbGVSZXF1ZXN0KCdzZXREb2N1bWVudFNlbGVjdGlvbicsIGZ1bmN0aW9uKHBhcmFtcykgewogICAgdmFyIGFuY2hvck5vZGVJbXBsID0gcHJpdmF0ZXMocGFyYW1zLmFuY2hvck9iamVjdCkuaW1wbDsKICAgIHZhciBmb2N1c05vZGVJbXBsID0gcHJpdmF0ZXMocGFyYW1zLmZvY3VzT2JqZWN0KS5pbXBsOwogICAgaWYgKGFuY2hvck5vZGVJbXBsLnRyZWVJRCAhPT0gZm9jdXNOb2RlSW1wbC50cmVlSUQpCiAgICAgIHRocm93IG5ldyBFcnJvcignU2VsZWN0aW9uIGFuY2hvciBhbmQgZm9jdXMgbXVzdCBiZSBpbiB0aGUgc2FtZSB0cmVlLicpOwogICAgaWYgKGFuY2hvck5vZGVJbXBsLnRyZWVJRCA9PT0gREVTS1RPUF9UUkVFX0lEKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcignVXNlIEF1dG9tYXRpb25Ob2RlLnNldFNlbGVjdGlvbiB0byBzZXQgdGhlIHNlbGVjdGlvbiAnICsKICAgICAgICAgICdpbiB0aGUgZGVza3RvcCB0cmVlLicpOwogICAgfQogICAgYXV0b21hdGlvbkludGVybmFsLnBlcmZvcm1BY3Rpb24oeyB0cmVlSUQ6IGFuY2hvck5vZGVJbXBsLnRyZWVJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b21hdGlvbk5vZGVJRDogYW5jaG9yTm9kZUltcGwuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvblR5cGU6ICdzZXRTZWxlY3Rpb24nfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZm9jdXNOb2RlSUQ6IGZvY3VzTm9kZUltcGwuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2hvck9mZnNldDogcGFyYW1zLmFuY2hvck9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9jdXNPZmZzZXQ6IHBhcmFtcy5mb2N1c09mZnNldCB9KTsKICB9KTsKCn0pOwoKYXV0b21hdGlvbkludGVybmFsLm9uQ2hpbGRUcmVlSUQuYWRkTGlzdGVuZXIoZnVuY3Rpb24odHJlZUlELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlSUQpIHsKICB2YXIgdHJlZSA9IEF1dG9tYXRpb25Sb290Tm9kZS5nZXRPckNyZWF0ZSh0cmVlSUQpOwogIGlmICghdHJlZSkKICAgIHJldHVybjsKCiAgdmFyIG5vZGUgPSBwcml2YXRlcyh0cmVlKS5pbXBsLmdldChub2RlSUQpOwogIGlmICghbm9kZSkKICAgIHJldHVybjsKCiAgLy8gQSBXZWJWaWV3IGluIHRoZSBkZXNrdG9wIHRyZWUgaGFzIGEgZGlmZmVyZW50IEFYIHRyZWUgYXMgaXRzIGNoaWxkLgogIC8vIFdoZW4gd2UgZW5jb3VudGVyIGEgV2ViVmlldyB3aXRoIGEgY2hpbGQgQVggdHJlZSBpZCB0aGF0IHdlIGRvbid0CiAgLy8gY3VycmVudGx5IGhhdmUgY2FjaGVkLCBleHBsaWNpdGx5IHJlcXVlc3QgdGhhdCBBWCB0cmVlIGZyb20gdGhlCiAgLy8gYnJvd3NlciBwcm9jZXNzIGFuZCBzZXQgdXAgYSBjYWxsYmFjayB3aGVuIGl0IGxvYWRzIHRvIGF0dGFjaCB0aGF0CiAgLy8gdHJlZSBhcyBhIGNoaWxkIG9mIHRoaXMgbm9kZSBhbmQgZmlyZSBhcHByb3ByaWF0ZSBldmVudHMuCiAgdmFyIGNoaWxkVHJlZUlEID0gR2V0SW50QXR0cmlidXRlKHRyZWVJRCwgbm9kZUlELCAnY2hpbGRUcmVlSWQnKTsKICBpZiAoIWNoaWxkVHJlZUlEKQogICAgcmV0dXJuOwoKICB2YXIgc3Vicm9vdCA9IEF1dG9tYXRpb25Sb290Tm9kZS5nZXQoY2hpbGRUcmVlSUQpOwogIGlmICghc3Vicm9vdCB8fCBzdWJyb290LnJvbGUgPT0gJ3Vua25vd24nKSB7CiAgICBhdXRvbWF0aW9uVXRpbC5zdG9yZVRyZWVDYWxsYmFjayhjaGlsZFRyZWVJRCwgZnVuY3Rpb24ocm9vdCkgewogICAgICAvLyBSZXR1cm4gZWFybHkgaWYgdGhlIHJvb3QgaGFzIGFscmVhZHkgYmVlbiBhdHRhY2hlZC4KICAgICAgaWYgKHJvb3QucGFyZW50KQogICAgICAgIHJldHVybjsKCiAgICAgIHByaXZhdGVzKHJvb3QpLmltcGwuc2V0SG9zdE5vZGUobm9kZSk7CgogICAgICBpZiAocm9vdC5kb2NMb2FkZWQpIHsKICAgICAgICBwcml2YXRlcyhyb290KS5pbXBsLmRpc3BhdGNoRXZlbnQoJ2xvYWRDb21wbGV0ZScsICdwYWdlJyk7CiAgICAgIH0KCiAgICAgIHByaXZhdGVzKG5vZGUpLmltcGwuZGlzcGF0Y2hFdmVudCgnY2hpbGRyZW5DaGFuZ2VkJywgJ25vbmUnKTsKICAgIH0pOwoKICAgIGF1dG9tYXRpb25JbnRlcm5hbC5lbmFibGVGcmFtZShjaGlsZFRyZWVJRCk7CiAgfSBlbHNlIHsKICAgIHByaXZhdGVzKHN1YnJvb3QpLmltcGwuc2V0SG9zdE5vZGUobm9kZSk7CiAgfQp9KTsKCmF1dG9tYXRpb25JbnRlcm5hbC5vblRyZWVDaGFuZ2UuYWRkTGlzdGVuZXIoZnVuY3Rpb24ob2JzZXJ2ZXJJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmVlSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZUlELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZVR5cGUpIHsKICB2YXIgdHJlZSA9IEF1dG9tYXRpb25Sb290Tm9kZS5nZXRPckNyZWF0ZSh0cmVlSUQpOwogIGlmICghdHJlZSkKICAgIHJldHVybjsKCiAgdmFyIG5vZGUgPSBwcml2YXRlcyh0cmVlKS5pbXBsLmdldChub2RlSUQpOwogIGlmICghbm9kZSkKICAgIHJldHVybjsKCiAgdmFyIG9ic2VydmVyID0gYXV0b21hdGlvblV0aWwudHJlZUNoYW5nZU9ic2VydmVyTWFwW29ic2VydmVySURdOwogIGlmICghb2JzZXJ2ZXIpCiAgICByZXR1cm47CgogIHRyeSB7CiAgICBvYnNlcnZlcih7dGFyZ2V0OiBub2RlLCB0eXBlOiBjaGFuZ2VUeXBlfSk7CiAgfSBjYXRjaCAoZSkgewogICAgZXhjZXB0aW9uSGFuZGxlci5oYW5kbGUoJ0Vycm9yIGluIHRyZWUgY2hhbmdlIG9ic2VydmVyIGZvciAnICsKICAgICAgICB0cmVlQ2hhbmdlLnR5cGUsIGUpOwogIH0KfSk7CgphdXRvbWF0aW9uSW50ZXJuYWwub25Ob2Rlc1JlbW92ZWQuYWRkTGlzdGVuZXIoZnVuY3Rpb24odHJlZUlELCBub2RlSURzKSB7CiAgdmFyIHRyZWUgPSBBdXRvbWF0aW9uUm9vdE5vZGUuZ2V0T3JDcmVhdGUodHJlZUlEKTsKICBpZiAoIXRyZWUpCiAgICByZXR1cm47CgogIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZUlEcy5sZW5ndGg7IGkrKykgewogICAgcHJpdmF0ZXModHJlZSkuaW1wbC5yZW1vdmUobm9kZUlEc1tpXSk7CiAgfQp9KTsKCi8qKgogKiBEaXNwYXRjaCBhY2Nlc3NpYmlsaXR5IGV2ZW50cyBmaXJlZCBvbiBpbmRpdmlkdWFsIG5vZGVzIHRvIGl0cwogKiBjb3JyZXNwb25kaW5nIEF1dG9tYXRpb25Ob2RlLiBIYW5kbGUgZm9jdXMgZXZlbnRzIHNwZWNpYWxseQogKiAoc2VlIGJlbG93KS4KICovCmF1dG9tYXRpb25JbnRlcm5hbC5vbkFjY2Vzc2liaWxpdHlFdmVudC5hZGRMaXN0ZW5lcihmdW5jdGlvbihldmVudFBhcmFtcykgewogIHZhciBpZCA9IGV2ZW50UGFyYW1zLnRyZWVJRDsKICB2YXIgdGFyZ2V0VHJlZSA9IEF1dG9tYXRpb25Sb290Tm9kZS5nZXRPckNyZWF0ZShpZCk7CiAgaWYgKGV2ZW50UGFyYW1zLmV2ZW50VHlwZSA9PSAnYmx1cicpIHsKICAgIC8vIFdvcmsgYXJvdW5kIGFuIGlzc3VlIHdoZXJlIENocm9tZSBzZW5kcyB1cyAnYmx1cicgZXZlbnRzIG9uIHRoZQogICAgLy8gcm9vdCBub2RlIHdoZW4gbm90aGluZyBoYXMgZm9jdXMsIHdlIG5lZWQgdG8gdHJlYXQgdGhvc2UgYXMgZm9jdXMKICAgIC8vIGV2ZW50cyBidXQgb3RoZXJ3aXNlIG5vdCBoYW5kbGUgYmx1ciBldmVudHMgc3BlY2lhbGx5LgogICAgdmFyIG5vZGUgPSBwcml2YXRlcyh0YXJnZXRUcmVlKS5pbXBsLmdldChldmVudFBhcmFtcy50YXJnZXRJRCk7CiAgICBpZiAobm9kZSA9PSBub2RlLnJvb3QpCiAgICAgIGF1dG9tYXRpb25VdGlsLnVwZGF0ZUZvY3VzZWROb2RlT25CbHVyKCk7CiAgfSBlbHNlIGlmIChldmVudFBhcmFtcy5ldmVudFR5cGUgPT0gJ21lZGlhU3RhcnRlZFBsYXlpbmcnIHx8CiAgICAgIGV2ZW50UGFyYW1zLmV2ZW50VHlwZSA9PSAnbWVkaWFTdG9wcGVkUGxheWluZycpIHsKICAgIC8vIFRoZXNlIGV2ZW50cyBhcmUgZ2xvYmFsIHRvIHRoZSB0cmVlLgogICAgZXZlbnRQYXJhbXMudGFyZ2V0SUQgPSBwcml2YXRlcyh0YXJnZXRUcmVlKS5pbXBsLmlkOwogIH0gZWxzZSB7CiAgICB2YXIgcHJldmlvdXNGb2N1c2VkTm9kZSA9IGF1dG9tYXRpb25VdGlsLmZvY3VzZWROb2RlOwogICAgYXV0b21hdGlvblV0aWwudXBkYXRlRm9jdXNlZE5vZGUoKTsKCiAgICAvLyBGaXJlIGZvY3VzIGV2ZW50cyBpZiBuZWNlc3NhcnkuCiAgICBpZiAoYXV0b21hdGlvblV0aWwuZm9jdXNlZE5vZGUgJiYKICAgICAgICBhdXRvbWF0aW9uVXRpbC5mb2N1c2VkTm9kZSAhPSBwcmV2aW91c0ZvY3VzZWROb2RlKSB7CiAgICAgIHZhciBldmVudFBhcmFtc0NvcHkgPSB7fTsKICAgICAgZm9yICh2YXIga2V5IGluIGV2ZW50UGFyYW1zKQogICAgICAgIGV2ZW50UGFyYW1zQ29weVtrZXldID0gZXZlbnRQYXJhbXNba2V5XTsKICAgICAgZXZlbnRQYXJhbXNDb3B5WydldmVudFR5cGUnXSA9ICdmb2N1cyc7CiAgICAgIGV2ZW50UGFyYW1zQ29weVsndHJlZUlEJ10gPQogICAgICAgICAgcHJpdmF0ZXMoYXV0b21hdGlvblV0aWwuZm9jdXNlZE5vZGUucm9vdCkuaW1wbC50cmVlSUQ7CiAgICAgIGV2ZW50UGFyYW1zQ29weVsndGFyZ2V0SUQnXSA9CiAgICAgICAgICBwcml2YXRlcyhhdXRvbWF0aW9uVXRpbC5mb2N1c2VkTm9kZSkuaW1wbC5pZDsKICAgICAgcHJpdmF0ZXMoYXV0b21hdGlvblV0aWwuZm9jdXNlZE5vZGUucm9vdCkKICAgICAgICAgIC5pbXBsLm9uQWNjZXNzaWJpbGl0eUV2ZW50KGV2ZW50UGFyYW1zQ29weSk7CiAgICB9CiAgfQoKICAvLyBOb3RlIHRoYXQgZm9jdXMgdHlwZSBldmVudHMgaGF2ZSBhbHJlYWR5IGJlZW4gaGFuZGxlZCBhYm92ZSBpZiB0aGVyZSB3YXMgYQogIC8vIGZvY3VzZWQgbm9kZS4gQWxsIG90aGVyIGV2ZW50cywgZXZlbiBub24tZm9jdXMgZXZlbnRzIHRoYXQgdHJpZ2dlcmVkIGEKICAvLyBmb2N1cyBkaXNwYXRjaCwgc3RpbGwgbmVlZCB0byBoYXZlIHRoZWlyIG9yaWdpbmFsIGV2ZW50IGZpcmVkLgogIGlmICgoIWF1dG9tYXRpb25VdGlsLmZvY3VzZWROb2RlIHx8IGV2ZW50UGFyYW1zLmV2ZW50VHlwZSAhPSAnZm9jdXMnKSAmJgogICAgICAhcHJpdmF0ZXModGFyZ2V0VHJlZSkuaW1wbC5vbkFjY2Vzc2liaWxpdHlFdmVudChldmVudFBhcmFtcykpCiAgICByZXR1cm47CgogIC8vIElmIHdlJ3JlIG5vdCB3YWl0aW5nIG9uIGEgY2FsbGJhY2sgdG8gZ2V0VHJlZSgpLCB3ZSBjYW4gZWFybHkgb3V0IGhlcmUuCiAgaWYgKCEoaWQgaW4gaWRUb0NhbGxiYWNrKSkKICAgIHJldHVybjsKCiAgLy8gV2UgdXN1YWxseSBnZXQgYSAncGxhY2Vob2xkZXInIHRyZWUgZmlyc3QsIHdoaWNoIGRvZXNuJ3QgaGF2ZSBhbnkgdXJsCiAgLy8gYXR0cmlidXRlIG9yIGNoaWxkIG5vZGVzLiBJZiB3ZSd2ZSBnb3QgdGhhdCwgd2FpdCBmb3IgdGhlIGZ1bGwgdHJlZSBiZWZvcmUKICAvLyBjYWxsaW5nIHRoZSBjYWxsYmFjay4KICAvLyBUT0RPKGRtYXp6b25pKTogRG9uJ3Qgc2VuZCBkb3duIHBsYWNlaG9sZGVyIChjcmJ1Zy5jb20vMzk3NTUzKQogIGlmIChpZCAhPSBERVNLVE9QX1RSRUVfSUQgJiYgIXRhcmdldFRyZWUudXJsICYmCiAgICAgIHRhcmdldFRyZWUuY2hpbGRyZW4ubGVuZ3RoID09IDApCiAgICByZXR1cm47CgogIC8vIElmIHRoZSB0cmVlIHdhc24ndCBhdmFpbGFibGUgd2hlbiBnZXRUcmVlKCkgd2FzIGNhbGxlZCwgdGhlIGNhbGxiYWNrIHdpbGwKICAvLyBoYXZlIGJlZW4gY2FjaGVkIGluIGlkVG9DYWxsYmFjaywgc28gY2FsbCBhbmQgZGVsZXRlIGl0IG5vdyB0aGF0IHdlCiAgLy8gaGF2ZSB0aGUgY29tcGxldGUgdHJlZS4KICBmb3IgKHZhciBpID0gMDsgaSA8IGlkVG9DYWxsYmFja1tpZF0ubGVuZ3RoOyBpKyspIHsKICAgIHZhciBjYWxsYmFjayA9IGlkVG9DYWxsYmFja1tpZF1baV07CiAgICBjYWxsYmFjayh0YXJnZXRUcmVlKTsKICB9CiAgZGVsZXRlIGlkVG9DYWxsYmFja1tpZF07Cn0pOwoKYXV0b21hdGlvbkludGVybmFsLm9uQWNjZXNzaWJpbGl0eVRyZWVEZXN0cm95ZWQuYWRkTGlzdGVuZXIoZnVuY3Rpb24oaWQpIHsKICAvLyBEZXN0cm95IHRoZSBBdXRvbWF0aW9uUm9vdE5vZGUuCiAgdmFyIHRhcmdldFRyZWUgPSBBdXRvbWF0aW9uUm9vdE5vZGUuZ2V0KGlkKTsKICBpZiAodGFyZ2V0VHJlZSkgewogICAgcHJpdmF0ZXModGFyZ2V0VHJlZSkuaW1wbC5kZXN0cm95KCk7CiAgICBBdXRvbWF0aW9uUm9vdE5vZGUuZGVzdHJveShpZCk7CiAgfSBlbHNlIHsKICAgIGxvZ2dpbmcuV0FSTklORygnbm8gdGFyZ2V0VHJlZSB0byBkZXN0cm95Jyk7CiAgfQoKICAvLyBEZXN0cm95IHRoZSBuYXRpdmUgY2FjaGUgb2YgdGhlIGFjY2Vzc2liaWxpdHkgdHJlZS4KICBEZXN0cm95QWNjZXNzaWJpbGl0eVRyZWUoaWQpOwp9KTsKCmF1dG9tYXRpb25JbnRlcm5hbC5vbkFjY2Vzc2liaWxpdHlUcmVlU2VyaWFsaXphdGlvbkVycm9yLmFkZExpc3RlbmVyKAogICAgZnVuY3Rpb24oaWQpIHsKICBhdXRvbWF0aW9uSW50ZXJuYWwuZW5hYmxlRnJhbWUoaWQpOwp9KTsKCmF1dG9tYXRpb25JbnRlcm5hbC5vbkFjdGlvblJlc3VsdC5hZGRMaXN0ZW5lcigKICAgIGZ1bmN0aW9uKHRyZWVJRCwgcmVxdWVzdElELCByZXN1bHQpIHsKICB2YXIgdGFyZ2V0VHJlZSA9IEF1dG9tYXRpb25Sb290Tm9kZS5nZXQodHJlZUlEKTsKICBpZiAoIXRhcmdldFRyZWUpCiAgICByZXR1cm47CgogIHByaXZhdGVzKHRhcmdldFRyZWUpLmltcGwub25BY3Rpb25SZXN1bHQocmVxdWVzdElELCByZXN1bHQpOwogICAgfSk7CgppZiAoIWFwaUJyaWRnZSkKICBleHBvcnRzLiRzZXQoJ2JpbmRpbmcnLCBhdXRvbWF0aW9uLmdlbmVyYXRlKCkpOwovLyBDb3B5cmlnaHQgMjAxNCBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQovLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKdmFyIHV0aWxzID0gcmVxdWlyZSgndXRpbHMnKTsKCmZ1bmN0aW9uIEF1dG9tYXRpb25FdmVudEltcGwodHlwZSwgdGFyZ2V0LCBldmVudEZyb20pIHsKICB0aGlzLnByb3BhZ2F0aW9uU3RvcHBlZCA9IGZhbHNlOwogIHRoaXMudHlwZSA9IHR5cGU7CiAgdGhpcy50YXJnZXQgPSB0YXJnZXQ7CiAgdGhpcy5ldmVudFBoYXNlID0gRXZlbnQuTk9ORTsKICB0aGlzLmV2ZW50RnJvbSA9IGV2ZW50RnJvbTsKfQoKQXV0b21hdGlvbkV2ZW50SW1wbC5wcm90b3R5cGUgPSB7CiAgX19wcm90b19fOiBudWxsLAogIHN0b3BQcm9wYWdhdGlvbjogZnVuY3Rpb24oKSB7CiAgICB0aGlzLnByb3BhZ2F0aW9uU3RvcHBlZCA9IHRydWU7CiAgfSwKfTsKCmZ1bmN0aW9uIEF1dG9tYXRpb25FdmVudCgpIHsKICBwcml2YXRlcyhBdXRvbWF0aW9uRXZlbnQpLmNvbnN0cnVjdFByaXZhdGUodGhpcywgYXJndW1lbnRzKTsKfQp1dGlscy5leHBvc2UoQXV0b21hdGlvbkV2ZW50LCBBdXRvbWF0aW9uRXZlbnRJbXBsLCB7CiAgZnVuY3Rpb25zOiBbCiAgICAnc3RvcFByb3BhZ2F0aW9uJywKICBdLAogIHJlYWRvbmx5OiBbCiAgICAndHlwZScsCiAgICAndGFyZ2V0JywKICAgICdldmVudFBoYXNlJywKICAgICdldmVudEZyb20nLAogIF0sCn0pOwoKZXhwb3J0cy4kc2V0KCdBdXRvbWF0aW9uRXZlbnQnLCBBdXRvbWF0aW9uRXZlbnQpOwovLyBDb3B5cmlnaHQgMjAxNCBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQovLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKdmFyIEF1dG9tYXRpb25FdmVudCA9IHJlcXVpcmUoJ2F1dG9tYXRpb25FdmVudCcpLkF1dG9tYXRpb25FdmVudDsKdmFyIGF1dG9tYXRpb25JbnRlcm5hbCA9CiAgICBnZXRJbnRlcm5hbEFwaSA/CiAgICAgICAgZ2V0SW50ZXJuYWxBcGkoJ2F1dG9tYXRpb25JbnRlcm5hbCcpIDoKICAgICAgICByZXF1aXJlKCdiaW5kaW5nJykuQmluZGluZy5jcmVhdGUoJ2F1dG9tYXRpb25JbnRlcm5hbCcpLmdlbmVyYXRlKCk7CnZhciBleGNlcHRpb25IYW5kbGVyID0gcmVxdWlyZSgndW5jYXVnaHRfZXhjZXB0aW9uX2hhbmRsZXInKTsKCnZhciBuYXRpdmVzID0gcmVxdWlyZU5hdGl2ZSgnYXV0b21hdGlvbkludGVybmFsJyk7Cgp2YXIgSXNJbnRlcmFjdFBlcm1pdHRlZCA9IG5hdGl2ZXMuSXNJbnRlcmFjdFBlcm1pdHRlZDsKCi8qKgogKiBAcGFyYW0ge251bWJlcn0gYXhUcmVlSUQgVGhlIGlkIG9mIHRoZSBhY2Nlc3NpYmlsaXR5IHRyZWUuCiAqIEByZXR1cm4gez9udW1iZXJ9IFRoZSBpZCBvZiB0aGUgcm9vdCBub2RlLgogKi8KdmFyIEdldFJvb3RJRCA9IG5hdGl2ZXMuR2V0Um9vdElEOwoKLyoqCiAqIEBwYXJhbSB7bnVtYmVyfSBheFRyZWVJRCBUaGUgaWQgb2YgdGhlIGFjY2Vzc2liaWxpdHkgdHJlZS4KICogQHJldHVybiB7P3N0cmluZ30gVGhlIHRpdGxlIG9mIHRoZSBkb2N1bWVudC4KICovCnZhciBHZXREb2NUaXRsZSA9IG5hdGl2ZXMuR2V0RG9jVGl0bGU7CgovKioKICogQHBhcmFtIHtudW1iZXJ9IGF4VHJlZUlEIFRoZSBpZCBvZiB0aGUgYWNjZXNzaWJpbGl0eSB0cmVlLgogKiBAcmV0dXJuIHs/c3RyaW5nfSBUaGUgdXJsIG9mIHRoZSBkb2N1bWVudC4KICovCnZhciBHZXREb2NVUkwgPSBuYXRpdmVzLkdldERvY1VSTDsKCi8qKgogKiBAcGFyYW0ge251bWJlcn0gYXhUcmVlSUQgVGhlIGlkIG9mIHRoZSBhY2Nlc3NpYmlsaXR5IHRyZWUuCiAqIEByZXR1cm4gez9ib29sZWFufSBUcnVlIGlmIHRoZSBkb2N1bWVudCBoYXMgZmluaXNoZWQgbG9hZGluZy4KICovCnZhciBHZXREb2NMb2FkZWQgPSBuYXRpdmVzLkdldERvY0xvYWRlZDsKCi8qKgogKiBAcGFyYW0ge251bWJlcn0gYXhUcmVlSUQgVGhlIGlkIG9mIHRoZSBhY2Nlc3NpYmlsaXR5IHRyZWUuCiAqIEByZXR1cm4gez9udW1iZXJ9IFRoZSBsb2FkaW5nIHByb2dyZXNzLCBmcm9tIDAuMCB0byAxLjAgKGZ1bGx5IGxvYWRlZCkuCiAqLwp2YXIgR2V0RG9jTG9hZGluZ1Byb2dyZXNzID0KICAgIG5hdGl2ZXMuR2V0RG9jTG9hZGluZ1Byb2dyZXNzOwoKLyoqCiAqIEBwYXJhbSB7bnVtYmVyfSBheFRyZWVJRCBUaGUgaWQgb2YgdGhlIGFjY2Vzc2liaWxpdHkgdHJlZS4KICogQHJldHVybiB7P251bWJlcn0gVGhlIElEIG9mIHRoZSBzZWxlY3Rpb24gYW5jaG9yIG9iamVjdC4KICovCnZhciBHZXRBbmNob3JPYmplY3RJRCA9IG5hdGl2ZXMuR2V0QW5jaG9yT2JqZWN0SUQ7CgovKioKICogQHBhcmFtIHtudW1iZXJ9IGF4VHJlZUlEIFRoZSBpZCBvZiB0aGUgYWNjZXNzaWJpbGl0eSB0cmVlLgogKiBAcmV0dXJuIHs/bnVtYmVyfSBUaGUgc2VsZWN0aW9uIGFuY2hvciBvZmZzZXQuCiAqLwp2YXIgR2V0QW5jaG9yT2Zmc2V0ID0gbmF0aXZlcy5HZXRBbmNob3JPZmZzZXQ7CgovKioKICogQHBhcmFtIHtudW1iZXJ9IGF4VHJlZUlEIFRoZSBpZCBvZiB0aGUgYWNjZXNzaWJpbGl0eSB0cmVlLgogKiBAcmV0dXJuIHs/c3RyaW5nfSBUaGUgc2VsZWN0aW9uIGFuY2hvciBhZmZpbml0eS4KICovCnZhciBHZXRBbmNob3JBZmZpbml0eSA9IG5hdGl2ZXMuR2V0QW5jaG9yQWZmaW5pdHk7CgovKioKICogQHBhcmFtIHtudW1iZXJ9IGF4VHJlZUlEIFRoZSBpZCBvZiB0aGUgYWNjZXNzaWJpbGl0eSB0cmVlLgogKiBAcmV0dXJuIHs/bnVtYmVyfSBUaGUgSUQgb2YgdGhlIHNlbGVjdGlvbiBmb2N1cyBvYmplY3QuCiAqLwp2YXIgR2V0Rm9jdXNPYmplY3RJRCA9IG5hdGl2ZXMuR2V0Rm9jdXNPYmplY3RJRDsKCi8qKgogKiBAcGFyYW0ge251bWJlcn0gYXhUcmVlSUQgVGhlIGlkIG9mIHRoZSBhY2Nlc3NpYmlsaXR5IHRyZWUuCiAqIEByZXR1cm4gez9udW1iZXJ9IFRoZSBzZWxlY3Rpb24gZm9jdXMgb2Zmc2V0LgogKi8KdmFyIEdldEZvY3VzT2Zmc2V0ID0gbmF0aXZlcy5HZXRGb2N1c09mZnNldDsKCi8qKgogKiBAcGFyYW0ge251bWJlcn0gYXhUcmVlSUQgVGhlIGlkIG9mIHRoZSBhY2Nlc3NpYmlsaXR5IHRyZWUuCiAqIEByZXR1cm4gez9zdHJpbmd9IFRoZSBzZWxlY3Rpb24gZm9jdXMgYWZmaW5pdHkuCiAqLwp2YXIgR2V0Rm9jdXNBZmZpbml0eSA9IG5hdGl2ZXMuR2V0Rm9jdXNBZmZpbml0eTsKCi8qKgogKiBAcGFyYW0ge251bWJlcn0gYXhUcmVlSUQgVGhlIGlkIG9mIHRoZSBhY2Nlc3NpYmlsaXR5IHRyZWUuCiAqIEBwYXJhbSB7bnVtYmVyfSBub2RlSUQgVGhlIGlkIG9mIGEgbm9kZS4KICogQHJldHVybiB7P251bWJlcn0gVGhlIGlkIG9mIHRoZSBub2RlJ3MgcGFyZW50LCBvciB1bmRlZmluZWQgaWYgaXQncyB0aGUKICogICAgcm9vdCBvZiBpdHMgdHJlZSBvciBpZiB0aGUgdHJlZSBvciBub2RlIHdhc24ndCBmb3VuZC4KICovCnZhciBHZXRQYXJlbnRJRCA9IG5hdGl2ZXMuR2V0UGFyZW50SUQ7CgovKioKICogQHBhcmFtIHtudW1iZXJ9IGF4VHJlZUlEIFRoZSBpZCBvZiB0aGUgYWNjZXNzaWJpbGl0eSB0cmVlLgogKiBAcGFyYW0ge251bWJlcn0gbm9kZUlEIFRoZSBpZCBvZiBhIG5vZGUuCiAqIEByZXR1cm4gez9udW1iZXJ9IFRoZSBudW1iZXIgb2YgY2hpbGRyZW4gb2YgdGhlIG5vZGUsIG9yIHVuZGVmaW5lZCBpZgogKiAgICAgdGhlIHRyZWUgb3Igbm9kZSB3YXNuJ3QgZm91bmQuCiAqLwp2YXIgR2V0Q2hpbGRDb3VudCA9IG5hdGl2ZXMuR2V0Q2hpbGRDb3VudDsKCi8qKgogKiBAcGFyYW0ge251bWJlcn0gYXhUcmVlSUQgVGhlIGlkIG9mIHRoZSBhY2Nlc3NpYmlsaXR5IHRyZWUuCiAqIEBwYXJhbSB7bnVtYmVyfSBub2RlSUQgVGhlIGlkIG9mIGEgbm9kZS4KICogQHBhcmFtIHtudW1iZXJ9IGNoaWxkSW5kZXggQW4gaW5kZXggb2YgYSBjaGlsZCBvZiB0aGlzIG5vZGUuCiAqIEByZXR1cm4gez9udW1iZXJ9IFRoZSBpZCBvZiB0aGUgY2hpbGQgYXQgdGhlIGdpdmVuIGluZGV4LCBvciB1bmRlZmluZWQKICogICAgIGlmIHRoZSB0cmVlIG9yIG5vZGUgb3IgY2hpbGQgYXQgdGhhdCBpbmRleCB3YXNuJ3QgZm91bmQuCiAqLwp2YXIgR2V0Q2hpbGRJREF0SW5kZXggPSBuYXRpdmVzLkdldENoaWxkSURBdEluZGV4OwoKLyoqCiAqIEBwYXJhbSB7bnVtYmVyfSBheFRyZWVJRCBUaGUgaWQgb2YgdGhlIGFjY2Vzc2liaWxpdHkgdHJlZS4KICogQHBhcmFtIHtudW1iZXJ9IG5vZGVJRCBUaGUgaWQgb2YgYSBub2RlLgogKiBAcmV0dXJuIHs/bnVtYmVyfSBUaGUgaWRzIG9mIHRoZSBjaGlsZHJlbiBvZiB0aGUgbm9kZSwgb3IgdW5kZWZpbmVkCiAqICAgICBpZiB0aGUgdHJlZSBvciBub2RlIHdhc24ndCBmb3VuZC4KICovCnZhciBHZXRDaGlsZElkcyA9IG5hdGl2ZXMuR2V0Q2hpbGRJRHM7CgovKioKICogQHBhcmFtIHtudW1iZXJ9IGF4VHJlZUlEIFRoZSBpZCBvZiB0aGUgYWNjZXNzaWJpbGl0eSB0cmVlLgogKiBAcGFyYW0ge251bWJlcn0gbm9kZUlEIFRoZSBpZCBvZiBhIG5vZGUuCiAqIEByZXR1cm4gez9PYmplY3R9IEFuIG9iamVjdCBtYXBwaW5nIGh0bWwgYXR0cmlidXRlcyB0byB2YWx1ZXMuCiAqLwp2YXIgR2V0SHRtbEF0dHJpYnV0ZXMgPSBuYXRpdmVzLkdldEh0bWxBdHRyaWJ1dGVzOwoKLyoqCiAqIEBwYXJhbSB7bnVtYmVyfSBheFRyZWVJRCBUaGUgaWQgb2YgdGhlIGFjY2Vzc2liaWxpdHkgdHJlZS4KICogQHBhcmFtIHtudW1iZXJ9IG5vZGVJRCBUaGUgaWQgb2YgYSBub2RlLgogKiBAcmV0dXJuIHs/bnVtYmVyfSBUaGUgaW5kZXggb2YgdGhpcyBub2RlIGluIGl0cyBwYXJlbnQsIG9yIHVuZGVmaW5lZCBpZgogKiAgICAgdGhlIHRyZWUgb3Igbm9kZSBvciBub2RlIHBhcmVudCB3YXNuJ3QgZm91bmQuCiAqLwp2YXIgR2V0SW5kZXhJblBhcmVudCA9IG5hdGl2ZXMuR2V0SW5kZXhJblBhcmVudDsKCi8qKgogKiBAcGFyYW0ge251bWJlcn0gYXhUcmVlSUQgVGhlIGlkIG9mIHRoZSBhY2Nlc3NpYmlsaXR5IHRyZWUuCiAqIEBwYXJhbSB7bnVtYmVyfSBub2RlSUQgVGhlIGlkIG9mIGEgbm9kZS4KICogQHJldHVybiB7P09iamVjdH0gQW4gb2JqZWN0IHdpdGggYSBzdHJpbmcga2V5IGZvciBldmVyeSBzdGF0ZSBmbGFnIHNldCwKICogICAgIG9yIHVuZGVmaW5lZCBpZiB0aGUgdHJlZSBvciBub2RlIG9yIG5vZGUgcGFyZW50IHdhc24ndCBmb3VuZC4KICovCnZhciBHZXRTdGF0ZSA9IG5hdGl2ZXMuR2V0U3RhdGU7CgovKioKICogQHBhcmFtIHtudW1iZXJ9IGF4VHJlZUlEIFRoZSBpZCBvZiB0aGUgYWNjZXNzaWJpbGl0eSB0cmVlLgogKiBAcGFyYW0ge251bWJlcn0gbm9kZUlEIFRoZSBpZCBvZiBhIG5vZGUuCiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHJlc3RyaWN0aW9uLCBvbmUgb2YKICogImRpc2FibGVkIiwgInJlYWRPbmx5IiBvciB1bmRlZmluZWQgaWYgZW5hYmxlZCBvciBvdGhlciBvYmplY3Qgbm90IGRpc2FibGVkCiAqLwp2YXIgR2V0UmVzdHJpY3Rpb24gPSBuYXRpdmVzLkdldFJlc3RyaWN0aW9uOwoKLyoqCiAqIEBwYXJhbSB7bnVtYmVyfSBheFRyZWVJRCBUaGUgaWQgb2YgdGhlIGFjY2Vzc2liaWxpdHkgdHJlZS4KICogQHBhcmFtIHtudW1iZXJ9IG5vZGVJRCBUaGUgaWQgb2YgYSBub2RlLgogKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBjaGVja2VkIHN0YXRlLCBhcyB1bmRlZmluZWQsICJ0cnVlIiwgImZhbHNlIiBvciAibWl4ZWQiLgogKi8KdmFyIEdldENoZWNrZWQgPSBuYXRpdmVzLkdldENoZWNrZWQ7CgovKioKICogQHBhcmFtIHtudW1iZXJ9IGF4VHJlZUlEIFRoZSBpZCBvZiB0aGUgYWNjZXNzaWJpbGl0eSB0cmVlLgogKiBAcGFyYW0ge251bWJlcn0gbm9kZUlEIFRoZSBpZCBvZiBhIG5vZGUuCiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHJvbGUgb2YgdGhlIG5vZGUsIG9yIHVuZGVmaW5lZCBpZiB0aGUgdHJlZSBvcgogKiAgICAgbm9kZSB3YXNuJ3QgZm91bmQuCiAqLwp2YXIgR2V0Um9sZSA9IG5hdGl2ZXMuR2V0Um9sZTsKCi8qKgogKiBAcGFyYW0ge251bWJlcn0gYXhUcmVlSUQgVGhlIGlkIG9mIHRoZSBhY2Nlc3NpYmlsaXR5IHRyZWUuCiAqIEBwYXJhbSB7bnVtYmVyfSBub2RlSUQgVGhlIGlkIG9mIGEgbm9kZS4KICogQHJldHVybiB7P2F1dG9tYXRpb24uUmVjdH0gVGhlIGxvY2F0aW9uIG9mIHRoZSBub2RlLCBvciB1bmRlZmluZWQgaWYKICogICAgIHRoZSB0cmVlIG9yIG5vZGUgd2Fzbid0IGZvdW5kLgogKi8KdmFyIEdldExvY2F0aW9uID0gbmF0aXZlcy5HZXRMb2NhdGlvbjsKCi8qKgogKiBAcGFyYW0ge251bWJlcn0gYXhUcmVlSUQgVGhlIGlkIG9mIHRoZSBhY2Nlc3NpYmlsaXR5IHRyZWUuCiAqIEBwYXJhbSB7bnVtYmVyfSBub2RlSUQgVGhlIGlkIG9mIGEgbm9kZS4KICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0SW5kZXggVGhlIHN0YXJ0IGluZGV4IG9mIHRoZSByYW5nZS4KICogQHBhcmFtIHtudW1iZXJ9IGVuZEluZGV4IFRoZSBlbmQgaW5kZXggb2YgdGhlIHJhbmdlLgogKiBAcmV0dXJuIHs/YXV0b21hdGlvbi5SZWN0fSBUaGUgYm91bmRpbmcgYm94IG9mIHRoZSBzdWJyYW5nZSBvZiB0aGlzIG5vZGUsCiAqICAgICBvciB0aGUgbG9jYXRpb24gaWYgdGhlcmUgYXJlIG5vIHN1YnJhbmdlcywgb3IgdW5kZWZpbmVkIGlmCiAqICAgICB0aGUgdHJlZSBvciBub2RlIHdhc24ndCBmb3VuZC4KICovCnZhciBHZXRCb3VuZHNGb3JSYW5nZSA9IG5hdGl2ZXMuR2V0Qm91bmRzRm9yUmFuZ2U7CgovKioKICogQHBhcmFtIHtudW1iZXJ9IGF4VHJlZUlEIFRoZSBpZCBvZiB0aGUgYWNjZXNzaWJpbGl0eSB0cmVlLgogKiBAcGFyYW0ge251bWJlcn0gbm9kZUlEIFRoZSBpZCBvZiBhIG5vZGUuCiAqIEByZXR1cm4gez9hdXRvbWF0aW9uLlJlY3R9IFRoZSB1bmNsaXBwZWQgbG9jYXRpb24gb2YgdGhlIG5vZGUsIG9yCiAqIHVuZGVmaW5lZCBpZiB0aGUgdHJlZSBvciBub2RlIHdhc24ndCBmb3VuZC4KICovCnZhciBHZXRVbmNsaXBwZWRMb2NhdGlvbiA9IG5hdGl2ZXMuR2V0VW5jbGlwcGVkTG9jYXRpb247CgovKioKICogQHBhcmFtIHtudW1iZXJ9IGF4VHJlZUlEIFRoZSBpZCBvZiB0aGUgYWNjZXNzaWJpbGl0eSB0cmVlLgogKiBAcGFyYW0ge251bWJlcn0gbm9kZUlEIFRoZSBpZCBvZiBhIG5vZGUuCiAqIEByZXR1cm4geyFBcnJheS48bnVtYmVyPn0gVGhlIHRleHQgb2Zmc2V0IHdoZXJlIGVhY2ggbGluZSBzdGFydHMsIG9yIGFuIGVtcHR5CiAqICAgICBhcnJheSBpZiB0aGlzIG5vZGUgaGFzIG5vIHRleHQgY29udGVudCwgb3IgdW5kZWZpbmVkIGlmIHRoZSB0cmVlIG9yIG5vZGUKICogICAgIHdhcyBub3QgZm91bmQuCiAqLwp2YXIgR2V0TGluZVN0YXJ0T2Zmc2V0cyA9IHJlcXVpcmVOYXRpdmUoCiAgICAnYXV0b21hdGlvbkludGVybmFsJykuR2V0TGluZVN0YXJ0T2Zmc2V0czsKCi8qKgogKiBAcGFyYW0ge251bWJlcn0gYXhUcmVlSUQgVGhlIGlkIG9mIHRoZSBhY2Nlc3NpYmlsaXR5IHRyZWUuCiAqIEBwYXJhbSB7bnVtYmVyfSBub2RlSUQgVGhlIGlkIG9mIGEgbm9kZS4KICogQHBhcmFtIHtzdHJpbmd9IGF0dHIgVGhlIG5hbWUgb2YgYSBzdHJpbmcgYXR0cmlidXRlLgogKiBAcmV0dXJuIHs/c3RyaW5nfSBUaGUgdmFsdWUgb2YgdGhpcyBhdHRyaWJ1dGUsIG9yIHVuZGVmaW5lZCBpZiB0aGUgdHJlZSwKICogICAgIG5vZGUsIG9yIGF0dHJpYnV0ZSB3YXNuJ3QgZm91bmQuCiAqLwp2YXIgR2V0U3RyaW5nQXR0cmlidXRlID0gbmF0aXZlcy5HZXRTdHJpbmdBdHRyaWJ1dGU7CgovKioKICogQHBhcmFtIHtudW1iZXJ9IGF4VHJlZUlEIFRoZSBpZCBvZiB0aGUgYWNjZXNzaWJpbGl0eSB0cmVlLgogKiBAcGFyYW0ge251bWJlcn0gbm9kZUlEIFRoZSBpZCBvZiBhIG5vZGUuCiAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyIFRoZSBuYW1lIG9mIGFuIGF0dHJpYnV0ZS4KICogQHJldHVybiB7P2Jvb2xlYW59IFRoZSB2YWx1ZSBvZiB0aGlzIGF0dHJpYnV0ZSwgb3IgdW5kZWZpbmVkIGlmIHRoZSB0cmVlLAogKiAgICAgbm9kZSwgb3IgYXR0cmlidXRlIHdhc24ndCBmb3VuZC4KICovCnZhciBHZXRCb29sQXR0cmlidXRlID0gbmF0aXZlcy5HZXRCb29sQXR0cmlidXRlOwoKLyoqCiAqIEBwYXJhbSB7bnVtYmVyfSBheFRyZWVJRCBUaGUgaWQgb2YgdGhlIGFjY2Vzc2liaWxpdHkgdHJlZS4KICogQHBhcmFtIHtudW1iZXJ9IG5vZGVJRCBUaGUgaWQgb2YgYSBub2RlLgogKiBAcGFyYW0ge3N0cmluZ30gYXR0ciBUaGUgbmFtZSBvZiBhbiBhdHRyaWJ1dGUuCiAqIEByZXR1cm4gez9udW1iZXJ9IFRoZSB2YWx1ZSBvZiB0aGlzIGF0dHJpYnV0ZSwgb3IgdW5kZWZpbmVkIGlmIHRoZSB0cmVlLAogKiAgICAgbm9kZSwgb3IgYXR0cmlidXRlIHdhc24ndCBmb3VuZC4KICovCnZhciBHZXRJbnRBdHRyaWJ1dGUgPSBuYXRpdmVzLkdldEludEF0dHJpYnV0ZTsKCi8qKgogKiBAcGFyYW0ge251bWJlcn0gYXhUcmVlSUQgVGhlIGlkIG9mIHRoZSBhY2Nlc3NpYmlsaXR5IHRyZWUuCiAqIEBwYXJhbSB7bnVtYmVyfSBub2RlSUQgVGhlIGlkIG9mIGEgbm9kZS4KICogQHBhcmFtIHtzdHJpbmd9IGF0dHIgVGhlIG5hbWUgb2YgYW4gYXR0cmlidXRlLgogKiBAcmV0dXJuIHs/bnVtYmVyfSBUaGUgdmFsdWUgb2YgdGhpcyBhdHRyaWJ1dGUsIG9yIHVuZGVmaW5lZCBpZiB0aGUgdHJlZSwKICogICAgIG5vZGUsIG9yIGF0dHJpYnV0ZSB3YXNuJ3QgZm91bmQuCiAqLwp2YXIgR2V0RmxvYXRBdHRyaWJ1dGUgPSBuYXRpdmVzLkdldEZsb2F0QXR0cmlidXRlOwoKLyoqCiAqIEBwYXJhbSB7bnVtYmVyfSBheFRyZWVJRCBUaGUgaWQgb2YgdGhlIGFjY2Vzc2liaWxpdHkgdHJlZS4KICogQHBhcmFtIHtudW1iZXJ9IG5vZGVJRCBUaGUgaWQgb2YgYSBub2RlLgogKiBAcGFyYW0ge3N0cmluZ30gYXR0ciBUaGUgbmFtZSBvZiBhbiBhdHRyaWJ1dGUuCiAqIEByZXR1cm4gez9BcnJheS48bnVtYmVyPn0gVGhlIHZhbHVlIG9mIHRoaXMgYXR0cmlidXRlLCBvciB1bmRlZmluZWQKICogICAgIGlmIHRoZSB0cmVlLCBub2RlLCBvciBhdHRyaWJ1dGUgd2Fzbid0IGZvdW5kLgogKi8KdmFyIEdldEludExpc3RBdHRyaWJ1dGUgPQogICAgbmF0aXZlcy5HZXRJbnRMaXN0QXR0cmlidXRlOwoKLyoqCiAqIEBwYXJhbSB7bnVtYmVyfSBheFRyZWVJRCBUaGUgaWQgb2YgdGhlIGFjY2Vzc2liaWxpdHkgdHJlZS4KICogQHBhcmFtIHtudW1iZXJ9IG5vZGVJRCBUaGUgaWQgb2YgYSBub2RlLgogKiBAcGFyYW0ge3N0cmluZ30gYXR0ciBUaGUgbmFtZSBvZiBhbiBIVE1MIGF0dHJpYnV0ZS4KICogQHJldHVybiB7P3N0cmluZ30gVGhlIHZhbHVlIG9mIHRoaXMgYXR0cmlidXRlLCBvciB1bmRlZmluZWQgaWYgdGhlIHRyZWUsCiAqICAgICBub2RlLCBvciBhdHRyaWJ1dGUgd2Fzbid0IGZvdW5kLgogKi8KdmFyIEdldEh0bWxBdHRyaWJ1dGUgPSBuYXRpdmVzLkdldEh0bWxBdHRyaWJ1dGU7CgovKioKICogQHBhcmFtIHtudW1iZXJ9IGF4VHJlZUlEIFRoZSBpZCBvZiB0aGUgYWNjZXNzaWJpbGl0eSB0cmVlLgogKiBAcGFyYW0ge251bWJlcn0gbm9kZUlEIFRoZSBpZCBvZiBhIG5vZGUuCiAqIEByZXR1cm4ge2F1dG9tYXRpb24uTmFtZUZyb21UeXBlfSBUaGUgc291cmNlIG9mIHRoZSBub2RlJ3MgbmFtZS4KICovCnZhciBHZXROYW1lRnJvbSA9IG5hdGl2ZXMuR2V0TmFtZUZyb207CgovKioKICogQHBhcmFtIHtudW1iZXJ9IGF4VHJlZUlEIFRoZSBpZCBvZiB0aGUgYWNjZXNzaWJpbGl0eSB0cmVlLgogKiBAcGFyYW0ge251bWJlcn0gbm9kZUlEIFRoZSBpZCBvZiBhIG5vZGUuCiAqIEByZXR1cm4ge2Jvb2xlYW59CiAqLwp2YXIgR2V0Qm9sZCA9IG5hdGl2ZXMuR2V0Qm9sZDsKCi8qKgogKiBAcGFyYW0ge251bWJlcn0gYXhUcmVlSUQgVGhlIGlkIG9mIHRoZSBhY2Nlc3NpYmlsaXR5IHRyZWUuCiAqIEBwYXJhbSB7bnVtYmVyfSBub2RlSUQgVGhlIGlkIG9mIGEgbm9kZS4KICogQHJldHVybiB7Ym9vbGVhbn0KICovCnZhciBHZXRJdGFsaWMgPSBuYXRpdmVzLkdldEl0YWxpYzsKCi8qKgogKiBAcGFyYW0ge251bWJlcn0gYXhUcmVlSUQgVGhlIGlkIG9mIHRoZSBhY2Nlc3NpYmlsaXR5IHRyZWUuCiAqIEBwYXJhbSB7bnVtYmVyfSBub2RlSUQgVGhlIGlkIG9mIGEgbm9kZS4KICogQHJldHVybiB7Ym9vbGVhbn0KICovCnZhciBHZXRVbmRlcmxpbmUgPSBuYXRpdmVzLkdldFVuZGVybGluZTsKCi8qKgogKiBAcGFyYW0ge251bWJlcn0gYXhUcmVlSUQgVGhlIGlkIG9mIHRoZSBhY2Nlc3NpYmlsaXR5IHRyZWUuCiAqIEBwYXJhbSB7bnVtYmVyfSBub2RlSUQgVGhlIGlkIG9mIGEgbm9kZS4KICogQHJldHVybiB7Ym9vbGVhbn0KICovCnZhciBHZXRMaW5lVGhyb3VnaCA9IG5hdGl2ZXMuR2V0TGluZVRocm91Z2g7CgovKioKICogQHBhcmFtIHtudW1iZXJ9IGF4VHJlZUlEIFRoZSBpZCBvZiB0aGUgYWNjZXNzaWJpbGl0eSB0cmVlLgogKiBAcGFyYW0ge251bWJlcn0gbm9kZUlEIFRoZSBpZCBvZiBhIG5vZGUuCiAqIEByZXR1cm4gez9BcnJheS48YXV0b21hdGlvbi5DdXN0b21BY3Rpb24+fSBMaXN0IG9mIGN1c3RvbSBhY3Rpb25zIG9mIHRoZQogKiAgICAgbm9kZS4KICovCnZhciBHZXRDdXN0b21BY3Rpb25zID0gbmF0aXZlcy5HZXRDdXN0b21BY3Rpb25zOwoKdmFyIGxvZ2dpbmcgPSByZXF1aXJlTmF0aXZlKCdsb2dnaW5nJyk7CnZhciB1dGlscyA9IHJlcXVpcmUoJ3V0aWxzJyk7CgovKioKICogQSBzaW5nbGUgbm9kZSBpbiB0aGUgQXV0b21hdGlvbiB0cmVlLgogKiBAcGFyYW0ge0F1dG9tYXRpb25Sb290Tm9kZUltcGx9IHJvb3QgVGhlIHJvb3Qgb2YgdGhlIHRyZWUuCiAqIEBjb25zdHJ1Y3RvcgogKi8KZnVuY3Rpb24gQXV0b21hdGlvbk5vZGVJbXBsKHJvb3QpIHsKICB0aGlzLnJvb3RJbXBsID0gcm9vdDsKICB0aGlzLmhvc3ROb2RlXyA9IG51bGw7CiAgdGhpcy5saXN0ZW5lcnMgPSB7X19wcm90b19fOiBudWxsfTsKfQoKQXV0b21hdGlvbk5vZGVJbXBsLnByb3RvdHlwZSA9IHsKICBfX3Byb3RvX186IG51bGwsCiAgdHJlZUlEOiAtMSwKICBpZDogLTEsCiAgaXNSb290Tm9kZTogZmFsc2UsCgogIGRldGFjaDogZnVuY3Rpb24oKSB7CiAgICB0aGlzLnJvb3RJbXBsID0gbnVsbDsKICAgIHRoaXMuaG9zdE5vZGVfID0gbnVsbDsKICAgIHRoaXMubGlzdGVuZXJzID0ge19fcHJvdG9fXzogbnVsbH07CiAgfSwKCiAgZ2V0IHJvb3QoKSB7CiAgICByZXR1cm4gdGhpcy5yb290SW1wbCAmJiB0aGlzLnJvb3RJbXBsLndyYXBwZXI7CiAgfSwKCiAgZ2V0IHBhcmVudCgpIHsKICAgIGlmICghdGhpcy5yb290SW1wbCkKICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICAgIGlmICh0aGlzLmhvc3ROb2RlXykKICAgICAgcmV0dXJuIHRoaXMuaG9zdE5vZGVfOwogICAgdmFyIHBhcmVudElEID0gR2V0UGFyZW50SUQodGhpcy50cmVlSUQsIHRoaXMuaWQpOwogICAgcmV0dXJuIHRoaXMucm9vdEltcGwuZ2V0KHBhcmVudElEKTsKICB9LAoKICBnZXQgaHRtbEF0dHJpYnV0ZXMoKSB7CiAgICByZXR1cm4gR2V0SHRtbEF0dHJpYnV0ZXModGhpcy50cmVlSUQsIHRoaXMuaWQpIHx8IHt9OwogIH0sCgogIGdldCBzdGF0ZSgpIHsKICAgIHJldHVybiBHZXRTdGF0ZSh0aGlzLnRyZWVJRCwgdGhpcy5pZCkgfHwge307CiAgfSwKCiAgZ2V0IHJvbGUoKSB7CiAgICByZXR1cm4gR2V0Um9sZSh0aGlzLnRyZWVJRCwgdGhpcy5pZCk7CiAgfSwKCiAgZ2V0IHJlc3RyaWN0aW9uKCkgewogICAgcmV0dXJuIEdldFJlc3RyaWN0aW9uKHRoaXMudHJlZUlELCB0aGlzLmlkKTsKICB9LAoKICBnZXQgY2hlY2tlZCgpIHsKICAgIHJldHVybiBHZXRDaGVja2VkKHRoaXMudHJlZUlELCB0aGlzLmlkKTsKICB9LAoKICBnZXQgbG9jYXRpb24oKSB7CiAgICByZXR1cm4gR2V0TG9jYXRpb24odGhpcy50cmVlSUQsIHRoaXMuaWQpOwogIH0sCgogIGJvdW5kc0ZvclJhbmdlOiBmdW5jdGlvbihzdGFydEluZGV4LCBlbmRJbmRleCkgewogICAgcmV0dXJuIEdldEJvdW5kc0ZvclJhbmdlKHRoaXMudHJlZUlELCB0aGlzLmlkLCBzdGFydEluZGV4LCBlbmRJbmRleCk7CiAgfSwKCiAgZ2V0IHVuY2xpcHBlZExvY2F0aW9uKCkgewogICAgdmFyIHJlc3VsdCA9IEdldFVuY2xpcHBlZExvY2F0aW9uKHRoaXMudHJlZUlELCB0aGlzLmlkKTsKICAgIGlmIChyZXN1bHQgPT09IHVuZGVmaW5lZCkKICAgICAgcmVzdWx0ID0gR2V0TG9jYXRpb24odGhpcy50cmVlSUQsIHRoaXMuaWQpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9LAoKICBnZXQgaW5kZXhJblBhcmVudCgpIHsKICAgIHJldHVybiBHZXRJbmRleEluUGFyZW50KHRoaXMudHJlZUlELCB0aGlzLmlkKTsKICB9LAoKICBnZXQgbGluZVN0YXJ0T2Zmc2V0cygpIHsKICAgIHJldHVybiBHZXRMaW5lU3RhcnRPZmZzZXRzKHRoaXMudHJlZUlELCB0aGlzLmlkKTsKICB9LAoKICBnZXQgY2hpbGRUcmVlKCkgewogICAgdmFyIGNoaWxkVHJlZUlEID0gR2V0SW50QXR0cmlidXRlKHRoaXMudHJlZUlELCB0aGlzLmlkLCAnY2hpbGRUcmVlSWQnKTsKICAgIGlmIChjaGlsZFRyZWVJRCkKICAgICAgcmV0dXJuIEF1dG9tYXRpb25Sb290Tm9kZUltcGwuZ2V0KGNoaWxkVHJlZUlEKTsKICB9LAoKICBnZXQgZmlyc3RDaGlsZCgpIHsKICAgIGlmICghdGhpcy5yb290SW1wbCkKICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICAgIGlmICh0aGlzLmNoaWxkVHJlZSkKICAgICAgcmV0dXJuIHRoaXMuY2hpbGRUcmVlOwogICAgaWYgKCFHZXRDaGlsZENvdW50KHRoaXMudHJlZUlELCB0aGlzLmlkKSkKICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICAgIHZhciBmaXJzdENoaWxkSUQgPSBHZXRDaGlsZElEQXRJbmRleCh0aGlzLnRyZWVJRCwgdGhpcy5pZCwgMCk7CiAgICByZXR1cm4gdGhpcy5yb290SW1wbC5nZXQoZmlyc3RDaGlsZElEKTsKICB9LAoKICBnZXQgbGFzdENoaWxkKCkgewogICAgaWYgKCF0aGlzLnJvb3RJbXBsKQogICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgaWYgKHRoaXMuY2hpbGRUcmVlKQogICAgICByZXR1cm4gdGhpcy5jaGlsZFRyZWU7CiAgICB2YXIgY291bnQgPSBHZXRDaGlsZENvdW50KHRoaXMudHJlZUlELCB0aGlzLmlkKTsKICAgIGlmICghY291bnQpCiAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICB2YXIgbGFzdENoaWxkSUQgPSBHZXRDaGlsZElEQXRJbmRleCh0aGlzLnRyZWVJRCwgdGhpcy5pZCwgY291bnQgLSAxKTsKICAgIHJldHVybiB0aGlzLnJvb3RJbXBsLmdldChsYXN0Q2hpbGRJRCk7CiAgfSwKCiAgZ2V0IGNoaWxkcmVuKCkgewogICAgaWYgKCF0aGlzLnJvb3RJbXBsKQogICAgICByZXR1cm4gW107CgogICAgaWYgKHRoaXMuY2hpbGRUcmVlKQogICAgICByZXR1cm4gW3RoaXMuY2hpbGRUcmVlXTsKCiAgICB2YXIgY2hpbGRyZW4gPSBbXTsKICAgIHZhciBjaGlsZElkcyA9IEdldENoaWxkSWRzKHRoaXMudHJlZUlELCB0aGlzLmlkKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRJZHMubGVuZ3RoOyArK2kpIHsKICAgICAgdmFyIGNoaWxkSUQgPSBjaGlsZElkc1tpXTsKICAgICAgdmFyIGNoaWxkID0gdGhpcy5yb290SW1wbC5nZXQoY2hpbGRJRCk7CiAgICAgICRBcnJheS5wdXNoKGNoaWxkcmVuLCBjaGlsZCk7CiAgICB9CiAgICByZXR1cm4gY2hpbGRyZW47CiAgfSwKCiAgZ2V0IHByZXZpb3VzU2libGluZygpIHsKICAgIHZhciBwYXJlbnQgPSB0aGlzLnBhcmVudDsKICAgIGlmICghcGFyZW50KQogICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgcGFyZW50ID0gcHJpdmF0ZXMocGFyZW50KS5pbXBsOwogICAgdmFyIGluZGV4SW5QYXJlbnQgPSBHZXRJbmRleEluUGFyZW50KHRoaXMudHJlZUlELCB0aGlzLmlkKTsKICAgIHJldHVybiB0aGlzLnJvb3RJbXBsLmdldCgKICAgICAgICBHZXRDaGlsZElEQXRJbmRleChwYXJlbnQudHJlZUlELCBwYXJlbnQuaWQsIGluZGV4SW5QYXJlbnQgLSAxKSk7CiAgfSwKCiAgZ2V0IG5leHRTaWJsaW5nKCkgewogICAgdmFyIHBhcmVudCA9IHRoaXMucGFyZW50OwogICAgaWYgKCFwYXJlbnQpCiAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICBwYXJlbnQgPSBwcml2YXRlcyhwYXJlbnQpLmltcGw7CiAgICB2YXIgaW5kZXhJblBhcmVudCA9IEdldEluZGV4SW5QYXJlbnQodGhpcy50cmVlSUQsIHRoaXMuaWQpOwogICAgcmV0dXJuIHRoaXMucm9vdEltcGwuZ2V0KAogICAgICAgIEdldENoaWxkSURBdEluZGV4KHBhcmVudC50cmVlSUQsIHBhcmVudC5pZCwgaW5kZXhJblBhcmVudCArIDEpKTsKICB9LAoKICBnZXQgbmFtZUZyb20oKSB7CiAgICByZXR1cm4gR2V0TmFtZUZyb20odGhpcy50cmVlSUQsIHRoaXMuaWQpOwogIH0sCgogIGdldCBib2xkKCkgewogICAgcmV0dXJuIEdldEJvbGQodGhpcy50cmVlSUQsIHRoaXMuaWQpOwogIH0sCgogIGdldCBpdGFsaWMoKSB7CiAgICByZXR1cm4gR2V0SXRhbGljKHRoaXMudHJlZUlELCB0aGlzLmlkKTsKICB9LAoKICBnZXQgdW5kZXJsaW5lKCkgewogICAgcmV0dXJuIEdldFVuZGVybGluZSh0aGlzLnRyZWVJRCwgdGhpcy5pZCk7CiAgfSwKCiAgZ2V0IGxpbmVUaHJvdWdoKCkgewogICAgcmV0dXJuIEdldExpbmVUaHJvdWdoKHRoaXMudHJlZUlELCB0aGlzLmlkKTsKICB9LAoKICBnZXQgY3VzdG9tQWN0aW9ucygpIHsKICAgIHJldHVybiBHZXRDdXN0b21BY3Rpb25zKHRoaXMudHJlZUlELCB0aGlzLmlkKTsKICB9LAoKICBkb0RlZmF1bHQ6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5wZXJmb3JtQWN0aW9uXygnZG9EZWZhdWx0Jyk7CiAgfSwKCiAgZm9jdXM6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5wZXJmb3JtQWN0aW9uXygnZm9jdXMnKTsKICB9LAoKICBnZXRJbWFnZURhdGE6IGZ1bmN0aW9uKG1heFdpZHRoLCBtYXhIZWlnaHQpIHsKICAgIHRoaXMucGVyZm9ybUFjdGlvbl8oJ2dldEltYWdlRGF0YScsCiAgICAgICAgICAgICAgICAgICAgICAgIHsgbWF4V2lkdGg6IG1heFdpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgIG1heEhlaWdodDogbWF4SGVpZ2h0IH0pOwogIH0sCgogIGhpdFRlc3Q6IGZ1bmN0aW9uKHgsIHksIGV2ZW50VG9GaXJlKSB7CiAgICB0aGlzLmhpdFRlc3RJbnRlcm5hbCh4LCB5LCBldmVudFRvRmlyZSk7CiAgfSwKCiAgaGl0VGVzdFdpdGhSZXBseTogZnVuY3Rpb24oeCwgeSwgb3B0X2NhbGxiYWNrKSB7CiAgICB0aGlzLmhpdFRlc3RJbnRlcm5hbCh4LCB5LCAnaGl0VGVzdFJlc3VsdCcsIG9wdF9jYWxsYmFjayk7CiAgfSwKCiAgaGl0VGVzdEludGVybmFsOiBmdW5jdGlvbih4LCB5LCBldmVudFRvRmlyZSwgb3B0X2NhbGxiYWNrKSB7CiAgICAvLyBDb252ZXJ0IGZyb20gZ2xvYmFsIHRvIHRyZWUtcmVsYXRpdmUgY29vcmRpbmF0ZXMuCiAgICB2YXIgbG9jYXRpb24gPSBHZXRMb2NhdGlvbih0aGlzLnRyZWVJRCwgR2V0Um9vdElEKHRoaXMudHJlZUlEKSk7CiAgICB0aGlzLnBlcmZvcm1BY3Rpb25fKCdoaXRUZXN0JywKICAgICAgICAgICAgICAgICAgICAgICAgeyB4OiBNYXRoLmZsb29yKHggLSBsb2NhdGlvbi5sZWZ0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICB5OiBNYXRoLmZsb29yKHkgLSBsb2NhdGlvbi50b3ApLAogICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VG9GaXJlOiBldmVudFRvRmlyZSB9LAogICAgICAgICAgICAgICAgICAgICAgICBvcHRfY2FsbGJhY2spOwogIH0sCgogIG1ha2VWaXNpYmxlOiBmdW5jdGlvbigpIHsKICAgIHRoaXMucGVyZm9ybUFjdGlvbl8oJ21ha2VWaXNpYmxlJyk7CiAgfSwKCiAgcGVyZm9ybUN1c3RvbUFjdGlvbjogZnVuY3Rpb24oY3VzdG9tQWN0aW9uSWQpIHsKICAgIHRoaXMucGVyZm9ybUFjdGlvbl8oJ2N1c3RvbUFjdGlvbicsIHsgY3VzdG9tQWN0aW9uSUQ6IGN1c3RvbUFjdGlvbklkIH0pOwogIH0sCgogIHJlc3VtZU1lZGlhOiBmdW5jdGlvbigpIHsKICAgIHRoaXMucGVyZm9ybUFjdGlvbl8oJ3Jlc3VtZU1lZGlhJyk7CiAgfSwKCiAgc2Nyb2xsQmFja3dhcmQ6IGZ1bmN0aW9uKG9wdF9jYWxsYmFjaykgewogICAgdGhpcy5wZXJmb3JtQWN0aW9uXygnc2Nyb2xsQmFja3dhcmQnLCB7fSwgb3B0X2NhbGxiYWNrKTsKICB9LAoKICBzY3JvbGxGb3J3YXJkOiBmdW5jdGlvbihvcHRfY2FsbGJhY2spIHsKICAgIHRoaXMucGVyZm9ybUFjdGlvbl8oJ3Njcm9sbEZvcndhcmQnLCB7fSwgb3B0X2NhbGxiYWNrKTsKICB9LAoKICBzY3JvbGxVcDogZnVuY3Rpb24ob3B0X2NhbGxiYWNrKSB7CiAgICB0aGlzLnBlcmZvcm1BY3Rpb25fKCdzY3JvbGxVcCcsIHt9LCBvcHRfY2FsbGJhY2spOwogIH0sCgogIHNjcm9sbERvd246IGZ1bmN0aW9uKG9wdF9jYWxsYmFjaykgewogICAgdGhpcy5wZXJmb3JtQWN0aW9uXygnc2Nyb2xsRG93bicsIHt9LCBvcHRfY2FsbGJhY2spOwogIH0sCgogIHNjcm9sbExlZnQ6IGZ1bmN0aW9uKG9wdF9jYWxsYmFjaykgewogICAgdGhpcy5wZXJmb3JtQWN0aW9uXygnc2Nyb2xsTGVmdCcsIHt9LCBvcHRfY2FsbGJhY2spOwogIH0sCgogIHNjcm9sbFJpZ2h0OiBmdW5jdGlvbihvcHRfY2FsbGJhY2spIHsKICAgIHRoaXMucGVyZm9ybUFjdGlvbl8oJ3Njcm9sbFJpZ2h0Jywge30sIG9wdF9jYWxsYmFjayk7CiAgfSwKCiAgc2V0U2VsZWN0aW9uOiBmdW5jdGlvbihzdGFydEluZGV4LCBlbmRJbmRleCkgewogICAgaWYgKHRoaXMuc3RhdGUuZWRpdGFibGUpIHsKICAgICAgdGhpcy5wZXJmb3JtQWN0aW9uXygnc2V0U2VsZWN0aW9uJywKICAgICAgICAgICAgICAgICAgICAgICAgICB7IGZvY3VzTm9kZUlEOiB0aGlzLmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jaG9yT2Zmc2V0OiBzdGFydEluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9jdXNPZmZzZXQ6IGVuZEluZGV4IH0pOwogICAgfQogIH0sCgogIHNldFNlcXVlbnRpYWxGb2N1c05hdmlnYXRpb25TdGFydGluZ1BvaW50OiBmdW5jdGlvbigpIHsKICAgIHRoaXMucGVyZm9ybUFjdGlvbl8oJ3NldFNlcXVlbnRpYWxGb2N1c05hdmlnYXRpb25TdGFydGluZ1BvaW50Jyk7CiAgfSwKCiAgc2hvd0NvbnRleHRNZW51OiBmdW5jdGlvbigpIHsKICAgIHRoaXMucGVyZm9ybUFjdGlvbl8oJ3Nob3dDb250ZXh0TWVudScpOwogIH0sCgogIHN0YXJ0RHVja2luZ01lZGlhOiBmdW5jdGlvbigpIHsKICAgIHRoaXMucGVyZm9ybUFjdGlvbl8oJ3N0YXJ0RHVja2luZ01lZGlhJyk7CiAgfSwKCiAgc3RvcER1Y2tpbmdNZWRpYTogZnVuY3Rpb24oKSB7CiAgICB0aGlzLnBlcmZvcm1BY3Rpb25fKCdzdG9wRHVja2luZ01lZGlhJyk7CiAgfSwKCiAgc3VzcGVuZE1lZGlhOiBmdW5jdGlvbigpIHsKICAgIHRoaXMucGVyZm9ybUFjdGlvbl8oJ3N1c3BlbmRNZWRpYScpOwogIH0sCgogIGRvbVF1ZXJ5U2VsZWN0b3I6IGZ1bmN0aW9uKHNlbGVjdG9yLCBjYWxsYmFjaykgewogICAgaWYgKCF0aGlzLnJvb3RJbXBsKQogICAgICBjYWxsYmFjaygpOwogICAgYXV0b21hdGlvbkludGVybmFsLnF1ZXJ5U2VsZWN0b3IoCiAgICAgIHsgdHJlZUlEOiB0aGlzLnJvb3RJbXBsLnRyZWVJRCwKICAgICAgICBhdXRvbWF0aW9uTm9kZUlEOiB0aGlzLmlkLAogICAgICAgIHNlbGVjdG9yOiBzZWxlY3RvciB9LAogICAgICAkRnVuY3Rpb24uYmluZCh0aGlzLmRvbVF1ZXJ5U2VsZWN0b3JDYWxsYmFja18sIHRoaXMsIGNhbGxiYWNrKSk7CiAgfSwKCiAgZmluZDogZnVuY3Rpb24ocGFyYW1zKSB7CiAgICByZXR1cm4gdGhpcy5maW5kSW50ZXJuYWxfKHBhcmFtcyk7CiAgfSwKCiAgZmluZEFsbDogZnVuY3Rpb24ocGFyYW1zKSB7CiAgICByZXR1cm4gdGhpcy5maW5kSW50ZXJuYWxfKHBhcmFtcywgW10pOwogIH0sCgogIG1hdGNoZXM6IGZ1bmN0aW9uKHBhcmFtcykgewogICAgcmV0dXJuIHRoaXMubWF0Y2hJbnRlcm5hbF8ocGFyYW1zKTsKICB9LAoKICBhZGRFdmVudExpc3RlbmVyOiBmdW5jdGlvbihldmVudFR5cGUsIGNhbGxiYWNrLCBjYXB0dXJlKSB7CiAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBjYWxsYmFjayk7CiAgICBpZiAoIXRoaXMubGlzdGVuZXJzW2V2ZW50VHlwZV0pCiAgICAgIHRoaXMubGlzdGVuZXJzW2V2ZW50VHlwZV0gPSBbXTsKICAgICRBcnJheS5wdXNoKHRoaXMubGlzdGVuZXJzW2V2ZW50VHlwZV0sIHsKICAgICAgX19wcm90b19fOiBudWxsLAogICAgICBjYWxsYmFjazogY2FsbGJhY2ssCiAgICAgIGNhcHR1cmU6ICEhY2FwdHVyZSwKICAgIH0pOwogIH0sCgogIC8vIFRPRE8oZHRzZW5nL2Fib3hoYWxsKTogQ2hlY2sgdGhpcyBpbXBsIGFnYWluc3Qgc3BlYy4KICByZW1vdmVFdmVudExpc3RlbmVyOiBmdW5jdGlvbihldmVudFR5cGUsIGNhbGxiYWNrKSB7CiAgICBpZiAodGhpcy5saXN0ZW5lcnNbZXZlbnRUeXBlXSkgewogICAgICB2YXIgbGlzdGVuZXJzID0gdGhpcy5saXN0ZW5lcnNbZXZlbnRUeXBlXTsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKICAgICAgICBpZiAoY2FsbGJhY2sgPT09IGxpc3RlbmVyc1tpXS5jYWxsYmFjaykKICAgICAgICAgICRBcnJheS5zcGxpY2UobGlzdGVuZXJzLCBpLCAxKTsKICAgICAgfQogICAgfQogIH0sCgogIHRvSlNPTjogZnVuY3Rpb24oKSB7CiAgICByZXR1cm4geyB0cmVlSUQ6IHRoaXMudHJlZUlELAogICAgICAgICAgICAgaWQ6IHRoaXMuaWQsCiAgICAgICAgICAgICByb2xlOiB0aGlzLnJvbGUsCiAgICAgICAgICAgICBhdHRyaWJ1dGVzOiB0aGlzLmF0dHJpYnV0ZXMgfTsKICB9LAoKICBkaXNwYXRjaEV2ZW50OiBmdW5jdGlvbihldmVudFR5cGUsIGV2ZW50RnJvbSwgbW91c2VYLCBtb3VzZVkpIHsKICAgIHZhciBwYXRoID0gW107CiAgICB2YXIgcGFyZW50ID0gdGhpcy5wYXJlbnQ7CiAgICB3aGlsZSAocGFyZW50KSB7CiAgICAgICRBcnJheS5wdXNoKHBhdGgsIHBhcmVudCk7CiAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnQ7CiAgICB9CiAgICB2YXIgZXZlbnQgPSBuZXcgQXV0b21hdGlvbkV2ZW50KGV2ZW50VHlwZSwgdGhpcy53cmFwcGVyLCBldmVudEZyb20pOwogICAgZXZlbnQubW91c2VYID0gbW91c2VYOwogICAgZXZlbnQubW91c2VZID0gbW91c2VZOwoKICAgIC8vIERpc3BhdGNoIHRoZSBldmVudCB0aHJvdWdoIHRoZSBwcm9wYWdhdGlvbiBwYXRoIGluIHRocmVlIHBoYXNlczoKICAgIC8vIC0gY2FwdHVyaW5nOiBzdGFydGluZyBmcm9tIHRoZSByb290IGFuZCBnb2luZyBkb3duIHRvIHRoZSB0YXJnZXQncyBwYXJlbnQKICAgIC8vIC0gdGFyZ2V0aW5nOiBkaXNwYXRjaGluZyB0aGUgZXZlbnQgb24gdGhlIHRhcmdldCBpdHNlbGYKICAgIC8vIC0gYnViYmxpbmc6IHN0YXJ0aW5nIGZyb20gdGhlIHRhcmdldCdzIHBhcmVudCwgZ29pbmcgYmFjayB1cCB0byB0aGUgcm9vdC4KICAgIC8vIEF0IGFueSBzdGFnZSwgYSBsaXN0ZW5lciBtYXkgY2FsbCBzdG9wUHJvcGFnYXRpb24oKSBvbiB0aGUgZXZlbnQsIHdoaWNoCiAgICAvLyB3aWxsIGltbWVkaWF0ZWx5IHN0b3AgZXZlbnQgcHJvcGFnYXRpb24gdGhyb3VnaCB0aGlzIHBhdGguCiAgICBpZiAodGhpcy5kaXNwYXRjaEV2ZW50QXRDYXB0dXJpbmdfKGV2ZW50LCBwYXRoKSkgewogICAgICBpZiAodGhpcy5kaXNwYXRjaEV2ZW50QXRUYXJnZXRpbmdfKGV2ZW50LCBwYXRoKSkKICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnRBdEJ1YmJsaW5nXyhldmVudCwgcGF0aCk7CiAgICB9CiAgfSwKCiAgdG9TdHJpbmc6IGZ1bmN0aW9uKCkgewogICAgdmFyIHBhcmVudElEID0gR2V0UGFyZW50SUQodGhpcy50cmVlSUQsIHRoaXMuaWQpOwogICAgdmFyIGNoaWxkVHJlZUlEID0gR2V0SW50QXR0cmlidXRlKHRoaXMudHJlZUlELCB0aGlzLmlkLCAnY2hpbGRUcmVlSWQnKTsKICAgIHZhciBjb3VudCA9IEdldENoaWxkQ291bnQodGhpcy50cmVlSUQsIHRoaXMuaWQpOwogICAgdmFyIGNoaWxkSURzID0gW107CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKICAgICAgdmFyIGNoaWxkSUQgPSBHZXRDaGlsZElEQXRJbmRleCh0aGlzLnRyZWVJRCwgdGhpcy5pZCwgaSk7CiAgICAgICRBcnJheS5wdXNoKGNoaWxkSURzLCBjaGlsZElEKTsKICAgIH0KCiAgICB2YXIgcmVzdWx0ID0gJ25vZGUgaWQ9JyArIHRoaXMuaWQgKwogICAgICAgICcgcm9sZT0nICsgdGhpcy5yb2xlICsKICAgICAgICAnIHN0YXRlPScgKyAkSlNPTi5zdHJpbmdpZnkodGhpcy5zdGF0ZSkgKwogICAgICAgICcgcGFyZW50SUQ9JyArIHBhcmVudElEICsKICAgICAgICAnIGNoaWxkSWRzPScgKyAkSlNPTi5zdHJpbmdpZnkoY2hpbGRJRHMpOwogICAgaWYgKHRoaXMuaG9zdE5vZGVfKSB7CiAgICAgIHZhciBob3N0Tm9kZUltcGwgPSBwcml2YXRlcyh0aGlzLmhvc3ROb2RlXykuaW1wbDsKICAgICAgcmVzdWx0ICs9ICcgaG9zdCB0cmVlSUQ9JyArIGhvc3ROb2RlSW1wbC50cmVlSUQgKwogICAgICAgICAgJyBob3N0IG5vZGVJRD0nICsgaG9zdE5vZGVJbXBsLmlkOwogICAgfQogICAgaWYgKGNoaWxkVHJlZUlEKQogICAgICByZXN1bHQgKz0gJyBjaGlsZFRyZWVJRD0nICsgY2hpbGRUcmVlSUQ7CiAgICByZXR1cm4gcmVzdWx0OwogIH0sCgogIGRpc3BhdGNoRXZlbnRBdENhcHR1cmluZ186IGZ1bmN0aW9uKGV2ZW50LCBwYXRoKSB7CiAgICBwcml2YXRlcyhldmVudCkuaW1wbC5ldmVudFBoYXNlID0gRXZlbnQuQ0FQVFVSSU5HX1BIQVNFOwogICAgZm9yICh2YXIgaSA9IHBhdGgubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgdGhpcy5maXJlRXZlbnRMaXN0ZW5lcnNfKHBhdGhbaV0sIGV2ZW50KTsKICAgICAgaWYgKHByaXZhdGVzKGV2ZW50KS5pbXBsLnByb3BhZ2F0aW9uU3RvcHBlZCkKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9LAoKICBkaXNwYXRjaEV2ZW50QXRUYXJnZXRpbmdfOiBmdW5jdGlvbihldmVudCkgewogICAgcHJpdmF0ZXMoZXZlbnQpLmltcGwuZXZlbnRQaGFzZSA9IEV2ZW50LkFUX1RBUkdFVDsKICAgIHRoaXMuZmlyZUV2ZW50TGlzdGVuZXJzXyh0aGlzLndyYXBwZXIsIGV2ZW50KTsKICAgIHJldHVybiAhcHJpdmF0ZXMoZXZlbnQpLmltcGwucHJvcGFnYXRpb25TdG9wcGVkOwogIH0sCgogIGRpc3BhdGNoRXZlbnRBdEJ1YmJsaW5nXzogZnVuY3Rpb24oZXZlbnQsIHBhdGgpIHsKICAgIHByaXZhdGVzKGV2ZW50KS5pbXBsLmV2ZW50UGhhc2UgPSBFdmVudC5CVUJCTElOR19QSEFTRTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGF0aC5sZW5ndGg7IGkrKykgewogICAgICB0aGlzLmZpcmVFdmVudExpc3RlbmVyc18ocGF0aFtpXSwgZXZlbnQpOwogICAgICBpZiAocHJpdmF0ZXMoZXZlbnQpLmltcGwucHJvcGFnYXRpb25TdG9wcGVkKQogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0sCgogIGZpcmVFdmVudExpc3RlbmVyc186IGZ1bmN0aW9uKG5vZGUsIGV2ZW50KSB7CiAgICB2YXIgbm9kZUltcGwgPSBwcml2YXRlcyhub2RlKS5pbXBsOwogICAgaWYgKCFub2RlSW1wbC5yb290SW1wbCkKICAgICAgcmV0dXJuOwoKICAgIHZhciBsaXN0ZW5lcnMgPSBub2RlSW1wbC5saXN0ZW5lcnNbZXZlbnQudHlwZV07CiAgICBpZiAoIWxpc3RlbmVycykKICAgICAgcmV0dXJuOwogICAgdmFyIGV2ZW50UGhhc2UgPSBldmVudC5ldmVudFBoYXNlOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKGV2ZW50UGhhc2UgPT0gRXZlbnQuQ0FQVFVSSU5HX1BIQVNFICYmICFsaXN0ZW5lcnNbaV0uY2FwdHVyZSkKICAgICAgICBjb250aW51ZTsKICAgICAgaWYgKGV2ZW50UGhhc2UgPT0gRXZlbnQuQlVCQkxJTkdfUEhBU0UgJiYgbGlzdGVuZXJzW2ldLmNhcHR1cmUpCiAgICAgICAgY29udGludWU7CgogICAgICB0cnkgewogICAgICAgIGxpc3RlbmVyc1tpXS5jYWxsYmFjayhldmVudCk7CiAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICBleGNlcHRpb25IYW5kbGVyLmhhbmRsZSgnRXJyb3IgaW4gZXZlbnQgaGFuZGxlciBmb3IgJyArIGV2ZW50LnR5cGUgKwogICAgICAgICAgICAnIGR1cmluZyBwaGFzZSAnICsgZXZlbnRQaGFzZSwgZSk7CiAgICAgIH0KICAgIH0KICB9LAoKICBwZXJmb3JtQWN0aW9uXzogZnVuY3Rpb24oYWN0aW9uVHlwZSwgb3B0X2FyZ3MsIG9wdF9jYWxsYmFjaykgewogICAgaWYgKCF0aGlzLnJvb3RJbXBsKQogICAgICByZXR1cm47CgogICAgLy8gTm90IHlldCBpbml0aWFsaXplZC4KICAgIGlmICh0aGlzLnJvb3RJbXBsLnRyZWVJRCA9PT0gdW5kZWZpbmVkIHx8CiAgICAgICAgdGhpcy5pZCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICAvLyBDaGVjayBwZXJtaXNzaW9ucy4KICAgIGlmICghSXNJbnRlcmFjdFBlcm1pdHRlZCgpKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcihhY3Rpb25UeXBlICsgJyByZXF1aXJlcyB7ImRlc2t0b3AiOiB0cnVlfSBvcicgKwogICAgICAgICAgJyB7ImludGVyYWN0IjogdHJ1ZX0gaW4gdGhlICJhdXRvbWF0aW9uIiBtYW5pZmVzdCBrZXkuJyk7CiAgICB9CiAgICB2YXIgcmVxdWVzdElEID0gLTE7CiAgICBpZiAob3B0X2NhbGxiYWNrKSB7CiAgICAgIHJlcXVlc3RJRCA9IHRoaXMucm9vdEltcGwuYWRkQWN0aW9uUmVzdWx0Q2FsbGJhY2sob3B0X2NhbGxiYWNrKTsKICAgIH0KCiAgICBhdXRvbWF0aW9uSW50ZXJuYWwucGVyZm9ybUFjdGlvbih7IHRyZWVJRDogdGhpcy5yb290SW1wbC50cmVlSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9tYXRpb25Ob2RlSUQ6IHRoaXMuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvblR5cGU6IGFjdGlvblR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJRDogcmVxdWVzdElEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdF9hcmdzIHx8IHt9KTsKICB9LAoKICBkb21RdWVyeVNlbGVjdG9yQ2FsbGJhY2tfOiBmdW5jdGlvbih1c2VyQ2FsbGJhY2ssIHJlc3VsdEF1dG9tYXRpb25Ob2RlSUQpIHsKICAgIC8vIHJlc3VsdEF1dG9tYXRpb25Ob2RlSUQgY291bGQgYmUgemVybyBvciB1bmRlZmluZWQgb3IgKHVubGlrZWx5KSBudWxsOwogICAgLy8gdGhleSBhbGwgYW1vdW50IHRvIHRoZSBzYW1lIHRoaW5nIGhlcmUsIHdoaWNoIGlzIHRoYXQgbm8gbm9kZSB3YXMKICAgIC8vIHJldHVybmVkLgogICAgaWYgKCFyZXN1bHRBdXRvbWF0aW9uTm9kZUlEIHx8ICF0aGlzLnJvb3RJbXBsKSB7CiAgICAgIHVzZXJDYWxsYmFjayhudWxsKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgdmFyIHJlc3VsdE5vZGUgPSB0aGlzLnJvb3RJbXBsLmdldChyZXN1bHRBdXRvbWF0aW9uTm9kZUlEKTsKICAgIGlmICghcmVzdWx0Tm9kZSkgewogICAgICBsb2dnaW5nLldBUk5JTkcoJ1F1ZXJ5IHNlbGVjdG9yIHJlc3VsdCBub3QgaW4gdHJlZTogJyArCiAgICAgICAgICAgICAgICAgICAgICByZXN1bHRBdXRvbWF0aW9uTm9kZUlEKTsKICAgICAgdXNlckNhbGxiYWNrKG51bGwpOwogICAgfQogICAgdXNlckNhbGxiYWNrKHJlc3VsdE5vZGUpOwogIH0sCgogIGZpbmRJbnRlcm5hbF86IGZ1bmN0aW9uKHBhcmFtcywgb3B0X3Jlc3VsdHMpIHsKICAgIHZhciByZXN1bHQgPSBudWxsOwogICAgdGhpcy5mb3JBbGxEZXNjZW5kYW50c18oZnVuY3Rpb24obm9kZSkgewogICAgICBpZiAocHJpdmF0ZXMobm9kZSkuaW1wbC5tYXRjaEludGVybmFsXyhwYXJhbXMpKSB7CiAgICAgICAgaWYgKG9wdF9yZXN1bHRzKQogICAgICAgICAgJEFycmF5LnB1c2gob3B0X3Jlc3VsdHMsIG5vZGUpOwogICAgICAgIGVsc2UKICAgICAgICAgIHJlc3VsdCA9IG5vZGU7CiAgICAgICAgcmV0dXJuICFvcHRfcmVzdWx0czsKICAgICAgfQogICAgfSk7CiAgICBpZiAob3B0X3Jlc3VsdHMpCiAgICAgIHJldHVybiBvcHRfcmVzdWx0czsKICAgIHJldHVybiByZXN1bHQ7CiAgfSwKCiAgLyoqCiAgICogRXhlY3V0ZXMgYSBjbG9zdXJlIGZvciBhbGwgb2YgdGhpcyBub2RlJ3MgZGVzY2VuZGFudHMsIGluIHByZS1vcmRlci4KICAgKiBFYXJseS1vdXRzIGlmIHRoZSBjbG9zdXJlIHJldHVybnMgdHJ1ZS4KICAgKiBAcGFyYW0ge0Z1bmN0aW9uKEF1dG9tYXRpb25Ob2RlKTpib29sZWFufSBjbG9zdXJlIENsb3N1cmUgdG8gYmUgZXhlY3V0ZWQKICAgKiAgICAgZm9yIGVhY2ggbm9kZS4gUmV0dXJuIHRydWUgdG8gZWFybHktb3V0IHRoZSB0cmF2ZXJzYWwuCiAgICovCiAgZm9yQWxsRGVzY2VuZGFudHNfOiBmdW5jdGlvbihjbG9zdXJlKSB7CiAgICB2YXIgc3RhY2sgPSAkQXJyYXkucmV2ZXJzZSh0aGlzLndyYXBwZXIuY2hpbGRyZW4pOwogICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHsKICAgICAgdmFyIG5vZGUgPSAkQXJyYXkucG9wKHN0YWNrKTsKICAgICAgaWYgKGNsb3N1cmUobm9kZSkpCiAgICAgICAgcmV0dXJuOwoKICAgICAgdmFyIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbjsKICAgICAgZm9yICh2YXIgaSA9IGNoaWxkcmVuLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKQogICAgICAgICRBcnJheS5wdXNoKHN0YWNrLCBjaGlsZHJlbltpXSk7CiAgICB9CiAgfSwKCiAgbWF0Y2hJbnRlcm5hbF86IGZ1bmN0aW9uKHBhcmFtcykgewogICAgaWYgKCRPYmplY3Qua2V5cyhwYXJhbXMpLmxlbmd0aCA9PT0gMCkKICAgICAgcmV0dXJuIGZhbHNlOwoKICAgIGlmICgncm9sZScgaW4gcGFyYW1zICYmIHRoaXMucm9sZSAhPSBwYXJhbXMucm9sZSkKICAgICAgICByZXR1cm4gZmFsc2U7CgogICAgaWYgKCdzdGF0ZScgaW4gcGFyYW1zKSB7CiAgICAgIGZvciAodmFyIHN0YXRlIGluIHBhcmFtcy5zdGF0ZSkgewogICAgICAgIGlmIChwYXJhbXMuc3RhdGVbc3RhdGVdICE9IChzdGF0ZSBpbiB0aGlzLnN0YXRlKSkKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfQogICAgaWYgKCdhdHRyaWJ1dGVzJyBpbiBwYXJhbXMpIHsKICAgICAgZm9yICh2YXIgYXR0cmlidXRlIGluIHBhcmFtcy5hdHRyaWJ1dGVzKSB7CiAgICAgICAgdmFyIGF0dHJWYWx1ZSA9IHBhcmFtcy5hdHRyaWJ1dGVzW2F0dHJpYnV0ZV07CiAgICAgICAgaWYgKHR5cGVvZiBhdHRyVmFsdWUgIT0gJ29iamVjdCcpIHsKICAgICAgICAgIGlmICh0aGlzW2F0dHJpYnV0ZV0gIT09IGF0dHJWYWx1ZSkKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0gZWxzZSBpZiAoYXR0clZhbHVlIGluc3RhbmNlb2YgJFJlZ0V4cC5zZWxmKSB7CiAgICAgICAgICBpZiAodHlwZW9mIHRoaXNbYXR0cmlidXRlXSAhPSAnc3RyaW5nJykKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgaWYgKCFhdHRyVmFsdWUudGVzdCh0aGlzW2F0dHJpYnV0ZV0pKQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIC8vIFRPRE8oYWJveGhhbGwpOiBoYW5kbGUgaW50bGlzdCBjYXNlLgogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQp9OwoKdmFyIHN0cmluZ0F0dHJpYnV0ZXMgPSBbCiAgICAnYWNjZXNzS2V5JywKICAgICdhcmlhSW52YWxpZFZhbHVlJywKICAgICdhdXRvQ29tcGxldGUnLAogICAgJ2NsYXNzTmFtZScsCiAgICAnY29udGFpbmVyTGl2ZVJlbGV2YW50JywKICAgICdjb250YWluZXJMaXZlU3RhdHVzJywKICAgICdkZXNjcmlwdGlvbicsCiAgICAnZGlzcGxheScsCiAgICAnaHRtbFRhZycsCiAgICAnaW1hZ2VEYXRhVXJsJywKICAgICdsYW5ndWFnZScsCiAgICAnbGl2ZVJlbGV2YW50JywKICAgICdsaXZlU3RhdHVzJywKICAgICduYW1lJywKICAgICdwbGFjZWhvbGRlcicsCiAgICAncm9sZURlc2NyaXB0aW9uJywKICAgICd0ZXh0SW5wdXRUeXBlJywKICAgICd1cmwnLAogICAgJ3ZhbHVlJ107Cgp2YXIgYm9vbEF0dHJpYnV0ZXMgPSBbCiAgICAnYnVzeScsCiAgICAnY2xpY2thYmxlJywKICAgICdjb250YWluZXJMaXZlQXRvbWljJywKICAgICdjb250YWluZXJMaXZlQnVzeScsCiAgICAnbGl2ZUF0b21pYycsCiAgICAnc2Nyb2xsYWJsZScKXTsKCnZhciBpbnRBdHRyaWJ1dGVzID0gWwogICAgJ2JhY2tncm91bmRDb2xvcicsCiAgICAnY29sb3InLAogICAgJ2NvbG9yVmFsdWUnLAogICAgJ2hpZXJhcmNoaWNhbExldmVsJywKICAgICdwb3NJblNldCcsCiAgICAnc2Nyb2xsWCcsCiAgICAnc2Nyb2xsWE1heCcsCiAgICAnc2Nyb2xsWE1pbicsCiAgICAnc2Nyb2xsWScsCiAgICAnc2Nyb2xsWU1heCcsCiAgICAnc2Nyb2xsWU1pbicsCiAgICAnc2V0U2l6ZScsCiAgICAndGFibGVDZWxsQ29sdW1uSW5kZXgnLAogICAgJ2FyaWFDZWxsQ29sdW1uSW5kZXgnLAogICAgJ3RhYmxlQ2VsbENvbHVtblNwYW4nLAogICAgJ3RhYmxlQ2VsbFJvd0luZGV4JywKICAgICdhcmlhQ2VsbFJvd0luZGV4JywKICAgICd0YWJsZUNlbGxSb3dTcGFuJywKICAgICd0YWJsZUNvbHVtbkNvdW50JywKICAgICdhcmlhQ29sdW1uQ291bnQnLAogICAgJ3RhYmxlQ29sdW1uSW5kZXgnLAogICAgJ3RhYmxlUm93Q291bnQnLAogICAgJ2FyaWFSb3dDb3VudCcsCiAgICAndGFibGVSb3dJbmRleCcsCiAgICAndGV4dFNlbEVuZCcsCiAgICAndGV4dFNlbFN0YXJ0J107Cgp2YXIgbm9kZVJlZkF0dHJpYnV0ZXMgPSBbCiAgICBbJ2FjdGl2ZWRlc2NlbmRhbnRJZCcsICdhY3RpdmVEZXNjZW5kYW50J10sCiAgICBbJ2luUGFnZUxpbmtUYXJnZXRJZCcsICdpblBhZ2VMaW5rVGFyZ2V0J10sCiAgICBbJ25leHRGb2N1c0lkJywgJ25leHRGb2N1cyddLAogICAgWyduZXh0T25MaW5lSWQnLCAnbmV4dE9uTGluZSddLAogICAgWydwcmV2aW91c0ZvY3VzSWQnLCAncHJldmlvdXNGb2N1cyddLAogICAgWydwcmV2aW91c09uTGluZUlkJywgJ3ByZXZpb3VzT25MaW5lJ10sCiAgICBbJ3RhYmxlQ29sdW1uSGVhZGVySWQnLCAndGFibGVDb2x1bW5IZWFkZXInXSwKICAgIFsndGFibGVIZWFkZXJJZCcsICd0YWJsZUhlYWRlciddLAogICAgWyd0YWJsZVJvd0hlYWRlcklkJywgJ3RhYmxlUm93SGVhZGVyJ11dOwoKdmFyIGludExpc3RBdHRyaWJ1dGVzID0gWwogICAgJ2xpbmVCcmVha3MnLAogICAgJ21hcmtlckVuZHMnLAogICAgJ21hcmtlclN0YXJ0cycsCiAgICAnbWFya2VyVHlwZXMnLAogICAgJ3dvcmRFbmRzJywKICAgICd3b3JkU3RhcnRzJ107Cgp2YXIgbm9kZVJlZkxpc3RBdHRyaWJ1dGVzID0gWwogICAgWydjb250cm9sc0lkcycsICdjb250cm9scyddLAogICAgWydkZXNjcmliZWRieUlkcycsICdkZXNjcmliZWRCeSddLAogICAgWydmbG93dG9JZHMnLCAnZmxvd1RvJ10sCiAgICBbJ2xhYmVsbGVkYnlJZHMnLCAnbGFiZWxsZWRCeSddXTsKCnZhciBmbG9hdEF0dHJpYnV0ZXMgPSBbCiAgICAndmFsdWVGb3JSYW5nZScsCiAgICAnbWluVmFsdWVGb3JSYW5nZScsCiAgICAnbWF4VmFsdWVGb3JSYW5nZSddOwoKdmFyIGh0bWxBdHRyaWJ1dGVzID0gWwogICAgWyd0eXBlJywgJ2lucHV0VHlwZSddXTsKCnZhciBwdWJsaWNBdHRyaWJ1dGVzID0gW107CgokQXJyYXkuZm9yRWFjaChzdHJpbmdBdHRyaWJ1dGVzLCBmdW5jdGlvbihhdHRyaWJ1dGVOYW1lKSB7CiAgJEFycmF5LnB1c2gocHVibGljQXR0cmlidXRlcywgYXR0cmlidXRlTmFtZSk7CiAgJE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBdXRvbWF0aW9uTm9kZUltcGwucHJvdG90eXBlLCBhdHRyaWJ1dGVOYW1lLCB7CiAgICBfX3Byb3RvX186IG51bGwsCiAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gR2V0U3RyaW5nQXR0cmlidXRlKHRoaXMudHJlZUlELCB0aGlzLmlkLCBhdHRyaWJ1dGVOYW1lKTsKICAgIH0KICB9KTsKfSk7CgokQXJyYXkuZm9yRWFjaChib29sQXR0cmlidXRlcywgZnVuY3Rpb24oYXR0cmlidXRlTmFtZSkgewogICRBcnJheS5wdXNoKHB1YmxpY0F0dHJpYnV0ZXMsIGF0dHJpYnV0ZU5hbWUpOwogICRPYmplY3QuZGVmaW5lUHJvcGVydHkoQXV0b21hdGlvbk5vZGVJbXBsLnByb3RvdHlwZSwgYXR0cmlidXRlTmFtZSwgewogICAgX19wcm90b19fOiBudWxsLAogICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIEdldEJvb2xBdHRyaWJ1dGUodGhpcy50cmVlSUQsIHRoaXMuaWQsIGF0dHJpYnV0ZU5hbWUpOwogICAgfQogIH0pOwp9KTsKCiRBcnJheS5mb3JFYWNoKGludEF0dHJpYnV0ZXMsIGZ1bmN0aW9uKGF0dHJpYnV0ZU5hbWUpIHsKICAkQXJyYXkucHVzaChwdWJsaWNBdHRyaWJ1dGVzLCBhdHRyaWJ1dGVOYW1lKTsKICAkT2JqZWN0LmRlZmluZVByb3BlcnR5KEF1dG9tYXRpb25Ob2RlSW1wbC5wcm90b3R5cGUsIGF0dHJpYnV0ZU5hbWUsIHsKICAgIF9fcHJvdG9fXzogbnVsbCwKICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBHZXRJbnRBdHRyaWJ1dGUodGhpcy50cmVlSUQsIHRoaXMuaWQsIGF0dHJpYnV0ZU5hbWUpOwogICAgfQogIH0pOwp9KTsKCiRBcnJheS5mb3JFYWNoKG5vZGVSZWZBdHRyaWJ1dGVzLCBmdW5jdGlvbihwYXJhbXMpIHsKICB2YXIgc3JjQXR0cmlidXRlTmFtZSA9IHBhcmFtc1swXTsKICB2YXIgZHN0QXR0cmlidXRlTmFtZSA9IHBhcmFtc1sxXTsKICAkQXJyYXkucHVzaChwdWJsaWNBdHRyaWJ1dGVzLCBkc3RBdHRyaWJ1dGVOYW1lKTsKICAkT2JqZWN0LmRlZmluZVByb3BlcnR5KEF1dG9tYXRpb25Ob2RlSW1wbC5wcm90b3R5cGUsIGRzdEF0dHJpYnV0ZU5hbWUsIHsKICAgIF9fcHJvdG9fXzogbnVsbCwKICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHZhciBpZCA9IEdldEludEF0dHJpYnV0ZSh0aGlzLnRyZWVJRCwgdGhpcy5pZCwgc3JjQXR0cmlidXRlTmFtZSk7CiAgICAgIGlmIChpZCAmJiB0aGlzLnJvb3RJbXBsKQogICAgICAgIHJldHVybiB0aGlzLnJvb3RJbXBsLmdldChpZCk7CiAgICAgIGVsc2UKICAgICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgfQogIH0pOwp9KTsKCiRBcnJheS5mb3JFYWNoKGludExpc3RBdHRyaWJ1dGVzLCBmdW5jdGlvbihhdHRyaWJ1dGVOYW1lKSB7CiAgJEFycmF5LnB1c2gocHVibGljQXR0cmlidXRlcywgYXR0cmlidXRlTmFtZSk7CiAgJE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBdXRvbWF0aW9uTm9kZUltcGwucHJvdG90eXBlLCBhdHRyaWJ1dGVOYW1lLCB7CiAgICBfX3Byb3RvX186IG51bGwsCiAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gR2V0SW50TGlzdEF0dHJpYnV0ZSh0aGlzLnRyZWVJRCwgdGhpcy5pZCwgYXR0cmlidXRlTmFtZSk7CiAgICB9CiAgfSk7Cn0pOwoKJEFycmF5LmZvckVhY2gobm9kZVJlZkxpc3RBdHRyaWJ1dGVzLCBmdW5jdGlvbihwYXJhbXMpIHsKICB2YXIgc3JjQXR0cmlidXRlTmFtZSA9IHBhcmFtc1swXTsKICB2YXIgZHN0QXR0cmlidXRlTmFtZSA9IHBhcmFtc1sxXTsKICAkQXJyYXkucHVzaChwdWJsaWNBdHRyaWJ1dGVzLCBkc3RBdHRyaWJ1dGVOYW1lKTsKICAkT2JqZWN0LmRlZmluZVByb3BlcnR5KEF1dG9tYXRpb25Ob2RlSW1wbC5wcm90b3R5cGUsIGRzdEF0dHJpYnV0ZU5hbWUsIHsKICAgIF9fcHJvdG9fXzogbnVsbCwKICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHZhciBpZHMgPSBHZXRJbnRMaXN0QXR0cmlidXRlKHRoaXMudHJlZUlELCB0aGlzLmlkLCBzcmNBdHRyaWJ1dGVOYW1lKTsKICAgICAgaWYgKCFpZHMgfHwgIXRoaXMucm9vdEltcGwpCiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICAgICAgdmFyIHJlc3VsdCA9IFtdOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGlkcy5sZW5ndGg7ICsraSkgewogICAgICAgIHZhciBub2RlID0gdGhpcy5yb290SW1wbC5nZXQoaWRzW2ldKTsKICAgICAgICBpZiAobm9kZSkKICAgICAgICAgICRBcnJheS5wdXNoKHJlc3VsdCwgbm9kZSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICB9KTsKfSk7CgokQXJyYXkuZm9yRWFjaChmbG9hdEF0dHJpYnV0ZXMsIGZ1bmN0aW9uKGF0dHJpYnV0ZU5hbWUpIHsKICAkQXJyYXkucHVzaChwdWJsaWNBdHRyaWJ1dGVzLCBhdHRyaWJ1dGVOYW1lKTsKICAkT2JqZWN0LmRlZmluZVByb3BlcnR5KEF1dG9tYXRpb25Ob2RlSW1wbC5wcm90b3R5cGUsIGF0dHJpYnV0ZU5hbWUsIHsKICAgIF9fcHJvdG9fXzogbnVsbCwKICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBHZXRGbG9hdEF0dHJpYnV0ZSh0aGlzLnRyZWVJRCwgdGhpcy5pZCwgYXR0cmlidXRlTmFtZSk7CiAgICB9CiAgfSk7Cn0pOwoKJEFycmF5LmZvckVhY2goaHRtbEF0dHJpYnV0ZXMsIGZ1bmN0aW9uKHBhcmFtcykgewogIHZhciBzcmNBdHRyaWJ1dGVOYW1lID0gcGFyYW1zWzBdOwogIHZhciBkc3RBdHRyaWJ1dGVOYW1lID0gcGFyYW1zWzFdOwogICRBcnJheS5wdXNoKHB1YmxpY0F0dHJpYnV0ZXMsIGRzdEF0dHJpYnV0ZU5hbWUpOwogICRPYmplY3QuZGVmaW5lUHJvcGVydHkoQXV0b21hdGlvbk5vZGVJbXBsLnByb3RvdHlwZSwgZHN0QXR0cmlidXRlTmFtZSwgewogICAgX19wcm90b19fOiBudWxsLAogICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIEdldEh0bWxBdHRyaWJ1dGUodGhpcy50cmVlSUQsIHRoaXMuaWQsIHNyY0F0dHJpYnV0ZU5hbWUpOwogICAgfQogIH0pOwp9KTsKCi8qKgogKiBBdXRvbWF0aW9uUm9vdE5vZGUuCiAqCiAqIEFuIEF1dG9tYXRpb25Sb290Tm9kZSBpcyB0aGUgamF2YXNjcmlwdCBlbmQgb2YgYW4gQVhUcmVlIGxpdmluZyBpbiB0aGUKICogYnJvd3Nlci4gQXV0b21hdGlvblJvb3ROb2RlIGhhbmRsZXMgdW5zZXJpYWxpemluZyBpbmNyZW1lbnRhbCB1cGRhdGVzIGZyb20KICogdGhlIHNvdXJjZSBBWFRyZWUuIEVhY2ggdXBkYXRlIGNvbnRhaW5zIG5vZGUgZGF0YSB0aGF0IGZvcm0gYSBjb21wbGV0ZSB0cmVlCiAqIGFmdGVyIGFwcGx5aW5nIHRoZSB1cGRhdGUuCiAqCiAqIEEgYnJpZWYgbm90ZSBhYm91dCBpZHMgdXNlZCB0aHJvdWdoIHRoaXMgY2xhc3MuIFRoZSBzb3VyY2UgQVhUcmVlIGFzc2lnbnMKICogdW5pcXVlIGlkcyBwZXIgbm9kZSBhbmQgd2UgdXNlIHRoZXNlIGlkcyB0byBidWlsZCBhIGhhc2ggdG8gdGhlIGFjdHVhbAogKiBBdXRvbWF0aW9uTm9kZSBvYmplY3QuCiAqIFRodXMsIHRyZWUgdHJhdmVyc2FscyBhbW91bnQgdG8gYSBsb29rdXAgaW4gb3VyIGhhc2guCiAqCiAqIFRoZSB0cmVlIGl0c2VsZiBpcyBpZGVudGlmaWVkIGJ5IHRoZSBhY2Nlc3NpYmlsaXR5IHRyZWUgaWQgb2YgdGhlCiAqIHJlbmRlcmVyIHdpZGdldCBob3N0LgogKiBAY29uc3RydWN0b3IKICovCmZ1bmN0aW9uIEF1dG9tYXRpb25Sb290Tm9kZUltcGwodHJlZUlEKSB7CiAgJEZ1bmN0aW9uLmNhbGwoQXV0b21hdGlvbk5vZGVJbXBsLCB0aGlzLCB0aGlzKTsKICB0aGlzLnRyZWVJRCA9IHRyZWVJRDsKICB0aGlzLmF4Tm9kZURhdGFDYWNoZV8gPSB7X19wcm90b19fOiBudWxsfTsKICB0aGlzLmFjdGlvblJlcXVlc3RJRFRvQ2FsbGJhY2tfID0ge19fcHJvdG9fXzogbnVsbH07Cn0KCnV0aWxzLmRlZmluZVByb3BlcnR5KEF1dG9tYXRpb25Sb290Tm9kZUltcGwsICdpZFRvQXV0b21hdGlvblJvb3ROb2RlXycsCiAgICB7X19wcm90b19fOiBudWxsfSk7Cgp1dGlscy5kZWZpbmVQcm9wZXJ0eShBdXRvbWF0aW9uUm9vdE5vZGVJbXBsLCAnZ2V0JywgZnVuY3Rpb24odHJlZUlEKSB7CiAgdmFyIHJlc3VsdCA9IEF1dG9tYXRpb25Sb290Tm9kZUltcGwuaWRUb0F1dG9tYXRpb25Sb290Tm9kZV9bdHJlZUlEXTsKICByZXR1cm4gcmVzdWx0IHx8IHVuZGVmaW5lZDsKfSk7Cgp1dGlscy5kZWZpbmVQcm9wZXJ0eShBdXRvbWF0aW9uUm9vdE5vZGVJbXBsLCAnZ2V0T3JDcmVhdGUnLCBmdW5jdGlvbih0cmVlSUQpIHsKICBpZiAoQXV0b21hdGlvblJvb3ROb2RlSW1wbC5pZFRvQXV0b21hdGlvblJvb3ROb2RlX1t0cmVlSURdKQogICAgcmV0dXJuIEF1dG9tYXRpb25Sb290Tm9kZUltcGwuaWRUb0F1dG9tYXRpb25Sb290Tm9kZV9bdHJlZUlEXTsKICB2YXIgcmVzdWx0ID0gbmV3IEF1dG9tYXRpb25Sb290Tm9kZSh0cmVlSUQpOwogIEF1dG9tYXRpb25Sb290Tm9kZUltcGwuaWRUb0F1dG9tYXRpb25Sb290Tm9kZV9bdHJlZUlEXSA9IHJlc3VsdDsKICByZXR1cm4gcmVzdWx0Owp9KTsKCnV0aWxzLmRlZmluZVByb3BlcnR5KEF1dG9tYXRpb25Sb290Tm9kZUltcGwsICdkZXN0cm95JywgZnVuY3Rpb24odHJlZUlEKSB7CiAgZGVsZXRlIEF1dG9tYXRpb25Sb290Tm9kZUltcGwuaWRUb0F1dG9tYXRpb25Sb290Tm9kZV9bdHJlZUlEXTsKfSk7CgpBdXRvbWF0aW9uUm9vdE5vZGVJbXBsLnByb3RvdHlwZSA9IHsKICBfX3Byb3RvX186IEF1dG9tYXRpb25Ob2RlSW1wbC5wcm90b3R5cGUsCgogIC8qKgogICAqIEB0eXBlIHtib29sZWFufQogICAqLwogIGlzUm9vdE5vZGU6IHRydWUsCgogIC8qKgogICAqIEB0eXBlIHtudW1iZXJ9CiAgICovCiAgdHJlZUlEOiAtMSwKCiAgLyoqCiAgICogVGhlIHBhcmVudCBvZiB0aGlzIG5vZGUgZnJvbSBhIGRpZmZlcmVudCB0cmVlLgogICAqIEB0eXBlIHs/QXV0b21hdGlvbk5vZGV9CiAgICogQHByaXZhdGUKICAgKi8KICBob3N0Tm9kZV86IG51bGwsCgogIC8qKgogICAqIEEgbWFwIGZyb20gaWQgdG8gQXV0b21hdGlvbk5vZGUuCiAgICogQHR5cGUge09iamVjdC48bnVtYmVyLCBBdXRvbWF0aW9uTm9kZT59CiAgICogQHByaXZhdGUKICAgKi8KICBheE5vZGVEYXRhQ2FjaGVfOiBudWxsLAoKICBhY3Rpb25SZXF1ZXN0Q291bnRlcl86IDAsCgogIGFjdGlvblJlcXVlc3RJRFRvQ2FsbGJhY2tfOiBudWxsLAoKICBnZXQgaWQoKSB7CiAgICB2YXIgcmVzdWx0ID0gR2V0Um9vdElEKHRoaXMudHJlZUlEKTsKCiAgICAvLyBEb24ndCByZXR1cm4gdW5kZWZpbmVkLCBiZWNhdXNlIHRoZSBpZCBpcyBvZnRlbiBwYXNzZWQgZGlyZWN0bHkKICAgIC8vIGFzIGFuIGFyZ3VtZW50IHRvIGEgbmF0aXZlIGJpbmRpbmcgdGhhdCBleHBlY3RzIG9ubHkgYSB2YWxpZCBudW1iZXIuCiAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpCiAgICAgIHJldHVybiAtMTsKCiAgICByZXR1cm4gcmVzdWx0OwogIH0sCgogIGdldCBjaHJvbWVDaGFubmVsKCkgewogICAgcmV0dXJuIEdldFN0cmluZ0F0dHJpYnV0ZSh0aGlzLnRyZWVJRCwgdGhpcy5pZCwgJ2Nocm9tZUNoYW5uZWwnKTsKICB9LAoKICBnZXQgZG9jVXJsKCkgewogICAgcmV0dXJuIEdldERvY1VSTCh0aGlzLnRyZWVJRCk7CiAgfSwKCiAgZ2V0IGRvY1RpdGxlKCkgewogICAgcmV0dXJuIEdldERvY1RpdGxlKHRoaXMudHJlZUlEKTsKICB9LAoKICBnZXQgZG9jTG9hZGVkKCkgewogICAgcmV0dXJuIEdldERvY0xvYWRlZCh0aGlzLnRyZWVJRCk7CiAgfSwKCiAgZ2V0IGRvY0xvYWRpbmdQcm9ncmVzcygpIHsKICAgIHJldHVybiBHZXREb2NMb2FkaW5nUHJvZ3Jlc3ModGhpcy50cmVlSUQpOwogIH0sCgogIGdldCBhbmNob3JPYmplY3QoKSB7CiAgICB2YXIgaWQgPSBHZXRBbmNob3JPYmplY3RJRCh0aGlzLnRyZWVJRCk7CiAgICBpZiAoaWQgJiYgaWQgIT0gLTEpCiAgICAgIHJldHVybiB0aGlzLmdldChpZCk7CiAgICBlbHNlCiAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgfSwKCiAgZ2V0IGFuY2hvck9mZnNldCgpIHsKICAgIHZhciBpZCA9IEdldEFuY2hvck9iamVjdElEKHRoaXMudHJlZUlEKTsKICAgIGlmIChpZCAmJiBpZCAhPSAtMSkKICAgICAgcmV0dXJuIEdldEFuY2hvck9mZnNldCh0aGlzLnRyZWVJRCk7CiAgfSwKCiAgZ2V0IGFuY2hvckFmZmluaXR5KCkgewogICAgdmFyIGlkID0gR2V0QW5jaG9yT2JqZWN0SUQodGhpcy50cmVlSUQpOwogICAgaWYgKGlkICYmIGlkICE9IC0xKQogICAgICByZXR1cm4gR2V0QW5jaG9yQWZmaW5pdHkodGhpcy50cmVlSUQpOwogIH0sCgogIGdldCBmb2N1c09iamVjdCgpIHsKICAgIHZhciBpZCA9IEdldEZvY3VzT2JqZWN0SUQodGhpcy50cmVlSUQpOwogICAgaWYgKGlkICYmIGlkICE9IC0xKQogICAgICByZXR1cm4gdGhpcy5nZXQoaWQpOwogICAgZWxzZQogICAgICByZXR1cm4gdW5kZWZpbmVkOwogIH0sCgogIGdldCBmb2N1c09mZnNldCgpIHsKICAgIHZhciBpZCA9IEdldEZvY3VzT2JqZWN0SUQodGhpcy50cmVlSUQpOwogICAgaWYgKGlkICYmIGlkICE9IC0xKQogICAgICByZXR1cm4gR2V0Rm9jdXNPZmZzZXQodGhpcy50cmVlSUQpOwogIH0sCgogIGdldCBmb2N1c0FmZmluaXR5KCkgewogICAgdmFyIGlkID0gR2V0Rm9jdXNPYmplY3RJRCh0aGlzLnRyZWVJRCk7CiAgICBpZiAoaWQgJiYgaWQgIT0gLTEpCiAgICAgIHJldHVybiBHZXRGb2N1c0FmZmluaXR5KHRoaXMudHJlZUlEKTsKICB9LAoKICBnZXQ6IGZ1bmN0aW9uKGlkKSB7CiAgICBpZiAoaWQgPT0gdW5kZWZpbmVkKQogICAgICByZXR1cm4gdW5kZWZpbmVkOwoKICAgIGlmIChpZCA9PSB0aGlzLmlkKQogICAgICByZXR1cm4gdGhpcy53cmFwcGVyOwoKICAgIHZhciBvYmogPSB0aGlzLmF4Tm9kZURhdGFDYWNoZV9baWRdOwogICAgaWYgKG9iaikKICAgICAgcmV0dXJuIG9iajsKCiAgICBvYmogPSBuZXcgQXV0b21hdGlvbk5vZGUodGhpcyk7CiAgICBwcml2YXRlcyhvYmopLmltcGwudHJlZUlEID0gdGhpcy50cmVlSUQ7CiAgICBwcml2YXRlcyhvYmopLmltcGwuaWQgPSBpZDsKICAgIHRoaXMuYXhOb2RlRGF0YUNhY2hlX1tpZF0gPSBvYmo7CgogICAgcmV0dXJuIG9iajsKICB9LAoKICByZW1vdmU6IGZ1bmN0aW9uKGlkKSB7CiAgICBpZiAodGhpcy5heE5vZGVEYXRhQ2FjaGVfW2lkXSkKICAgICAgcHJpdmF0ZXModGhpcy5heE5vZGVEYXRhQ2FjaGVfW2lkXSkuaW1wbC5kZXRhY2goKTsKICAgIGRlbGV0ZSB0aGlzLmF4Tm9kZURhdGFDYWNoZV9baWRdOwogIH0sCgogIGRlc3Ryb3k6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5kaXNwYXRjaEV2ZW50KCdkZXN0cm95ZWQnLCAnbm9uZScpOwogICAgZm9yICh2YXIgaWQgaW4gdGhpcy5heE5vZGVEYXRhQ2FjaGVfKQogICAgICB0aGlzLnJlbW92ZShpZCk7CiAgICB0aGlzLmRldGFjaCgpOwogIH0sCgogIHNldEhvc3ROb2RlKGhvc3ROb2RlKSB7CiAgICB0aGlzLmhvc3ROb2RlXyA9IGhvc3ROb2RlOwogIH0sCgogIG9uQWNjZXNzaWJpbGl0eUV2ZW50OiBmdW5jdGlvbihldmVudFBhcmFtcykgewogICAgdmFyIHRhcmdldE5vZGUgPSB0aGlzLmdldChldmVudFBhcmFtcy50YXJnZXRJRCk7CiAgICBpZiAodGFyZ2V0Tm9kZSkgewogICAgICB2YXIgdGFyZ2V0Tm9kZUltcGwgPSBwcml2YXRlcyh0YXJnZXROb2RlKS5pbXBsOwogICAgICB0YXJnZXROb2RlSW1wbC5kaXNwYXRjaEV2ZW50KAogICAgICAgICAgZXZlbnRQYXJhbXMuZXZlbnRUeXBlLCBldmVudFBhcmFtcy5ldmVudEZyb20sCiAgICAgICAgICBldmVudFBhcmFtcy5tb3VzZVgsIGV2ZW50UGFyYW1zLm1vdXNlWSk7CgogICAgICBpZiAoZXZlbnRQYXJhbXMuYWN0aW9uUmVxdWVzdElEICE9IC0xKSB7CiAgICAgICAgdGhpcy5vbkFjdGlvblJlc3VsdChldmVudFBhcmFtcy5hY3Rpb25SZXF1ZXN0SUQsIHRhcmdldE5vZGUpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBsb2dnaW5nLldBUk5JTkcoJ0dvdCAnICsgZXZlbnRQYXJhbXMuZXZlbnRUeXBlICsKICAgICAgICAgICAgICAgICAgICAgICcgZXZlbnQgb24gdW5rbm93biBub2RlOiAnICsgZXZlbnRQYXJhbXMudGFyZ2V0SUQgKwogICAgICAgICAgICAgICAgICAgICAgJzsgdGhpczogJyArIHRoaXMuaWQpOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfSwKCiAgYWRkQWN0aW9uUmVzdWx0Q2FsbGJhY2s6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7CiAgICB0aGlzLmFjdGlvblJlcXVlc3RJRFRvQ2FsbGJhY2tfWysrdGhpcy5hY3Rpb25SZXF1ZXN0Q291bnRlcl9dID0gY2FsbGJhY2s7CiAgICByZXR1cm4gdGhpcy5hY3Rpb25SZXF1ZXN0Q291bnRlcl87CiAgfSwKCiAgb25BY3Rpb25SZXN1bHQ6IGZ1bmN0aW9uKHJlcXVlc3RJRCwgcmVzdWx0KSB7CiAgICBpZiAocmVxdWVzdElEIGluIHRoaXMuYWN0aW9uUmVxdWVzdElEVG9DYWxsYmFja18pIHsKICAgICAgdGhpcy5hY3Rpb25SZXF1ZXN0SURUb0NhbGxiYWNrX1tyZXF1ZXN0SURdKHJlc3VsdCk7CiAgICAgIGRlbGV0ZSB0aGlzLmFjdGlvblJlcXVlc3RJRFRvQ2FsbGJhY2tfW3JlcXVlc3RJRF07CiAgICB9CiAgfSwKCiAgdG9TdHJpbmc6IGZ1bmN0aW9uKCkgewogICAgZnVuY3Rpb24gdG9TdHJpbmdJbnRlcm5hbChub2RlSW1wbCwgaW5kZW50KSB7CiAgICAgIGlmICghbm9kZUltcGwpCiAgICAgICAgcmV0dXJuICcnOwogICAgICB2YXIgb3V0cHV0ID0gJyc7CiAgICAgIGlmIChub2RlSW1wbC5pc1Jvb3ROb2RlKQogICAgICAgIG91dHB1dCArPSBpbmRlbnQgKyAndHJlZSBpZD0nICsgbm9kZUltcGwudHJlZUlEICsgJ1xuJzsKICAgICAgb3V0cHV0ICs9IGluZGVudCArCiAgICAgICAgJEZ1bmN0aW9uLmNhbGwoQXV0b21hdGlvbk5vZGVJbXBsLnByb3RvdHlwZS50b1N0cmluZywgbm9kZUltcGwpICsgJ1xuJzsKICAgICAgaW5kZW50ICs9ICcgICc7CiAgICAgIHZhciBjaGlsZHJlbiA9IG5vZGVJbXBsLmNoaWxkcmVuOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgKytpKQogICAgICAgIG91dHB1dCArPSB0b1N0cmluZ0ludGVybmFsKHByaXZhdGVzKGNoaWxkcmVuW2ldKS5pbXBsLCBpbmRlbnQpOwogICAgICByZXR1cm4gb3V0cHV0OwogICAgfQogICAgcmV0dXJuIHRvU3RyaW5nSW50ZXJuYWwodGhpcywgJycpOwogIH0sCn07CgpmdW5jdGlvbiBBdXRvbWF0aW9uTm9kZSgpIHsKICBwcml2YXRlcyhBdXRvbWF0aW9uTm9kZSkuY29uc3RydWN0UHJpdmF0ZSh0aGlzLCBhcmd1bWVudHMpOwp9CnV0aWxzLmV4cG9zZShBdXRvbWF0aW9uTm9kZSwgQXV0b21hdGlvbk5vZGVJbXBsLCB7CiAgZnVuY3Rpb25zOiBbCiAgICAnZG9EZWZhdWx0JywKICAgICdmaW5kJywKICAgICdmaW5kQWxsJywKICAgICdmb2N1cycsCiAgICAnZ2V0SW1hZ2VEYXRhJywKICAgICdoaXRUZXN0JywKICAgICdoaXRUZXN0V2l0aFJlcGx5JywKICAgICdtYWtlVmlzaWJsZScsCiAgICAnbWF0Y2hlcycsCiAgICAncGVyZm9ybUN1c3RvbUFjdGlvbicsCiAgICAncmVzdW1lTWVkaWEnLAogICAgJ3Njcm9sbEJhY2t3YXJkJywKICAgICdzY3JvbGxGb3J3YXJkJywKICAgICdzY3JvbGxVcCcsCiAgICAnc2Nyb2xsRG93bicsCiAgICAnc2Nyb2xsTGVmdCcsCiAgICAnc2Nyb2xsUmlnaHQnLAogICAgJ3NldFNlbGVjdGlvbicsCiAgICAnc2V0U2VxdWVudGlhbEZvY3VzTmF2aWdhdGlvblN0YXJ0aW5nUG9pbnQnLAogICAgJ3Nob3dDb250ZXh0TWVudScsCiAgICAnc3RhcnREdWNraW5nTWVkaWEnLAogICAgJ3N0b3BEdWNraW5nTWVkaWEnLAogICAgJ3N1c3BlbmRNZWRpYScsCiAgICAnYWRkRXZlbnRMaXN0ZW5lcicsCiAgICAncmVtb3ZlRXZlbnRMaXN0ZW5lcicsCiAgICAnZG9tUXVlcnlTZWxlY3RvcicsCiAgICAndG9TdHJpbmcnLAogICAgJ2JvdW5kc0ZvclJhbmdlJywKICBdLAogIHJlYWRvbmx5OiAkQXJyYXkuY29uY2F0KHB1YmxpY0F0dHJpYnV0ZXMsIFsKICAgICAgJ3BhcmVudCcsCiAgICAgICdmaXJzdENoaWxkJywKICAgICAgJ2xhc3RDaGlsZCcsCiAgICAgICdjaGlsZHJlbicsCiAgICAgICdwcmV2aW91c1NpYmxpbmcnLAogICAgICAnbmV4dFNpYmxpbmcnLAogICAgICAnaXNSb290Tm9kZScsCiAgICAgICdyb2xlJywKICAgICAgJ2NoZWNrZWQnLAogICAgICAncmVzdHJpY3Rpb24nLAogICAgICAnc3RhdGUnLAogICAgICAnbG9jYXRpb24nLAogICAgICAnaW5kZXhJblBhcmVudCcsCiAgICAgICdsaW5lU3RhcnRPZmZzZXRzJywKICAgICAgJ3Jvb3QnLAogICAgICAnaHRtbEF0dHJpYnV0ZXMnLAogICAgICAnbmFtZUZyb20nLAogICAgICAnYm9sZCcsCiAgICAgICdpdGFsaWMnLAogICAgICAndW5kZXJsaW5lJywKICAgICAgJ2xpbmVUaHJvdWdoJywKICAgICAgJ2N1c3RvbUFjdGlvbnMnLAogICAgICAndW5jbGlwcGVkTG9jYXRpb24nLAogIF0pLAp9KTsKCmZ1bmN0aW9uIEF1dG9tYXRpb25Sb290Tm9kZSgpIHsKICBwcml2YXRlcyhBdXRvbWF0aW9uUm9vdE5vZGUpLmNvbnN0cnVjdFByaXZhdGUodGhpcywgYXJndW1lbnRzKTsKfQp1dGlscy5leHBvc2UoQXV0b21hdGlvblJvb3ROb2RlLCBBdXRvbWF0aW9uUm9vdE5vZGVJbXBsLCB7CiAgc3VwZXJjbGFzczogQXV0b21hdGlvbk5vZGUsCiAgcmVhZG9ubHk6IFsKICAgICdjaHJvbWVDaGFubmVsJywKICAgICdkb2NUaXRsZScsCiAgICAnZG9jVXJsJywKICAgICdkb2NMb2FkZWQnLAogICAgJ2RvY0xvYWRpbmdQcm9ncmVzcycsCiAgICAnYW5jaG9yT2JqZWN0JywKICAgICdhbmNob3JPZmZzZXQnLAogICAgJ2FuY2hvckFmZmluaXR5JywKICAgICdmb2N1c09iamVjdCcsCiAgICAnZm9jdXNPZmZzZXQnLAogICAgJ2ZvY3VzQWZmaW5pdHknLAogIF0sCn0pOwoKdXRpbHMuZGVmaW5lUHJvcGVydHkoQXV0b21hdGlvblJvb3ROb2RlLCAnZ2V0JywgZnVuY3Rpb24odHJlZUlEKSB7CiAgcmV0dXJuIEF1dG9tYXRpb25Sb290Tm9kZUltcGwuZ2V0KHRyZWVJRCk7Cn0pOwoKdXRpbHMuZGVmaW5lUHJvcGVydHkoQXV0b21hdGlvblJvb3ROb2RlLCAnZ2V0T3JDcmVhdGUnLCBmdW5jdGlvbih0cmVlSUQpIHsKICByZXR1cm4gQXV0b21hdGlvblJvb3ROb2RlSW1wbC5nZXRPckNyZWF0ZSh0cmVlSUQpOwp9KTsKCnV0aWxzLmRlZmluZVByb3BlcnR5KEF1dG9tYXRpb25Sb290Tm9kZSwgJ2Rlc3Ryb3knLCBmdW5jdGlvbih0cmVlSUQpIHsKICBBdXRvbWF0aW9uUm9vdE5vZGVJbXBsLmRlc3Ryb3kodHJlZUlEKTsKfSk7CgpleHBvcnRzLiRzZXQoJ0F1dG9tYXRpb25Ob2RlJywgQXV0b21hdGlvbk5vZGUpOwpleHBvcnRzLiRzZXQoJ0F1dG9tYXRpb25Sb290Tm9kZScsIEF1dG9tYXRpb25Sb290Tm9kZSk7Ci8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQovLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gQ3VzdG9tIGJpbmRpbmcgZm9yIHRoZSBicm93c2VyQWN0aW9uIEFQSS4KCnZhciBiaW5kaW5nID0gYXBpQnJpZGdlIHx8IHJlcXVpcmUoJ2JpbmRpbmcnKS5CaW5kaW5nLmNyZWF0ZSgnYnJvd3NlckFjdGlvbicpOwoKdmFyIHNldEljb24gPSByZXF1aXJlKCdzZXRJY29uJykuc2V0SWNvbjsKdmFyIGdldEV4dGVuc2lvblZpZXdzID0gcmVxdWlyZU5hdGl2ZSgncnVudGltZScpLkdldEV4dGVuc2lvblZpZXdzOwp2YXIgc2VuZFJlcXVlc3QgPSBiaW5kaW5nVXRpbCA/CiAgICAkRnVuY3Rpb24uYmluZChiaW5kaW5nVXRpbC5zZW5kUmVxdWVzdCwgYmluZGluZ1V0aWwpIDoKICAgIHJlcXVpcmUoJ3NlbmRSZXF1ZXN0Jykuc2VuZFJlcXVlc3Q7Cgp2YXIganNMYXN0RXJyb3IgPSBiaW5kaW5nVXRpbCA/IHVuZGVmaW5lZCA6IHJlcXVpcmUoJ2xhc3RFcnJvcicpOwpmdW5jdGlvbiBoYXNMYXN0RXJyb3IoKSB7CiAgcmV0dXJuIGJpbmRpbmdVdGlsID8KICAgICAgYmluZGluZ1V0aWwuaGFzTGFzdEVycm9yKCkgOiBqc0xhc3RFcnJvci5oYXNFcnJvcihjaHJvbWUpOwp9CgpiaW5kaW5nLnJlZ2lzdGVyQ3VzdG9tSG9vayhmdW5jdGlvbihiaW5kaW5nc0FQSSkgewogIHZhciBhcGlGdW5jdGlvbnMgPSBiaW5kaW5nc0FQSS5hcGlGdW5jdGlvbnM7CgogIGFwaUZ1bmN0aW9ucy5zZXRIYW5kbGVSZXF1ZXN0KCdzZXRJY29uJywgZnVuY3Rpb24oZGV0YWlscywgY2FsbGJhY2spIHsKICAgIHNldEljb24oZGV0YWlscywgZnVuY3Rpb24oYXJncykgewogICAgICBzZW5kUmVxdWVzdCgnYnJvd3NlckFjdGlvbi5zZXRJY29uJywKICAgICAgICAgICAgICAgICAgW2FyZ3MsIGNhbGxiYWNrXSwKICAgICAgICAgICAgICAgICAgYXBpQnJpZGdlID8gdW5kZWZpbmVkIDogdGhpcy5kZWZpbml0aW9uLnBhcmFtZXRlcnMsCiAgICAgICAgICAgICAgICAgIHVuZGVmaW5lZCk7CiAgICB9LmJpbmQodGhpcykpOwogIH0pOwoKICBhcGlGdW5jdGlvbnMuc2V0Q3VzdG9tQ2FsbGJhY2soJ29wZW5Qb3B1cCcsCiAgICAgIGZ1bmN0aW9uKG5hbWUsIHJlcXVlc3QsIGNhbGxiYWNrLCByZXNwb25zZSkgewogICAgaWYgKCFjYWxsYmFjaykKICAgICAgcmV0dXJuOwoKICAgIGlmIChoYXNMYXN0RXJyb3IoKSkgewogICAgICBjYWxsYmFjaygpOwogICAgfSBlbHNlIHsKICAgICAgdmFyIHZpZXdzID0gZ2V0RXh0ZW5zaW9uVmlld3MoLTEsIC0xLCAnUE9QVVAnKTsKICAgICAgY2FsbGJhY2sodmlld3MubGVuZ3RoID4gMCA/IHZpZXdzWzBdIDogbnVsbCk7CiAgICB9CiAgfSk7Cn0pOwoKaWYgKCFhcGlCcmlkZ2UpCiAgZXhwb3J0cy4kc2V0KCdiaW5kaW5nJywgYmluZGluZy5nZW5lcmF0ZSgpKTsKLy8gQ29weXJpZ2h0IDIwMTMgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIEN1c3RvbSBiaW5kaW5nIGZvciB0aGUgQ2FzdCBTdHJlYW1pbmcgUnRwU3RyZWFtIEFQSS4KCnZhciBiaW5kaW5nID0gYXBpQnJpZGdlIHx8CiAgICAgICAgICAgICAgcmVxdWlyZSgnYmluZGluZycpLkJpbmRpbmcuY3JlYXRlKCdjYXN0LnN0cmVhbWluZy5ydHBTdHJlYW0nKTsKdmFyIG5hdGl2ZXMgPSByZXF1aXJlTmF0aXZlKCdjYXN0X3N0cmVhbWluZ19uYXRpdmVzJyk7CgpiaW5kaW5nLnJlZ2lzdGVyQ3VzdG9tSG9vayhmdW5jdGlvbihiaW5kaW5nc0FQSSwgZXh0ZW5zaW9uSWQpIHsKICB2YXIgYXBpRnVuY3Rpb25zID0gYmluZGluZ3NBUEkuYXBpRnVuY3Rpb25zOwoKICBhcGlGdW5jdGlvbnMuc2V0SGFuZGxlUmVxdWVzdCgnZGVzdHJveScsCiAgICAgIGZ1bmN0aW9uKHRyYW5zcG9ydElkKSB7CiAgICAgICAgbmF0aXZlcy5EZXN0cm95Q2FzdFJ0cFN0cmVhbSh0cmFuc3BvcnRJZCk7CiAgfSk7CiAgYXBpRnVuY3Rpb25zLnNldEhhbmRsZVJlcXVlc3QoJ2dldFN1cHBvcnRlZFBhcmFtcycsCiAgICAgIGZ1bmN0aW9uKHRyYW5zcG9ydElkKSB7CiAgICAgICAgcmV0dXJuIG5hdGl2ZXMuR2V0U3VwcG9ydGVkUGFyYW1zQ2FzdFJ0cFN0cmVhbSh0cmFuc3BvcnRJZCk7CiAgfSk7CiAgYXBpRnVuY3Rpb25zLnNldEhhbmRsZVJlcXVlc3QoJ3N0YXJ0JywKICAgICAgZnVuY3Rpb24odHJhbnNwb3J0SWQsIHBhcmFtcykgewogICAgICAgIG5hdGl2ZXMuU3RhcnRDYXN0UnRwU3RyZWFtKHRyYW5zcG9ydElkLCBwYXJhbXMpOwogIH0pOwogIGFwaUZ1bmN0aW9ucy5zZXRIYW5kbGVSZXF1ZXN0KCdzdG9wJywKICAgICAgZnVuY3Rpb24odHJhbnNwb3J0SWQpIHsKICAgICAgICBuYXRpdmVzLlN0b3BDYXN0UnRwU3RyZWFtKHRyYW5zcG9ydElkKTsKICB9KTsKICBhcGlGdW5jdGlvbnMuc2V0SGFuZGxlUmVxdWVzdCgndG9nZ2xlTG9nZ2luZycsCiAgICAgIGZ1bmN0aW9uKHRyYW5zcG9ydElkLCBlbmFibGUpIHsKICAgICAgICBuYXRpdmVzLlRvZ2dsZUxvZ2dpbmcodHJhbnNwb3J0SWQsIGVuYWJsZSk7CiAgfSk7CiAgYXBpRnVuY3Rpb25zLnNldEhhbmRsZVJlcXVlc3QoJ2dldFJhd0V2ZW50cycsCiAgICAgIGZ1bmN0aW9uKHRyYW5zcG9ydElkLCBleHRyYURhdGEsIGNhbGxiYWNrKSB7CiAgICAgICAgbmF0aXZlcy5HZXRSYXdFdmVudHModHJhbnNwb3J0SWQsIGV4dHJhRGF0YSwgY2FsbGJhY2spOwogIH0pOwogIGFwaUZ1bmN0aW9ucy5zZXRIYW5kbGVSZXF1ZXN0KCdnZXRTdGF0cycsCiAgICAgIGZ1bmN0aW9uKHRyYW5zcG9ydElkLCBjYWxsYmFjaykgewogICAgICAgIG5hdGl2ZXMuR2V0U3RhdHModHJhbnNwb3J0SWQsIGNhbGxiYWNrKTsKICB9KTsKfSk7CgppZiAoIWFwaUJyaWRnZSkKICBleHBvcnRzLiRzZXQoJ2JpbmRpbmcnLCBiaW5kaW5nLmdlbmVyYXRlKCkpOwovLyBDb3B5cmlnaHQgMjAxMyBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQovLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gQ3VzdG9tIGJpbmRpbmcgZm9yIHRoZSBDYXN0IFN0cmVhbWluZyBTZXNzaW9uIEFQSS4KCnZhciBiaW5kaW5nID0gYXBpQnJpZGdlIHx8CiAgICAgICAgICAgICAgcmVxdWlyZSgnYmluZGluZycpLkJpbmRpbmcuY3JlYXRlKCdjYXN0LnN0cmVhbWluZy5zZXNzaW9uJyk7CnZhciBuYXRpdmVzID0gcmVxdWlyZU5hdGl2ZSgnY2FzdF9zdHJlYW1pbmdfbmF0aXZlcycpOwoKYmluZGluZy5yZWdpc3RlckN1c3RvbUhvb2soZnVuY3Rpb24oYmluZGluZ3NBUEksIGV4dGVuc2lvbklkKSB7CiAgdmFyIGFwaUZ1bmN0aW9ucyA9IGJpbmRpbmdzQVBJLmFwaUZ1bmN0aW9uczsKICBhcGlGdW5jdGlvbnMuc2V0SGFuZGxlUmVxdWVzdCgnY3JlYXRlJywKICAgICAgZnVuY3Rpb24oYXVkaW9UcmFjaywgdmlkZW9UcmFjaywgY2FsbGJhY2spIHsKICAgICAgICBuYXRpdmVzLkNyZWF0ZVNlc3Npb24oYXVkaW9UcmFjaywgdmlkZW9UcmFjaywgY2FsbGJhY2spOwogIH0pOwp9KTsKCmlmICghYXBpQnJpZGdlKQogIGV4cG9ydHMuJHNldCgnYmluZGluZycsIGJpbmRpbmcuZ2VuZXJhdGUoKSk7Ci8vIENvcHlyaWdodCAyMDEzIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgovLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLyBDdXN0b20gYmluZGluZyBmb3IgdGhlIENhc3QgU3RyZWFtaW5nIFVkcFRyYW5zcG9ydCBBUEkuCgp2YXIgYmluZGluZyA9IGFwaUJyaWRnZSB8fAogICAgICAgICAgICAgIHJlcXVpcmUoJ2JpbmRpbmcnKS5CaW5kaW5nLmNyZWF0ZSgnY2FzdC5zdHJlYW1pbmcudWRwVHJhbnNwb3J0Jyk7CnZhciBuYXRpdmVzID0gcmVxdWlyZU5hdGl2ZSgnY2FzdF9zdHJlYW1pbmdfbmF0aXZlcycpOwoKYmluZGluZy5yZWdpc3RlckN1c3RvbUhvb2soZnVuY3Rpb24oYmluZGluZ3NBUEksIGV4dGVuc2lvbklkKSB7CiAgdmFyIGFwaUZ1bmN0aW9ucyA9IGJpbmRpbmdzQVBJLmFwaUZ1bmN0aW9uczsKCiAgYXBpRnVuY3Rpb25zLnNldEhhbmRsZVJlcXVlc3QoJ2Rlc3Ryb3knLCBmdW5jdGlvbih0cmFuc3BvcnRJZCkgewogICAgbmF0aXZlcy5EZXN0cm95Q2FzdFVkcFRyYW5zcG9ydCh0cmFuc3BvcnRJZCk7CiAgfSk7CiAgYXBpRnVuY3Rpb25zLnNldEhhbmRsZVJlcXVlc3QoJ3NldERlc3RpbmF0aW9uJywKICAgIGZ1bmN0aW9uKHRyYW5zcG9ydElkLCBkZXN0aW5hdGlvbikgewogICAgICBuYXRpdmVzLlNldERlc3RpbmF0aW9uQ2FzdFVkcFRyYW5zcG9ydCh0cmFuc3BvcnRJZCwgZGVzdGluYXRpb24pOwogIH0pOwogIGFwaUZ1bmN0aW9ucy5zZXRIYW5kbGVSZXF1ZXN0KCdzZXRPcHRpb25zJywKICAgIGZ1bmN0aW9uKHRyYW5zcG9ydElkLCBvcHRpb25zKSB7CiAgICAgIG5hdGl2ZXMuU2V0T3B0aW9uc0Nhc3RVZHBUcmFuc3BvcnQodHJhbnNwb3J0SWQsIG9wdGlvbnMpOwogIH0pOwp9KTsKCmlmICghYXBpQnJpZGdlKQogIGV4cG9ydHMuJHNldCgnYmluZGluZycsIGJpbmRpbmcuZ2VuZXJhdGUoKSk7Ci8vIENvcHlyaWdodCAyMDEzIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgovLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLyBDdXN0b20gYmluZGluZyBmb3IgdGhlIENhc3QgU3RyZWFtaW5nIFNlc3Npb24gQVBJLgoKdmFyIGJpbmRpbmcgPQogICAgYXBpQnJpZGdlIHx8CiAgICByZXF1aXJlKCdiaW5kaW5nJykuQmluZGluZy5jcmVhdGUoJ2Nhc3Quc3RyZWFtaW5nLnJlY2VpdmVyU2Vzc2lvbicpOwp2YXIgbmF0aXZlcyA9IHJlcXVpcmVOYXRpdmUoJ2Nhc3Rfc3RyZWFtaW5nX25hdGl2ZXMnKTsKCmJpbmRpbmcucmVnaXN0ZXJDdXN0b21Ib29rKGZ1bmN0aW9uKGJpbmRpbmdzQVBJLCBleHRlbnNpb25JZCkgewogIHZhciBhcGlGdW5jdGlvbnMgPSBiaW5kaW5nc0FQSS5hcGlGdW5jdGlvbnM7CiAgYXBpRnVuY3Rpb25zLnNldEhhbmRsZVJlcXVlc3QoCiAgICAgICdjcmVhdGVBbmRCaW5kJywKICAgICAgZnVuY3Rpb24oYXAsIHZwLCBsb2NhbCwgd2VpZGd0aCwgaGVpZ2h0LCBmciwgdXJsLCBjYiwgb3ApIHsKICAgICAgICBuYXRpdmVzLlN0YXJ0Q2FzdFJ0cFJlY2VpdmVyKAogICAgICAgICAgICBhcCwgdnAsIGxvY2FsLCB3ZWlkZ3RoLCBoZWlnaHQsIGZyLCB1cmwsIGNiLCBvcCk7CiAgfSk7Cn0pOwoKaWYgKCFhcGlCcmlkZ2UpCiAgZXhwb3J0cy4kc2V0KCdiaW5kaW5nJywgYmluZGluZy5nZW5lcmF0ZSgpKTsKLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgovLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgp2YXIgRXZlbnQgPSByZXF1aXJlKCdldmVudF9iaW5kaW5ncycpLkV2ZW50Owp2YXIgc2VuZFJlcXVlc3QgPSByZXF1aXJlKCdzZW5kUmVxdWVzdCcpLnNlbmRSZXF1ZXN0Owp2YXIgdmFsaWRhdGUgPSByZXF1aXJlKCdzY2hlbWFVdGlscycpLnZhbGlkYXRlOwoKZnVuY3Rpb24gZXh0ZW5kU2NoZW1hKHNjaGVtYSkgewogIHZhciBleHRlbmRlZFNjaGVtYSA9ICRBcnJheS5zbGljZShzY2hlbWEpOwogICRBcnJheS51bnNoaWZ0KGV4dGVuZGVkU2NoZW1hLCB7J3R5cGUnOiAnc3RyaW5nJ30pOwogIHJldHVybiBleHRlbmRlZFNjaGVtYTsKfQoKLy8gVE9ETyhkZXZsaW4pOiBNYXliZSBmaW5kIGEgd2F5IHRvIGNvbWJpbmUgdGhpcyBhbmQgQ29udGVudFNldHRpbmcuCmZ1bmN0aW9uIENocm9tZVNldHRpbmcocHJlZktleSwgdmFsdWVTY2hlbWEsIHNjaGVtYSkgewogIHZhciBnZXRGdW5jdGlvblBhcmFtZXRlcnMgPSBmdW5jdGlvbihuYW1lKSB7CiAgICB2YXIgZiA9ICRBcnJheS5maWx0ZXIoCiAgICAgICAgICAgICAgICBzY2hlbWEuZnVuY3Rpb25zLCBmdW5jdGlvbihmKSB7IHJldHVybiBmLm5hbWUgPT09IG5hbWU7IH0pWzBdOwogICAgcmV0dXJuIGYucGFyYW1ldGVyczsKICB9OwogIHRoaXMuZ2V0ID0gZnVuY3Rpb24oZGV0YWlscywgY2FsbGJhY2spIHsKICAgIHZhciBnZXRTY2hlbWEgPSBnZXRGdW5jdGlvblBhcmFtZXRlcnMoJ2dldCcpOwogICAgdmFsaWRhdGUoW2RldGFpbHMsIGNhbGxiYWNrXSwgZ2V0U2NoZW1hKTsKICAgIHJldHVybiBzZW5kUmVxdWVzdCgndHlwZXMuQ2hyb21lU2V0dGluZy5nZXQnLAogICAgICAgICAgICAgICAgICAgICAgIFtwcmVmS2V5LCBkZXRhaWxzLCBjYWxsYmFja10sCiAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5kU2NoZW1hKGdldFNjaGVtYSkpOwogIH07CiAgdGhpcy5zZXQgPSBmdW5jdGlvbihkZXRhaWxzLCBjYWxsYmFjaykgewogICAgLy8gVGhlIHNldCBzY2hlbWEgaW5jbHVkZWQgaW4gdGhlIFNjaGVtYSBvYmplY3QgaXMgZ2VuZXJpYywgc2luY2UgaXQgdmFyaWVzCiAgICAvLyBwZXItc2V0dGluZy4gSG93ZXZlciwgdGhpcyBpcyBvbmx5IGV2ZXIgZm9yIGEgc2luZ2xlIHNldHRpbmcsIHNvIHdlIGNhbgogICAgLy8gZW5mb3JjZSB0aGUgdHlwZXMgbW9yZSB0aG9yb3VnaGx5LgogICAgdmFyIHJhd1NldFNjaGVtYSA9IGdldEZ1bmN0aW9uUGFyYW1ldGVycygnc2V0Jyk7CiAgICB2YXIgcmF3U2V0dGluZ1BhcmFtID0gcmF3U2V0U2NoZW1hWzBdOwogICAgdmFyIHByb3BzID0gJE9iamVjdC5hc3NpZ24oe30sIHJhd1NldHRpbmdQYXJhbS5wcm9wZXJ0aWVzKTsKICAgIHByb3BzLnZhbHVlID0gdmFsdWVTY2hlbWE7CiAgICB2YXIgbW9kU2V0dGluZ1BhcmFtID0gewogICAgICBuYW1lOiByYXdTZXR0aW5nUGFyYW0ubmFtZSwKICAgICAgdHlwZTogcmF3U2V0dGluZ1BhcmFtLnR5cGUsCiAgICAgIHByb3BlcnRpZXM6IHByb3BzLAogICAgfTsKICAgIHZhciBtb2RTZXRTY2hlbWEgPSAkQXJyYXkuc2xpY2UocmF3U2V0U2NoZW1hKTsKICAgIG1vZFNldFNjaGVtYVswXSA9IG1vZFNldHRpbmdQYXJhbTsKICAgIHZhbGlkYXRlKFtkZXRhaWxzLCBjYWxsYmFja10sIG1vZFNldFNjaGVtYSk7CiAgICByZXR1cm4gc2VuZFJlcXVlc3QoJ3R5cGVzLkNocm9tZVNldHRpbmcuc2V0JywKICAgICAgICAgICAgICAgICAgICAgICBbcHJlZktleSwgZGV0YWlscywgY2FsbGJhY2tdLAogICAgICAgICAgICAgICAgICAgICAgIGV4dGVuZFNjaGVtYShtb2RTZXRTY2hlbWEpKTsKICB9OwogIHRoaXMuY2xlYXIgPSBmdW5jdGlvbihkZXRhaWxzLCBjYWxsYmFjaykgewogICAgdmFyIGNsZWFyU2NoZW1hID0gZ2V0RnVuY3Rpb25QYXJhbWV0ZXJzKCdjbGVhcicpOwogICAgdmFsaWRhdGUoW2RldGFpbHMsIGNhbGxiYWNrXSwgY2xlYXJTY2hlbWEpOwogICAgcmV0dXJuIHNlbmRSZXF1ZXN0KCd0eXBlcy5DaHJvbWVTZXR0aW5nLmNsZWFyJywKICAgICAgICAgICAgICAgICAgICAgICBbcHJlZktleSwgZGV0YWlscywgY2FsbGJhY2tdLAogICAgICAgICAgICAgICAgICAgICAgIGV4dGVuZFNjaGVtYShjbGVhclNjaGVtYSkpOwogIH07CiAgdGhpcy5vbkNoYW5nZSA9IG5ldyBFdmVudCgndHlwZXMuQ2hyb21lU2V0dGluZy4nICsgcHJlZktleSArICcub25DaGFuZ2UnKTsKfTsKCmV4cG9ydHMuJHNldCgnQ2hyb21lU2V0dGluZycsIENocm9tZVNldHRpbmcpOwovLyBDb3B5cmlnaHQgMjAxNCBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQovLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKdmFyIGJpbmRpbmcgPSBhcGlCcmlkZ2UgfHwKICAgICAgICAgICAgICByZXF1aXJlKCdiaW5kaW5nJykuQmluZGluZy5jcmVhdGUoJ2Nocm9tZVdlYlZpZXdJbnRlcm5hbCcpOwp2YXIgY29udGV4dE1lbnVzSGFuZGxlcnMgPSByZXF1aXJlKCdjb250ZXh0TWVudXNIYW5kbGVycycpOwoKYmluZGluZy5yZWdpc3RlckN1c3RvbUhvb2soZnVuY3Rpb24oYmluZGluZ3NBUEkpIHsKICB2YXIgYXBpRnVuY3Rpb25zID0gYmluZGluZ3NBUEkuYXBpRnVuY3Rpb25zOwoKICB2YXIgaGFuZGxlcnMgPSBjb250ZXh0TWVudXNIYW5kbGVycy5jcmVhdGUodHJ1ZSAvKiBpc1dlYnZpZXcgKi8pOwoKICBhcGlGdW5jdGlvbnMuc2V0SGFuZGxlUmVxdWVzdCgKICAgICAgJ2NvbnRleHRNZW51c0NyZWF0ZScsIGhhbmRsZXJzLnJlcXVlc3RIYW5kbGVycy5jcmVhdGUpOwoKICBhcGlGdW5jdGlvbnMuc2V0SGFuZGxlUmVxdWVzdCgKICAgICAgJ2NvbnRleHRNZW51c1VwZGF0ZScsIGhhbmRsZXJzLnJlcXVlc3RIYW5kbGVycy51cGRhdGUpOwoKICBhcGlGdW5jdGlvbnMuc2V0SGFuZGxlUmVxdWVzdCgKICAgICAgJ2NvbnRleHRNZW51c1JlbW92ZScsIGhhbmRsZXJzLnJlcXVlc3RIYW5kbGVycy5yZW1vdmUpOwoKICBhcGlGdW5jdGlvbnMuc2V0SGFuZGxlUmVxdWVzdCgKICAgICAgJ2NvbnRleHRNZW51c1JlbW92ZUFsbCcsIGhhbmRsZXJzLnJlcXVlc3RIYW5kbGVycy5yZW1vdmVBbGwpOwp9KTsKCmlmICghYXBpQnJpZGdlKQogIGV4cG9ydHMuJHNldCgnQ2hyb21lV2ViVmlldycsIGJpbmRpbmcuZ2VuZXJhdGUoKSk7Ci8vIENvcHlyaWdodCAyMDE0IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgovLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLyBUaGlzIG1vZHVsZSBpbXBsZW1lbnRzIGNocm9tZS1zcGVjaWZpYyA8d2Vidmlldz4gQVBJLgovLyBTZWUgd2ViX3ZpZXdfYXBpX21ldGhvZHMuanMgZm9yIGRldGFpbHMuCgp2YXIgQ2hyb21lV2ViVmlldyA9IGdldEludGVybmFsQXBpID8KICAgIGdldEludGVybmFsQXBpKCdjaHJvbWVXZWJWaWV3SW50ZXJuYWwnKSA6CiAgICByZXF1aXJlKCdjaHJvbWVXZWJWaWV3SW50ZXJuYWwnKS5DaHJvbWVXZWJWaWV3Owp2YXIgQ2hyb21lV2ViVmlld1NjaGVtYSA9CiAgICByZXF1aXJlTmF0aXZlKCdzY2hlbWFfcmVnaXN0cnknKS5HZXRTY2hlbWEoJ2Nocm9tZVdlYlZpZXdJbnRlcm5hbCcpOwp2YXIgQ3JlYXRlRXZlbnQgPSByZXF1aXJlKCdndWVzdFZpZXdFdmVudHMnKS5DcmVhdGVFdmVudDsKdmFyIEd1ZXN0Vmlld0ludGVybmFsTmF0aXZlcyA9IHJlcXVpcmVOYXRpdmUoJ2d1ZXN0X3ZpZXdfaW50ZXJuYWwnKTsKdmFyIGlkR2VuZXJhdG9yTmF0aXZlcyA9IHJlcXVpcmVOYXRpdmUoJ2lkX2dlbmVyYXRvcicpOwp2YXIgdXRpbHMgPSByZXF1aXJlKCd1dGlscycpOwp2YXIgV2ViVmlld0ltcGwgPSByZXF1aXJlKCd3ZWJWaWV3JykuV2ViVmlld0ltcGw7CgovLyBUaGlzIGlzIHRoZSBvbmx5ICJ3ZWJWaWV3SW50ZXJuYWwub25DbGlja2VkIiBuYW1lZCBldmVudCBmb3IgdGhpcyByZW5kZXJlci4KLy8KLy8gU2luY2Ugd2UgbmVlZCBhbiBldmVudCBwZXIgPHdlYnZpZXc+LCB3ZSBkZWZpbmUgZXZlbnRzIHdpdGggc3VmZml4Ci8vIChzdWJFdmVudE5hbWUpIGluIGVhY2ggb2YgdGhlIDx3ZWJ2aWV3Pi4gQmVoaW5kIHRoZSBzY2VuZXMsIHRoaXMgZXZlbnQgaXMKLy8gcmVnaXN0ZXJlZCBhcyBhIENvbnRleHRNZW51c0V2ZW50LCB3aXRoIGZpbHRlciBzZXQgdG8gdGhlIHdlYnZpZXcncwovLyB8dmlld0luc3RhbmNlSWR8LiBBbnkgdGltZSBhIENvbnRleHRNZW51c0V2ZW50IGlzIGRpc3BhdGNoZWQsIHdlIHJlLWRpc3BhdGNoCi8vIGl0IHRvIHRoZSBzdWJFdmVudCdzIGxpc3RlbmVycy4gVGhpcyB3YXkKLy8gPHdlYnZpZXc+LmNvbnRleHRNZW51cy5vbkNsaWNrZWQgYmVoYXZlIGFzIGEgcmVndWxhciBjaHJvbWUgRXZlbnQgdHlwZS4KdmFyIENvbnRleHRNZW51c0V2ZW50ID0gQ3JlYXRlRXZlbnQoJ2Nocm9tZVdlYlZpZXdJbnRlcm5hbC5vbkNsaWNrZWQnKTsKLy8gU2VlIGNvbW1lbnQgYWJvdmUuCnZhciBDb250ZXh0TWVudXNIYW5kbGVyRXZlbnQgPQogICAgQ3JlYXRlRXZlbnQoJ2Nocm9tZVdlYlZpZXdJbnRlcm5hbC5vbkNvbnRleHRNZW51U2hvdycpOwoKdmFyIGpzRXZlbnQ7CmZ1bmN0aW9uIGNyZWF0ZUN1c3RvbUV2ZW50KG5hbWUsIHNjaGVtYSwgb3B0aW9ucywgd2Vidmlld0lkKSB7CiAgaWYgKGJpbmRpbmdVdGlsKQogICAgcmV0dXJuIGJpbmRpbmdVdGlsLmNyZWF0ZUN1c3RvbUV2ZW50KG5hbWUsIHVuZGVmaW5lZCwgZmFsc2UsIGZhbHNlKTsKICBpZiAoIWpzRXZlbnQpCiAgICBqc0V2ZW50ID0gcmVxdWlyZSgnZXZlbnRfYmluZGluZ3MnKS5FdmVudDsKICByZXR1cm4gbmV3IGpzRXZlbnQobmFtZSwgc2NoZW1hLCBvcHRpb25zLCB3ZWJ2aWV3SWQpOwp9CgovLyBUaGlzIGV2ZW50IGlzIGV4cG9zZWQgYXMgPHdlYnZpZXc+LmNvbnRleHRNZW51cy5vbkNsaWNrZWQuCmZ1bmN0aW9uIGNyZWF0ZUNvbnRleHRNZW51c09uQ2xpY2tlZEV2ZW50KHdlYlZpZXdJbnN0YW5jZUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRfZXZlbnROYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRfYXJnU2NoZW1hcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0X2V2ZW50T3B0aW9ucykgewogIHZhciBzdWJFdmVudE5hbWUgPSBHZXRVbmlxdWVTdWJFdmVudE5hbWUob3B0X2V2ZW50TmFtZSk7CiAgdmFyIG5ld0V2ZW50ID0gY3JlYXRlQ3VzdG9tRXZlbnQoc3ViRXZlbnROYW1lLCBvcHRfYXJnU2NoZW1hcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRfZXZlbnRPcHRpb25zLCB3ZWJWaWV3SW5zdGFuY2VJZCk7CgogIHZhciB2aWV3ID0gR3Vlc3RWaWV3SW50ZXJuYWxOYXRpdmVzLkdldFZpZXdGcm9tSUQod2ViVmlld0luc3RhbmNlSWQpOwogIGlmICh2aWV3KSB7CiAgICB2aWV3LmV2ZW50cy5hZGRTY29wZWRMaXN0ZW5lcigKICAgICAgICBDb250ZXh0TWVudXNFdmVudCwKICAgICAgICAkRnVuY3Rpb24uYmluZChmdW5jdGlvbigpIHsKICAgICAgICAgIC8vIFJlLWRpc3BhdGNoIHRvIHN1YkV2ZW50J3MgbGlzdGVuZXJzLgogICAgICAgICAgJEZ1bmN0aW9uLmFwcGx5KG5ld0V2ZW50LmRpc3BhdGNoLCBuZXdFdmVudCwgJEFycmF5LnNsaWNlKGFyZ3VtZW50cykpOwogICAgICAgIH0sIG5ld0V2ZW50KSwKICAgICAgICB7aW5zdGFuY2VJZDogd2ViVmlld0luc3RhbmNlSWR9KTsKICB9CiAgcmV0dXJuIG5ld0V2ZW50Owp9CgovLyBUaGlzIGV2ZW50IGlzIGV4cG9zZWQgYXMgPHdlYnZpZXc+LmNvbnRleHRNZW51cy5vblNob3cuCmZ1bmN0aW9uIGNyZWF0ZUNvbnRleHRNZW51c09uQ29udGV4dE1lbnVFdmVudCh3ZWJWaWV3SW5zdGFuY2VJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdF9ldmVudE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRfYXJnU2NoZW1hcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdF9ldmVudE9wdGlvbnMpIHsKICB2YXIgc3ViRXZlbnROYW1lID0gR2V0VW5pcXVlU3ViRXZlbnROYW1lKG9wdF9ldmVudE5hbWUpOwogIHZhciBuZXdFdmVudCA9IGNyZWF0ZUN1c3RvbUV2ZW50KHN1YkV2ZW50TmFtZSwgb3B0X2FyZ1NjaGVtYXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0X2V2ZW50T3B0aW9ucywgd2ViVmlld0luc3RhbmNlSWQpOwoKICB2YXIgdmlldyA9IEd1ZXN0Vmlld0ludGVybmFsTmF0aXZlcy5HZXRWaWV3RnJvbUlEKHdlYlZpZXdJbnN0YW5jZUlkKTsKICBpZiAodmlldykgewogICAgdmlldy5ldmVudHMuYWRkU2NvcGVkTGlzdGVuZXIoCiAgICAgICAgQ29udGV4dE1lbnVzSGFuZGxlckV2ZW50LAogICAgICAgICRGdW5jdGlvbi5iaW5kKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgIHZhciBkZWZhdWx0UHJldmVudGVkID0gZmFsc2U7CiAgICAgICAgICB2YXIgZXZlbnQgPSB7CiAgICAgICAgICAgIHByZXZlbnREZWZhdWx0OiBmdW5jdGlvbigpIHsgZGVmYXVsdFByZXZlbnRlZCA9IHRydWU7IH0KICAgICAgICAgIH07CgogICAgICAgICAgLy8gUmUtZGlzcGF0Y2ggdG8gc3ViRXZlbnQncyBsaXN0ZW5lcnMuCiAgICAgICAgICAkRnVuY3Rpb24uYXBwbHkobmV3RXZlbnQuZGlzcGF0Y2gsIG5ld0V2ZW50LCBbZXZlbnRdKTsKCiAgICAgICAgICBpZiAoIWRlZmF1bHRQcmV2ZW50ZWQpIHsKICAgICAgICAgIC8vIFRPRE8obGF6eWJveSk6IFJlbW92ZSB8aXRlbXN8IHBhcmFtZXRlciBjb21wbGV0ZWx5IGZyb20KICAgICAgICAgIC8vIENocm9tZVdlYlZpZXcuc2hvd0NvbnRleHRNZW51IGFzIHdlIGRvbid0IGRvIGFueXRoaW5nIHVzZWZ1bCB3aXRoCiAgICAgICAgICAvLyBpdCBjdXJyZW50bHkuCiAgICAgICAgICB2YXIgaXRlbXMgPSBbXTsKICAgICAgICAgIHZhciBndWVzdEluc3RhbmNlSWQgPSBHdWVzdFZpZXdJbnRlcm5hbE5hdGl2ZXMuCiAgICAgICAgICAgICAgR2V0Vmlld0Zyb21JRCh3ZWJWaWV3SW5zdGFuY2VJZCkuZ3Vlc3QuZ2V0SWQoKTsKICAgICAgICAgIENocm9tZVdlYlZpZXcuc2hvd0NvbnRleHRNZW51KGd1ZXN0SW5zdGFuY2VJZCwgZS5yZXF1ZXN0SWQsIGl0ZW1zKTsKICAgICAgICB9CiAgICAgIH0sIG5ld0V2ZW50KSwKICAgICAge2luc3RhbmNlSWQ6IHdlYlZpZXdJbnN0YW5jZUlkfSk7CiAgfQoKICByZXR1cm4gbmV3RXZlbnQ7Cn0KCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIFdlYlZpZXdDb250ZXh0TWVudXNJbXBsIG9iamVjdC4KCi8vIEFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgaXMgZXhwb3NlZCBhcyA8d2Vidmlldz4uY29udGV4dE1lbnVzLgpmdW5jdGlvbiBXZWJWaWV3Q29udGV4dE1lbnVzSW1wbCh2aWV3SW5zdGFuY2VJZCkgewogIHRoaXMudmlld0luc3RhbmNlSWRfID0gdmlld0luc3RhbmNlSWQ7Cn0KJE9iamVjdC5zZXRQcm90b3R5cGVPZihXZWJWaWV3Q29udGV4dE1lbnVzSW1wbC5wcm90b3R5cGUsIG51bGwpOwoKV2ViVmlld0NvbnRleHRNZW51c0ltcGwucHJvdG90eXBlLmNyZWF0ZSA9IGZ1bmN0aW9uKCkgewogIHZhciBhcmdzID0gJEFycmF5LmNvbmNhdChbdGhpcy52aWV3SW5zdGFuY2VJZF9dLCAkQXJyYXkuc2xpY2UoYXJndW1lbnRzKSk7CiAgcmV0dXJuICRGdW5jdGlvbi5hcHBseShDaHJvbWVXZWJWaWV3LmNvbnRleHRNZW51c0NyZWF0ZSwgbnVsbCwgYXJncyk7Cn07CgpXZWJWaWV3Q29udGV4dE1lbnVzSW1wbC5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24oKSB7CiAgdmFyIGFyZ3MgPSAkQXJyYXkuY29uY2F0KFt0aGlzLnZpZXdJbnN0YW5jZUlkX10sICRBcnJheS5zbGljZShhcmd1bWVudHMpKTsKICByZXR1cm4gJEZ1bmN0aW9uLmFwcGx5KENocm9tZVdlYlZpZXcuY29udGV4dE1lbnVzUmVtb3ZlLCBudWxsLCBhcmdzKTsKfTsKCldlYlZpZXdDb250ZXh0TWVudXNJbXBsLnByb3RvdHlwZS5yZW1vdmVBbGwgPSBmdW5jdGlvbigpIHsKICB2YXIgYXJncyA9ICRBcnJheS5jb25jYXQoW3RoaXMudmlld0luc3RhbmNlSWRfXSwgJEFycmF5LnNsaWNlKGFyZ3VtZW50cykpOwogIHJldHVybiAkRnVuY3Rpb24uYXBwbHkoQ2hyb21lV2ViVmlldy5jb250ZXh0TWVudXNSZW1vdmVBbGwsIG51bGwsIGFyZ3MpOwp9OwoKV2ViVmlld0NvbnRleHRNZW51c0ltcGwucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uKCkgewogIHZhciBhcmdzID0gJEFycmF5LmNvbmNhdChbdGhpcy52aWV3SW5zdGFuY2VJZF9dLCAkQXJyYXkuc2xpY2UoYXJndW1lbnRzKSk7CiAgcmV0dXJuICRGdW5jdGlvbi5hcHBseShDaHJvbWVXZWJWaWV3LmNvbnRleHRNZW51c1VwZGF0ZSwgbnVsbCwgYXJncyk7Cn07CgpmdW5jdGlvbiBXZWJWaWV3Q29udGV4dE1lbnVzKCkgewogIHByaXZhdGVzKFdlYlZpZXdDb250ZXh0TWVudXMpLmNvbnN0cnVjdFByaXZhdGUodGhpcywgYXJndW1lbnRzKTsKfQp1dGlscy5leHBvc2UoV2ViVmlld0NvbnRleHRNZW51cywgV2ViVmlld0NvbnRleHRNZW51c0ltcGwsIHsKICBmdW5jdGlvbnM6IFsKICAgICdjcmVhdGUnLAogICAgJ3JlbW92ZScsCiAgICAncmVtb3ZlQWxsJywKICAgICd1cGRhdGUnLAogIF0sCn0pOwoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCldlYlZpZXdJbXBsLnByb3RvdHlwZS5tYXliZVNldHVwQ29udGV4dE1lbnVzID0gZnVuY3Rpb24oKSB7CiAgaWYgKCF0aGlzLmNvbnRleHRNZW51c09uQ29udGV4dE1lbnVFdmVudF8pIHsKICAgIHZhciBldmVudE5hbWUgPSAnY2hyb21lV2ViVmlld0ludGVybmFsLm9uQ29udGV4dE1lbnVTaG93JzsKICAgIHZhciBldmVudFNjaGVtYSA9CiAgICAgICAgdXRpbHMubG9va3VwKENocm9tZVdlYlZpZXdTY2hlbWEuZXZlbnRzLCAnbmFtZScsICdvblNob3cnKTsKICAgIHZhciBldmVudE9wdGlvbnMgPSB7c3VwcG9ydHNMaXN0ZW5lcnM6IHRydWUsIHN1cHBvcnRzTGF6eUxpc3RlbmVyczogZmFsc2V9OwogICAgdGhpcy5jb250ZXh0TWVudXNPbkNvbnRleHRNZW51RXZlbnRfID0gY3JlYXRlQ29udGV4dE1lbnVzT25Db250ZXh0TWVudUV2ZW50KAogICAgICAgIHRoaXMudmlld0luc3RhbmNlSWQsIGV2ZW50TmFtZSwgZXZlbnRTY2hlbWEsIGV2ZW50T3B0aW9ucyk7CiAgfQoKICB2YXIgY3JlYXRlQ29udGV4dE1lbnVzID0gJEZ1bmN0aW9uLmJpbmQoZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy53ZWFrV3JhcHBlcihmdW5jdGlvbigpIHsKICAgICAgaWYgKHRoaXMuY29udGV4dE1lbnVzXykgewogICAgICAgIHJldHVybiB0aGlzLmNvbnRleHRNZW51c187CiAgICAgIH0KCiAgICAgIHRoaXMuY29udGV4dE1lbnVzXyA9IG5ldyBXZWJWaWV3Q29udGV4dE1lbnVzKHRoaXMudmlld0luc3RhbmNlSWQpOwoKICAgICAgLy8gRGVmaW5lICdvbkNsaWNrZWQnIGV2ZW50IHByb3BlcnR5IG9uIHx0aGlzLmNvbnRleHRNZW51c198LgogICAgICB2YXIgZ2V0T25DbGlja2VkRXZlbnQgPSAkRnVuY3Rpb24uYmluZChmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy53ZWFrV3JhcHBlcihmdW5jdGlvbigpIHsKICAgICAgICAgIGlmICghdGhpcy5jb250ZXh0TWVudXNPbkNsaWNrZWRFdmVudF8pIHsKICAgICAgICAgICAgdmFyIGV2ZW50TmFtZSA9ICdjaHJvbWVXZWJWaWV3SW50ZXJuYWwub25DbGlja2VkJzsKICAgICAgICAgICAgdmFyIGV2ZW50U2NoZW1hID0KICAgICAgICAgICAgICAgIHV0aWxzLmxvb2t1cChDaHJvbWVXZWJWaWV3U2NoZW1hLmV2ZW50cywgJ25hbWUnLCAnb25DbGlja2VkJyk7CiAgICAgICAgICAgIHZhciBldmVudE9wdGlvbnMgPQogICAgICAgICAgICAgICAge3N1cHBvcnRzTGlzdGVuZXJzOiB0cnVlLCBzdXBwb3J0c0xhenlMaXN0ZW5lcnM6IGZhbHNlfTsKICAgICAgICAgICAgdmFyIG9uQ2xpY2tlZEV2ZW50ID0gY3JlYXRlQ29udGV4dE1lbnVzT25DbGlja2VkRXZlbnQoCiAgICAgICAgICAgICAgICB0aGlzLnZpZXdJbnN0YW5jZUlkLCBldmVudE5hbWUsIGV2ZW50U2NoZW1hLCBldmVudE9wdGlvbnMpOwogICAgICAgICAgICB0aGlzLmNvbnRleHRNZW51c09uQ2xpY2tlZEV2ZW50XyA9IG9uQ2xpY2tlZEV2ZW50OwogICAgICAgICAgICByZXR1cm4gb25DbGlja2VkRXZlbnQ7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gdGhpcy5jb250ZXh0TWVudXNPbkNsaWNrZWRFdmVudF87CiAgICAgICAgfSk7CiAgICAgIH0sIHRoaXMpOwogICAgICAkT2JqZWN0LmRlZmluZVByb3BlcnR5KAogICAgICAgICAgdGhpcy5jb250ZXh0TWVudXNfLAogICAgICAgICAgJ29uQ2xpY2tlZCcsCiAgICAgICAgICB7Z2V0OiBnZXRPbkNsaWNrZWRFdmVudCgpLCBlbnVtZXJhYmxlOiB0cnVlfSk7CiAgICAgICRPYmplY3QuZGVmaW5lUHJvcGVydHkoCiAgICAgICAgICB0aGlzLmNvbnRleHRNZW51c18sCiAgICAgICAgICAnb25TaG93JywKICAgICAgICAgIHsKICAgICAgICAgICAgZ2V0OiB0aGlzLndlYWtXcmFwcGVyKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnRleHRNZW51c09uQ29udGV4dE1lbnVFdmVudF87CiAgICAgICAgICAgIH0pLAogICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlCiAgICAgICAgICB9KTsKICAgICAgcmV0dXJuIHRoaXMuY29udGV4dE1lbnVzXzsKICAgIH0pOwogIH0sIHRoaXMpOwoKICAvLyBFeHBvc2UgPHdlYnZpZXc+LmNvbnRleHRNZW51cyBvYmplY3QuCiAgJE9iamVjdC5kZWZpbmVQcm9wZXJ0eSgKICAgICAgdGhpcy5lbGVtZW50LAogICAgICAnY29udGV4dE1lbnVzJywKICAgICAgewogICAgICAgIGdldDogY3JlYXRlQ29udGV4dE1lbnVzKCksCiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZQogICAgICB9KTsKfTsKCmZ1bmN0aW9uIEdldFVuaXF1ZVN1YkV2ZW50TmFtZShldmVudE5hbWUpIHsKICByZXR1cm4gZXZlbnROYW1lICsgJy8nICsgaWRHZW5lcmF0b3JOYXRpdmVzLkdldE5leHRJZCgpOwp9Ci8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQovLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gQ3VzdG9tIGJpbmRpbmcgZm9yIHRoZSBjb250ZW50U2V0dGluZ3MgQVBJLgoKdmFyIHNlbmRSZXF1ZXN0ID0gcmVxdWlyZSgnc2VuZFJlcXVlc3QnKS5zZW5kUmVxdWVzdDsKdmFyIHZhbGlkYXRlID0gcmVxdWlyZSgnc2NoZW1hVXRpbHMnKS52YWxpZGF0ZTsKCi8vIFNvbWUgY29udGVudCB0eXBlcyBoYXZlIGJlZW4gcmVtb3ZlZCBhbmQgbm8gbG9uZ2VyIGNvcnJlc3BvbmQgdG8gYSByZWFsCi8vIGNvbnRlbnQgc2V0dGluZy4gSW5zdGVhZCwgdGhlc2UgYWx3YXlzIHJldHVybiBhIGZpeGVkIGR1bW15IHZhbHVlLCBhbmQgaXNzdWUKLy8gYSB3YXJuaW5nIHdoZW4gYWNjZXNzZWQuIFRoaXMgbWFwcyB0aGUgY29udGVudCB0eXBlIG5hbWUgdG8gdGhlIGR1bW15IHZhbHVlLgp2YXIgREVQUkVDQVRFRF9DT05URU5UX1RZUEVTID0gewogIF9fcHJvdG9fXzogbnVsbCwKCiAgZnVsbHNjcmVlbjogJ2FsbG93JywKICBtb3VzZWxvY2s6ICdhbGxvdycsCn07CgpmdW5jdGlvbiBleHRlbmRTY2hlbWEoc2NoZW1hKSB7CiAgdmFyIGV4dGVuZGVkU2NoZW1hID0gJEFycmF5LnNsaWNlKHNjaGVtYSk7CiAgJEFycmF5LnVuc2hpZnQoZXh0ZW5kZWRTY2hlbWEsIHsndHlwZSc6ICdzdHJpbmcnfSk7CiAgcmV0dXJuIGV4dGVuZGVkU2NoZW1hOwp9CgpmdW5jdGlvbiBDb250ZW50U2V0dGluZyhjb250ZW50VHlwZSwgc2V0dGluZ1NjaGVtYSwgc2NoZW1hKSB7CiAgdmFyIGdldEZ1bmN0aW9uUGFyYW1ldGVycyA9IGZ1bmN0aW9uKG5hbWUpIHsKICAgIHZhciBmID0gJEFycmF5LmZpbHRlcigKICAgICAgICAgICAgICAgIHNjaGVtYS5mdW5jdGlvbnMsIGZ1bmN0aW9uKGYpIHsgcmV0dXJuIGYubmFtZSA9PT0gbmFtZTsgfSlbMF07CiAgICByZXR1cm4gZi5wYXJhbWV0ZXJzOwogIH07CiAgdGhpcy5nZXQgPSBmdW5jdGlvbihkZXRhaWxzLCBjYWxsYmFjaykgewogICAgdmFyIGdldFNjaGVtYSA9IGdldEZ1bmN0aW9uUGFyYW1ldGVycygnZ2V0Jyk7CiAgICB2YWxpZGF0ZShbZGV0YWlscywgY2FsbGJhY2tdLCBnZXRTY2hlbWEpOwoKICAgIHZhciBkdW1teVNldHRpbmcgPSBERVBSRUNBVEVEX0NPTlRFTlRfVFlQRVNbY29udGVudFR5cGVdOwogICAgaWYgKGR1bW15U2V0dGluZyAhPT0gdW5kZWZpbmVkKSB7CiAgICAgIGNvbnNvbGUud2FybignY29udGVudFNldHRpbmdzLicgKyBjb250ZW50VHlwZSArICcgaXMgZGVwcmVjYXRlZDsgaXQgd2lsbCAnCiAgICAgICAgICAgICAgICAgICArICdhbHdheXMgcmV0dXJuIFwnJyArIGR1bW15U2V0dGluZyArICdcJy4nKTsKICAgICAgJEZ1bmN0aW9uLmFwcGx5KGNhbGxiYWNrLCB1bmRlZmluZWQsIFt7c2V0dGluZzogZHVtbXlTZXR0aW5nfV0pOwogICAgICByZXR1cm47CiAgICB9CgogICAgcmV0dXJuIHNlbmRSZXF1ZXN0KCdjb250ZW50U2V0dGluZ3MuZ2V0JywKICAgICAgICAgICAgICAgICAgICAgICBbY29udGVudFR5cGUsIGRldGFpbHMsIGNhbGxiYWNrXSwKICAgICAgICAgICAgICAgICAgICAgICBleHRlbmRTY2hlbWEoZ2V0U2NoZW1hKSk7CiAgfTsKCiAgdGhpcy5zZXQgPSBmdW5jdGlvbihkZXRhaWxzLCBjYWxsYmFjaykgewogICAgLy8gV2UgY2hlY2sgaWYgdGhlIHNldHRpbmcgaXMgZGVwcmVjYXRlZCBmaXJzdCwgc2luY2UgdGhlIHZhbGlkYXRpb24gd2lsbAogICAgLy8gZmFpbCBmb3IgZGVwcmVjYXRlZCB0eXBlcy4KICAgIGlmICgkT2JqZWN0Lmhhc093blByb3BlcnR5KERFUFJFQ0FURURfQ09OVEVOVF9UWVBFUywgY29udGVudFR5cGUpKSB7CiAgICAgIGNvbnNvbGUud2FybignY29udGVudFNldHRpbmdzLicgKyBjb250ZW50VHlwZSArICcgaXMgZGVwcmVjYXRlZDsgc2V0dGluZyAnCiAgICAgICAgICAgICAgICAgICArICdpdCBoYXMgbm8gZWZmZWN0LicpOwogICAgICAkRnVuY3Rpb24uYXBwbHkoY2FsbGJhY2ssIHVuZGVmaW5lZCwgW10pOwogICAgICByZXR1cm47CiAgICB9CgogICAgLy8gVGhlIHNldCBzY2hlbWEgaW5jbHVkZWQgaW4gdGhlIFNjaGVtYSBvYmplY3QgaXMgZ2VuZXJpYywgc2luY2UgaXQgdmFyaWVzCiAgICAvLyBwZXItc2V0dGluZy4gSG93ZXZlciwgdGhpcyBpcyBvbmx5IGV2ZXIgZm9yIGEgc2luZ2xlIHNldHRpbmcsIHNvIHdlIGNhbgogICAgLy8gZW5mb3JjZSB0aGUgdHlwZXMgbW9yZSB0aG9yb3VnaGx5LgogICAgdmFyIHJhd1NldFNjaGVtYSA9IGdldEZ1bmN0aW9uUGFyYW1ldGVycygnc2V0Jyk7CiAgICB2YXIgcmF3U2V0dGluZ1BhcmFtID0gcmF3U2V0U2NoZW1hWzBdOwogICAgdmFyIHByb3BzID0gJE9iamVjdC5hc3NpZ24oe30sIHJhd1NldHRpbmdQYXJhbS5wcm9wZXJ0aWVzKTsKICAgIHByb3BzLnNldHRpbmcgPSBzZXR0aW5nU2NoZW1hOwogICAgdmFyIG1vZFNldHRpbmdQYXJhbSA9IHsKICAgICAgbmFtZTogcmF3U2V0dGluZ1BhcmFtLm5hbWUsCiAgICAgIHR5cGU6IHJhd1NldHRpbmdQYXJhbS50eXBlLAogICAgICBwcm9wZXJ0aWVzOiBwcm9wcywKICAgIH07CiAgICB2YXIgbW9kU2V0U2NoZW1hID0gJEFycmF5LnNsaWNlKHJhd1NldFNjaGVtYSk7CiAgICBtb2RTZXRTY2hlbWFbMF0gPSBtb2RTZXR0aW5nUGFyYW07CiAgICB2YWxpZGF0ZShbZGV0YWlscywgY2FsbGJhY2tdLCBtb2RTZXRTY2hlbWEpOwoKICAgIHJldHVybiBzZW5kUmVxdWVzdCgnY29udGVudFNldHRpbmdzLnNldCcsCiAgICAgICAgICAgICAgICAgICAgICAgW2NvbnRlbnRUeXBlLCBkZXRhaWxzLCBjYWxsYmFja10sCiAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5kU2NoZW1hKG1vZFNldFNjaGVtYSkpOwogIH07CgogIHRoaXMuY2xlYXIgPSBmdW5jdGlvbihkZXRhaWxzLCBjYWxsYmFjaykgewogICAgdmFyIGNsZWFyU2NoZW1hID0gZ2V0RnVuY3Rpb25QYXJhbWV0ZXJzKCdjbGVhcicpOwogICAgdmFsaWRhdGUoW2RldGFpbHMsIGNhbGxiYWNrXSwgY2xlYXJTY2hlbWEpOwoKICAgIGlmICgkT2JqZWN0Lmhhc093blByb3BlcnR5KERFUFJFQ0FURURfQ09OVEVOVF9UWVBFUywgY29udGVudFR5cGUpKSB7CiAgICAgIGNvbnNvbGUud2FybignY29udGVudFNldHRpbmdzLicgKyBjb250ZW50VHlwZSArICcgaXMgZGVwcmVjYXRlZDsgJwogICAgICAgICAgICAgICAgICAgKyAnY2xlYXJpbmcgaXQgaGFzIG5vIGVmZmVjdC4nKTsKICAgICAgJEZ1bmN0aW9uLmFwcGx5KGNhbGxiYWNrLCB1bmRlZmluZWQsIFtdKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIHJldHVybiBzZW5kUmVxdWVzdCgnY29udGVudFNldHRpbmdzLmNsZWFyJywKICAgICAgICAgICAgICAgICAgICAgICBbY29udGVudFR5cGUsIGRldGFpbHMsIGNhbGxiYWNrXSwKICAgICAgICAgICAgICAgICAgICAgICBleHRlbmRTY2hlbWEoY2xlYXJTY2hlbWEpKTsKICB9OwoKICB0aGlzLmdldFJlc291cmNlSWRlbnRpZmllcnMgPSBmdW5jdGlvbihjYWxsYmFjaykgewogICAgdmFyIHNjaGVtYSA9IGdldEZ1bmN0aW9uUGFyYW1ldGVycygnZ2V0UmVzb3VyY2VJZGVudGlmaWVycycpOwogICAgdmFsaWRhdGUoW2NhbGxiYWNrXSwgc2NoZW1hKTsKCiAgICBpZiAoJE9iamVjdC5oYXNPd25Qcm9wZXJ0eShERVBSRUNBVEVEX0NPTlRFTlRfVFlQRVMsIGNvbnRlbnRUeXBlKSkgewogICAgICAkRnVuY3Rpb24uYXBwbHkoY2FsbGJhY2ssIHVuZGVmaW5lZCwgW10pOwogICAgICByZXR1cm47CiAgICB9CgogICAgcmV0dXJuIHNlbmRSZXF1ZXN0KAogICAgICAgICdjb250ZW50U2V0dGluZ3MuZ2V0UmVzb3VyY2VJZGVudGlmaWVycycsCiAgICAgICAgW2NvbnRlbnRUeXBlLCBjYWxsYmFja10sCiAgICAgICAgZXh0ZW5kU2NoZW1hKHNjaGVtYSkpOwogIH07Cn0KCmV4cG9ydHMuJHNldCgnQ29udGVudFNldHRpbmcnLCBDb250ZW50U2V0dGluZyk7Ci8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQovLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gQ3VzdG9tIGJpbmRpbmcgZm9yIHRoZSBkZWNsYXJhdGl2ZUNvbnRlbnQgQVBJLgoKdmFyIGJpbmRpbmcgPQogICAgYXBpQnJpZGdlIHx8IHJlcXVpcmUoJ2JpbmRpbmcnKS5CaW5kaW5nLmNyZWF0ZSgnZGVjbGFyYXRpdmVDb250ZW50Jyk7CgppZiAoIWFwaUJyaWRnZSkgewogIHZhciB1dGlscyA9IHJlcXVpcmUoJ3V0aWxzJyk7CiAgdmFyIHZhbGlkYXRlID0gcmVxdWlyZSgnc2NoZW1hVXRpbHMnKS52YWxpZGF0ZTsKICB2YXIgY2Fub25pY2FsaXplQ29tcG91bmRTZWxlY3RvciA9CiAgICAgIHJlcXVpcmVOYXRpdmUoJ2Nzc19uYXRpdmVzJykuQ2Fub25pY2FsaXplQ29tcG91bmRTZWxlY3RvcjsKfQoKdmFyIHNldEljb24gPSByZXF1aXJlKCdzZXRJY29uJykuc2V0SWNvbjsKCmJpbmRpbmcucmVnaXN0ZXJDdXN0b21Ib29rKGZ1bmN0aW9uKGFwaSkgewogIHZhciBkZWNsYXJhdGl2ZUNvbnRlbnQgPSBhcGkuY29tcGlsZWRBcGk7CgogIGlmIChhcGlCcmlkZ2UpIHsKICAgIC8vIFZhbGlkYXRpb24gZm9yIG1vc3QgdHlwZXMgaXMgZG9uZSBpbiB0aGUgbmF0aXZlIEMrKyB3aXRoIG5hdGl2ZSBiaW5kaW5ncywKICAgIC8vIGJ1dCBzZXRJY29uIGlzIGZ1bm55IChhbmQgc2FkbHkgYnJva2VuKS4gSWRlYWxseSwgd2UgY2FuIG1vdmUgdGhpcwogICAgLy8gdmFsaWRhdGlvbiBlbnRpcmVseSBpbnRvIHRoZSBuYXRpdmUgY29kZSwgYW5kIHRoaXMgd2hvbGUgZmlsZSBjYW4gZ28KICAgIC8vIGF3YXkuCiAgICB2YXIgbmF0aXZlU2V0SWNvbiA9IGRlY2xhcmF0aXZlQ29udGVudC5TZXRJY29uOwogICAgZGVjbGFyYXRpdmVDb250ZW50LlNldEljb24gPSBmdW5jdGlvbihwYXJhbWV0ZXJzKSB7CiAgICAgIC8vIFRPRE8oZGV2bGluKTogVGhpcyBpcyB2ZXJ5LCB2ZXJ5IHdyb25nLiBzZXRJY29uKCkgaXMgcG90ZW50aWFsbHkKICAgICAgLy8gYXN5bmNocm9ub3VzIChpbiB0aGUgY2FzZSBvZiBhIHBhdGggYmVpbmcgc3BlY2lmaWVkKSwgd2hpY2ggbWVhbnMgdGhpcwogICAgICAvLyBiZWNvbWVzIGFuICJhc3luY2hyb25vdXMgY29uc3RydWN0b3IiLiBFcnJvcnMgY2FuIGJlIHRocm93biAqYWZ0ZXIqIHRoZQogICAgICAvLyBgbmV3IGRlY2xhcmF0aXZlQ29udGVudC5TZXRJY29uKC4uLilgIGNhbGwsIGFuZCBpbiB0aGUgYXN5bmMgY2FzZXMsCiAgICAgIC8vIHRoaXMgd291bGRuJ3Qgd29yayB3aGVuIHdlIGltbWVkaWF0ZWx5IGFkZCB0aGUgYWN0aW9uIHZpYSBhbiBBUEkgY2FsbAogICAgICAvLyAoZS5nLiwKICAgICAgLy8gICBjaHJvbWUuZGVjbGFyYXRpdmVDb250ZW50Lm9uUGFnZUNoYW5nZS5hZGRSdWxlcygKICAgICAgLy8gICAgICAgW3tjb25kaXRpb25zOiAuLi4sIGFjdGlvbnM6IFsgbmV3IFNldEljb24oLi4uKSBdfV0pOwogICAgICAvLyApLiBTb21lIG9mIHRoaXMgaXMgdHJhY2tlZCBpbiBodHRwOi8vY3JidWcuY29tLzQxNTMxNS4KICAgICAgc2V0SWNvbihwYXJhbWV0ZXJzLCAkRnVuY3Rpb24uYmluZChmdW5jdGlvbihkYXRhKSB7CiAgICAgICAgLy8gRmFrZSBjYWxsaW5nIHRoZSBvcmlnaW5hbCBmdW5jdGlvbiBhcyBhIGNvbnN0cnVjdG9yLgogICAgICAgICRPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgbmF0aXZlU2V0SWNvbi5wcm90b3R5cGUpOwogICAgICAgICRGdW5jdGlvbi5hcHBseShuYXRpdmVTZXRJY29uLCB0aGlzLCBbZGF0YV0pOwogICAgICB9LCB0aGlzKSk7CiAgICB9OwogICAgcmV0dXJuOwogIH0KCiAgLy8gUmV0dXJucyB0aGUgc2NoZW1hIGRlZmluaXRpb24gb2YgdHlwZSB8dHlwZUlkfCBkZWZpbmVkIGluIHxuYW1lc3BhY2V8LgogIGZ1bmN0aW9uIGdldFNjaGVtYSh0eXBlSWQpIHsKICAgIHJldHVybiB1dGlscy5sb29rdXAoYXBpLnNjaGVtYS50eXBlcywKICAgICAgICAgICAgICAgICAgICAgICAgJ2lkJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2RlY2xhcmF0aXZlQ29udGVudC4nICsgdHlwZUlkKTsKICB9CgogIC8vIEhlbHBlciBmdW5jdGlvbiBmb3IgdGhlIGNvbnN0cnVjdG9yIG9mIGNvbmNyZXRlIGRhdGF0eXBlcyBvZiB0aGUKICAvLyBkZWNsYXJhdGl2ZSBjb250ZW50IEFQSS4KICAvLyBNYWtlcyBzdXJlIHRoYXQgfHRoaXN8IGNvbnRhaW5zIHRoZSB1bmlvbiBvZiBwYXJhbWV0ZXJzIGFuZAogIC8vIHsnaW5zdGFuY2VUeXBlJzogJ2RlY2xhcmF0aXZlQ29udGVudC4nICsgdHlwZUlkfSBhbmQgdmFsaWRhdGVzIHRoZQogIC8vIGdlbmVyYXRlZCB1bmlvbiBkaWN0aW9uYXJ5IGFnYWluc3QgdGhlIHNjaGVtYSBmb3IgfHR5cGVJZHwuCiAgZnVuY3Rpb24gc2V0dXBJbnN0YW5jZShpbnN0YW5jZSwgcGFyYW1ldGVycywgdHlwZUlkKSB7CiAgICBmb3IgKHZhciBrZXkgaW4gcGFyYW1ldGVycykgewogICAgICBpZiAoJE9iamVjdC5oYXNPd25Qcm9wZXJ0eShwYXJhbWV0ZXJzLCBrZXkpKSB7CiAgICAgICAgaW5zdGFuY2Vba2V5XSA9IHBhcmFtZXRlcnNba2V5XTsKICAgICAgfQogICAgfQogICAgaW5zdGFuY2UuaW5zdGFuY2VUeXBlID0gJ2RlY2xhcmF0aXZlQ29udGVudC4nICsgdHlwZUlkOwogICAgdmFyIHNjaGVtYSA9IGdldFNjaGVtYSh0eXBlSWQpOwogICAgdmFsaWRhdGUoW2luc3RhbmNlXSwgW3NjaGVtYV0pOwogIH0KCiAgZnVuY3Rpb24gY2Fub25pY2FsaXplQ3NzU2VsZWN0b3JzKHNlbGVjdG9ycykgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxlY3RvcnMubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIGNhbm9uaWNhbGl6ZWRTZWxlY3RvciA9IGNhbm9uaWNhbGl6ZUNvbXBvdW5kU2VsZWN0b3Ioc2VsZWN0b3JzW2ldKTsKICAgICAgaWYgKGNhbm9uaWNhbGl6ZWRTZWxlY3RvciA9PSAnJykgewogICAgICAgIHRocm93IG5ldyBFcnJvcigKICAgICAgICAgICAgJ0VsZW1lbnQgb2YgXCdjc3NcJyBhcnJheSBtdXN0IGJlIGEgJyArCiAgICAgICAgICAgICdsaXN0IG9mIHZhbGlkIGNvbXBvdW5kIHNlbGVjdG9yczogJyArCiAgICAgICAgICAgIHNlbGVjdG9yc1tpXSk7CiAgICAgIH0KICAgICAgc2VsZWN0b3JzW2ldID0gY2Fub25pY2FsaXplZFNlbGVjdG9yOwogICAgfQogIH0KCiAgLy8gU2V0dXAgYWxsIGRhdGEgdHlwZXMgZm9yIHRoZSBkZWNsYXJhdGl2ZSBjb250ZW50IEFQSS4KICBkZWNsYXJhdGl2ZUNvbnRlbnQuUGFnZVN0YXRlTWF0Y2hlciA9IGZ1bmN0aW9uKHBhcmFtZXRlcnMpIHsKICAgIHNldHVwSW5zdGFuY2UodGhpcywgcGFyYW1ldGVycywgJ1BhZ2VTdGF0ZU1hdGNoZXInKTsKICAgIGlmICgkT2JqZWN0Lmhhc093blByb3BlcnR5KHRoaXMsICdjc3MnKSkgewogICAgICBjYW5vbmljYWxpemVDc3NTZWxlY3RvcnModGhpcy5jc3MpOwogICAgfQogIH07CiAgZGVjbGFyYXRpdmVDb250ZW50LlNob3dQYWdlQWN0aW9uID0gZnVuY3Rpb24ocGFyYW1ldGVycykgewogICAgc2V0dXBJbnN0YW5jZSh0aGlzLCBwYXJhbWV0ZXJzLCAnU2hvd1BhZ2VBY3Rpb24nKTsKICB9OwogIGRlY2xhcmF0aXZlQ29udGVudC5SZXF1ZXN0Q29udGVudFNjcmlwdCA9IGZ1bmN0aW9uKHBhcmFtZXRlcnMpIHsKICAgIHNldHVwSW5zdGFuY2UodGhpcywgcGFyYW1ldGVycywgJ1JlcXVlc3RDb250ZW50U2NyaXB0Jyk7CiAgfTsKICAvLyBUT0RPKHJvY2tvdCk6IERvIG5vdCBleHBvc2UgdGhpcyBpbiBNMzkgc3RhYmxlLiBNYWtpbmcgdGhpcyByZXN0cmljdGlvbgogIC8vIHBvc3NpYmxlIHdpbGwgdGFrZSBzb21lIGV4dHJhIHdvcmsuIFNlZSBodHRwOi8vY3JidWcuY29tLzQxNTMxNQogIC8vIE5vdGU6IFNlZSBhbHNvIHRoZSBTZXRJY29uIHdyYXBwZXIgYWJvdmUgZm9yIG1vcmUgaXNzdWVzLgogIGRlY2xhcmF0aXZlQ29udGVudC5TZXRJY29uID0gZnVuY3Rpb24ocGFyYW1ldGVycykgewogICAgc2V0SWNvbihwYXJhbWV0ZXJzLCAkRnVuY3Rpb24uYmluZChmdW5jdGlvbihkYXRhKSB7CiAgICAgIHNldHVwSW5zdGFuY2UodGhpcywgZGF0YSwgJ1NldEljb24nKTsKICAgIH0sIHRoaXMpKTsKICB9Owp9KTsKCmlmICghYXBpQnJpZGdlKQogIGV4cG9ydHMuJHNldCgnYmluZGluZycsIGJpbmRpbmcuZ2VuZXJhdGUoKSk7Ci8vIENvcHlyaWdodCAyMDEzIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgovLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLyBDdXN0b20gYmluZGluZyBmb3IgdGhlIGRlc2t0b3BDYXB0dXJlIEFQSS4KCnZhciBiaW5kaW5nID0gYXBpQnJpZGdlIHx8IHJlcXVpcmUoJ2JpbmRpbmcnKS5CaW5kaW5nLmNyZWF0ZSgnZGVza3RvcENhcHR1cmUnKTsKdmFyIHNlbmRSZXF1ZXN0ID0gYmluZGluZ1V0aWwgPwogICAgJEZ1bmN0aW9uLmJpbmQoYmluZGluZ1V0aWwuc2VuZFJlcXVlc3QsIGJpbmRpbmdVdGlsKSA6CiAgICByZXF1aXJlKCdzZW5kUmVxdWVzdCcpLnNlbmRSZXF1ZXN0Owp2YXIgaWRHZW5lcmF0b3IgPSByZXF1aXJlTmF0aXZlKCdpZF9nZW5lcmF0b3InKTsKCmJpbmRpbmcucmVnaXN0ZXJDdXN0b21Ib29rKGZ1bmN0aW9uKGJpbmRpbmdzQVBJKSB7CiAgdmFyIGFwaUZ1bmN0aW9ucyA9IGJpbmRpbmdzQVBJLmFwaUZ1bmN0aW9uczsKCiAgdmFyIHBlbmRpbmdSZXF1ZXN0cyA9IHt9OwoKICBmdW5jdGlvbiBvblJlcXVlc3RSZXN1bHQoaWQsIHJlc3VsdCwgb3B0aW9ucykgewogICAgaWYgKGlkIGluIHBlbmRpbmdSZXF1ZXN0cykgewogICAgICB2YXIgY2FsbGJhY2sgPSBwZW5kaW5nUmVxdWVzdHNbaWRdOwogICAgICBkZWxldGUgcGVuZGluZ1JlcXVlc3RzW2lkXTsKICAgICAgY2FsbGJhY2socmVzdWx0LCBvcHRpb25zKTsKICAgIH0KICB9CgogIGFwaUZ1bmN0aW9ucy5zZXRIYW5kbGVSZXF1ZXN0KCdjaG9vc2VEZXNrdG9wTWVkaWEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKHNvdXJjZXMsIHRhcmdldF90YWIsIGNhbGxiYWNrKSB7CiAgICAvLyB8dGFyZ2V0X3RhYnwgaXMgYW4gb3B0aW9uYWwgcGFyYW1ldGVyLgogICAgaWYgKGNhbGxiYWNrID09PSB1bmRlZmluZWQpIHsKICAgICAgY2FsbGJhY2sgPSB0YXJnZXRfdGFiOwogICAgICB0YXJnZXRfdGFiID0gdW5kZWZpbmVkOwogICAgfQogICAgdmFyIGlkID0gaWRHZW5lcmF0b3IuR2V0TmV4dElkKCk7CiAgICBwZW5kaW5nUmVxdWVzdHNbaWRdID0gY2FsbGJhY2s7CiAgICBzZW5kUmVxdWVzdCgnZGVza3RvcENhcHR1cmUuY2hvb3NlRGVza3RvcE1lZGlhJywKICAgICAgICAgICAgICAgIFtpZCwgc291cmNlcywgdGFyZ2V0X3RhYiwKICAgICAgICAgICAgICAgICAkRnVuY3Rpb24uYmluZChvblJlcXVlc3RSZXN1bHQsIG51bGwsIGlkKV0sCiAgICAgICAgICAgICAgICBhcGlCcmlkZ2UgPyB1bmRlZmluZWQgOiB0aGlzLmRlZmluaXRpb24ucGFyYW1ldGVycywKICAgICAgICAgICAgICAgIHVuZGVmaW5lZCk7CiAgICByZXR1cm4gaWQ7CiAgfSk7CgogIGFwaUZ1bmN0aW9ucy5zZXRIYW5kbGVSZXF1ZXN0KCdjYW5jZWxDaG9vc2VEZXNrdG9wTWVkaWEnLCBmdW5jdGlvbihpZCkgewogICAgaWYgKGlkIGluIHBlbmRpbmdSZXF1ZXN0cykgewogICAgICBkZWxldGUgcGVuZGluZ1JlcXVlc3RzW2lkXTsKICAgICAgc2VuZFJlcXVlc3QoJ2Rlc2t0b3BDYXB0dXJlLmNhbmNlbENob29zZURlc2t0b3BNZWRpYScsCiAgICAgICAgICAgICAgICAgIFtpZF0sIGFwaUJyaWRnZSA/IHVuZGVmaW5lZCA6IHRoaXMuZGVmaW5pdGlvbi5wYXJhbWV0ZXJzLAogICAgICAgICAgICAgICAgICB1bmRlZmluZWQpOwogICAgfQogIH0pOwp9KTsKCmlmICghYXBpQnJpZGdlKQogIGV4cG9ydHMuJHNldCgnYmluZGluZycsIGJpbmRpbmcuZ2VuZXJhdGUoKSk7Ci8vIENvcHlyaWdodCAyMDE0IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgovLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLyBDdXN0b20gYmluZGluZyBmb3IgdGhlIGRldmVsb3BlclByaXZhdGUgQVBJLgoKdmFyIGJpbmRpbmcgPQogICAgYXBpQnJpZGdlIHx8IHJlcXVpcmUoJ2JpbmRpbmcnKS5CaW5kaW5nLmNyZWF0ZSgnZGV2ZWxvcGVyUHJpdmF0ZScpOwoKYmluZGluZy5yZWdpc3RlckN1c3RvbUhvb2soZnVuY3Rpb24oYmluZGluZ3NBUEkpIHsKICB2YXIgYXBpRnVuY3Rpb25zID0gYmluZGluZ3NBUEkuYXBpRnVuY3Rpb25zOwoKICAvLyBDb252ZXJ0cyB0aGUgYXJndW1lbnQgb2YgfGZ1bmN0aW9uTmFtZXwgZnJvbSBEaXJlY3RvcnlFbnRyeSB0byBVUkwuCiAgZnVuY3Rpb24gYmluZEZpbGVTeXN0ZW1GdW5jdGlvbihmdW5jdGlvbk5hbWUpIHsKICAgIGFwaUZ1bmN0aW9ucy5zZXRVcGRhdGVBcmd1bWVudHNQb3N0VmFsaWRhdGUoCiAgICAgICAgZnVuY3Rpb25OYW1lLCBmdW5jdGlvbihkaXJlY3RvcnlFbnRyeSwgY2FsbGJhY2spIHsKICAgICAgICAgIHZhciBmaWxlU3lzdGVtTmFtZSA9IGRpcmVjdG9yeUVudHJ5LmZpbGVzeXN0ZW0ubmFtZTsKICAgICAgICAgIHZhciByZWxhdGl2ZVBhdGggPSAkU3RyaW5nLnNsaWNlKGRpcmVjdG9yeUVudHJ5LmZ1bGxQYXRoLCAxKTsKICAgICAgICAgIHZhciB1cmwgPSBkaXJlY3RvcnlFbnRyeS50b1VSTCgpOwogICAgICAgICAgcmV0dXJuIFtmaWxlU3lzdGVtTmFtZSwgcmVsYXRpdmVQYXRoLCB1cmwsIGNhbGxiYWNrXTsKICAgIH0pOwogIH0KCiAgYmluZEZpbGVTeXN0ZW1GdW5jdGlvbignbG9hZERpcmVjdG9yeScpOwoKICAvLyBkZXZlbG9wZXJQcml2YXRlLmVuYWJsZSBpcyB0aGUgc2FtZSBhcyBjaHJvbWUubWFuYWdlbWVudC5zZXRFbmFibGVkLgogIC8vIFRPRE8oZGV2bGluKTogTWlncmF0ZSBjYWxsZXJzIG9mZiBkZXZlbG9wZXJQcml2YXRlLmVuYWJsZS4KICBiaW5kaW5nc0FQSS5jb21waWxlZEFwaS5lbmFibGUgPSBjaHJvbWUubWFuYWdlbWVudC5zZXRFbmFibGVkOwoKICBhcGlGdW5jdGlvbnMuc2V0SGFuZGxlUmVxdWVzdCgnYWxsb3dGaWxlQWNjZXNzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbihpZCwgYWxsb3csIGNhbGxiYWNrKSB7CiAgICBjaHJvbWUuZGV2ZWxvcGVyUHJpdmF0ZS51cGRhdGVFeHRlbnNpb25Db25maWd1cmF0aW9uKAogICAgICAgIHtleHRlbnNpb25JZDogaWQsIGZpbGVBY2Nlc3M6IGFsbG93fSwgY2FsbGJhY2spOwogIH0pOwoKICBhcGlGdW5jdGlvbnMuc2V0SGFuZGxlUmVxdWVzdCgnYWxsb3dJbmNvZ25pdG8nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKGlkLCBhbGxvdywgY2FsbGJhY2spIHsKICAgIGNocm9tZS5kZXZlbG9wZXJQcml2YXRlLnVwZGF0ZUV4dGVuc2lvbkNvbmZpZ3VyYXRpb24oCiAgICAgICAge2V4dGVuc2lvbklkOiBpZCwgaW5jb2duaXRvQWNjZXNzOiBhbGxvd30sIGNhbGxiYWNrKTsKICB9KTsKCiAgYXBpRnVuY3Rpb25zLnNldEhhbmRsZVJlcXVlc3QoJ2luc3BlY3QnLCBmdW5jdGlvbihvcHRpb25zLCBjYWxsYmFjaykgewogICAgdmFyIHJlbmRlclZpZXdJZCA9IG9wdGlvbnMucmVuZGVyX3ZpZXdfaWQ7CiAgICBpZiAodHlwZW9mIHJlbmRlclZpZXdJZCA9PSAnc3RyaW5nJykgewogICAgICByZW5kZXJWaWV3SWQgPSBwYXJzZUludChyZW5kZXJWaWV3SWQpOwogICAgICBpZiAoaXNOYU4ocmVuZGVyVmlld0lkKSkKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdmFsdWUgZm9yIHJlbmRlcl92aWV3X2lkJyk7CiAgICB9CiAgICB2YXIgcmVuZGVyUHJvY2Vzc0lkID0gb3B0aW9ucy5yZW5kZXJfcHJvY2Vzc19pZDsKICAgIGlmICh0eXBlb2YgcmVuZGVyUHJvY2Vzc0lkID09ICdzdHJpbmcnKSB7CiAgICAgIHJlbmRlclByb2Nlc3NJZCA9IHBhcnNlSW50KHJlbmRlclByb2Nlc3NJZCk7CiAgICAgIGlmIChpc05hTihyZW5kZXJQcm9jZXNzSWQpKQogICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB2YWx1ZSBmb3IgcmVuZGVyX3Byb2Nlc3NfaWQnKTsKICAgIH0KICAgIGNocm9tZS5kZXZlbG9wZXJQcml2YXRlLm9wZW5EZXZUb29scyh7CiAgICAgICAgZXh0ZW5zaW9uSWQ6IG9wdGlvbnMuZXh0ZW5zaW9uX2lkLAogICAgICAgIHJlbmRlclByb2Nlc3NJZDogcmVuZGVyUHJvY2Vzc0lkLAogICAgICAgIHJlbmRlclZpZXdJZDogcmVuZGVyVmlld0lkLAogICAgICAgIGluY29nbml0bzogb3B0aW9ucy5pbmNvZ25pdG8KICAgIH0sIGNhbGxiYWNrKTsKICB9KTsKfSk7CgppZiAoIWFwaUJyaWRnZSkKICBleHBvcnRzLiRzZXQoJ2JpbmRpbmcnLCBiaW5kaW5nLmdlbmVyYXRlKCkpOwovLyBDb3B5cmlnaHQgKGMpIDIwMTMgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIEN1c3RvbSBiaW5kaW5ncyBmb3IgdGhlIGRvd25sb2FkcyBBUEkuCgp2YXIgYmluZGluZyA9IGFwaUJyaWRnZSB8fCByZXF1aXJlKCdiaW5kaW5nJykuQmluZGluZy5jcmVhdGUoJ2Rvd25sb2FkcycpOwp2YXIgZG93bmxvYWRzSW50ZXJuYWwgPQogICAgZ2V0SW50ZXJuYWxBcGkgPwogICAgICAgIGdldEludGVybmFsQXBpKCdkb3dubG9hZHNJbnRlcm5hbCcpIDoKICAgICAgICByZXF1aXJlKCdiaW5kaW5nJykuQmluZGluZy5jcmVhdGUoJ2Rvd25sb2Fkc0ludGVybmFsJykuZ2VuZXJhdGUoKTsKdmFyIHJlZ2lzdGVyQXJndW1lbnRNYXNzYWdlciA9IGJpbmRpbmdVdGlsID8KICAgICRGdW5jdGlvbi5iaW5kKGJpbmRpbmdVdGlsLnJlZ2lzdGVyRXZlbnRBcmd1bWVudE1hc3NhZ2VyLCBiaW5kaW5nVXRpbCkgOgogICAgcmVxdWlyZSgnZXZlbnRfYmluZGluZ3MnKS5yZWdpc3RlckFyZ3VtZW50TWFzc2FnZXI7CgpyZWdpc3RlckFyZ3VtZW50TWFzc2FnZXIoJ2Rvd25sb2Fkcy5vbkRldGVybWluaW5nRmlsZW5hbWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oYXJncywgZGlzcGF0Y2gpIHsKICB2YXIgZG93bmxvYWRJdGVtID0gYXJnc1swXTsKICAvLyBDb3B5IHRoZSBpZCBzbyB0aGF0IGV4dGVuc2lvbnMgY2FuJ3QgY2hhbmdlIGl0LgogIHZhciBkb3dubG9hZElkID0gZG93bmxvYWRJdGVtLmlkOwogIHZhciBzdWdnZXN0YWJsZSA9IHRydWU7CiAgZnVuY3Rpb24gaXNWYWxpZFJlc3VsdChyZXN1bHQpIHsKICAgIGlmIChyZXN1bHQgPT09IHVuZGVmaW5lZCkKICAgICAgcmV0dXJuIGZhbHNlOwogICAgaWYgKHR5cGVvZihyZXN1bHQpICE9ICdvYmplY3QnKSB7CiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yOiBJbnZvY2F0aW9uIG9mIGZvcm0gc3VnZ2VzdCgnICsgdHlwZW9mKHJlc3VsdCkgKwogICAgICAgICAgICAgICAgICAgICcpIGRvZXNuXCd0IG1hdGNoIGRlZmluaXRpb24gc3VnZ2VzdCh7ZmlsZW5hbWU6IHN0cmluZywgJyArCiAgICAgICAgICAgICAgICAgICAgJ2NvbmZsaWN0QWN0aW9uOiBzdHJpbmd9KScpOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9IGVsc2UgaWYgKCh0eXBlb2YocmVzdWx0LmZpbGVuYW1lKSAhPSAnc3RyaW5nJykgfHwKICAgICAgICAgICAgICAgKHJlc3VsdC5maWxlbmFtZS5sZW5ndGggPT0gMCkpIHsKICAgICAgY29uc29sZS5lcnJvcignRXJyb3I6ICJmaWxlbmFtZSIgcGFyYW1ldGVyIHRvIHN1Z2dlc3QoKSBtdXN0IGJlIGEgJyArCiAgICAgICAgICAgICAgICAgICAgJ25vbi1lbXB0eSBzdHJpbmcnKTsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSBlbHNlIGlmIChbdW5kZWZpbmVkLCAndW5pcXVpZnknLCAnb3ZlcndyaXRlJywgJ3Byb21wdCddLmluZGV4T2YoCiAgICAgICAgICAgICAgICAgcmVzdWx0LmNvbmZsaWN0QWN0aW9uKSA8IDApIHsKICAgICAgY29uc29sZS5lcnJvcignRXJyb3I6ICJjb25mbGljdEFjdGlvbiIgcGFyYW1ldGVyIHRvIHN1Z2dlc3QoKSBtdXN0IGJlICcgKwogICAgICAgICAgICAgICAgICAgICdvbmUgb2YgdW5kZWZpbmVkLCAidW5pcXVpZnkiLCAib3ZlcndyaXRlIiwgInByb21wdCInKTsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQogIGZ1bmN0aW9uIHN1Z2dlc3RDYWxsYmFjayhyZXN1bHQpIHsKICAgIGlmICghc3VnZ2VzdGFibGUpIHsKICAgICAgY29uc29sZS5lcnJvcignc3VnZ2VzdENhbGxiYWNrIG1heSBub3QgYmUgY2FsbGVkIG1vcmUgdGhhbiBvbmNlLicpOwogICAgICByZXR1cm47CiAgICB9CiAgICBzdWdnZXN0YWJsZSA9IGZhbHNlOwogICAgaWYgKGlzVmFsaWRSZXN1bHQocmVzdWx0KSkgewogICAgICBkb3dubG9hZHNJbnRlcm5hbC5kZXRlcm1pbmVGaWxlbmFtZSgKICAgICAgICAgIGRvd25sb2FkSWQsIHJlc3VsdC5maWxlbmFtZSwgcmVzdWx0LmNvbmZsaWN0QWN0aW9uIHx8ICIiKTsKICAgIH0gZWxzZSB7CiAgICAgIGRvd25sb2Fkc0ludGVybmFsLmRldGVybWluZUZpbGVuYW1lKGRvd25sb2FkSWQsICIiLCAiIik7CiAgICB9CiAgfQogIHRyeSB7CiAgICB2YXIgcmVzdWx0cyA9IGRpc3BhdGNoKFtkb3dubG9hZEl0ZW0sIHN1Z2dlc3RDYWxsYmFja10pOwogICAgdmFyIGFzeW5jID0gKHJlc3VsdHMgJiYKICAgICAgICAgICAgICAgICByZXN1bHRzLnJlc3VsdHMgJiYKICAgICAgICAgICAgICAgICAocmVzdWx0cy5yZXN1bHRzLmxlbmd0aCAhPSAwKSAmJgogICAgICAgICAgICAgICAgIChyZXN1bHRzLnJlc3VsdHNbMF0gPT09IHRydWUpKTsKICAgIGlmIChzdWdnZXN0YWJsZSAmJiAhYXN5bmMpCiAgICAgIHN1Z2dlc3RDYWxsYmFjaygpOwogIH0gY2F0Y2ggKGUpIHsKICAgIHN1Z2dlc3RDYWxsYmFjaygpOwogICAgdGhyb3cgZTsKICB9Cn0pOwoKaWYgKCFhcGlCcmlkZ2UpCiAgZXhwb3J0cy4kc2V0KCdiaW5kaW5nJywgYmluZGluZy5nZW5lcmF0ZSgpKTsKLy8gQ29weXJpZ2h0IDIwMTcgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnZhciBFdmVudCA9IHJlcXVpcmUoJ2V2ZW50X2JpbmRpbmdzJykuRXZlbnQ7CgovLyBUaGUgRWFzeVVubG9ja1Byb3hpbWl0eVJlcXVpcmVkIG9iamVjdCBpcyBqdXN0IGEgc3R1YiB0aGF0IGhhcyBhbiBvbkNoYW5nZQovLyBldmVudCwgd2hpY2ggaXMgbmV2ZXIgdHJpZ2dlcmVkLgovLyBUT0RPKGRldmxpbik6IFJlbW92ZSB0aGlzIG9uY2UgdGhlIHByZWZlcmVuY2VzUHJpdmF0ZSBBUEkgaXMgZnVsbHkgcmVtb3ZlZC4KLy8gaHR0cHM6Ly9jcmJ1Zy5jb20vNTkzMTY2CmZ1bmN0aW9uIEVhc3lVbmxvY2tQcm94aW1pdHlSZXF1aXJlZChwcmVmS2V5LCB2YWx1ZVNjaGVtYSwgc2NoZW1hKSB7CiAgLy8gTm90ZTogdGVjaG5pY2FsbHksIGV4dGVuc2lvbnMgY291bGQgaW50ZXJjZXB0IHRoaXMgdGhyb3VnaCBhIHNldHRlciBvbgogIC8vIE9iamVjdC5wcm90b3R5cGUoKS4gV2UgZG9uJ3QgcmVhbGx5IGNhcmUsIGJlY2F1c2UgYSkgdGhpcyBpcyBvbmx5IGZvciBhCiAgLy8gcHJpdmF0ZSBBUEksIHNvIHdlIHNob3VsZG4ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IHVudHJ1c3RlZCBjb2RlLCBhbmQgYikKICAvLyB0aGlzIGlzIGFuIGFub255bW91cyBldmVudCwgd2hpY2ggZXhwb3NlcyBubyBhdHRhY2sgc3VyZmFjZSBhbmQgd2lsbCBiZQogIC8vIGV4cG9zZWQgdG8gdGhlIGV4dGVuc2lvbiBhbnl3YXkuCiAgdGhpcy5vbkNoYW5nZSA9IG5ldyBFdmVudCgpOwp9OwoKZXhwb3J0cy4kc2V0KCdFYXN5VW5sb2NrUHJveGltaXR5UmVxdWlyZWQnLCBFYXN5VW5sb2NrUHJveGltaXR5UmVxdWlyZWQpOwovLyBDb3B5cmlnaHQgMjAxMyBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQovLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gQ3VzdG9tIGJpbmRpbmdzIGZvciB0aGUgZmVlZGJhY2tQcml2YXRlIEFQSS4KCnZhciBiaW5kaW5nID0gYXBpQnJpZGdlIHx8IHJlcXVpcmUoJ2JpbmRpbmcnKS5CaW5kaW5nLmNyZWF0ZSgnZmVlZGJhY2tQcml2YXRlJyk7Cgp2YXIgYmxvYk5hdGl2ZXMgPSByZXF1aXJlTmF0aXZlKCdibG9iX25hdGl2ZXMnKTsKCmJpbmRpbmcucmVnaXN0ZXJDdXN0b21Ib29rKGZ1bmN0aW9uKGJpbmRpbmdzQVBJKSB7CiAgdmFyIGFwaUZ1bmN0aW9ucyA9IGJpbmRpbmdzQVBJLmFwaUZ1bmN0aW9uczsKICBhcGlGdW5jdGlvbnMuc2V0VXBkYXRlQXJndW1lbnRzUG9zdFZhbGlkYXRlKAogICAgICAic2VuZEZlZWRiYWNrIiwgZnVuY3Rpb24oZmVlZGJhY2tJbmZvLCBjYWxsYmFjaykgewogICAgdmFyIGF0dGFjaGVkRmlsZUJsb2JVdWlkID0gJyc7CiAgICB2YXIgc2NyZWVuc2hvdEJsb2JVdWlkID0gJyc7CgogICAgaWYgKGZlZWRiYWNrSW5mby5hdHRhY2hlZEZpbGUpCiAgICAgIGF0dGFjaGVkRmlsZUJsb2JVdWlkID0KICAgICAgICAgIGJsb2JOYXRpdmVzLkdldEJsb2JVdWlkKGZlZWRiYWNrSW5mby5hdHRhY2hlZEZpbGUuZGF0YSk7CiAgICBpZiAoZmVlZGJhY2tJbmZvLnNjcmVlbnNob3QpCiAgICAgIHNjcmVlbnNob3RCbG9iVXVpZCA9CiAgICAgICAgICBibG9iTmF0aXZlcy5HZXRCbG9iVXVpZChmZWVkYmFja0luZm8uc2NyZWVuc2hvdCk7CgogICAgZmVlZGJhY2tJbmZvLmF0dGFjaGVkRmlsZUJsb2JVdWlkID0gYXR0YWNoZWRGaWxlQmxvYlV1aWQ7CiAgICBmZWVkYmFja0luZm8uc2NyZWVuc2hvdEJsb2JVdWlkID0gc2NyZWVuc2hvdEJsb2JVdWlkOwoKICAgIHJldHVybiBbZmVlZGJhY2tJbmZvLCBjYWxsYmFja107CiAgfSk7Cn0pOwoKaWYgKCFhcGlCcmlkZ2UpCiAgZXhwb3J0cy4kc2V0KCdiaW5kaW5nJywgYmluZGluZy5nZW5lcmF0ZSgpKTsKLy8gQ29weXJpZ2h0IDIwMTMgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIEN1c3RvbSBiaW5kaW5nIGZvciB0aGUgR0NNIEFQSS4KCnZhciBiaW5kaW5nID0gYXBpQnJpZGdlIHx8IHJlcXVpcmUoJ2JpbmRpbmcnKS5CaW5kaW5nLmNyZWF0ZSgnZ2NtJyk7CnZhciBmb3JFYWNoID0gcmVxdWlyZSgndXRpbHMnKS5mb3JFYWNoOwoKYmluZGluZy5yZWdpc3RlckN1c3RvbUhvb2soZnVuY3Rpb24oYmluZGluZ3NBUEkpIHsKICB2YXIgYXBpRnVuY3Rpb25zID0gYmluZGluZ3NBUEkuYXBpRnVuY3Rpb25zOwogIHZhciBnY20gPSBiaW5kaW5nc0FQSS5jb21waWxlZEFwaTsKCiAgYXBpRnVuY3Rpb25zLnNldFVwZGF0ZUFyZ3VtZW50c1Bvc3RWYWxpZGF0ZSgKICAgICdzZW5kJywgZnVuY3Rpb24obWVzc2FnZSwgY2FsbGJhY2spIHsKICAgICAgLy8gVmFsaWRhdGUgbWVzc2FnZS5kYXRhLgogICAgICB2YXIgcGF5bG9hZFNpemUgPSAwOwogICAgICBmb3JFYWNoKG1lc3NhZ2UuZGF0YSwgZnVuY3Rpb24ocHJvcGVydHksIHZhbHVlKSB7CiAgICAgICAgaWYgKHByb3BlcnR5Lmxlbmd0aCA9PSAwKQogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJPbmUgb2YgZGF0YSBrZXlzIGlzIGVtcHR5LiIpOwoKICAgICAgICB2YXIgbG93ZXJDYXNlZFByb3BlcnR5ID0gcHJvcGVydHkudG9Mb3dlckNhc2UoKTsKICAgICAgICAvLyBJc3N1ZSBhbiBlcnJvciBmb3IgZm9yYmlkZGVuIHByZWZpeGVzIG9mIHByb3BlcnR5IG5hbWVzLgogICAgICAgIGlmIChsb3dlckNhc2VkUHJvcGVydHkuc3RhcnRzV2l0aCgiZ29vZy4iKSB8fAogICAgICAgICAgICBsb3dlckNhc2VkUHJvcGVydHkuc3RhcnRzV2l0aCgiZ29vZ2xlIikgfHwKICAgICAgICAgICAgcHJvcGVydHkuc3RhcnRzV2l0aCgiY29sbGFwc2Vfa2V5IikpIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiSW52YWxpZCBkYXRhIGtleTogIiArIHByb3BlcnR5KTsKICAgICAgICB9CgogICAgICAgIHBheWxvYWRTaXplICs9IHByb3BlcnR5Lmxlbmd0aCArIHZhbHVlLmxlbmd0aDsKICAgICAgfSk7CgogICAgICBpZiAocGF5bG9hZFNpemUgPiBnY20uTUFYX01FU1NBR0VfU0laRSkKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlBheWxvYWQgZXhjZWVkZWQgYWxsb3dlZCBzaXplIGxpbWl0LiBQYXlsb2FkIHNpemUgaXM6ICIKICAgICAgICAgICAgKyBwYXlsb2FkU2l6ZSk7CgogICAgICBpZiAocGF5bG9hZFNpemUgPT0gMCkKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIk5vIGRhdGEgdG8gc2VuZC4iKTsKCiAgICAgIHJldHVybiBhcmd1bWVudHM7CiAgICB9KTsKfSk7CgppZiAoIWFwaUJyaWRnZSkKICBleHBvcnRzLiRzZXQoJ2JpbmRpbmcnLCBiaW5kaW5nLmdlbmVyYXRlKCkpOwovLyBDb3B5cmlnaHQgMjAxMyBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQovLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gQ3VzdG9tIGJpbmRpbmcgZm9yIHRoZSBJZGVudGl0eSBBUEkuCgp2YXIgYmluZGluZyA9IGFwaUJyaWRnZSB8fCByZXF1aXJlKCdiaW5kaW5nJykuQmluZGluZy5jcmVhdGUoJ2lkZW50aXR5Jyk7CgpiaW5kaW5nLnJlZ2lzdGVyQ3VzdG9tSG9vayhmdW5jdGlvbihiaW5kaW5nLCBpZCwgY29udGV4dFR5cGUpIHsKICB2YXIgYXBpRnVuY3Rpb25zID0gYmluZGluZy5hcGlGdW5jdGlvbnM7CgogIGFwaUZ1bmN0aW9ucy5zZXRIYW5kbGVSZXF1ZXN0KCdnZXRSZWRpcmVjdFVSTCcsIGZ1bmN0aW9uKHBhdGgpIHsKICAgIGlmIChwYXRoID09PSBudWxsIHx8IHBhdGggPT09IHVuZGVmaW5lZCkKICAgICAgcGF0aCA9ICcvJzsKICAgIGVsc2UKICAgICAgcGF0aCA9IFN0cmluZyhwYXRoKTsKICAgIGlmIChwYXRoWzBdICE9ICcvJykKICAgICAgcGF0aCA9ICcvJyArIHBhdGg7CiAgICByZXR1cm4gJ2h0dHBzOi8vJyArIGlkICsgJy5jaHJvbWl1bWFwcC5vcmcnICsgcGF0aDsKICB9KTsKfSk7CgppZiAoIWFwaUJyaWRnZSkKICBleHBvcnRzLiRzZXQoJ2JpbmRpbmcnLCBiaW5kaW5nLmdlbmVyYXRlKCkpOwovLyBDb3B5cmlnaHQgMjAxMyBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQovLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gQ3VzdG9tIGJpbmRpbmcgZm9yIHRoZSBpbWFnZSB3cml0ZXIgcHJpdmF0ZSBBUEkuCgp2YXIgYmluZGluZyA9CiAgICBhcGlCcmlkZ2UgfHwgcmVxdWlyZSgnYmluZGluZycpLkJpbmRpbmcuY3JlYXRlKCdpbWFnZVdyaXRlclByaXZhdGUnKTsKCmJpbmRpbmcucmVnaXN0ZXJDdXN0b21Ib29rKGZ1bmN0aW9uKGJpbmRpbmdzQVBJKSB7CiAgdmFyIGFwaUZ1bmN0aW9ucyA9IGJpbmRpbmdzQVBJLmFwaUZ1bmN0aW9uczsKCiAgYXBpRnVuY3Rpb25zLnNldFVwZGF0ZUFyZ3VtZW50c1Bvc3RWYWxpZGF0ZSgKICAgICAgJ3dyaXRlRnJvbUZpbGUnLCBmdW5jdGlvbihkZXZpY2UsIGZpbGVFbnRyeSwgb3B0aW9ucywgY2FsbGJhY2spIHsKICAgIHZhciBmaWxlU3lzdGVtTmFtZSA9IGZpbGVFbnRyeS5maWxlc3lzdGVtLm5hbWU7CiAgICB2YXIgcmVsYXRpdmVQYXRoID0gJFN0cmluZy5zbGljZShmaWxlRW50cnkuZnVsbFBhdGgsIDEpOwogICAgcmV0dXJuIFtkZXZpY2UsIGZpbGVTeXN0ZW1OYW1lLCByZWxhdGl2ZVBhdGgsIGNhbGxiYWNrXTsKICB9KTsKfSk7CgppZiAoIWFwaUJyaWRnZSkKICBleHBvcnRzLiRzZXQoJ2JpbmRpbmcnLCBiaW5kaW5nLmdlbmVyYXRlKCkpOwovLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIEN1c3RvbSBiaW5kaW5nIGZvciB0aGUgaW5wdXQgaW1lIEFQSS4gT25seSBpbmplY3RlZCBpbnRvIHRoZQovLyB2OCBjb250ZXh0cyBmb3IgZXh0ZW5zaW9ucyB3aGljaCBoYXZlIHBlcm1pc3Npb24gZm9yIHRoZSBBUEkuCgp2YXIgYmluZGluZyA9IGFwaUJyaWRnZSB8fCByZXF1aXJlKCdiaW5kaW5nJykuQmluZGluZy5jcmVhdGUoJ2lucHV0LmltZScpOwp2YXIgYXBwV2luZG93TmF0aXZlcyA9IHJlcXVpcmVOYXRpdmUoJ2FwcF93aW5kb3dfbmF0aXZlcycpOwp2YXIgcmVnaXN0ZXJBcmd1bWVudE1hc3NhZ2VyID0gYmluZGluZ1V0aWwgPwogICAgJEZ1bmN0aW9uLmJpbmQoYmluZGluZ1V0aWwucmVnaXN0ZXJFdmVudEFyZ3VtZW50TWFzc2FnZXIsIGJpbmRpbmdVdGlsKSA6CiAgICByZXF1aXJlKCdldmVudF9iaW5kaW5ncycpLnJlZ2lzdGVyQXJndW1lbnRNYXNzYWdlcjsKCi8vIFRPRE8oY3JidWcuY29tLzczMzgyNSk6IFRoZXNlIGJpbmRpbmdzIGhhdmUgc29tZSBpc3N1ZXMuCgp2YXIgaW5wdXRJbWU7CnJlZ2lzdGVyQXJndW1lbnRNYXNzYWdlcignaW5wdXQuaW1lLm9uS2V5RXZlbnQnLAogICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oYXJncywgZGlzcGF0Y2gpIHsKICB2YXIga2V5RGF0YSA9IGFyZ3NbMV07CiAgdmFyIHJlc3VsdCA9IGZhbHNlOwogIHRyeSB7CiAgICAvLyBkaXNwYXRjaCgpIGlzIHdlaXJkIC0gaXQgcmV0dXJucyBhbiBvYmplY3Qge3Jlc3VsdHM6IGFycmF5PHJlc3VsdHM+fSBpZmYKICAgIC8vIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSByZXN1bHQgdmFsdWUgdGhhdCAhPT0gdW5kZWZpbmVkLiBTaW5jZSBvbktleUV2ZW50CiAgICAvLyBoYXMgYSBtYXhpbXVtIG9mIG9uZSBsaXN0ZW5lciwgd2Uga25vdyB0aGF0IGFueSByZXN1bHQgd2UgZmluZCBpcyB0aGUgb25lCiAgICAvLyB3ZSdyZSBpbnRlcmVzdGVkIGluLgogICAgdmFyIGRpc3BhdGNoUmVzdWx0ID0gZGlzcGF0Y2goYXJncyk7CiAgICBpZiAoZGlzcGF0Y2hSZXN1bHQgJiYgZGlzcGF0Y2hSZXN1bHQucmVzdWx0cykKICAgICAgcmVzdWx0ID0gZGlzcGF0Y2hSZXN1bHQucmVzdWx0c1swXTsKICB9IGNhdGNoIChlKSB7CiAgICBjb25zb2xlLmVycm9yKCdFcnJvciBpbiBldmVudCBoYW5kbGVyIGZvciBvbktleUV2ZW50OiAnICsgZS5zdGFjayk7CiAgfQogIGlmICghaW5wdXRJbWUub25LZXlFdmVudC5hc3luYykKICAgIGlucHV0SW1lLmtleUV2ZW50SGFuZGxlZChrZXlEYXRhLnJlcXVlc3RJZCwgcmVzdWx0KTsKfSk7CgpiaW5kaW5nLnJlZ2lzdGVyQ3VzdG9tSG9vayhmdW5jdGlvbihhcGkpIHsKIGlucHV0SW1lID0gYXBpLmNvbXBpbGVkQXBpOwoKICB2YXIgb3JpZ2luYWxBZGRMaXN0ZW5lciA9IGlucHV0SW1lLm9uS2V5RXZlbnQuYWRkTGlzdGVuZXI7CiAgaW5wdXRJbWUub25LZXlFdmVudC5hZGRMaXN0ZW5lciA9IGZ1bmN0aW9uKGNiLCBvcHRfZXh0cmFJbmZvKSB7CiAgICBpbnB1dEltZS5vbktleUV2ZW50LmFzeW5jID0gZmFsc2U7CiAgICBpZiAob3B0X2V4dHJhSW5mbyBpbnN0YW5jZW9mIEFycmF5KSB7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb3B0X2V4dHJhSW5mby5sZW5ndGg7ICsraSkgewogICAgICAgIGlmIChvcHRfZXh0cmFJbmZvW2ldID09ICdhc3luYycpIHsKICAgICAgICAgIGlucHV0SW1lLm9uS2V5RXZlbnQuYXN5bmMgPSB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgJEZ1bmN0aW9uLmNhbGwob3JpZ2luYWxBZGRMaXN0ZW5lciwgdGhpcywgY2IpOwogIH07CgogIGFwaS5hcGlGdW5jdGlvbnMuc2V0Q3VzdG9tQ2FsbGJhY2soJ2NyZWF0ZVdpbmRvdycsCiAgICAgIGZ1bmN0aW9uKG5hbWUsIHJlcXVlc3QsIGNhbGxiYWNrLCB3aW5kb3dQYXJhbXMpIHsKICAgIGlmICghY2FsbGJhY2spIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgdmFyIHZpZXc7CiAgICBpZiAod2luZG93UGFyYW1zICYmIHdpbmRvd1BhcmFtcy5mcmFtZUlkKSB7CiAgICAgIHZpZXcgPSBhcHBXaW5kb3dOYXRpdmVzLkdldEZyYW1lKAogICAgICAgICAgd2luZG93UGFyYW1zLmZyYW1lSWQsIGZhbHNlIC8qIG5vdGlmeUJyb3dzZXIgKi8pOwogICAgICB2aWV3LmlkID0gd2luZG93UGFyYW1zLmZyYW1lSWQ7CiAgICB9CiAgICBjYWxsYmFjayh2aWV3KTsKICB9KTsKfSk7CgppZiAoIWFwaUJyaWRnZSkKICBleHBvcnRzLiRzZXQoJ2JpbmRpbmcnLCBiaW5kaW5nLmdlbmVyYXRlKCkpOwovLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIEN1c3RvbSBiaW5kaW5nIGZvciB0aGUgTWVkaWEgR2FsbGVyeSBBUEkuCgp2YXIgYmluZGluZyA9IGFwaUJyaWRnZSB8fCByZXF1aXJlKCdiaW5kaW5nJykuQmluZGluZy5jcmVhdGUoJ21lZGlhR2FsbGVyaWVzJyk7CnZhciBibG9iTmF0aXZlcyA9IHJlcXVpcmVOYXRpdmUoJ2Jsb2JfbmF0aXZlcycpOwp2YXIgbWVkaWFHYWxsZXJpZXNOYXRpdmVzID0gcmVxdWlyZU5hdGl2ZSgnbWVkaWFHYWxsZXJpZXMnKTsKdmFyIHNlbmRSZXF1ZXN0ID0gYmluZGluZ1V0aWwgPwogICAgJEZ1bmN0aW9uLmJpbmQoYmluZGluZ1V0aWwuc2VuZFJlcXVlc3QsIGJpbmRpbmdVdGlsKSA6CiAgICByZXF1aXJlKCdzZW5kUmVxdWVzdCcpLnNlbmRSZXF1ZXN0OwoKdmFyIGJsb2JzQXdhaXRpbmdNZXRhZGF0YSA9IHt9Owp2YXIgbWVkaWFHYWxsZXJpZXNNZXRhZGF0YSA9IHt9OwoKZnVuY3Rpb24gY3JlYXRlRmlsZVN5c3RlbU9iamVjdHNBbmRVcGRhdGVNZXRhZGF0YShyZXNwb25zZSkgewogIHZhciByZXN1bHQgPSBbXTsKICBtZWRpYUdhbGxlcmllc01ldGFkYXRhID0ge307ICAvLyBDbGVhciBhbnkgcHJldmlvdXMgbWV0YWRhdGEuCiAgaWYgKHJlc3BvbnNlKSB7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlc3BvbnNlLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBmaWxlc3lzdGVtID0gbWVkaWFHYWxsZXJpZXNOYXRpdmVzLkdldE1lZGlhRmlsZVN5c3RlbU9iamVjdCgKICAgICAgICAgIHJlc3BvbnNlW2ldLmZzaWQpOwogICAgICAkQXJyYXkucHVzaChyZXN1bHQsIGZpbGVzeXN0ZW0pOwogICAgICB2YXIgbWV0YWRhdGEgPSByZXNwb25zZVtpXTsKICAgICAgZGVsZXRlIG1ldGFkYXRhLmZzaWQ7CiAgICAgIG1lZGlhR2FsbGVyaWVzTWV0YWRhdGFbZmlsZXN5c3RlbS5uYW1lXSA9IG1ldGFkYXRhOwogICAgfQogIH0KICByZXR1cm4gcmVzdWx0Owp9CgpiaW5kaW5nLnJlZ2lzdGVyQ3VzdG9tSG9vayhmdW5jdGlvbihiaW5kaW5nc0FQSSwgZXh0ZW5zaW9uSWQpIHsKICB2YXIgYXBpRnVuY3Rpb25zID0gYmluZGluZ3NBUEkuYXBpRnVuY3Rpb25zOwoKICAvLyBnZXRNZWRpYUZpbGVTeXN0ZW1zIGFuZCBhZGRVc2VyU2VsZWN0ZWRGb2xkZXIgdXNlIGEgY3VzdG9tIGNhbGxiYWNrIHNvIHRoYXQKICAvLyB0aGV5IGNhbiBpbnN0YW50aWF0ZSBhbmQgcmV0dXJuIGFuIGFycmF5IG9mIGZpbGUgc3lzdGVtIG9iamVjdHMuCiAgYXBpRnVuY3Rpb25zLnNldEN1c3RvbUNhbGxiYWNrKCdnZXRNZWRpYUZpbGVTeXN0ZW1zJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24obmFtZSwgcmVxdWVzdCwgY2FsbGJhY2ssIHJlc3BvbnNlKSB7CiAgICB2YXIgcmVzdWx0ID0gY3JlYXRlRmlsZVN5c3RlbU9iamVjdHNBbmRVcGRhdGVNZXRhZGF0YShyZXNwb25zZSk7CiAgICBpZiAoY2FsbGJhY2spCiAgICAgIGNhbGxiYWNrKHJlc3VsdCk7CiAgfSk7CgogIGFwaUZ1bmN0aW9ucy5zZXRDdXN0b21DYWxsYmFjaygnYWRkVXNlclNlbGVjdGVkRm9sZGVyJywKICAgICAgZnVuY3Rpb24obmFtZSwgcmVxdWVzdCwgY2FsbGJhY2ssIHJlc3BvbnNlKSB7CiAgICB2YXIgZmlsZVN5c3RlbXMgPSBbXTsKICAgIHZhciBzZWxlY3RlZEZpbGVTeXN0ZW1OYW1lID0gIiI7CiAgICBpZiAocmVzcG9uc2UgJiYgJ21lZGlhRmlsZVN5c3RlbXMnIGluIHJlc3BvbnNlICYmCiAgICAgICAgJ3NlbGVjdGVkRmlsZVN5c3RlbUluZGV4JyBpbiByZXNwb25zZSkgewogICAgICBmaWxlU3lzdGVtcyA9IGNyZWF0ZUZpbGVTeXN0ZW1PYmplY3RzQW5kVXBkYXRlTWV0YWRhdGEoCiAgICAgICAgICByZXNwb25zZVsnbWVkaWFGaWxlU3lzdGVtcyddKTsKICAgICAgdmFyIHNlbGVjdGVkRmlsZVN5c3RlbUluZGV4ID0gcmVzcG9uc2VbJ3NlbGVjdGVkRmlsZVN5c3RlbUluZGV4J107CiAgICAgIGlmIChzZWxlY3RlZEZpbGVTeXN0ZW1JbmRleCA+PSAwKSB7CiAgICAgICAgc2VsZWN0ZWRGaWxlU3lzdGVtTmFtZSA9IGZpbGVTeXN0ZW1zW3NlbGVjdGVkRmlsZVN5c3RlbUluZGV4XS5uYW1lOwogICAgICB9CiAgICB9CiAgICBpZiAoY2FsbGJhY2spCiAgICAgIGNhbGxiYWNrKGZpbGVTeXN0ZW1zLCBzZWxlY3RlZEZpbGVTeXN0ZW1OYW1lKTsKICB9KTsKCiAgYXBpRnVuY3Rpb25zLnNldEhhbmRsZVJlcXVlc3QoJ2dldE1lZGlhRmlsZVN5c3RlbU1ldGFkYXRhJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbihmaWxlc3lzdGVtKSB7CiAgICBpZiAoZmlsZXN5c3RlbSAmJiBmaWxlc3lzdGVtLm5hbWUgJiYKICAgICAgICBmaWxlc3lzdGVtLm5hbWUgaW4gbWVkaWFHYWxsZXJpZXNNZXRhZGF0YSkgewogICAgICByZXR1cm4gbWVkaWFHYWxsZXJpZXNNZXRhZGF0YVtmaWxlc3lzdGVtLm5hbWVdOwogICAgfQogICAgcmV0dXJuIHsKICAgICAgJ25hbWUnOiAnJywKICAgICAgJ2dhbGxlcnlJZCc6ICcnLAogICAgICAnaXNSZW1vdmFibGUnOiBmYWxzZSwKICAgICAgJ2lzTWVkaWFEZXZpY2UnOiBmYWxzZSwKICAgICAgJ2lzQXZhaWxhYmxlJzogZmFsc2UsCiAgICB9OwogIH0pOwoKICBmdW5jdGlvbiBnZXRNZXRhZGF0YUNhbGxiYWNrKHV1aWQsIG5hbWUsIHJlcXVlc3QsIGNhbGxiYWNrLCByZXNwb25zZSkgewogICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLmF0dGFjaGVkSW1hZ2VzQmxvYkluZm8pIHsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXNwb25zZS5hdHRhY2hlZEltYWdlc0Jsb2JJbmZvLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdmFyIGJsb2JJbmZvID0gcmVzcG9uc2UuYXR0YWNoZWRJbWFnZXNCbG9iSW5mb1tpXTsKICAgICAgICB2YXIgYmxvYiA9IGJsb2JOYXRpdmVzLlRha2VCcm93c2VyUHJvY2Vzc0Jsb2IoCiAgICAgICAgICAgIGJsb2JJbmZvLmJsb2JVVUlELCBibG9iSW5mby50eXBlLCBibG9iSW5mby5zaXplKTsKICAgICAgICByZXNwb25zZS5tZXRhZGF0YS5hdHRhY2hlZEltYWdlcy5wdXNoKGJsb2IpOwogICAgICB9CiAgICB9CgogICAgaWYgKGNhbGxiYWNrKQogICAgICBjYWxsYmFjayhyZXNwb25zZSA/IHJlc3BvbnNlLm1ldGFkYXRhIDogbnVsbCk7CgogICAgZGVsZXRlIGJsb2JzQXdhaXRpbmdNZXRhZGF0YVt1dWlkXTsKICB9CgogIGFwaUZ1bmN0aW9ucy5zZXRIYW5kbGVSZXF1ZXN0KCdnZXRNZXRhZGF0YScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24obWVkaWFGaWxlLCBvcHRpb25zLCBjYWxsYmFjaykgewogICAgdmFyIGJsb2JVdWlkID0gYmxvYk5hdGl2ZXMuR2V0QmxvYlV1aWQobWVkaWFGaWxlKQogICAgLy8gU3RvcmUgdGhlIGJsb2IgaW4gYSBnbG9iYWwgb2JqZWN0IHRvIGtlZXAgaXRzIHJlZmNvdW50IG5vbnplcm8gLS0gdGhpcwogICAgLy8gcHJldmVudHMgdGhlIG9iamVjdCBmcm9tIGJlaW5nIGdhcmJhZ2UgY29sbGVjdGVkIGJlZm9yZSBhbnkgbWV0YWRhdGEKICAgIC8vIHBhcnNpbmcgZ2V0cyB0byBvY2N1ciAoc2VlIGNyYnVnLmNvbS80MTU3OTIpLgogICAgYmxvYnNBd2FpdGluZ01ldGFkYXRhW2Jsb2JVdWlkXSA9IG1lZGlhRmlsZTsKCiAgICB2YXIgb3B0QXJncyA9IHsKICAgICAgX19wcm90b19fOiBudWxsLAogICAgICBjdXN0b21DYWxsYmFjazogJEZ1bmN0aW9uLmJpbmQoZ2V0TWV0YWRhdGFDYWxsYmFjaywgbnVsbCwgYmxvYlV1aWQpLAogICAgfTsKCiAgICBzZW5kUmVxdWVzdCgnbWVkaWFHYWxsZXJpZXMuZ2V0TWV0YWRhdGEnLCBbYmxvYlV1aWQsIG9wdGlvbnMsIGNhbGxiYWNrXSwKICAgICAgICAgICAgICAgIGJpbmRpbmdVdGlsID8gdW5kZWZpbmVkIDogdGhpcy5kZWZpbml0aW9uLnBhcmFtZXRlcnMsIG9wdEFyZ3MpOwogIH0pOwp9KTsKCmlmICghYXBpQnJpZGdlKQogIGV4cG9ydHMuJHNldCgnYmluZGluZycsIGJpbmRpbmcuZ2VuZXJhdGUoKSk7Ci8vIENvcHlyaWdodCAyMDEzIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgovLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLyBDdXN0b20gYmluZGluZ3MgZm9yIHRoZSBub3RpZmljYXRpb25zIEFQSS4KLy8KdmFyIGJpbmRpbmcgPSBhcGlCcmlkZ2UgfHwgcmVxdWlyZSgnYmluZGluZycpLkJpbmRpbmcuY3JlYXRlKCdub3RpZmljYXRpb25zJyk7Cgp2YXIgc2VuZFJlcXVlc3QgPSBiaW5kaW5nVXRpbCA/CiAgICAkRnVuY3Rpb24uYmluZChiaW5kaW5nVXRpbC5zZW5kUmVxdWVzdCwgYmluZGluZ1V0aWwpIDoKICAgIHJlcXVpcmUoJ3NlbmRSZXF1ZXN0Jykuc2VuZFJlcXVlc3Q7CnZhciBleGNlcHRpb25IYW5kbGVyID0gcmVxdWlyZSgndW5jYXVnaHRfZXhjZXB0aW9uX2hhbmRsZXInKTsKdmFyIGltYWdlVXRpbCA9IHJlcXVpcmUoJ2ltYWdlVXRpbCcpOwp2YXIgbm90aWZpY2F0aW9uc1ByaXZhdGUgPSByZXF1aXJlTmF0aXZlKCdub3RpZmljYXRpb25zX3ByaXZhdGUnKTsKCnZhciBqc0xhc3RFcnJvciA9IGJpbmRpbmdVdGlsID8gdW5kZWZpbmVkIDogcmVxdWlyZSgnbGFzdEVycm9yJyk7CmZ1bmN0aW9uIHJ1bkNhbGxiYWNrV2l0aExhc3RFcnJvcihuYW1lLCBtZXNzYWdlLCBzdGFjaywgY2FsbGJhY2ssIGFyZ3MpIHsKICBpZiAoYmluZGluZ1V0aWwpIHsKICAgIGJpbmRpbmdVdGlsLnJ1bkNhbGxiYWNrV2l0aExhc3RFcnJvcihtZXNzYWdlLCBmdW5jdGlvbigpIHsKICAgICAgJEZ1bmN0aW9uLmFwcGx5KGNhbGxiYWNrLCBudWxsLCBhcmdzKTsKICAgIH0pOwogIH0gZWxzZSB7CiAgICBqc0xhc3RFcnJvci5ydW4obmFtZSwgbWVzc2FnZSwgc3RhY2ssIGNhbGxiYWNrLCBhcmdzKTsKICB9Cn0KCmZ1bmN0aW9uIGltYWdlRGF0YVNldHRlcihjb250ZXh0LCBrZXkpIHsKICB2YXIgZiA9IGZ1bmN0aW9uKHZhbCkgewogICAgdGhpc1trZXldID0gdmFsOwogIH07CiAgcmV0dXJuICRGdW5jdGlvbi5iaW5kKGYsIGNvbnRleHQpOwp9CgovLyBBIFVSTCBTcGVjIGlzIGFuIG9iamVjdCB3aXRoIHRoZSBmb2xsb3dpbmcga2V5czoKLy8gIHBhdGg6IFRoZSByZXNvdXJjZSB0byBiZSBkb3dubG9hZGVkLgovLyAgd2lkdGg6IChvcHRpb25hbCkgVGhlIG1heGltdW0gd2lkdGggb2YgdGhlIGltYWdlIHRvIGJlIGRvd25sb2FkZWQgaW4gZGV2aWNlCi8vICAgICAgICAgcGl4ZWxzLgovLyAgaGVpZ2h0OiAob3B0aW9uYWwpIFRoZSBtYXhpbXVtIGhlaWdodCBvZiB0aGUgaW1hZ2UgdG8gYmUgZG93bmxvYWRlZCBpbgovLyAgICAgICAgICBkZXZpY2UgcGl4ZWxzLgovLyAgY2FsbGJhY2s6IEEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gdGhlIFVSTCBpcyBjb21wbGV0ZS4gSXQKLy8gICAgc2hvdWxkIGFjY2VwdCBhbiBJbWFnZURhdGEgb2JqZWN0IGFuZCBzZXQgdGhlIGFwcHJvcHJpYXRlCi8vICAgIGZpZWxkIGluIHxub3RpZmljYXRpb25EZXRhaWxzfC4KZnVuY3Rpb24gZ2V0VXJsU3BlY3MoaW1hZ2VTaXplcywgbm90aWZpY2F0aW9uRGV0YWlscykgewogIHZhciB1cmxTcGVjcyA9IFtdOwoKICAvLyB8aWNvblVybHwgbWlnaHQgYmUgb3B0aW9uYWwgZm9yIG5vdGlmaWNhdGlvbiB1cGRhdGVzLgogIGlmIChub3RpZmljYXRpb25EZXRhaWxzLmljb25VcmwpIHsKICAgICRBcnJheS5wdXNoKHVybFNwZWNzLCB7CiAgICAgIHBhdGg6IG5vdGlmaWNhdGlvbkRldGFpbHMuaWNvblVybCwKICAgICAgd2lkdGg6IGltYWdlU2l6ZXMuaWNvbi53aWR0aCAqIGltYWdlU2l6ZXMuc2NhbGVGYWN0b3IsCiAgICAgIGhlaWdodDogaW1hZ2VTaXplcy5pY29uLmhlaWdodCAqIGltYWdlU2l6ZXMuc2NhbGVGYWN0b3IsCiAgICAgIGNhbGxiYWNrOiBpbWFnZURhdGFTZXR0ZXIobm90aWZpY2F0aW9uRGV0YWlscywgJ2ljb25CaXRtYXAnKQogICAgfSk7CiAgfQoKICAvLyB8YXBwSWNvbk1hc2tVcmx8IGlzIG9wdGlvbmFsLgogIGlmIChub3RpZmljYXRpb25EZXRhaWxzLmFwcEljb25NYXNrVXJsKSB7CiAgICAkQXJyYXkucHVzaCh1cmxTcGVjcywgewogICAgICBwYXRoOiBub3RpZmljYXRpb25EZXRhaWxzLmFwcEljb25NYXNrVXJsLAogICAgICB3aWR0aDogaW1hZ2VTaXplcy5hcHBJY29uTWFzay53aWR0aCAqIGltYWdlU2l6ZXMuc2NhbGVGYWN0b3IsCiAgICAgIGhlaWdodDogaW1hZ2VTaXplcy5hcHBJY29uTWFzay5oZWlnaHQgKiBpbWFnZVNpemVzLnNjYWxlRmFjdG9yLAogICAgICBjYWxsYmFjazogaW1hZ2VEYXRhU2V0dGVyKG5vdGlmaWNhdGlvbkRldGFpbHMsICdhcHBJY29uTWFza0JpdG1hcCcpCiAgICB9KTsKICB9CgogIC8vIHxpbWFnZVVybHwgaXMgb3B0aW9uYWwuCiAgaWYgKG5vdGlmaWNhdGlvbkRldGFpbHMuaW1hZ2VVcmwpIHsKICAgICRBcnJheS5wdXNoKHVybFNwZWNzLCB7CiAgICAgIHBhdGg6IG5vdGlmaWNhdGlvbkRldGFpbHMuaW1hZ2VVcmwsCiAgICAgIHdpZHRoOiBpbWFnZVNpemVzLmltYWdlLndpZHRoICogaW1hZ2VTaXplcy5zY2FsZUZhY3RvciwKICAgICAgaGVpZ2h0OiBpbWFnZVNpemVzLmltYWdlLmhlaWdodCAqIGltYWdlU2l6ZXMuc2NhbGVGYWN0b3IsCiAgICAgIGNhbGxiYWNrOiBpbWFnZURhdGFTZXR0ZXIobm90aWZpY2F0aW9uRGV0YWlscywgJ2ltYWdlQml0bWFwJykKICAgIH0pOwogIH0KCiAgLy8gRWFjaCBidXR0b24gaGFzIGFuIG9wdGlvbmFsIGljb24uCiAgdmFyIGJ1dHRvbkxpc3QgPSBub3RpZmljYXRpb25EZXRhaWxzLmJ1dHRvbnM7CiAgaWYgKGJ1dHRvbkxpc3QgJiYgdHlwZW9mIGJ1dHRvbkxpc3QubGVuZ3RoID09PSAnbnVtYmVyJykgewogICAgdmFyIG51bUJ1dHRvbnMgPSBidXR0b25MaXN0Lmxlbmd0aDsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtQnV0dG9uczsgaSsrKSB7CiAgICAgIGlmIChidXR0b25MaXN0W2ldLmljb25VcmwpIHsKICAgICAgICAkQXJyYXkucHVzaCh1cmxTcGVjcywgewogICAgICAgICAgcGF0aDogYnV0dG9uTGlzdFtpXS5pY29uVXJsLAogICAgICAgICAgd2lkdGg6IGltYWdlU2l6ZXMuYnV0dG9uSWNvbi53aWR0aCAqIGltYWdlU2l6ZXMuc2NhbGVGYWN0b3IsCiAgICAgICAgICBoZWlnaHQ6IGltYWdlU2l6ZXMuYnV0dG9uSWNvbi5oZWlnaHQgKiBpbWFnZVNpemVzLnNjYWxlRmFjdG9yLAogICAgICAgICAgY2FsbGJhY2s6IGltYWdlRGF0YVNldHRlcihidXR0b25MaXN0W2ldLCAnaWNvbkJpdG1hcCcpCiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0KICB9CgogIHJldHVybiB1cmxTcGVjczsKfQoKZnVuY3Rpb24gcmVwbGFjZU5vdGlmaWNhdGlvbk9wdGlvblVSTHMobm90aWZpY2F0aW9uX2RldGFpbHMsIGNhbGxiYWNrKSB7CiAgdmFyIGltYWdlU2l6ZXMgPSBub3RpZmljYXRpb25zUHJpdmF0ZS5HZXROb3RpZmljYXRpb25JbWFnZVNpemVzKCk7CiAgdmFyIHVybF9zcGVjcyA9IGdldFVybFNwZWNzKGltYWdlU2l6ZXMsIG5vdGlmaWNhdGlvbl9kZXRhaWxzKTsKICBpZiAoIXVybF9zcGVjcy5sZW5ndGgpIHsKICAgIGNhbGxiYWNrKHRydWUpOwogICAgcmV0dXJuOwogIH0KCiAgdmFyIGVycm9ycyA9IDA7CgogIGltYWdlVXRpbC5sb2FkQWxsSW1hZ2VzKHVybF9zcGVjcywgewogICAgb25lcnJvcjogZnVuY3Rpb24oaW5kZXgpIHsKICAgICAgZXJyb3JzKys7CiAgICB9LAogICAgb25jb21wbGV0ZTogZnVuY3Rpb24oaW1hZ2VEYXRhKSB7CiAgICAgIGlmIChlcnJvcnMgPiAwKSB7CiAgICAgICAgY2FsbGJhY2soZmFsc2UpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgdXJsX3NwZWNzLmxlbmd0aDsgaW5kZXgrKykgewogICAgICAgIHZhciB1cmxfc3BlYyA9IHVybF9zcGVjc1tpbmRleF07CiAgICAgICAgdXJsX3NwZWMuY2FsbGJhY2soaW1hZ2VEYXRhW2luZGV4XSk7CiAgICAgIH0KICAgICAgY2FsbGJhY2sodHJ1ZSk7CiAgICB9CiAgfSk7Cn0KCmZ1bmN0aW9uIGdlbkhhbmRsZShuYW1lLCBmYWlsdXJlX2Z1bmN0aW9uKSB7CiAgcmV0dXJuIGZ1bmN0aW9uKGlkLCBpbnB1dF9ub3RpZmljYXRpb25fZGV0YWlscywgY2FsbGJhY2spIHsKICAgIC8vIFRPRE8oZGV3aXR0aik6IFJlbW92ZSB0aGlzIGhhY2suIFRoaXMgaXMgdXNlZCBhcyBhIHdheSB0byBkZWVwCiAgICAvLyBjb3B5IGEgY29tcGxleCBKU09OIG9iamVjdC4KICAgIHZhciBub3RpZmljYXRpb25fZGV0YWlscyA9ICRKU09OLnBhcnNlKAogICAgICAgICRKU09OLnN0cmluZ2lmeShpbnB1dF9ub3RpZmljYXRpb25fZGV0YWlscykpOwogICAgdmFyIHRoYXQgPSB0aGlzOwogICAgdmFyIHN0YWNrID0gZXhjZXB0aW9uSGFuZGxlci5nZXRFeHRlbnNpb25TdGFja1RyYWNlKCk7CiAgICByZXBsYWNlTm90aWZpY2F0aW9uT3B0aW9uVVJMcyhub3RpZmljYXRpb25fZGV0YWlscywgZnVuY3Rpb24oc3VjY2VzcykgewogICAgICBpZiAoc3VjY2VzcykgewogICAgICAgIHNlbmRSZXF1ZXN0KAogICAgICAgICAgICBuYW1lLCBbaWQsIG5vdGlmaWNhdGlvbl9kZXRhaWxzLCBjYWxsYmFja10sCiAgICAgICAgICAgIGJpbmRpbmdVdGlsID8gdW5kZWZpbmVkIDogdGhhdC5kZWZpbml0aW9uLnBhcmFtZXRlcnMsCiAgICAgICAgICAgIGJpbmRpbmdVdGlsID8gdW5kZWZpbmVkIDoge19fcHJvdG9fXzogbnVsbCwgc3RhY2s6IHN0YWNrfSk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHJ1bkNhbGxiYWNrV2l0aExhc3RFcnJvcigKICAgICAgICAgIG5hbWUsICdVbmFibGUgdG8gZG93bmxvYWQgYWxsIHNwZWNpZmllZCBpbWFnZXMuJywKICAgICAgICAgIHN0YWNrLCBmYWlsdXJlX2Z1bmN0aW9uLCBbY2FsbGJhY2sgfHwgZnVuY3Rpb24oKSB7fSwgaWRdKTsKICAgIH0pOwogIH07Cn0KCnZhciBoYW5kbGVDcmVhdGUgPSBnZW5IYW5kbGUoJ25vdGlmaWNhdGlvbnMuY3JlYXRlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbihjYWxsYmFjaywgaWQpIHsgY2FsbGJhY2soaWQpOyB9KTsKdmFyIGhhbmRsZVVwZGF0ZSA9IGdlbkhhbmRsZSgnbm90aWZpY2F0aW9ucy51cGRhdGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKGNhbGxiYWNrLCBpZCkgeyBjYWxsYmFjayhmYWxzZSk7IH0pOwoKdmFyIG5vdGlmaWNhdGlvbnNDdXN0b21Ib29rID0gZnVuY3Rpb24oYmluZGluZ3NBUEksIGV4dGVuc2lvbklkKSB7CiAgdmFyIGFwaUZ1bmN0aW9ucyA9IGJpbmRpbmdzQVBJLmFwaUZ1bmN0aW9uczsKICBhcGlGdW5jdGlvbnMuc2V0SGFuZGxlUmVxdWVzdCgnY3JlYXRlJywgaGFuZGxlQ3JlYXRlKTsKICBhcGlGdW5jdGlvbnMuc2V0SGFuZGxlUmVxdWVzdCgndXBkYXRlJywgaGFuZGxlVXBkYXRlKTsKfTsKCmJpbmRpbmcucmVnaXN0ZXJDdXN0b21Ib29rKG5vdGlmaWNhdGlvbnNDdXN0b21Ib29rKTsKCmlmICghYXBpQnJpZGdlKQogIGV4cG9ydHMuJHNldCgnYmluZGluZycsIGJpbmRpbmcuZ2VuZXJhdGUoKSk7Ci8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQovLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gQ3VzdG9tIGJpbmRpbmcgZm9yIHRoZSBvbW5pYm94IEFQSS4gT25seSBpbmplY3RlZCBpbnRvIHRoZSB2OCBjb250ZXh0cwovLyBmb3IgZXh0ZW5zaW9ucyB3aGljaCBoYXZlIHBlcm1pc3Npb24gZm9yIHRoZSBvbW5pYm94IEFQSS4KCnZhciBiaW5kaW5nID0gYXBpQnJpZGdlIHx8IHJlcXVpcmUoJ2JpbmRpbmcnKS5CaW5kaW5nLmNyZWF0ZSgnb21uaWJveCcpOwoKdmFyIHJlZ2lzdGVyQXJndW1lbnRNYXNzYWdlciA9IGJpbmRpbmdVdGlsID8KICAgICRGdW5jdGlvbi5iaW5kKGJpbmRpbmdVdGlsLnJlZ2lzdGVyRXZlbnRBcmd1bWVudE1hc3NhZ2VyLCBiaW5kaW5nVXRpbCkgOgogICAgcmVxdWlyZSgnZXZlbnRfYmluZGluZ3MnKS5yZWdpc3RlckFyZ3VtZW50TWFzc2FnZXI7Cgp2YXIgc2VuZFJlcXVlc3QgPSBiaW5kaW5nVXRpbCA/CiAgICAkRnVuY3Rpb24uYmluZChiaW5kaW5nVXRpbC5zZW5kUmVxdWVzdCwgYmluZGluZ1V0aWwpIDoKICAgIHJlcXVpcmUoJ3NlbmRSZXF1ZXN0Jykuc2VuZFJlcXVlc3Q7CgovLyBSZW1vdmUgaW52YWxpZCBjaGFyYWN0ZXJzIGZyb20gfHRleHR8IHNvIHRoYXQgaXQgaXMgc3VpdGFibGUgdG8gdXNlCi8vIGZvciB8QXV0b2NvbXBsZXRlTWF0Y2g6OmNvbnRlbnRzfC4KZnVuY3Rpb24gc2FuaXRpemVTdHJpbmcodGV4dCwgc2hvdWxkVHJpbSkgewogIC8vIE5PVEU6IFRoaXMgbG9naWMgbWlycm9ycyB8QXV0b2NvbXBsZXRlTWF0Y2g6OlNhbml0aXplU3RyaW5nKCl8LgogIC8vIDB4MjAyOCA9IGxpbmUgc2VwYXJhdG9yOyAweDIwMjkgPSBwYXJhZ3JhcGggc2VwYXJhdG9yLgogIHZhciBrUmVtb3ZlQ2hhcnMgPSAvKFxyfFxufFx0fFx1MjAyOHxcdTIwMjkpL2dtOwogIGlmIChzaG91bGRUcmltKQogICAgdGV4dCA9IHRleHQudHJpbUxlZnQoKTsKICByZXR1cm4gdGV4dC5yZXBsYWNlKGtSZW1vdmVDaGFycywgJycpOwp9CgovLyBQYXJzZXMgdGhlIHhtbCBzeW50YXggc3VwcG9ydGVkIGJ5IG9tbmlib3ggc3VnZ2VzdGlvbiByZXN1bHRzLiBSZXR1cm5zIGFuCi8vIG9iamVjdCB3aXRoIHR3byBwcm9wZXJ0aWVzOiAnZGVzY3JpcHRpb24nLCB3aGljaCBpcyBqdXN0IHRoZSB0ZXh0IGNvbnRlbnQsCi8vIGFuZCAnZGVzY3JpcHRpb25TdHlsZXMnLCB3aGljaCBpcyBhbiBhcnJheSBvZiBzdHlsZSBvYmplY3RzIGluIGEgZm9ybWF0Ci8vIHVuZGVyc3Rvb2QgYnkgdGhlIEMrKyBiYWNrZW5kLgpmdW5jdGlvbiBwYXJzZU9tbmlib3hEZXNjcmlwdGlvbihpbnB1dCkgewogIHZhciBkb21QYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7CgogIC8vIFRoZSBYTUwgcGFyc2VyIHJlcXVpcmVzIGEgc2luZ2xlIHRvcC1sZXZlbCBlbGVtZW50LCBidXQgd2Ugd2FudCB0bwogIC8vIHN1cHBvcnQgdGhpbmdzIGxpa2UgJ2hlbGxvLCA8bWF0Y2g+d29ybGQ8L21hdGNoPiEnLiBTbyB3ZSB3cmFwIHRoZQogIC8vIHByb3ZpZGVkIHRleHQgaW4gZ2VuZXJhdGVkIHJvb3QgbGV2ZWwgZWxlbWVudC4KICB2YXIgcm9vdCA9IGRvbVBhcnNlci5wYXJzZUZyb21TdHJpbmcoCiAgICAgICc8ZnJhZ21lbnQ+JyArIGlucHV0ICsgJzwvZnJhZ21lbnQ+JywgJ3RleHQveG1sJyk7CgogIC8vIERPTVBhcnNlciBoYXMgYSB0ZXJyaWJsZSBlcnJvciByZXBvcnRpbmcgZmFjaWxpdHkuIEVycm9ycyBjb21lIG91dCBuZXN0ZWQKICAvLyBpbnNpZGUgdGhlIHJldHVybmVkIGRvY3VtZW50LgogIHZhciBlcnJvciA9IHJvb3QucXVlcnlTZWxlY3RvcigncGFyc2VyZXJyb3IgZGl2Jyk7CiAgaWYgKGVycm9yKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3IudGV4dENvbnRlbnQpOwogIH0KCiAgLy8gT3RoZXJ3aXNlLCBpdCdzIHZhbGlkLCBzbyBidWlsZCB1cCB0aGUgcmVzdWx0LgogIHZhciByZXN1bHQgPSB7CiAgICBkZXNjcmlwdGlvbjogJycsCiAgICBkZXNjcmlwdGlvblN0eWxlczogW10KICB9OwoKICAvLyBSZWN1cnNpdmVseSB3YWxrIHRoZSB0cmVlLgogIGZ1bmN0aW9uIHdhbGsobm9kZSkgewogICAgZm9yICh2YXIgaSA9IDAsIGNoaWxkOyBjaGlsZCA9IG5vZGUuY2hpbGROb2Rlc1tpXTsgaSsrKSB7CiAgICAgIC8vIEFwcGVuZCB0ZXh0IG5vZGVzIHRvIG91ciBkZXNjcmlwdGlvbi4KICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlID09IE5vZGUuVEVYVF9OT0RFKSB7CiAgICAgICAgdmFyIHNob3VsZFRyaW0gPSByZXN1bHQuZGVzY3JpcHRpb24ubGVuZ3RoID09IDA7CiAgICAgICAgcmVzdWx0LmRlc2NyaXB0aW9uICs9IHNhbml0aXplU3RyaW5nKGNoaWxkLm5vZGVWYWx1ZSwgc2hvdWxkVHJpbSk7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KCiAgICAgIC8vIFByb2Nlc3MgYW5kIGRlc2NlbmQgaW50byBhIHN1YnNldCBvZiByZWNvZ25pemVkIHRhZ3MuCiAgICAgIGlmIChjaGlsZC5ub2RlVHlwZSA9PSBOb2RlLkVMRU1FTlRfTk9ERSAmJgogICAgICAgICAgKGNoaWxkLm5vZGVOYW1lID09ICdkaW0nIHx8IGNoaWxkLm5vZGVOYW1lID09ICdtYXRjaCcgfHwKICAgICAgICAgICBjaGlsZC5ub2RlTmFtZSA9PSAndXJsJykpIHsKICAgICAgICB2YXIgc3R5bGUgPSB7CiAgICAgICAgICAndHlwZSc6IGNoaWxkLm5vZGVOYW1lLAogICAgICAgICAgJ29mZnNldCc6IHJlc3VsdC5kZXNjcmlwdGlvbi5sZW5ndGgKICAgICAgICB9OwogICAgICAgICRBcnJheS5wdXNoKHJlc3VsdC5kZXNjcmlwdGlvblN0eWxlcywgc3R5bGUpOwogICAgICAgIHdhbGsoY2hpbGQpOwogICAgICAgIHN0eWxlLmxlbmd0aCA9IHJlc3VsdC5kZXNjcmlwdGlvbi5sZW5ndGggLSBzdHlsZS5vZmZzZXQ7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KCiAgICAgIC8vIERlc2NlbmQgaW50byBhbGwgb3RoZXIgbm9kZXMsIGV2ZW4gaWYgdGhleSBhcmUgdW5yZWNvZ25pemVkLCBmb3IKICAgICAgLy8gZm9yd2FyZCBjb21wYXQuCiAgICAgIHdhbGsoY2hpbGQpOwogICAgfQogIH07CiAgd2Fsayhyb290KTsKCiAgcmV0dXJuIHJlc3VsdDsKfQoKYmluZGluZy5yZWdpc3RlckN1c3RvbUhvb2soZnVuY3Rpb24oYmluZGluZ3NBUEkpIHsKICB2YXIgYXBpRnVuY3Rpb25zID0gYmluZGluZ3NBUEkuYXBpRnVuY3Rpb25zOwoKICBhcGlGdW5jdGlvbnMuc2V0VXBkYXRlQXJndW1lbnRzUHJlVmFsaWRhdGUoJ3NldERlZmF1bHRTdWdnZXN0aW9uJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oc3VnZ2VzdFJlc3VsdCkgewogICAgaWYgKHN1Z2dlc3RSZXN1bHQuY29udGVudCAhPSB1bmRlZmluZWQpIHsgIC8vIG51bGwsIGV0Yy4KICAgICAgdGhyb3cgbmV3IEVycm9yKAogICAgICAgICAgJ3NldERlZmF1bHRTdWdnZXN0aW9uIGNhbm5vdCBjb250YWluIHRoZSAiY29udGVudCIgZmllbGQnKTsKICAgIH0KICAgIHJldHVybiBbc3VnZ2VzdFJlc3VsdF07CiAgfSk7CgogIGFwaUZ1bmN0aW9ucy5zZXRIYW5kbGVSZXF1ZXN0KCdzZXREZWZhdWx0U3VnZ2VzdGlvbicsIGZ1bmN0aW9uKGRldGFpbHMpIHsKICAgIHZhciBwYXJzZVJlc3VsdCA9IHBhcnNlT21uaWJveERlc2NyaXB0aW9uKGRldGFpbHMuZGVzY3JpcHRpb24pOwogICAgc2VuZFJlcXVlc3QoJ29tbmlib3guc2V0RGVmYXVsdFN1Z2dlc3Rpb24nLCBbcGFyc2VSZXN1bHRdLAogICAgICAgICAgICAgICAgYmluZGluZ1V0aWwgPyB1bmRlZmluZWQgOiB0aGlzLmRlZmluaXRpb24ucGFyYW1ldGVycywKICAgICAgICAgICAgICAgIHVuZGVmaW5lZCk7CiAgfSk7CgogIGFwaUZ1bmN0aW9ucy5zZXRVcGRhdGVBcmd1bWVudHNQb3N0VmFsaWRhdGUoCiAgICAgICdzZW5kU3VnZ2VzdGlvbnMnLCBmdW5jdGlvbihyZXF1ZXN0SWQsIHVzZXJTdWdnZXN0aW9ucykgewogICAgdmFyIHN1Z2dlc3Rpb25zID0gW107CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHVzZXJTdWdnZXN0aW9ucy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgcGFyc2VSZXN1bHQgPSBwYXJzZU9tbmlib3hEZXNjcmlwdGlvbigKICAgICAgICAgIHVzZXJTdWdnZXN0aW9uc1tpXS5kZXNjcmlwdGlvbik7CiAgICAgIHBhcnNlUmVzdWx0LmNvbnRlbnQgPSB1c2VyU3VnZ2VzdGlvbnNbaV0uY29udGVudDsKICAgICAgcGFyc2VSZXN1bHQuZGVsZXRhYmxlID0gdXNlclN1Z2dlc3Rpb25zW2ldLmRlbGV0YWJsZTsKICAgICAgJEFycmF5LnB1c2goc3VnZ2VzdGlvbnMsIHBhcnNlUmVzdWx0KTsKICAgIH0KICAgIHJldHVybiBbcmVxdWVzdElkLCBzdWdnZXN0aW9uc107CiAgfSk7Cn0pOwoKcmVnaXN0ZXJBcmd1bWVudE1hc3NhZ2VyKCdvbW5pYm94Lm9uSW5wdXRDaGFuZ2VkJywgZnVuY3Rpb24oYXJncywgZGlzcGF0Y2gpIHsKICB2YXIgdGV4dCA9IGFyZ3NbMF07CiAgdmFyIHJlcXVlc3RJZCA9IGFyZ3NbMV07CiAgdmFyIHN1Z2dlc3RDYWxsYmFjayA9IGZ1bmN0aW9uKHN1Z2dlc3Rpb25zKSB7CiAgICBjaHJvbWUub21uaWJveC5zZW5kU3VnZ2VzdGlvbnMocmVxdWVzdElkLCBzdWdnZXN0aW9ucyk7CiAgfTsKICBkaXNwYXRjaChbdGV4dCwgc3VnZ2VzdENhbGxiYWNrXSk7Cn0pOwoKaWYgKCFhcGlCcmlkZ2UpCiAgZXhwb3J0cy4kc2V0KCdiaW5kaW5nJywgYmluZGluZy5nZW5lcmF0ZSgpKTsKLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgovLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLyBDdXN0b20gYmluZGluZyBmb3IgdGhlIHBhZ2VBY3Rpb24gQVBJLgoKdmFyIGJpbmRpbmcgPSBhcGlCcmlkZ2UgfHwgcmVxdWlyZSgnYmluZGluZycpLkJpbmRpbmcuY3JlYXRlKCdwYWdlQWN0aW9uJyk7CnZhciBzZXRJY29uID0gcmVxdWlyZSgnc2V0SWNvbicpLnNldEljb247CnZhciBzZW5kUmVxdWVzdCA9IGJpbmRpbmdVdGlsID8KICAgICRGdW5jdGlvbi5iaW5kKGJpbmRpbmdVdGlsLnNlbmRSZXF1ZXN0LCBiaW5kaW5nVXRpbCkgOgogICAgcmVxdWlyZSgnc2VuZFJlcXVlc3QnKS5zZW5kUmVxdWVzdDsKCmJpbmRpbmcucmVnaXN0ZXJDdXN0b21Ib29rKGZ1bmN0aW9uKGJpbmRpbmdzQVBJKSB7CiAgdmFyIGFwaUZ1bmN0aW9ucyA9IGJpbmRpbmdzQVBJLmFwaUZ1bmN0aW9uczsKCiAgYXBpRnVuY3Rpb25zLnNldEhhbmRsZVJlcXVlc3QoJ3NldEljb24nLCBmdW5jdGlvbihkZXRhaWxzLCBjYWxsYmFjaykgewogICAgc2V0SWNvbihkZXRhaWxzLCAkRnVuY3Rpb24uYmluZChmdW5jdGlvbihhcmdzKSB7CiAgICAgIHNlbmRSZXF1ZXN0KCdwYWdlQWN0aW9uLnNldEljb24nLCBbYXJncywgY2FsbGJhY2tdLAogICAgICAgICAgICAgICAgICBiaW5kaW5nVXRpbCA/IHVuZGVmaW5lZCA6IHRoaXMuZGVmaW5pdGlvbi5wYXJhbWV0ZXJzLAogICAgICAgICAgICAgICAgICB1bmRlZmluZWQpOwogICAgfSwgdGhpcykpOwogIH0pOwp9KTsKCmlmICghYXBpQnJpZGdlKQogIGV4cG9ydHMuJHNldCgnYmluZGluZycsIGJpbmRpbmcuZ2VuZXJhdGUoKSk7Ci8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQovLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gQ3VzdG9tIGJpbmRpbmcgZm9yIHRoZSBwYWdlQ2FwdHVyZSBBUEkuCgp2YXIgYmluZGluZyA9IGFwaUJyaWRnZSB8fCByZXF1aXJlKCdiaW5kaW5nJykuQmluZGluZy5jcmVhdGUoJ3BhZ2VDYXB0dXJlJyk7Cgp2YXIgaGFuZGxlVW5jYXVnaHRFeGNlcHRpb24gPSByZXF1aXJlKCd1bmNhdWdodF9leGNlcHRpb25faGFuZGxlcicpLmhhbmRsZTsKdmFyIHBhZ2VDYXB0dXJlTmF0aXZlcyA9IHJlcXVpcmVOYXRpdmUoJ3BhZ2VfY2FwdHVyZScpOwp2YXIgQ3JlYXRlQmxvYiA9IHBhZ2VDYXB0dXJlTmF0aXZlcy5DcmVhdGVCbG9iOwp2YXIgU2VuZFJlc3BvbnNlQWNrID0gcGFnZUNhcHR1cmVOYXRpdmVzLlNlbmRSZXNwb25zZUFjazsKCmJpbmRpbmcucmVnaXN0ZXJDdXN0b21Ib29rKGZ1bmN0aW9uKGJpbmRpbmdzQVBJKSB7CiAgdmFyIGFwaUZ1bmN0aW9ucyA9IGJpbmRpbmdzQVBJLmFwaUZ1bmN0aW9uczsKCiAgYXBpRnVuY3Rpb25zLnNldEN1c3RvbUNhbGxiYWNrKCdzYXZlQXNNSFRNTCcsCiAgICAgIGZ1bmN0aW9uKG5hbWUsIHJlcXVlc3QsIGNhbGxiYWNrLCByZXNwb25zZSkgewogICAgaWYgKHJlc3BvbnNlKQogICAgICByZXNwb25zZSA9IENyZWF0ZUJsb2IocmVzcG9uc2UubWh0bWxGaWxlUGF0aCwgcmVzcG9uc2UubWh0bWxGaWxlTGVuZ3RoKTsKCiAgICB0cnkgewogICAgICBjYWxsYmFjayhyZXNwb25zZSk7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIGhhbmRsZVVuY2F1Z2h0RXhjZXB0aW9uKAogICAgICAgICAgJ0Vycm9yIGluIGNocm9tZS5wYWdlQ2FwdHVyZS5zYXZlQXNNSFRNTCBjYWxsYmFjaycsIGUsIHJlcXVlc3Quc3RhY2spOwogICAgfSBmaW5hbGx5IHsKICAgICAgLy8gTm90aWZ5IHRoZSBicm93c2VyLiBOb3cgdGhhdCB0aGUgYmxvYiBpcyByZWZlcmVuY2VkIGZyb20gSmF2YVNjcmlwdCwKICAgICAgLy8gdGhlIGJyb3dzZXIgY2FuIGRyb3AgaXRzIHJlZmVyZW5jZSB0byBpdC4KICAgICAgU2VuZFJlc3BvbnNlQWNrKHJlcXVlc3QuaWQpOwogICAgfQogIH0pOwp9KTsKCmlmICghYXBpQnJpZGdlKQogIGV4cG9ydHMuJHNldCgnYmluZGluZycsIGJpbmRpbmcuZ2VuZXJhdGUoKSk7Ci8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQovLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gQ3VzdG9tIGJpbmRpbmcgZm9yIHRoZSBzeW5jRmlsZVN5c3RlbSBBUEkuCgp2YXIgYmluZGluZyA9CiAgICBhcGlCcmlkZ2UgfHwgcmVxdWlyZSgnYmluZGluZycpLkJpbmRpbmcuY3JlYXRlKCdzeW5jRmlsZVN5c3RlbScpOwoKdmFyIHJlZ2lzdGVyQXJndW1lbnRNYXNzYWdlciA9IGJpbmRpbmdVdGlsID8KICAgICRGdW5jdGlvbi5iaW5kKGJpbmRpbmdVdGlsLnJlZ2lzdGVyRXZlbnRBcmd1bWVudE1hc3NhZ2VyLCBiaW5kaW5nVXRpbCkgOgogICAgcmVxdWlyZSgnZXZlbnRfYmluZGluZ3MnKS5yZWdpc3RlckFyZ3VtZW50TWFzc2FnZXI7Cgp2YXIgZmlsZVN5c3RlbU5hdGl2ZXMgPSByZXF1aXJlTmF0aXZlKCdmaWxlX3N5c3RlbV9uYXRpdmVzJyk7CnZhciBzeW5jRmlsZVN5c3RlbU5hdGl2ZXMgPSByZXF1aXJlTmF0aXZlKCdzeW5jX2ZpbGVfc3lzdGVtJyk7CgpiaW5kaW5nLnJlZ2lzdGVyQ3VzdG9tSG9vayhmdW5jdGlvbihiaW5kaW5nc0FQSSkgewogIHZhciBhcGlGdW5jdGlvbnMgPSBiaW5kaW5nc0FQSS5hcGlGdW5jdGlvbnM7CgogIC8vIEZ1bmN0aW9ucyB3aGljaCB0YWtlIGluIGFuIFtpbnN0YW5jZU9mPUZpbGVFbnRyeV0uCiAgZnVuY3Rpb24gYmluZEZpbGVFbnRyeUZ1bmN0aW9uKGZ1bmN0aW9uTmFtZSkgewogICAgYXBpRnVuY3Rpb25zLnNldFVwZGF0ZUFyZ3VtZW50c1Bvc3RWYWxpZGF0ZSgKICAgICAgICBmdW5jdGlvbk5hbWUsIGZ1bmN0aW9uKGVudHJ5LCBjYWxsYmFjaykgewogICAgICB2YXIgZmlsZVN5c3RlbVVybCA9IGVudHJ5LnRvVVJMKCk7CiAgICAgIHJldHVybiBbZmlsZVN5c3RlbVVybCwgY2FsbGJhY2tdOwogICAgfSk7CiAgfQogICRBcnJheS5mb3JFYWNoKFsnZ2V0RmlsZVN0YXR1cyddLCBiaW5kRmlsZUVudHJ5RnVuY3Rpb24pOwoKICAvLyBGdW5jdGlvbnMgd2hpY2ggdGFrZSBpbiBhIEZpbGVFbnRyeSBhcnJheS4KICBmdW5jdGlvbiBiaW5kRmlsZUVudHJ5QXJyYXlGdW5jdGlvbihmdW5jdGlvbk5hbWUpIHsKICAgIGFwaUZ1bmN0aW9ucy5zZXRVcGRhdGVBcmd1bWVudHNQb3N0VmFsaWRhdGUoCiAgICAgICAgZnVuY3Rpb25OYW1lLCBmdW5jdGlvbihlbnRyaWVzLCBjYWxsYmFjaykgewogICAgICB2YXIgZmlsZVN5c3RlbVVybEFycmF5ID0gW107CiAgICAgIGZvciAodmFyIGk9MDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAkQXJyYXkucHVzaChmaWxlU3lzdGVtVXJsQXJyYXksIGVudHJpZXNbaV0udG9VUkwoKSk7CiAgICAgIH0KICAgICAgcmV0dXJuIFtmaWxlU3lzdGVtVXJsQXJyYXksIGNhbGxiYWNrXTsKICAgIH0pOwogIH0KICAkQXJyYXkuZm9yRWFjaChbJ2dldEZpbGVTdGF0dXNlcyddLCBiaW5kRmlsZUVudHJ5QXJyYXlGdW5jdGlvbik7CgogIC8vIEZ1bmN0aW9ucyB3aGljaCB0YWtlIGluIGFuIFtpbnN0YW5jZU9mPURPTUZpbGVTeXN0ZW1dLgogIGZ1bmN0aW9uIGJpbmRGaWxlU3lzdGVtRnVuY3Rpb24oZnVuY3Rpb25OYW1lKSB7CiAgICBhcGlGdW5jdGlvbnMuc2V0VXBkYXRlQXJndW1lbnRzUG9zdFZhbGlkYXRlKAogICAgICAgIGZ1bmN0aW9uTmFtZSwgZnVuY3Rpb24oZmlsZXN5c3RlbSwgY2FsbGJhY2spIHsKICAgICAgdmFyIGZpbGVTeXN0ZW1VcmwgPSBmaWxlc3lzdGVtLnJvb3QudG9VUkwoKTsKICAgICAgcmV0dXJuIFtmaWxlU3lzdGVtVXJsLCBjYWxsYmFja107CiAgICB9KTsKICB9CiAgJEFycmF5LmZvckVhY2goWydnZXRVc2FnZUFuZFF1b3RhJ10sIGJpbmRGaWxlU3lzdGVtRnVuY3Rpb24pOwoKICAvLyBGdW5jdGlvbnMgd2hpY2ggcmV0dXJuIGFuIFtpbnN0YW5jZU9mPURPTUZpbGVTeXN0ZW1dLgogIGFwaUZ1bmN0aW9ucy5zZXRDdXN0b21DYWxsYmFjaygncmVxdWVzdEZpbGVTeXN0ZW0nLAogICAgICBmdW5jdGlvbihuYW1lLCByZXF1ZXN0LCBjYWxsYmFjaywgcmVzcG9uc2UpIHsKICAgIHZhciByZXN1bHQgPSBudWxsOwogICAgaWYgKHJlc3BvbnNlKSB7CiAgICAgIHJlc3VsdCA9IHN5bmNGaWxlU3lzdGVtTmF0aXZlcy5HZXRTeW5jRmlsZVN5c3RlbU9iamVjdCgKICAgICAgICAgIHJlc3BvbnNlLm5hbWUsIHJlc3BvbnNlLnJvb3QpOwogICAgfQogICAgaWYgKGNhbGxiYWNrKQogICAgICBjYWxsYmFjayhyZXN1bHQpOwogIH0pOwoKICAvLyBGdW5jdGlvbnMgd2hpY2ggcmV0dXJuIGFuIGFycmF5IG9mIEZpbGVTdGF0dXNJbmZvIG9iamVjdAogIC8vIHdoaWNoIGhhcyBbaW5zdGFuY2VPZj1GaWxlRW50cnldLgogIGFwaUZ1bmN0aW9ucy5zZXRDdXN0b21DYWxsYmFjaygnZ2V0RmlsZVN0YXR1c2VzJywKICAgICAgZnVuY3Rpb24obmFtZSwgcmVxdWVzdCwgY2FsbGJhY2ssIHJlc3BvbnNlKSB7CiAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgaWYgKHJlc3BvbnNlKSB7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVzcG9uc2UubGVuZ3RoOyBpKyspIHsKICAgICAgICB2YXIgcmVzdWx0ID0ge307CiAgICAgICAgdmFyIGVudHJ5ID0gcmVzcG9uc2VbaV0uZW50cnk7CiAgICAgICAgcmVzdWx0LmZpbGVFbnRyeSA9IGZpbGVTeXN0ZW1OYXRpdmVzLkdldEZpbGVFbnRyeSgKICAgICAgICAgICAgZW50cnkuZmlsZVN5c3RlbVR5cGUsCiAgICAgICAgICAgIGVudHJ5LmZpbGVTeXN0ZW1OYW1lLAogICAgICAgICAgICBlbnRyeS5yb290VXJsLAogICAgICAgICAgICBlbnRyeS5maWxlUGF0aCwKICAgICAgICAgICAgZW50cnkuaXNEaXJlY3RvcnkpOwogICAgICAgIHJlc3VsdC5zdGF0dXMgPSByZXNwb25zZVtpXS5zdGF0dXM7CiAgICAgICAgcmVzdWx0LmVycm9yID0gcmVzcG9uc2VbaV0uZXJyb3I7CiAgICAgICAgJEFycmF5LnB1c2gocmVzdWx0cywgcmVzdWx0KTsKICAgICAgfQogICAgfQogICAgaWYgKGNhbGxiYWNrKQogICAgICBjYWxsYmFjayhyZXN1bHRzKTsKICB9KTsKfSk7CgpyZWdpc3RlckFyZ3VtZW50TWFzc2FnZXIoJ3N5bmNGaWxlU3lzdGVtLm9uRmlsZVN0YXR1c0NoYW5nZWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oYXJncywgZGlzcGF0Y2gpIHsKICAvLyBNYWtlIEZpbGVFbnRyeSBvYmplY3QgdXNpbmcgYWxsIHRoZSBiYXNlIHN0cmluZyBmaWVsZHMuCiAgdmFyIGZpbGVFbnRyeSA9IGZpbGVTeXN0ZW1OYXRpdmVzLkdldEZpbGVFbnRyeSgKICAgICAgYXJnc1swXS5maWxlU3lzdGVtVHlwZSwKICAgICAgYXJnc1swXS5maWxlU3lzdGVtTmFtZSwKICAgICAgYXJnc1swXS5yb290VXJsLAogICAgICBhcmdzWzBdLmZpbGVQYXRoLAogICAgICBhcmdzWzBdLmlzRGlyZWN0b3J5KTsKCiAgLy8gQ29tYmluZSBpbnRvIGEgc2luZ2xlIGRpY3Rpb25hcnkuCiAgdmFyIGZpbGVJbmZvID0gbmV3IE9iamVjdCgpOwogIGZpbGVJbmZvLmZpbGVFbnRyeSA9IGZpbGVFbnRyeTsKICBmaWxlSW5mby5zdGF0dXMgPSBhcmdzWzFdOwogIGlmIChmaWxlSW5mby5zdGF0dXMgPT0gInN5bmNlZCIpIHsKICAgIGZpbGVJbmZvLmFjdGlvbiA9IGFyZ3NbMl07CiAgICBmaWxlSW5mby5kaXJlY3Rpb24gPSBhcmdzWzNdOwogIH0KICBkaXNwYXRjaChbZmlsZUluZm9dKTsKfSk7CgppZiAoIWFwaUJyaWRnZSkKICBleHBvcnRzLiRzZXQoJ2JpbmRpbmcnLCBiaW5kaW5nLmdlbmVyYXRlKCkpOwovLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIEN1c3RvbSBiaW5kaW5nIGZvciB0aGUgc3lzdGVtSW5kaWNhdG9yIEFQSS4KLy8gVE9ETyhkZXdpdHRqKSBSZWZhY3RvciBjdXN0b20gYmluZGluZyB0byByZWR1Y2UgcmVkdW5kYW5jeSBiZXR3ZWVuIHRoZQovLyBleHRlbnNpb24gYWN0aW9uIEFQSXMuCgp2YXIgYmluZGluZyA9CiAgICBhcGlCcmlkZ2UgfHwgcmVxdWlyZSgnYmluZGluZycpLkJpbmRpbmcuY3JlYXRlKCdzeXN0ZW1JbmRpY2F0b3InKTsKCnZhciBzZXRJY29uID0gcmVxdWlyZSgnc2V0SWNvbicpLnNldEljb247CnZhciBzZW5kUmVxdWVzdCA9IGJpbmRpbmdVdGlsID8KICAgICRGdW5jdGlvbi5iaW5kKGJpbmRpbmdVdGlsLnNlbmRSZXF1ZXN0LCBiaW5kaW5nVXRpbCkgOgogICAgcmVxdWlyZSgnc2VuZFJlcXVlc3QnKS5zZW5kUmVxdWVzdDsKCmJpbmRpbmcucmVnaXN0ZXJDdXN0b21Ib29rKGZ1bmN0aW9uKGJpbmRpbmdzQVBJKSB7CiAgdmFyIGFwaUZ1bmN0aW9ucyA9IGJpbmRpbmdzQVBJLmFwaUZ1bmN0aW9uczsKCiAgYXBpRnVuY3Rpb25zLnNldEhhbmRsZVJlcXVlc3QoJ3NldEljb24nLCBmdW5jdGlvbihkZXRhaWxzLCBjYWxsYmFjaykgewogICAgc2V0SWNvbihkZXRhaWxzLCAkRnVuY3Rpb24uYmluZChmdW5jdGlvbihhcmdzKSB7CiAgICAgIHNlbmRSZXF1ZXN0KCdzeXN0ZW1JbmRpY2F0b3Iuc2V0SWNvbicsIFthcmdzLCBjYWxsYmFja10sCiAgICAgICAgICAgICAgICAgIGJpbmRpbmdVdGlsID8gdW5kZWZpbmVkIDogdGhpcy5kZWZpbml0aW9uLnBhcmFtZXRlcnMsCiAgICAgICAgICAgICAgICAgIHVuZGVmaW5lZCk7CiAgICB9LCB0aGlzKSk7CiAgfSk7Cn0pOwoKaWYgKCFhcGlCcmlkZ2UpCiAgZXhwb3J0cy4kc2V0KCdiaW5kaW5nJywgYmluZGluZy5nZW5lcmF0ZSgpKTsKLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgovLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLyBDdXN0b20gYmluZGluZyBmb3IgdGhlIFRhYiBDYXB0dXJlIEFQSS4KCnZhciBiaW5kaW5nID0gYXBpQnJpZGdlIHx8IHJlcXVpcmUoJ2JpbmRpbmcnKS5CaW5kaW5nLmNyZWF0ZSgndGFiQ2FwdHVyZScpOwoKdmFyIGpzTGFzdEVycm9yID0gYmluZGluZ1V0aWwgPyB1bmRlZmluZWQgOiByZXF1aXJlKCdsYXN0RXJyb3InKTsKZnVuY3Rpb24gcnVuQ2FsbGJhY2tXaXRoTGFzdEVycm9yKG5hbWUsIG1lc3NhZ2UsIHN0YWNrLCBjYWxsYmFjaywgYXJncykgewogIGlmIChiaW5kaW5nVXRpbCkgewogICAgYmluZGluZ1V0aWwucnVuQ2FsbGJhY2tXaXRoTGFzdEVycm9yKG1lc3NhZ2UsIGZ1bmN0aW9uKCkgewogICAgICAkRnVuY3Rpb24uYXBwbHkoY2FsbGJhY2ssIG51bGwsIGFyZ3MpOwogICAgfSk7CiAgfSBlbHNlIHsKICAgIGpzTGFzdEVycm9yLnJ1bihuYW1lLCBtZXNzYWdlLCBzdGFjaywgY2FsbGJhY2ssIGFyZ3MpOwogIH0KfQoKYmluZGluZy5yZWdpc3RlckN1c3RvbUhvb2soZnVuY3Rpb24oYmluZGluZ3NBUEksIGV4dGVuc2lvbklkKSB7CiAgdmFyIGFwaUZ1bmN0aW9ucyA9IGJpbmRpbmdzQVBJLmFwaUZ1bmN0aW9uczsKCiAgZnVuY3Rpb24gcHJveHlUb0dldFVzZXJNZWRpYShuYW1lLCByZXF1ZXN0LCBjYWxsYmFjaywgcmVzcG9uc2UpIHsKICAgIGlmICghY2FsbGJhY2spCiAgICAgIHJldHVybjsKCiAgICBpZiAoIXJlc3BvbnNlKSB7CiAgICAgIC8vIFdoZW4gdGhlIHJlc3BvbnNlIGlzIG1pc3NpbmcsIHJ1bnRpbWUubGFzdEVycm9yIGhhcyBhbHJlYWR5IGJlZW4gc2V0LgogICAgICAvLyBTZWUgY2hyb21lL2Jyb3dzZXIvZXh0ZW5zaW9ucy9hcGkvdGFiX2NhcHR1cmUvdGFiX2NhcHR1cmVfYXBpLmNjLgogICAgICBjYWxsYmFjayhudWxsKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8vIENvbnZlbmllbmNlIGZ1bmN0aW9uIGZvciBwcm9jZXNzaW5nIHdlYmtpdEdldFVzZXJNZWRpYSgpIGVycm9yIG9iamVjdHMgdG8KICAgIC8vIHByb3ZpZGUgcnVudGltZS5sYXN0RXJyb3IgbWVzc2FnZXMgZm9yIHRoZSB0YWIgY2FwdHVyZSBBUEkuCiAgICBmdW5jdGlvbiBnZXRFcnJvck1lc3NhZ2UoZXJyb3IsIGZhbGxiYWNrTWVzc2FnZSkgewogICAgICBpZiAoIWVycm9yIHx8ICh0eXBlb2YgZXJyb3IubWVzc2FnZSAhPSAnc3RyaW5nJykpCiAgICAgICAgcmV0dXJuIGZhbGxiYWNrTWVzc2FnZTsKICAgICAgcmV0dXJuIGVycm9yLm1lc3NhZ2UucmVwbGFjZSgvKG5hdmlnYXRvclwuKT8od2Via2l0KT9HZXRVc2VyTWVkaWEvZ2ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7CiAgICB9CgogICAgdmFyIG9wdGlvbnMgPSB7fTsKICAgIGlmIChyZXNwb25zZS5hdWRpb0NvbnN0cmFpbnRzKQogICAgICBvcHRpb25zLmF1ZGlvID0gcmVzcG9uc2UuYXVkaW9Db25zdHJhaW50czsKICAgIGlmIChyZXNwb25zZS52aWRlb0NvbnN0cmFpbnRzKQogICAgICBvcHRpb25zLnZpZGVvID0gcmVzcG9uc2UudmlkZW9Db25zdHJhaW50czsKICAgIHRyeSB7CiAgICAgIG5hdmlnYXRvci53ZWJraXRHZXRVc2VyTWVkaWEoCiAgICAgICAgICBvcHRpb25zLAogICAgICAgICAgZnVuY3Rpb24gb25TdWNjZXNzKG1lZGlhX3N0cmVhbSkgewogICAgICAgICAgICBjYWxsYmFjayhtZWRpYV9zdHJlYW0pOwogICAgICAgICAgfSwKICAgICAgICAgIGZ1bmN0aW9uIG9uRXJyb3IoZXJyb3IpIHsKICAgICAgICAgICAgcnVuQ2FsbGJhY2tXaXRoTGFzdEVycm9yKAogICAgICAgICAgICAgICAgbmFtZSwKICAgICAgICAgICAgICAgIGdldEVycm9yTWVzc2FnZShlcnJvciwgIkZhaWxlZCB0byBzdGFydCBNZWRpYVN0cmVhbS4iKSwKICAgICAgICAgICAgICAgIHJlcXVlc3Quc3RhY2ssCiAgICAgICAgICAgICAgICBmdW5jdGlvbigpIHsgY2FsbGJhY2sobnVsbCk7IH0pOwogICAgICAgICAgfSk7CiAgICB9IGNhdGNoIChlcnJvcikgewogICAgICBydW5DYWxsYmFja1dpdGhMYXN0RXJyb3IoCiAgICAgICAgICBuYW1lLCBnZXRFcnJvck1lc3NhZ2UoZXJyb3IsICJJbnZhbGlkIGFyZ3VtZW50KHMpLiIpLCByZXF1ZXN0LnN0YWNrLAogICAgICAgICAgZnVuY3Rpb24oKSB7IGNhbGxiYWNrKG51bGwpOyB9KTsKICAgIH0KICB9CgogIGFwaUZ1bmN0aW9ucy5zZXRDdXN0b21DYWxsYmFjaygnY2FwdHVyZScsIHByb3h5VG9HZXRVc2VyTWVkaWEpOwogIGFwaUZ1bmN0aW9ucy5zZXRDdXN0b21DYWxsYmFjaygnY2FwdHVyZU9mZnNjcmVlblRhYicsIHByb3h5VG9HZXRVc2VyTWVkaWEpOwp9KTsKCmlmICghYXBpQnJpZGdlKQogIGV4cG9ydHMuJHNldCgnYmluZGluZycsIGJpbmRpbmcuZ2VuZXJhdGUoKSk7Ci8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQovLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gQ3VzdG9tIGJpbmRpbmcgZm9yIHRoZSB0YWJzIEFQSS4KCnZhciBiaW5kaW5nID0gYXBpQnJpZGdlIHx8IHJlcXVpcmUoJ2JpbmRpbmcnKS5CaW5kaW5nLmNyZWF0ZSgndGFicycpOwoKdmFyIG1lc3NhZ2luZyA9IHJlcXVpcmUoJ21lc3NhZ2luZycpOwp2YXIgT3BlbkNoYW5uZWxUb1RhYiA9IHJlcXVpcmVOYXRpdmUoJ21lc3NhZ2luZ19uYXRpdmVzJykuT3BlbkNoYW5uZWxUb1RhYjsKdmFyIHNlbmRSZXF1ZXN0SXNEaXNhYmxlZCA9IHJlcXVpcmVOYXRpdmUoJ3Byb2Nlc3MnKS5Jc1NlbmRSZXF1ZXN0RGlzYWJsZWQoKTsKdmFyIGZvckVhY2ggPSByZXF1aXJlKCd1dGlscycpLmZvckVhY2g7CgpiaW5kaW5nLnJlZ2lzdGVyQ3VzdG9tSG9vayhmdW5jdGlvbihiaW5kaW5nc0FQSSwgZXh0ZW5zaW9uSWQpIHsKICB2YXIgYXBpRnVuY3Rpb25zID0gYmluZGluZ3NBUEkuYXBpRnVuY3Rpb25zOwogIHZhciB0YWJzID0gYmluZGluZ3NBUEkuY29tcGlsZWRBcGk7CgogIGFwaUZ1bmN0aW9ucy5zZXRIYW5kbGVSZXF1ZXN0KCdjb25uZWN0JywgZnVuY3Rpb24odGFiSWQsIGNvbm5lY3RJbmZvKSB7CiAgICB2YXIgbmFtZSA9ICcnOwogICAgdmFyIGZyYW1lSWQgPSAtMTsKICAgIGlmIChjb25uZWN0SW5mbykgewogICAgICBuYW1lID0gY29ubmVjdEluZm8ubmFtZSB8fCBuYW1lOwogICAgICBmcmFtZUlkID0gY29ubmVjdEluZm8uZnJhbWVJZDsKICAgICAgaWYgKHR5cGVvZiBmcmFtZUlkID09ICd1bmRlZmluZWQnIHx8IGZyYW1lSWQgPCAwKQogICAgICAgIGZyYW1lSWQgPSAtMTsKICAgIH0KICAgIHZhciBwb3J0SWQgPSBPcGVuQ2hhbm5lbFRvVGFiKHRhYklkLCBmcmFtZUlkLCBleHRlbnNpb25JZCwgbmFtZSk7CiAgICByZXR1cm4gbWVzc2FnaW5nLmNyZWF0ZVBvcnQocG9ydElkLCBuYW1lKTsKICB9KTsKCiAgYXBpRnVuY3Rpb25zLnNldEhhbmRsZVJlcXVlc3QoJ3NlbmRSZXF1ZXN0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbih0YWJJZCwgcmVxdWVzdCwgcmVzcG9uc2VDYWxsYmFjaykgewogICAgaWYgKHNlbmRSZXF1ZXN0SXNEaXNhYmxlZCkKICAgICAgdGhyb3cgbmV3IEVycm9yKHNlbmRSZXF1ZXN0SXNEaXNhYmxlZCk7CiAgICB2YXIgcG9ydCA9IHRhYnMuY29ubmVjdCh0YWJJZCwge25hbWU6IG1lc3NhZ2luZy5rUmVxdWVzdENoYW5uZWx9KTsKICAgIG1lc3NhZ2luZy5zZW5kTWVzc2FnZUltcGwocG9ydCwgcmVxdWVzdCwgcmVzcG9uc2VDYWxsYmFjayk7CiAgfSk7CgogIGFwaUZ1bmN0aW9ucy5zZXRIYW5kbGVSZXF1ZXN0KCdzZW5kTWVzc2FnZScsCiAgICAgIGZ1bmN0aW9uKHRhYklkLCBtZXNzYWdlLCBvcHRpb25zLCByZXNwb25zZUNhbGxiYWNrKSB7CiAgICB2YXIgY29ubmVjdEluZm8gPSB7CiAgICAgIG5hbWU6IG1lc3NhZ2luZy5rTWVzc2FnZUNoYW5uZWwKICAgIH07CiAgICBpZiAob3B0aW9ucykgewogICAgICBmb3JFYWNoKG9wdGlvbnMsIGZ1bmN0aW9uKGssIHYpIHsKICAgICAgICBjb25uZWN0SW5mb1trXSA9IHY7CiAgICAgIH0pOwogICAgfQoKICAgIHZhciBwb3J0ID0gdGFicy5jb25uZWN0KHRhYklkLCBjb25uZWN0SW5mbyk7CiAgICBtZXNzYWdpbmcuc2VuZE1lc3NhZ2VJbXBsKHBvcnQsIG1lc3NhZ2UsIHJlc3BvbnNlQ2FsbGJhY2spOwogIH0pOwp9KTsKCmlmICghYXBpQnJpZGdlKQogIGV4cG9ydHMuJHNldCgnYmluZGluZycsIGJpbmRpbmcuZ2VuZXJhdGUoKSk7Ci8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQovLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gQ3VzdG9tIGJpbmRpbmcgZm9yIHRoZSB0dHMgQVBJLgoKdmFyIGJpbmRpbmcgPSBhcGlCcmlkZ2UgfHwgcmVxdWlyZSgnYmluZGluZycpLkJpbmRpbmcuY3JlYXRlKCd0dHMnKTsKCnZhciBpZEdlbmVyYXRvciA9IHJlcXVpcmVOYXRpdmUoJ2lkX2dlbmVyYXRvcicpOwp2YXIgc2VuZFJlcXVlc3QgPSBiaW5kaW5nVXRpbCA/CiAgICAkRnVuY3Rpb24uYmluZChiaW5kaW5nVXRpbC5zZW5kUmVxdWVzdCwgYmluZGluZ1V0aWwpIDoKICAgIHJlcXVpcmUoJ3NlbmRSZXF1ZXN0Jykuc2VuZFJlcXVlc3Q7CnZhciBsYXp5QkcgPSByZXF1aXJlTmF0aXZlKCdsYXp5X2JhY2tncm91bmRfcGFnZScpOwoKYmluZGluZy5yZWdpc3RlckN1c3RvbUhvb2soZnVuY3Rpb24oYXBpKSB7CiAgdmFyIGFwaUZ1bmN0aW9ucyA9IGFwaS5hcGlGdW5jdGlvbnM7CiAgdmFyIHR0cyA9IGFwaS5jb21waWxlZEFwaTsKICB2YXIgaGFuZGxlcnMgPSB7fTsKCiAgZnVuY3Rpb24gdHRzRXZlbnRMaXN0ZW5lcihldmVudCkgewogICAgdmFyIGV2ZW50SGFuZGxlciA9IGhhbmRsZXJzW2V2ZW50LnNyY0lkXTsKICAgIGlmIChldmVudEhhbmRsZXIpIHsKICAgICAgZXZlbnRIYW5kbGVyKHsKICAgICAgICAgICAgICAgICAgICAgdHlwZTogZXZlbnQudHlwZSwKICAgICAgICAgICAgICAgICAgICAgY2hhckluZGV4OiBldmVudC5jaGFySW5kZXgsCiAgICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZTogZXZlbnQuZXJyb3JNZXNzYWdlCiAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgaWYgKGV2ZW50LmlzRmluYWxFdmVudCkgewogICAgICAgIGRlbGV0ZSBoYW5kbGVyc1tldmVudC5zcmNJZF07CiAgICAgICAgLy8gQmFsYW5jZWQgaW4gJ3NwZWFrJyBoYW5kbGVyLgogICAgICAgIGxhenlCRy5EZWNyZW1lbnRLZWVwYWxpdmVDb3VudCgpOwogICAgICB9CiAgICB9CiAgfQoKICAvLyBUaGlzIGZpbGUgd2lsbCBnZXQgcnVuIGlmIGFuIGV4dGVuc2lvbiBuZWVkcyB0aGUgdHRzRW5naW5lIHBlcm1pc3Npb24sIGJ1dAogIC8vIGl0IGRvZXNuJ3QgbmVjZXNzYXJpbHkgaGF2ZSB0aGUgdHRzIHBlcm1pc3Npb24uIElmIGl0IGRvZXNuJ3QsIHRyeWluZyB0bwogIC8vIGFkZCBhIGxpc3RlbmVyIHRvIGNocm9tZS50dHMub25FdmVudCB3aWxsIGZhaWwuCiAgLy8gU2VlIGh0dHA6Ly9jcmJ1Zy5jb20vMTIyNDc0LgogIHRyeSB7CiAgICB0dHMub25FdmVudC5hZGRMaXN0ZW5lcih0dHNFdmVudExpc3RlbmVyKTsKICB9IGNhdGNoIChlKSB7fQoKICBhcGlGdW5jdGlvbnMuc2V0SGFuZGxlUmVxdWVzdCgnc3BlYWsnLCBmdW5jdGlvbigpIHsKICAgIHZhciBhcmdzID0gJEFycmF5LmZyb20oYXJndW1lbnRzKTsKICAgIGlmIChhcmdzLmxlbmd0aCA+IDEgJiYgYXJnc1sxXSAmJiBhcmdzWzFdLm9uRXZlbnQpIHsKICAgICAgdmFyIGlkID0gaWRHZW5lcmF0b3IuR2V0TmV4dElkKCk7CiAgICAgIGFyZ3NbMV0uc3JjSWQgPSBpZDsKICAgICAgaGFuZGxlcnNbaWRdID0gYXJnc1sxXS5vbkV2ZW50OwogICAgICAvLyBLZWVwIHRoZSBwYWdlIGFsaXZlIHVudGlsIHRoZSBldmVudCBmaW5pc2hlcy4KICAgICAgLy8gQmFsYW5jZWQgaW4gZXZlbnRIYW5kbGVyLgogICAgICBsYXp5QkcuSW5jcmVtZW50S2VlcGFsaXZlQ291bnQoKTsKICAgIH0KICAgIHNlbmRSZXF1ZXN0KCd0dHMuc3BlYWsnLCBhcmdzLAogICAgICAgICAgICAgICAgYmluZGluZ1V0aWwgPyB1bmRlZmluZWQgOiB0aGlzLmRlZmluaXRpb24ucGFyYW1ldGVycywKICAgICAgICAgICAgICAgIHVuZGVmaW5lZCk7CiAgICByZXR1cm4gaWQ7CiAgfSk7Cn0pOwoKaWYgKCFhcGlCcmlkZ2UpCiAgZXhwb3J0cy4kc2V0KCdiaW5kaW5nJywgYmluZGluZy5nZW5lcmF0ZSgpKTsKLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgovLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLyBDdXN0b20gYmluZGluZyBmb3IgdGhlIHR0c0VuZ2luZSBBUEkuCgp2YXIgYmluZGluZyA9IGFwaUJyaWRnZSB8fCByZXF1aXJlKCdiaW5kaW5nJykuQmluZGluZy5jcmVhdGUoJ3R0c0VuZ2luZScpOwp2YXIgcmVnaXN0ZXJBcmd1bWVudE1hc3NhZ2VyID0gYmluZGluZ1V0aWwgPwogICAgJEZ1bmN0aW9uLmJpbmQoYmluZGluZ1V0aWwucmVnaXN0ZXJFdmVudEFyZ3VtZW50TWFzc2FnZXIsIGJpbmRpbmdVdGlsKSA6CiAgICByZXF1aXJlKCdldmVudF9iaW5kaW5ncycpLnJlZ2lzdGVyQXJndW1lbnRNYXNzYWdlcjsKCnJlZ2lzdGVyQXJndW1lbnRNYXNzYWdlcigndHRzRW5naW5lLm9uU3BlYWsnLCBmdW5jdGlvbihhcmdzLCBkaXNwYXRjaCkgewogIHZhciB0ZXh0ID0gYXJnc1swXTsKICB2YXIgb3B0aW9ucyA9IGFyZ3NbMV07CiAgdmFyIHJlcXVlc3RJZCA9IGFyZ3NbMl07CiAgdmFyIHNlbmRUdHNFdmVudCA9IGZ1bmN0aW9uKGV2ZW50KSB7CiAgICBjaHJvbWUudHRzRW5naW5lLnNlbmRUdHNFdmVudChyZXF1ZXN0SWQsIGV2ZW50KTsKICB9OwogIGRpc3BhdGNoKFt0ZXh0LCBvcHRpb25zLCBzZW5kVHRzRXZlbnRdKTsKfSk7CgppZiAoIWFwaUJyaWRnZSkKICBleHBvcnRzLiRzZXQoJ2JpbmRpbmcnLCBiaW5kaW5nLmdlbmVyYXRlKCkpOwovLyBDb3B5cmlnaHQgMjAxNSBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQovLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gQ3VzdG9tIGJpbmRpbmcgZm9yIHRoZSB3ZWJydGNEZXNrdG9wQ2FwdHVyZVByaXZhdGUgQVBJLgoKdmFyIGJpbmRpbmcgPSBhcGlCcmlkZ2UgfHwKICAgICAgICAgICAgICByZXF1aXJlKCdiaW5kaW5nJykuQmluZGluZy5jcmVhdGUoJ3dlYnJ0Y0Rlc2t0b3BDYXB0dXJlUHJpdmF0ZScpOwp2YXIgc2VuZFJlcXVlc3QgPSBiaW5kaW5nVXRpbCA/CiAgICAkRnVuY3Rpb24uYmluZChiaW5kaW5nVXRpbC5zZW5kUmVxdWVzdCwgYmluZGluZ1V0aWwpIDoKICAgIHJlcXVpcmUoJ3NlbmRSZXF1ZXN0Jykuc2VuZFJlcXVlc3Q7CnZhciBpZEdlbmVyYXRvciA9IHJlcXVpcmVOYXRpdmUoJ2lkX2dlbmVyYXRvcicpOwoKYmluZGluZy5yZWdpc3RlckN1c3RvbUhvb2soZnVuY3Rpb24oYmluZGluZ3NBUEkpIHsKICB2YXIgYXBpRnVuY3Rpb25zID0gYmluZGluZ3NBUEkuYXBpRnVuY3Rpb25zOwoKICB2YXIgcGVuZGluZ1JlcXVlc3RzID0ge307CgogIGZ1bmN0aW9uIG9uUmVxdWVzdFJlc3VsdChpZCwgcmVzdWx0KSB7CiAgICBpZiAoaWQgaW4gcGVuZGluZ1JlcXVlc3RzKSB7CiAgICAgIHZhciBjYWxsYmFjayA9IHBlbmRpbmdSZXF1ZXN0c1tpZF07CiAgICAgIGRlbGV0ZSBwZW5kaW5nUmVxdWVzdHNbaWRdOwogICAgICBjYWxsYmFjayhyZXN1bHQpOwogICAgfQogIH0KCiAgYXBpRnVuY3Rpb25zLnNldEhhbmRsZVJlcXVlc3QoJ2Nob29zZURlc2t0b3BNZWRpYScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oc291cmNlcywgcmVxdWVzdCwgY2FsbGJhY2spIHsKICAgIHZhciBpZCA9IGlkR2VuZXJhdG9yLkdldE5leHRJZCgpOwogICAgcGVuZGluZ1JlcXVlc3RzW2lkXSA9IGNhbGxiYWNrOwogICAgc2VuZFJlcXVlc3QoJ3dlYnJ0Y0Rlc2t0b3BDYXB0dXJlUHJpdmF0ZS5jaG9vc2VEZXNrdG9wTWVkaWEnLAogICAgICAgICAgICAgICAgW2lkLCBzb3VyY2VzLCByZXF1ZXN0LAogICAgICAgICAgICAgICAgICRGdW5jdGlvbi5iaW5kKG9uUmVxdWVzdFJlc3VsdCwgbnVsbCwgaWQpXSwKICAgICAgICAgICAgICAgIGJpbmRpbmdVdGlsID8gdW5kZWZpbmVkIDogdGhpcy5kZWZpbml0aW9uLnBhcmFtZXRlcnMsCiAgICAgICAgICAgICAgICB1bmRlZmluZWQpOwogICAgcmV0dXJuIGlkOwogIH0pOwoKICBhcGlGdW5jdGlvbnMuc2V0SGFuZGxlUmVxdWVzdCgnY2FuY2VsQ2hvb3NlRGVza3RvcE1lZGlhJywgZnVuY3Rpb24oaWQpIHsKICAgIGlmIChpZCBpbiBwZW5kaW5nUmVxdWVzdHMpIHsKICAgICAgZGVsZXRlIHBlbmRpbmdSZXF1ZXN0c1tpZF07CiAgICAgIHNlbmRSZXF1ZXN0KCd3ZWJydGNEZXNrdG9wQ2FwdHVyZVByaXZhdGUuY2FuY2VsQ2hvb3NlRGVza3RvcE1lZGlhJywgW2lkXSwKICAgICAgICAgICAgICAgICAgYmluZGluZ1V0aWwgPyB1bmRlZmluZWQgOiB0aGlzLmRlZmluaXRpb24ucGFyYW1ldGVycywKICAgICAgICAgICAgICAgICAgdW5kZWZpbmVkKTsKICAgIH0KICB9KTsKfSk7CgppZiAoIWFwaUJyaWRnZSkKICBleHBvcnRzLiRzZXQoJ2JpbmRpbmcnLCBiaW5kaW5nLmdlbmVyYXRlKCkpOwovLyBDb3B5cmlnaHQgMjAxNyBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQovLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gQ3VzdG9tIGJpbmRpbmcgZm9yIHRoZSB3ZWJydGNMb2dnaW5nUHJpdmF0ZSBBUEkuCgp2YXIgYmluZGluZyA9IGFwaUJyaWRnZSB8fAogICAgICAgICAgICAgIHJlcXVpcmUoJ2JpbmRpbmcnKS5CaW5kaW5nLmNyZWF0ZSgnd2VicnRjTG9nZ2luZ1ByaXZhdGUnKTsKCnZhciBnZXRCaW5kRGlyZWN0b3J5RW50cnlDYWxsYmFjayA9CiAgICByZXF1aXJlKCdmaWxlRW50cnlCaW5kaW5nVXRpbCcpLmdldEJpbmREaXJlY3RvcnlFbnRyeUNhbGxiYWNrOwoKYmluZGluZy5yZWdpc3RlckN1c3RvbUhvb2soZnVuY3Rpb24oYmluZGluZywgaWQsIGNvbnRleHRUeXBlKSB7CiAgdmFyIGFwaUZ1bmN0aW9ucyA9IGJpbmRpbmcuYXBpRnVuY3Rpb25zOwogIGFwaUZ1bmN0aW9ucy5zZXRDdXN0b21DYWxsYmFjaygnZ2V0TG9nc0RpcmVjdG9yeScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEJpbmREaXJlY3RvcnlFbnRyeUNhbGxiYWNrKCkpOwp9KTsKCmlmICghYXBpQnJpZGdlKQogIGV4cG9ydHMuJHNldCgnYmluZGluZycsIGJpbmRpbmcuZ2VuZXJhdGUoKSk7Ci8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQovLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gQ3VzdG9tIGJpbmRpbmcgZm9yIHRoZSB3ZWJzdG9yZSBBUEkuCgp2YXIgd2Vic3RvcmVOYXRpdmVzID0gcmVxdWlyZU5hdGl2ZSgnd2Vic3RvcmUnKTsKCnZhciBvbkluc3RhbGxTdGFnZUNoYW5nZWQ7CnZhciBvbkRvd25sb2FkUHJvZ3Jlc3M7CgpmdW5jdGlvbiBJbnN0YWxsZXIoKSB7CiAgdGhpcy5fcGVuZGluZ0luc3RhbGwgPSBudWxsOwp9CgpJbnN0YWxsZXIucHJvdG90eXBlLmluc3RhbGwgPSBmdW5jdGlvbih1cmwsIG9uU3VjY2Vzcywgb25GYWlsdXJlKSB7CiAgaWYgKHRoaXMuX3BlbmRpbmdJbnN0YWxsKQogICAgdGhyb3cgbmV3IEVycm9yKCdBIENocm9tZSBXZWIgU3RvcmUgaW5zdGFsbGF0aW9uIGlzIGFscmVhZHkgcGVuZGluZy4nKTsKCiAgLy8gV2l0aCBuYXRpdmUgYmluZGluZ3MsIHRoZXNlIGNhbGxzIGdvIHRocm91Z2ggYXJndW1lbnQgdmFsaWRhdGlvbiwgd2hpY2gKICAvLyBzZXRzIG9wdGlvbmFsL21pc3NpbmcgYXJndW1lbnRzIHRvIG51bGwuIFRoZSBuYXRpdmUgd2Vic3RvcmUgYmluZGluZ3MKICAvLyBleHBlY3QgZWl0aGVyIHByZXNlbnQgb3IgdW5kZWZpbmVkLCBzbyB0cmFuc2Zvcm0gbnVsbCB0byB1bmRlZmluZWQuCiAgaWYgKHVybCA9PT0gbnVsbCkKICAgIHVybCA9IHVuZGVmaW5lZDsKICBpZiAob25TdWNjZXNzID09PSBudWxsKQogICAgb25TdWNjZXNzID0gdW5kZWZpbmVkOwogIGlmIChvbkZhaWx1cmUgPT09IG51bGwpCiAgICBvbkZhaWx1cmUgPSB1bmRlZmluZWQ7CgogIGlmICh1cmwgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgdXJsICE9PSAnc3RyaW5nJykgewogICAgdGhyb3cgbmV3IEVycm9yKAogICAgICAgICdUaGUgQ2hyb21lIFdlYiBTdG9yZSBpdGVtIGxpbmsgVVJMIHBhcmFtZXRlciBtdXN0IGJlIGEgc3RyaW5nLicpOwogIH0KICBpZiAob25TdWNjZXNzICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIG9uU3VjY2VzcyAhPT0gJ2Z1bmN0aW9uJykgewogICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgc3VjY2VzcyBjYWxsYmFjayBwYXJhbWV0ZXIgbXVzdCBiZSBhIGZ1bmN0aW9uLicpOwogIH0KICBpZiAob25GYWlsdXJlICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIG9uRmFpbHVyZSAhPT0gJ2Z1bmN0aW9uJykgewogICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgZmFpbHVyZSBjYWxsYmFjayBwYXJhbWV0ZXIgbXVzdCBiZSBhIGZ1bmN0aW9uLicpOwogIH0KCiAgLy8gU2luY2Ugd2UgY2FsbCBJbnN0YWxsKCkgd2l0aCBhIGJvb2wgZm9yIGlmIHdlIGhhdmUgbGlzdGVuZXJzLCBsaXN0ZW5lcnMKICAvLyBtdXN0IGJlIHNldCBwcmlvciB0byB0aGUgaW5saW5lIGluc3RhbGxhdGlvbiBzdGFydGluZyAodGhpcyBpcyBhbHNvCiAgLy8gbm90ZWQgaW4gdGhlIEV2ZW50IGRvY3VtZW50YXRpb24gaW4KICAvLyBjaHJvbWUvY29tbW9uL2V4dGVuc2lvbnMvYXBpL3dlYnN0b3JlLmpzb24pLgogIHZhciBpbnN0YWxsSWQgPSB3ZWJzdG9yZU5hdGl2ZXMuSW5zdGFsbCgKICAgICAgb25JbnN0YWxsU3RhZ2VDaGFuZ2VkLmhhc0xpc3RlbmVycygpLAogICAgICBvbkRvd25sb2FkUHJvZ3Jlc3MuaGFzTGlzdGVuZXJzKCksCiAgICAgIHVybCwKICAgICAgb25TdWNjZXNzLAogICAgICBvbkZhaWx1cmUpOwogIGlmIChpbnN0YWxsSWQgIT09IHVuZGVmaW5lZCkgewogICAgdGhpcy5fcGVuZGluZ0luc3RhbGwgPSB7CiAgICAgIGluc3RhbGxJZDogaW5zdGFsbElkLAogICAgICBvblN1Y2Nlc3M6IG9uU3VjY2VzcywKICAgICAgb25GYWlsdXJlOiBvbkZhaWx1cmUKICAgIH07CiAgfQp9OwoKSW5zdGFsbGVyLnByb3RvdHlwZS5vbkluc3RhbGxSZXNwb25zZSA9CiAgICBmdW5jdGlvbihpbnN0YWxsSWQsIHN1Y2Nlc3MsIGVycm9yLCByZXN1bHRDb2RlKSB7CiAgdmFyIHBlbmRpbmdJbnN0YWxsID0gdGhpcy5fcGVuZGluZ0luc3RhbGw7CiAgaWYgKCFwZW5kaW5nSW5zdGFsbCB8fCBwZW5kaW5nSW5zdGFsbC5pbnN0YWxsSWQgIT0gaW5zdGFsbElkKSB7CiAgICAvLyBUT0RPKGthbG1hbik6IHNob3VsZCB0aGlzIGJlIGFuIGVycm9yPwogICAgcmV0dXJuOwogIH0KCiAgdHJ5IHsKICAgIGlmIChzdWNjZXNzICYmIHBlbmRpbmdJbnN0YWxsLm9uU3VjY2VzcykKICAgICAgcGVuZGluZ0luc3RhbGwub25TdWNjZXNzKCk7CiAgICBlbHNlIGlmICghc3VjY2VzcyAmJiBwZW5kaW5nSW5zdGFsbC5vbkZhaWx1cmUpCiAgICAgIHBlbmRpbmdJbnN0YWxsLm9uRmFpbHVyZShlcnJvciwgcmVzdWx0Q29kZSk7CiAgfSBjYXRjaCAoZSkgewogICAgY29uc29sZS5lcnJvcignRXhjZXB0aW9uIGluIGNocm9tZS53ZWJzdG9yZS5pbnN0YWxsIHJlc3BvbnNlIGhhbmRsZXI6ICcgKwogICAgICAgICAgICAgICAgICBlLnN0YWNrKTsKICB9IGZpbmFsbHkgewogICAgdGhpcy5fcGVuZGluZ0luc3RhbGwgPSBudWxsOwogIH0KfTsKCkluc3RhbGxlci5wcm90b3R5cGUub25JbnN0YWxsU3RhZ2VDaGFuZ2VkID0gZnVuY3Rpb24oaW5zdGFsbFN0YWdlKSB7CiAgb25JbnN0YWxsU3RhZ2VDaGFuZ2VkLmRpc3BhdGNoKGluc3RhbGxTdGFnZSk7Cn07CgpJbnN0YWxsZXIucHJvdG90eXBlLm9uRG93bmxvYWRQcm9ncmVzcyA9IGZ1bmN0aW9uKHByb2dyZXNzKSB7CiAgb25Eb3dubG9hZFByb2dyZXNzLmRpc3BhdGNoKHByb2dyZXNzKTsKfTsKCnZhciBpbnN0YWxsZXIgPSBuZXcgSW5zdGFsbGVyKCk7CgoKaWYgKGFwaUJyaWRnZSkgewogIGFwaUJyaWRnZS5yZWdpc3RlckN1c3RvbUhvb2soZnVuY3Rpb24oYXBpKSB7CiAgICBhcGkuYXBpRnVuY3Rpb25zLnNldEhhbmRsZVJlcXVlc3QoJ2luc3RhbGwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKHVybCwgb25TdWNjZXNzLCBvbkZhaWx1cmUpIHsKICAgICAgaW5zdGFsbGVyLmluc3RhbGwodXJsLCBvblN1Y2Nlc3MsIG9uRmFpbHVyZSk7CiAgICB9KTsKCiAgICBvbkluc3RhbGxTdGFnZUNoYW5nZWQgPSBhcGkuY29tcGlsZWRBcGkub25JbnN0YWxsU3RhZ2VDaGFuZ2VkOwogICAgb25Eb3dubG9hZFByb2dyZXNzID0gYXBpLmNvbXBpbGVkQXBpLm9uRG93bmxvYWRQcm9ncmVzczsKICB9KTsKfSBlbHNlIHsKICB2YXIgRXZlbnQgPSByZXF1aXJlKCdldmVudF9iaW5kaW5ncycpLkV2ZW50OwogIG9uSW5zdGFsbFN0YWdlQ2hhbmdlZCA9CiAgICAgIG5ldyBFdmVudChudWxsLCBbe25hbWU6ICdzdGFnZScsIHR5cGU6ICdzdHJpbmcnfV0sIHt1bm1hbmFnZWQ6IHRydWV9KTsKICBvbkRvd25sb2FkUHJvZ3Jlc3MgPQogICAgICBuZXcgRXZlbnQobnVsbCwgW3tuYW1lOiAncHJvZ3Jlc3MnLCB0eXBlOiAnbnVtYmVyJ31dLCB7dW5tYW5hZ2VkOiB0cnVlfSk7CgogIHZhciBjaHJvbWVXZWJzdG9yZSA9IHsKICAgIGluc3RhbGw6IGZ1bmN0aW9uICh1cmwsIG9uU3VjY2Vzcywgb25GYWlsdXJlKSB7CiAgICAgIGluc3RhbGxlci5pbnN0YWxsKHVybCwgb25TdWNjZXNzLCBvbkZhaWx1cmUpOwogICAgfSwKICAgIG9uSW5zdGFsbFN0YWdlQ2hhbmdlZDogb25JbnN0YWxsU3RhZ2VDaGFuZ2VkLAogICAgb25Eb3dubG9hZFByb2dyZXNzOiBvbkRvd25sb2FkUHJvZ3Jlc3MsCiAgfTsKICBleHBvcnRzLiRzZXQoJ2JpbmRpbmcnLCBjaHJvbWVXZWJzdG9yZSk7Cn0KCi8vIENhbGxlZCBieSB3ZWJzdG9yZV9iaW5kaW5ncy5jYy4KZXhwb3J0cy4kc2V0KCdvbkluc3RhbGxSZXNwb25zZScsCiAgICAgICAgICAgICAkRnVuY3Rpb24uYmluZChJbnN0YWxsZXIucHJvdG90eXBlLm9uSW5zdGFsbFJlc3BvbnNlLCBpbnN0YWxsZXIpKTsKZXhwb3J0cy4kc2V0KCdvbkluc3RhbGxTdGFnZUNoYW5nZWQnLAogICAgICAgICAgICAgJEZ1bmN0aW9uLmJpbmQoSW5zdGFsbGVyLnByb3RvdHlwZS5vbkluc3RhbGxTdGFnZUNoYW5nZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YWxsZXIpKTsKZXhwb3J0cy4kc2V0KCdvbkRvd25sb2FkUHJvZ3Jlc3MnLAogICAgICAgICAgICAgJEZ1bmN0aW9uLmJpbmQoSW5zdGFsbGVyLnByb3RvdHlwZS5vbkRvd25sb2FkUHJvZ3Jlc3MsIGluc3RhbGxlcikpOwovLyBDb3B5cmlnaHQgMjAxNCBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQovLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKJ3VzZSBzdHJpY3QnOwoKKGZ1bmN0aW9uKCkgewogIHZhciBtb2pvbUlkID0gJ2Nocm9tZS9jb21tb24vbWVkaWFfcm91dGVyL21vam8vbWVkaWFfY29udHJvbGxlci5tb2pvbSc7CiAgaWYgKG1vam8uaW50ZXJuYWwuaXNNb2pvbUxvYWRlZChtb2pvbUlkKSkgewogICAgY29uc29sZS53YXJuKCdUaGUgZm9sbG93aW5nIG1vam9tIGlzIGxvYWRlZCBtdWx0aXBsZSB0aW1lczogJyArIG1vam9tSWQpOwogICAgcmV0dXJuOwogIH0KICBtb2pvLmludGVybmFsLm1hcmtNb2pvbUxvYWRlZChtb2pvbUlkKTsKICB2YXIgYmluZGluZ3MgPSBtb2pvOwogIHZhciBhc3NvY2lhdGVkQmluZGluZ3MgPSBtb2pvOwogIHZhciBjb2RlYyA9IG1vam8uaW50ZXJuYWw7CiAgdmFyIHZhbGlkYXRvciA9IG1vam8uaW50ZXJuYWw7CgogIHZhciBleHBvcnRzID0gbW9qby5pbnRlcm5hbC5leHBvc2VOYW1lc3BhY2UoJ21lZGlhUm91dGVyLm1vam9tJyk7CiAgdmFyIG1lZGlhX3N0YXR1cyQgPQogICAgICBtb2pvLmludGVybmFsLmV4cG9zZU5hbWVzcGFjZSgnbWVkaWFSb3V0ZXIubW9qb20nKTsKICBpZiAobW9qby5jb25maWcuYXV0b0xvYWRNb2pvbURlcHMpIHsKICAgIG1vam8uaW50ZXJuYWwubG9hZE1vam9tSWZOZWNlc3NhcnkoCiAgICAgICAgJ2Nocm9tZS9jb21tb24vbWVkaWFfcm91dGVyL21vam8vbWVkaWFfc3RhdHVzLm1vam9tJywgJ21lZGlhX3N0YXR1cy5tb2pvbS5qcycpOwogIH0KICB2YXIgdGltZSQgPQogICAgICBtb2pvLmludGVybmFsLmV4cG9zZU5hbWVzcGFjZSgnbW9qby5jb21tb24ubW9qb20nKTsKICBpZiAobW9qby5jb25maWcuYXV0b0xvYWRNb2pvbURlcHMpIHsKICAgIG1vam8uaW50ZXJuYWwubG9hZE1vam9tSWZOZWNlc3NhcnkoCiAgICAgICAgJ21vam8vY29tbW9uL3RpbWUubW9qb20nLCAnLi4vLi4vLi4vLi4vbW9qby9jb21tb24vdGltZS5tb2pvbS5qcycpOwogIH0KCgoKICBmdW5jdGlvbiBNZWRpYUNvbnRyb2xsZXJfUGxheV9QYXJhbXModmFsdWVzKSB7CiAgICB0aGlzLmluaXREZWZhdWx0c18oKTsKICAgIHRoaXMuaW5pdEZpZWxkc18odmFsdWVzKTsKICB9CgoKICBNZWRpYUNvbnRyb2xsZXJfUGxheV9QYXJhbXMucHJvdG90eXBlLmluaXREZWZhdWx0c18gPSBmdW5jdGlvbigpIHsKICB9OwogIE1lZGlhQ29udHJvbGxlcl9QbGF5X1BhcmFtcy5wcm90b3R5cGUuaW5pdEZpZWxkc18gPSBmdW5jdGlvbihmaWVsZHMpIHsKICAgIGZvcih2YXIgZmllbGQgaW4gZmllbGRzKSB7CiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoZmllbGQpKQogICAgICAgICAgdGhpc1tmaWVsZF0gPSBmaWVsZHNbZmllbGRdOwogICAgfQogIH07CgogIE1lZGlhQ29udHJvbGxlcl9QbGF5X1BhcmFtcy52YWxpZGF0ZSA9IGZ1bmN0aW9uKG1lc3NhZ2VWYWxpZGF0b3IsIG9mZnNldCkgewogICAgdmFyIGVycjsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RIZWFkZXIob2Zmc2V0LCBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICB2YXIga1ZlcnNpb25TaXplcyA9IFsKICAgICAge3ZlcnNpb246IDAsIG51bUJ5dGVzOiA4fQogICAgXTsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RWZXJzaW9uKG9mZnNldCwga1ZlcnNpb25TaXplcyk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwogIH07CgogIE1lZGlhQ29udHJvbGxlcl9QbGF5X1BhcmFtcy5lbmNvZGVkU2l6ZSA9IGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMDsKCiAgTWVkaWFDb250cm9sbGVyX1BsYXlfUGFyYW1zLmRlY29kZSA9IGZ1bmN0aW9uKGRlY29kZXIpIHsKICAgIHZhciBwYWNrZWQ7CiAgICB2YXIgdmFsID0gbmV3IE1lZGlhQ29udHJvbGxlcl9QbGF5X1BhcmFtcygpOwogICAgdmFyIG51bWJlck9mQnl0ZXMgPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhciB2ZXJzaW9uID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICByZXR1cm4gdmFsOwogIH07CgogIE1lZGlhQ29udHJvbGxlcl9QbGF5X1BhcmFtcy5lbmNvZGUgPSBmdW5jdGlvbihlbmNvZGVyLCB2YWwpIHsKICAgIHZhciBwYWNrZWQ7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKE1lZGlhQ29udHJvbGxlcl9QbGF5X1BhcmFtcy5lbmNvZGVkU2l6ZSk7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKDApOwogIH07CiAgZnVuY3Rpb24gTWVkaWFDb250cm9sbGVyX1BhdXNlX1BhcmFtcyh2YWx1ZXMpIHsKICAgIHRoaXMuaW5pdERlZmF1bHRzXygpOwogICAgdGhpcy5pbml0RmllbGRzXyh2YWx1ZXMpOwogIH0KCgogIE1lZGlhQ29udHJvbGxlcl9QYXVzZV9QYXJhbXMucHJvdG90eXBlLmluaXREZWZhdWx0c18gPSBmdW5jdGlvbigpIHsKICB9OwogIE1lZGlhQ29udHJvbGxlcl9QYXVzZV9QYXJhbXMucHJvdG90eXBlLmluaXRGaWVsZHNfID0gZnVuY3Rpb24oZmllbGRzKSB7CiAgICBmb3IodmFyIGZpZWxkIGluIGZpZWxkcykgewogICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGZpZWxkKSkKICAgICAgICAgIHRoaXNbZmllbGRdID0gZmllbGRzW2ZpZWxkXTsKICAgIH0KICB9OwoKICBNZWRpYUNvbnRyb2xsZXJfUGF1c2VfUGFyYW1zLnZhbGlkYXRlID0gZnVuY3Rpb24obWVzc2FnZVZhbGlkYXRvciwgb2Zmc2V0KSB7CiAgICB2YXIgZXJyOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdEhlYWRlcihvZmZzZXQsIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHZhciBrVmVyc2lvblNpemVzID0gWwogICAgICB7dmVyc2lvbjogMCwgbnVtQnl0ZXM6IDh9CiAgICBdOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFZlcnNpb24ob2Zmc2V0LCBrVmVyc2lvblNpemVzKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CiAgfTsKCiAgTWVkaWFDb250cm9sbGVyX1BhdXNlX1BhcmFtcy5lbmNvZGVkU2l6ZSA9IGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMDsKCiAgTWVkaWFDb250cm9sbGVyX1BhdXNlX1BhcmFtcy5kZWNvZGUgPSBmdW5jdGlvbihkZWNvZGVyKSB7CiAgICB2YXIgcGFja2VkOwogICAgdmFyIHZhbCA9IG5ldyBNZWRpYUNvbnRyb2xsZXJfUGF1c2VfUGFyYW1zKCk7CiAgICB2YXIgbnVtYmVyT2ZCeXRlcyA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFyIHZlcnNpb24gPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHJldHVybiB2YWw7CiAgfTsKCiAgTWVkaWFDb250cm9sbGVyX1BhdXNlX1BhcmFtcy5lbmNvZGUgPSBmdW5jdGlvbihlbmNvZGVyLCB2YWwpIHsKICAgIHZhciBwYWNrZWQ7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKE1lZGlhQ29udHJvbGxlcl9QYXVzZV9QYXJhbXMuZW5jb2RlZFNpemUpOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMigwKTsKICB9OwogIGZ1bmN0aW9uIE1lZGlhQ29udHJvbGxlcl9TZXRNdXRlX1BhcmFtcyh2YWx1ZXMpIHsKICAgIHRoaXMuaW5pdERlZmF1bHRzXygpOwogICAgdGhpcy5pbml0RmllbGRzXyh2YWx1ZXMpOwogIH0KCgogIE1lZGlhQ29udHJvbGxlcl9TZXRNdXRlX1BhcmFtcy5wcm90b3R5cGUuaW5pdERlZmF1bHRzXyA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy5tdXRlID0gZmFsc2U7CiAgfTsKICBNZWRpYUNvbnRyb2xsZXJfU2V0TXV0ZV9QYXJhbXMucHJvdG90eXBlLmluaXRGaWVsZHNfID0gZnVuY3Rpb24oZmllbGRzKSB7CiAgICBmb3IodmFyIGZpZWxkIGluIGZpZWxkcykgewogICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGZpZWxkKSkKICAgICAgICAgIHRoaXNbZmllbGRdID0gZmllbGRzW2ZpZWxkXTsKICAgIH0KICB9OwoKICBNZWRpYUNvbnRyb2xsZXJfU2V0TXV0ZV9QYXJhbXMudmFsaWRhdGUgPSBmdW5jdGlvbihtZXNzYWdlVmFsaWRhdG9yLCBvZmZzZXQpIHsKICAgIHZhciBlcnI7CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0SGVhZGVyKG9mZnNldCwgY29kZWMua1N0cnVjdEhlYWRlclNpemUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgdmFyIGtWZXJzaW9uU2l6ZXMgPSBbCiAgICAgIHt2ZXJzaW9uOiAwLCBudW1CeXRlczogMTZ9CiAgICBdOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFZlcnNpb24ob2Zmc2V0LCBrVmVyc2lvblNpemVzKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwogIH07CgogIE1lZGlhQ29udHJvbGxlcl9TZXRNdXRlX1BhcmFtcy5lbmNvZGVkU2l6ZSA9IGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgODsKCiAgTWVkaWFDb250cm9sbGVyX1NldE11dGVfUGFyYW1zLmRlY29kZSA9IGZ1bmN0aW9uKGRlY29kZXIpIHsKICAgIHZhciBwYWNrZWQ7CiAgICB2YXIgdmFsID0gbmV3IE1lZGlhQ29udHJvbGxlcl9TZXRNdXRlX1BhcmFtcygpOwogICAgdmFyIG51bWJlck9mQnl0ZXMgPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhciB2ZXJzaW9uID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICBwYWNrZWQgPSBkZWNvZGVyLnJlYWRVaW50OCgpOwogICAgdmFsLm11dGUgPSAocGFja2VkID4+IDApICYgMSA/IHRydWUgOiBmYWxzZTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIHJldHVybiB2YWw7CiAgfTsKCiAgTWVkaWFDb250cm9sbGVyX1NldE11dGVfUGFyYW1zLmVuY29kZSA9IGZ1bmN0aW9uKGVuY29kZXIsIHZhbCkgewogICAgdmFyIHBhY2tlZDsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoTWVkaWFDb250cm9sbGVyX1NldE11dGVfUGFyYW1zLmVuY29kZWRTaXplKTsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoMCk7CiAgICBwYWNrZWQgPSAwOwogICAgcGFja2VkIHw9ICh2YWwubXV0ZSAmIDEpIDw8IDAKICAgIGVuY29kZXIud3JpdGVVaW50OChwYWNrZWQpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogIH07CiAgZnVuY3Rpb24gTWVkaWFDb250cm9sbGVyX1NldFZvbHVtZV9QYXJhbXModmFsdWVzKSB7CiAgICB0aGlzLmluaXREZWZhdWx0c18oKTsKICAgIHRoaXMuaW5pdEZpZWxkc18odmFsdWVzKTsKICB9CgoKICBNZWRpYUNvbnRyb2xsZXJfU2V0Vm9sdW1lX1BhcmFtcy5wcm90b3R5cGUuaW5pdERlZmF1bHRzXyA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy52b2x1bWUgPSAwOwogIH07CiAgTWVkaWFDb250cm9sbGVyX1NldFZvbHVtZV9QYXJhbXMucHJvdG90eXBlLmluaXRGaWVsZHNfID0gZnVuY3Rpb24oZmllbGRzKSB7CiAgICBmb3IodmFyIGZpZWxkIGluIGZpZWxkcykgewogICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGZpZWxkKSkKICAgICAgICAgIHRoaXNbZmllbGRdID0gZmllbGRzW2ZpZWxkXTsKICAgIH0KICB9OwoKICBNZWRpYUNvbnRyb2xsZXJfU2V0Vm9sdW1lX1BhcmFtcy52YWxpZGF0ZSA9IGZ1bmN0aW9uKG1lc3NhZ2VWYWxpZGF0b3IsIG9mZnNldCkgewogICAgdmFyIGVycjsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RIZWFkZXIob2Zmc2V0LCBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICB2YXIga1ZlcnNpb25TaXplcyA9IFsKICAgICAge3ZlcnNpb246IDAsIG51bUJ5dGVzOiAxNn0KICAgIF07CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0VmVyc2lvbihvZmZzZXQsIGtWZXJzaW9uU2l6ZXMpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CiAgfTsKCiAgTWVkaWFDb250cm9sbGVyX1NldFZvbHVtZV9QYXJhbXMuZW5jb2RlZFNpemUgPSBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDg7CgogIE1lZGlhQ29udHJvbGxlcl9TZXRWb2x1bWVfUGFyYW1zLmRlY29kZSA9IGZ1bmN0aW9uKGRlY29kZXIpIHsKICAgIHZhciBwYWNrZWQ7CiAgICB2YXIgdmFsID0gbmV3IE1lZGlhQ29udHJvbGxlcl9TZXRWb2x1bWVfUGFyYW1zKCk7CiAgICB2YXIgbnVtYmVyT2ZCeXRlcyA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFyIHZlcnNpb24gPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhbC52b2x1bWUgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5GbG9hdCk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICByZXR1cm4gdmFsOwogIH07CgogIE1lZGlhQ29udHJvbGxlcl9TZXRWb2x1bWVfUGFyYW1zLmVuY29kZSA9IGZ1bmN0aW9uKGVuY29kZXIsIHZhbCkgewogICAgdmFyIHBhY2tlZDsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoTWVkaWFDb250cm9sbGVyX1NldFZvbHVtZV9QYXJhbXMuZW5jb2RlZFNpemUpOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMigwKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLkZsb2F0LCB2YWwudm9sdW1lKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICB9OwogIGZ1bmN0aW9uIE1lZGlhQ29udHJvbGxlcl9TZWVrX1BhcmFtcyh2YWx1ZXMpIHsKICAgIHRoaXMuaW5pdERlZmF1bHRzXygpOwogICAgdGhpcy5pbml0RmllbGRzXyh2YWx1ZXMpOwogIH0KCgogIE1lZGlhQ29udHJvbGxlcl9TZWVrX1BhcmFtcy5wcm90b3R5cGUuaW5pdERlZmF1bHRzXyA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy50aW1lID0gbnVsbDsKICB9OwogIE1lZGlhQ29udHJvbGxlcl9TZWVrX1BhcmFtcy5wcm90b3R5cGUuaW5pdEZpZWxkc18gPSBmdW5jdGlvbihmaWVsZHMpIHsKICAgIGZvcih2YXIgZmllbGQgaW4gZmllbGRzKSB7CiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoZmllbGQpKQogICAgICAgICAgdGhpc1tmaWVsZF0gPSBmaWVsZHNbZmllbGRdOwogICAgfQogIH07CgogIE1lZGlhQ29udHJvbGxlcl9TZWVrX1BhcmFtcy52YWxpZGF0ZSA9IGZ1bmN0aW9uKG1lc3NhZ2VWYWxpZGF0b3IsIG9mZnNldCkgewogICAgdmFyIGVycjsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RIZWFkZXIob2Zmc2V0LCBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICB2YXIga1ZlcnNpb25TaXplcyA9IFsKICAgICAge3ZlcnNpb246IDAsIG51bUJ5dGVzOiAxNn0KICAgIF07CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0VmVyc2lvbihvZmZzZXQsIGtWZXJzaW9uU2l6ZXMpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhQ29udHJvbGxlcl9TZWVrX1BhcmFtcy50aW1lCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0UG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDAsIHRpbWUkLlRpbWVEZWx0YSwgZmFsc2UpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICB9OwoKICBNZWRpYUNvbnRyb2xsZXJfU2Vla19QYXJhbXMuZW5jb2RlZFNpemUgPSBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDg7CgogIE1lZGlhQ29udHJvbGxlcl9TZWVrX1BhcmFtcy5kZWNvZGUgPSBmdW5jdGlvbihkZWNvZGVyKSB7CiAgICB2YXIgcGFja2VkOwogICAgdmFyIHZhbCA9IG5ldyBNZWRpYUNvbnRyb2xsZXJfU2Vla19QYXJhbXMoKTsKICAgIHZhciBudW1iZXJPZkJ5dGVzID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YXIgdmVyc2lvbiA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFsLnRpbWUgPSBkZWNvZGVyLmRlY29kZVN0cnVjdFBvaW50ZXIodGltZSQuVGltZURlbHRhKTsKICAgIHJldHVybiB2YWw7CiAgfTsKCiAgTWVkaWFDb250cm9sbGVyX1NlZWtfUGFyYW1zLmVuY29kZSA9IGZ1bmN0aW9uKGVuY29kZXIsIHZhbCkgewogICAgdmFyIHBhY2tlZDsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoTWVkaWFDb250cm9sbGVyX1NlZWtfUGFyYW1zLmVuY29kZWRTaXplKTsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoMCk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdFBvaW50ZXIodGltZSQuVGltZURlbHRhLCB2YWwudGltZSk7CiAgfTsKICBmdW5jdGlvbiBNZWRpYUNvbnRyb2xsZXJfQ29ubmVjdEhhbmdvdXRzTWVkaWFSb3V0ZUNvbnRyb2xsZXJfUGFyYW1zKHZhbHVlcykgewogICAgdGhpcy5pbml0RGVmYXVsdHNfKCk7CiAgICB0aGlzLmluaXRGaWVsZHNfKHZhbHVlcyk7CiAgfQoKCiAgTWVkaWFDb250cm9sbGVyX0Nvbm5lY3RIYW5nb3V0c01lZGlhUm91dGVDb250cm9sbGVyX1BhcmFtcy5wcm90b3R5cGUuaW5pdERlZmF1bHRzXyA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy5jb250cm9sbGVyUmVxdWVzdCA9IG5ldyBiaW5kaW5ncy5JbnRlcmZhY2VSZXF1ZXN0KCk7CiAgfTsKICBNZWRpYUNvbnRyb2xsZXJfQ29ubmVjdEhhbmdvdXRzTWVkaWFSb3V0ZUNvbnRyb2xsZXJfUGFyYW1zLnByb3RvdHlwZS5pbml0RmllbGRzXyA9IGZ1bmN0aW9uKGZpZWxkcykgewogICAgZm9yKHZhciBmaWVsZCBpbiBmaWVsZHMpIHsKICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpCiAgICAgICAgICB0aGlzW2ZpZWxkXSA9IGZpZWxkc1tmaWVsZF07CiAgICB9CiAgfTsKCiAgTWVkaWFDb250cm9sbGVyX0Nvbm5lY3RIYW5nb3V0c01lZGlhUm91dGVDb250cm9sbGVyX1BhcmFtcy52YWxpZGF0ZSA9IGZ1bmN0aW9uKG1lc3NhZ2VWYWxpZGF0b3IsIG9mZnNldCkgewogICAgdmFyIGVycjsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RIZWFkZXIob2Zmc2V0LCBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICB2YXIga1ZlcnNpb25TaXplcyA9IFsKICAgICAge3ZlcnNpb246IDAsIG51bUJ5dGVzOiAxNn0KICAgIF07CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0VmVyc2lvbihvZmZzZXQsIGtWZXJzaW9uU2l6ZXMpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhQ29udHJvbGxlcl9Db25uZWN0SGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlcl9QYXJhbXMuY29udHJvbGxlclJlcXVlc3QKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVJbnRlcmZhY2VSZXF1ZXN0KG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMCwgZmFsc2UpCiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwogIH07CgogIE1lZGlhQ29udHJvbGxlcl9Db25uZWN0SGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlcl9QYXJhbXMuZW5jb2RlZFNpemUgPSBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDg7CgogIE1lZGlhQ29udHJvbGxlcl9Db25uZWN0SGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlcl9QYXJhbXMuZGVjb2RlID0gZnVuY3Rpb24oZGVjb2RlcikgewogICAgdmFyIHBhY2tlZDsKICAgIHZhciB2YWwgPSBuZXcgTWVkaWFDb250cm9sbGVyX0Nvbm5lY3RIYW5nb3V0c01lZGlhUm91dGVDb250cm9sbGVyX1BhcmFtcygpOwogICAgdmFyIG51bWJlck9mQnl0ZXMgPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhciB2ZXJzaW9uID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YWwuY29udHJvbGxlclJlcXVlc3QgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5JbnRlcmZhY2VSZXF1ZXN0KTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIHJldHVybiB2YWw7CiAgfTsKCiAgTWVkaWFDb250cm9sbGVyX0Nvbm5lY3RIYW5nb3V0c01lZGlhUm91dGVDb250cm9sbGVyX1BhcmFtcy5lbmNvZGUgPSBmdW5jdGlvbihlbmNvZGVyLCB2YWwpIHsKICAgIHZhciBwYWNrZWQ7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKE1lZGlhQ29udHJvbGxlcl9Db25uZWN0SGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlcl9QYXJhbXMuZW5jb2RlZFNpemUpOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMigwKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLkludGVyZmFjZVJlcXVlc3QsIHZhbC5jb250cm9sbGVyUmVxdWVzdCk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgfTsKICBmdW5jdGlvbiBIYW5nb3V0c01lZGlhUm91dGVDb250cm9sbGVyX1NldExvY2FsUHJlc2VudF9QYXJhbXModmFsdWVzKSB7CiAgICB0aGlzLmluaXREZWZhdWx0c18oKTsKICAgIHRoaXMuaW5pdEZpZWxkc18odmFsdWVzKTsKICB9CgoKICBIYW5nb3V0c01lZGlhUm91dGVDb250cm9sbGVyX1NldExvY2FsUHJlc2VudF9QYXJhbXMucHJvdG90eXBlLmluaXREZWZhdWx0c18gPSBmdW5jdGlvbigpIHsKICAgIHRoaXMubG9jYWxQcmVzZW50ID0gZmFsc2U7CiAgfTsKICBIYW5nb3V0c01lZGlhUm91dGVDb250cm9sbGVyX1NldExvY2FsUHJlc2VudF9QYXJhbXMucHJvdG90eXBlLmluaXRGaWVsZHNfID0gZnVuY3Rpb24oZmllbGRzKSB7CiAgICBmb3IodmFyIGZpZWxkIGluIGZpZWxkcykgewogICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGZpZWxkKSkKICAgICAgICAgIHRoaXNbZmllbGRdID0gZmllbGRzW2ZpZWxkXTsKICAgIH0KICB9OwoKICBIYW5nb3V0c01lZGlhUm91dGVDb250cm9sbGVyX1NldExvY2FsUHJlc2VudF9QYXJhbXMudmFsaWRhdGUgPSBmdW5jdGlvbihtZXNzYWdlVmFsaWRhdG9yLCBvZmZzZXQpIHsKICAgIHZhciBlcnI7CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0SGVhZGVyKG9mZnNldCwgY29kZWMua1N0cnVjdEhlYWRlclNpemUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgdmFyIGtWZXJzaW9uU2l6ZXMgPSBbCiAgICAgIHt2ZXJzaW9uOiAwLCBudW1CeXRlczogMTZ9CiAgICBdOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFZlcnNpb24ob2Zmc2V0LCBrVmVyc2lvblNpemVzKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwogIH07CgogIEhhbmdvdXRzTWVkaWFSb3V0ZUNvbnRyb2xsZXJfU2V0TG9jYWxQcmVzZW50X1BhcmFtcy5lbmNvZGVkU2l6ZSA9IGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgODsKCiAgSGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlcl9TZXRMb2NhbFByZXNlbnRfUGFyYW1zLmRlY29kZSA9IGZ1bmN0aW9uKGRlY29kZXIpIHsKICAgIHZhciBwYWNrZWQ7CiAgICB2YXIgdmFsID0gbmV3IEhhbmdvdXRzTWVkaWFSb3V0ZUNvbnRyb2xsZXJfU2V0TG9jYWxQcmVzZW50X1BhcmFtcygpOwogICAgdmFyIG51bWJlck9mQnl0ZXMgPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhciB2ZXJzaW9uID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICBwYWNrZWQgPSBkZWNvZGVyLnJlYWRVaW50OCgpOwogICAgdmFsLmxvY2FsUHJlc2VudCA9IChwYWNrZWQgPj4gMCkgJiAxID8gdHJ1ZSA6IGZhbHNlOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgcmV0dXJuIHZhbDsKICB9OwoKICBIYW5nb3V0c01lZGlhUm91dGVDb250cm9sbGVyX1NldExvY2FsUHJlc2VudF9QYXJhbXMuZW5jb2RlID0gZnVuY3Rpb24oZW5jb2RlciwgdmFsKSB7CiAgICB2YXIgcGFja2VkOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMihIYW5nb3V0c01lZGlhUm91dGVDb250cm9sbGVyX1NldExvY2FsUHJlc2VudF9QYXJhbXMuZW5jb2RlZFNpemUpOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMigwKTsKICAgIHBhY2tlZCA9IDA7CiAgICBwYWNrZWQgfD0gKHZhbC5sb2NhbFByZXNlbnQgJiAxKSA8PCAwCiAgICBlbmNvZGVyLndyaXRlVWludDgocGFja2VkKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICB9OwogIHZhciBrTWVkaWFDb250cm9sbGVyX1BsYXlfTmFtZSA9IDgzMDYxOTk2MjsKICB2YXIga01lZGlhQ29udHJvbGxlcl9QYXVzZV9OYW1lID0gMzE4Mzg5MzMxOwogIHZhciBrTWVkaWFDb250cm9sbGVyX1NldE11dGVfTmFtZSA9IDg2OTE0MDQ3MjsKICB2YXIga01lZGlhQ29udHJvbGxlcl9TZXRWb2x1bWVfTmFtZSA9IDEwMzM3MTIwNzsKICB2YXIga01lZGlhQ29udHJvbGxlcl9TZWVrX05hbWUgPSAxMjU4MzI4NzE0OwogIHZhciBrTWVkaWFDb250cm9sbGVyX0Nvbm5lY3RIYW5nb3V0c01lZGlhUm91dGVDb250cm9sbGVyX05hbWUgPSAyMDg3NDAzODYyOwoKICBmdW5jdGlvbiBNZWRpYUNvbnRyb2xsZXJQdHIoaGFuZGxlT3JQdHJJbmZvKSB7CiAgICB0aGlzLnB0ciA9IG5ldyBiaW5kaW5ncy5JbnRlcmZhY2VQdHJDb250cm9sbGVyKE1lZGlhQ29udHJvbGxlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlT3JQdHJJbmZvKTsKICB9CgogIGZ1bmN0aW9uIE1lZGlhQ29udHJvbGxlckFzc29jaWF0ZWRQdHIoYXNzb2NpYXRlZEludGVyZmFjZVB0ckluZm8pIHsKICAgIHRoaXMucHRyID0gbmV3IGFzc29jaWF0ZWRCaW5kaW5ncy5Bc3NvY2lhdGVkSW50ZXJmYWNlUHRyQ29udHJvbGxlcigKICAgICAgICBNZWRpYUNvbnRyb2xsZXIsIGFzc29jaWF0ZWRJbnRlcmZhY2VQdHJJbmZvKTsKICB9CgogIE1lZGlhQ29udHJvbGxlckFzc29jaWF0ZWRQdHIucHJvdG90eXBlID0KICAgICAgT2JqZWN0LmNyZWF0ZShNZWRpYUNvbnRyb2xsZXJQdHIucHJvdG90eXBlKTsKICBNZWRpYUNvbnRyb2xsZXJBc3NvY2lhdGVkUHRyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9CiAgICAgIE1lZGlhQ29udHJvbGxlckFzc29jaWF0ZWRQdHI7CgogIGZ1bmN0aW9uIE1lZGlhQ29udHJvbGxlclByb3h5KHJlY2VpdmVyKSB7CiAgICB0aGlzLnJlY2VpdmVyXyA9IHJlY2VpdmVyOwogIH0KICBNZWRpYUNvbnRyb2xsZXJQdHIucHJvdG90eXBlLnBsYXkgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBNZWRpYUNvbnRyb2xsZXJQcm94eS5wcm90b3R5cGUucGxheQogICAgICAgIC5hcHBseSh0aGlzLnB0ci5nZXRQcm94eSgpLCBhcmd1bWVudHMpOwogIH07CgogIE1lZGlhQ29udHJvbGxlclByb3h5LnByb3RvdHlwZS5wbGF5ID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgcGFyYW1zID0gbmV3IE1lZGlhQ29udHJvbGxlcl9QbGF5X1BhcmFtcygpOwogICAgdmFyIGJ1aWxkZXIgPSBuZXcgY29kZWMuTWVzc2FnZVYwQnVpbGRlcigKICAgICAgICBrTWVkaWFDb250cm9sbGVyX1BsYXlfTmFtZSwKICAgICAgICBjb2RlYy5hbGlnbihNZWRpYUNvbnRyb2xsZXJfUGxheV9QYXJhbXMuZW5jb2RlZFNpemUpKTsKICAgIGJ1aWxkZXIuZW5jb2RlU3RydWN0KE1lZGlhQ29udHJvbGxlcl9QbGF5X1BhcmFtcywgcGFyYW1zKTsKICAgIHZhciBtZXNzYWdlID0gYnVpbGRlci5maW5pc2goKTsKICAgIHRoaXMucmVjZWl2ZXJfLmFjY2VwdChtZXNzYWdlKTsKICB9OwogIE1lZGlhQ29udHJvbGxlclB0ci5wcm90b3R5cGUucGF1c2UgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBNZWRpYUNvbnRyb2xsZXJQcm94eS5wcm90b3R5cGUucGF1c2UKICAgICAgICAuYXBwbHkodGhpcy5wdHIuZ2V0UHJveHkoKSwgYXJndW1lbnRzKTsKICB9OwoKICBNZWRpYUNvbnRyb2xsZXJQcm94eS5wcm90b3R5cGUucGF1c2UgPSBmdW5jdGlvbigpIHsKICAgIHZhciBwYXJhbXMgPSBuZXcgTWVkaWFDb250cm9sbGVyX1BhdXNlX1BhcmFtcygpOwogICAgdmFyIGJ1aWxkZXIgPSBuZXcgY29kZWMuTWVzc2FnZVYwQnVpbGRlcigKICAgICAgICBrTWVkaWFDb250cm9sbGVyX1BhdXNlX05hbWUsCiAgICAgICAgY29kZWMuYWxpZ24oTWVkaWFDb250cm9sbGVyX1BhdXNlX1BhcmFtcy5lbmNvZGVkU2l6ZSkpOwogICAgYnVpbGRlci5lbmNvZGVTdHJ1Y3QoTWVkaWFDb250cm9sbGVyX1BhdXNlX1BhcmFtcywgcGFyYW1zKTsKICAgIHZhciBtZXNzYWdlID0gYnVpbGRlci5maW5pc2goKTsKICAgIHRoaXMucmVjZWl2ZXJfLmFjY2VwdChtZXNzYWdlKTsKICB9OwogIE1lZGlhQ29udHJvbGxlclB0ci5wcm90b3R5cGUuc2V0TXV0ZSA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIE1lZGlhQ29udHJvbGxlclByb3h5LnByb3RvdHlwZS5zZXRNdXRlCiAgICAgICAgLmFwcGx5KHRoaXMucHRyLmdldFByb3h5KCksIGFyZ3VtZW50cyk7CiAgfTsKCiAgTWVkaWFDb250cm9sbGVyUHJveHkucHJvdG90eXBlLnNldE11dGUgPSBmdW5jdGlvbihtdXRlKSB7CiAgICB2YXIgcGFyYW1zID0gbmV3IE1lZGlhQ29udHJvbGxlcl9TZXRNdXRlX1BhcmFtcygpOwogICAgcGFyYW1zLm11dGUgPSBtdXRlOwogICAgdmFyIGJ1aWxkZXIgPSBuZXcgY29kZWMuTWVzc2FnZVYwQnVpbGRlcigKICAgICAgICBrTWVkaWFDb250cm9sbGVyX1NldE11dGVfTmFtZSwKICAgICAgICBjb2RlYy5hbGlnbihNZWRpYUNvbnRyb2xsZXJfU2V0TXV0ZV9QYXJhbXMuZW5jb2RlZFNpemUpKTsKICAgIGJ1aWxkZXIuZW5jb2RlU3RydWN0KE1lZGlhQ29udHJvbGxlcl9TZXRNdXRlX1BhcmFtcywgcGFyYW1zKTsKICAgIHZhciBtZXNzYWdlID0gYnVpbGRlci5maW5pc2goKTsKICAgIHRoaXMucmVjZWl2ZXJfLmFjY2VwdChtZXNzYWdlKTsKICB9OwogIE1lZGlhQ29udHJvbGxlclB0ci5wcm90b3R5cGUuc2V0Vm9sdW1lID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gTWVkaWFDb250cm9sbGVyUHJveHkucHJvdG90eXBlLnNldFZvbHVtZQogICAgICAgIC5hcHBseSh0aGlzLnB0ci5nZXRQcm94eSgpLCBhcmd1bWVudHMpOwogIH07CgogIE1lZGlhQ29udHJvbGxlclByb3h5LnByb3RvdHlwZS5zZXRWb2x1bWUgPSBmdW5jdGlvbih2b2x1bWUpIHsKICAgIHZhciBwYXJhbXMgPSBuZXcgTWVkaWFDb250cm9sbGVyX1NldFZvbHVtZV9QYXJhbXMoKTsKICAgIHBhcmFtcy52b2x1bWUgPSB2b2x1bWU7CiAgICB2YXIgYnVpbGRlciA9IG5ldyBjb2RlYy5NZXNzYWdlVjBCdWlsZGVyKAogICAgICAgIGtNZWRpYUNvbnRyb2xsZXJfU2V0Vm9sdW1lX05hbWUsCiAgICAgICAgY29kZWMuYWxpZ24oTWVkaWFDb250cm9sbGVyX1NldFZvbHVtZV9QYXJhbXMuZW5jb2RlZFNpemUpKTsKICAgIGJ1aWxkZXIuZW5jb2RlU3RydWN0KE1lZGlhQ29udHJvbGxlcl9TZXRWb2x1bWVfUGFyYW1zLCBwYXJhbXMpOwogICAgdmFyIG1lc3NhZ2UgPSBidWlsZGVyLmZpbmlzaCgpOwogICAgdGhpcy5yZWNlaXZlcl8uYWNjZXB0KG1lc3NhZ2UpOwogIH07CiAgTWVkaWFDb250cm9sbGVyUHRyLnByb3RvdHlwZS5zZWVrID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gTWVkaWFDb250cm9sbGVyUHJveHkucHJvdG90eXBlLnNlZWsKICAgICAgICAuYXBwbHkodGhpcy5wdHIuZ2V0UHJveHkoKSwgYXJndW1lbnRzKTsKICB9OwoKICBNZWRpYUNvbnRyb2xsZXJQcm94eS5wcm90b3R5cGUuc2VlayA9IGZ1bmN0aW9uKHRpbWUpIHsKICAgIHZhciBwYXJhbXMgPSBuZXcgTWVkaWFDb250cm9sbGVyX1NlZWtfUGFyYW1zKCk7CiAgICBwYXJhbXMudGltZSA9IHRpbWU7CiAgICB2YXIgYnVpbGRlciA9IG5ldyBjb2RlYy5NZXNzYWdlVjBCdWlsZGVyKAogICAgICAgIGtNZWRpYUNvbnRyb2xsZXJfU2Vla19OYW1lLAogICAgICAgIGNvZGVjLmFsaWduKE1lZGlhQ29udHJvbGxlcl9TZWVrX1BhcmFtcy5lbmNvZGVkU2l6ZSkpOwogICAgYnVpbGRlci5lbmNvZGVTdHJ1Y3QoTWVkaWFDb250cm9sbGVyX1NlZWtfUGFyYW1zLCBwYXJhbXMpOwogICAgdmFyIG1lc3NhZ2UgPSBidWlsZGVyLmZpbmlzaCgpOwogICAgdGhpcy5yZWNlaXZlcl8uYWNjZXB0KG1lc3NhZ2UpOwogIH07CiAgTWVkaWFDb250cm9sbGVyUHRyLnByb3RvdHlwZS5jb25uZWN0SGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlciA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIE1lZGlhQ29udHJvbGxlclByb3h5LnByb3RvdHlwZS5jb25uZWN0SGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlcgogICAgICAgIC5hcHBseSh0aGlzLnB0ci5nZXRQcm94eSgpLCBhcmd1bWVudHMpOwogIH07CgogIE1lZGlhQ29udHJvbGxlclByb3h5LnByb3RvdHlwZS5jb25uZWN0SGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlciA9IGZ1bmN0aW9uKGNvbnRyb2xsZXJSZXF1ZXN0KSB7CiAgICB2YXIgcGFyYW1zID0gbmV3IE1lZGlhQ29udHJvbGxlcl9Db25uZWN0SGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlcl9QYXJhbXMoKTsKICAgIHBhcmFtcy5jb250cm9sbGVyUmVxdWVzdCA9IGNvbnRyb2xsZXJSZXF1ZXN0OwogICAgdmFyIGJ1aWxkZXIgPSBuZXcgY29kZWMuTWVzc2FnZVYwQnVpbGRlcigKICAgICAgICBrTWVkaWFDb250cm9sbGVyX0Nvbm5lY3RIYW5nb3V0c01lZGlhUm91dGVDb250cm9sbGVyX05hbWUsCiAgICAgICAgY29kZWMuYWxpZ24oTWVkaWFDb250cm9sbGVyX0Nvbm5lY3RIYW5nb3V0c01lZGlhUm91dGVDb250cm9sbGVyX1BhcmFtcy5lbmNvZGVkU2l6ZSkpOwogICAgYnVpbGRlci5lbmNvZGVTdHJ1Y3QoTWVkaWFDb250cm9sbGVyX0Nvbm5lY3RIYW5nb3V0c01lZGlhUm91dGVDb250cm9sbGVyX1BhcmFtcywgcGFyYW1zKTsKICAgIHZhciBtZXNzYWdlID0gYnVpbGRlci5maW5pc2goKTsKICAgIHRoaXMucmVjZWl2ZXJfLmFjY2VwdChtZXNzYWdlKTsKICB9OwoKICBmdW5jdGlvbiBNZWRpYUNvbnRyb2xsZXJTdHViKGRlbGVnYXRlKSB7CiAgICB0aGlzLmRlbGVnYXRlXyA9IGRlbGVnYXRlOwogIH0KICBNZWRpYUNvbnRyb2xsZXJTdHViLnByb3RvdHlwZS5wbGF5ID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZV8gJiYgdGhpcy5kZWxlZ2F0ZV8ucGxheSAmJiB0aGlzLmRlbGVnYXRlXy5wbGF5KCk7CiAgfQogIE1lZGlhQ29udHJvbGxlclN0dWIucHJvdG90eXBlLnBhdXNlID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZV8gJiYgdGhpcy5kZWxlZ2F0ZV8ucGF1c2UgJiYgdGhpcy5kZWxlZ2F0ZV8ucGF1c2UoKTsKICB9CiAgTWVkaWFDb250cm9sbGVyU3R1Yi5wcm90b3R5cGUuc2V0TXV0ZSA9IGZ1bmN0aW9uKG11dGUpIHsKICAgIHJldHVybiB0aGlzLmRlbGVnYXRlXyAmJiB0aGlzLmRlbGVnYXRlXy5zZXRNdXRlICYmIHRoaXMuZGVsZWdhdGVfLnNldE11dGUobXV0ZSk7CiAgfQogIE1lZGlhQ29udHJvbGxlclN0dWIucHJvdG90eXBlLnNldFZvbHVtZSA9IGZ1bmN0aW9uKHZvbHVtZSkgewogICAgcmV0dXJuIHRoaXMuZGVsZWdhdGVfICYmIHRoaXMuZGVsZWdhdGVfLnNldFZvbHVtZSAmJiB0aGlzLmRlbGVnYXRlXy5zZXRWb2x1bWUodm9sdW1lKTsKICB9CiAgTWVkaWFDb250cm9sbGVyU3R1Yi5wcm90b3R5cGUuc2VlayA9IGZ1bmN0aW9uKHRpbWUpIHsKICAgIHJldHVybiB0aGlzLmRlbGVnYXRlXyAmJiB0aGlzLmRlbGVnYXRlXy5zZWVrICYmIHRoaXMuZGVsZWdhdGVfLnNlZWsodGltZSk7CiAgfQogIE1lZGlhQ29udHJvbGxlclN0dWIucHJvdG90eXBlLmNvbm5lY3RIYW5nb3V0c01lZGlhUm91dGVDb250cm9sbGVyID0gZnVuY3Rpb24oY29udHJvbGxlclJlcXVlc3QpIHsKICAgIHJldHVybiB0aGlzLmRlbGVnYXRlXyAmJiB0aGlzLmRlbGVnYXRlXy5jb25uZWN0SGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlciAmJiB0aGlzLmRlbGVnYXRlXy5jb25uZWN0SGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlcihjb250cm9sbGVyUmVxdWVzdCk7CiAgfQoKICBNZWRpYUNvbnRyb2xsZXJTdHViLnByb3RvdHlwZS5hY2NlcHQgPSBmdW5jdGlvbihtZXNzYWdlKSB7CiAgICB2YXIgcmVhZGVyID0gbmV3IGNvZGVjLk1lc3NhZ2VSZWFkZXIobWVzc2FnZSk7CiAgICBzd2l0Y2ggKHJlYWRlci5tZXNzYWdlTmFtZSkgewogICAgY2FzZSBrTWVkaWFDb250cm9sbGVyX1BsYXlfTmFtZToKICAgICAgdmFyIHBhcmFtcyA9IHJlYWRlci5kZWNvZGVTdHJ1Y3QoTWVkaWFDb250cm9sbGVyX1BsYXlfUGFyYW1zKTsKICAgICAgdGhpcy5wbGF5KCk7CiAgICAgIHJldHVybiB0cnVlOwogICAgY2FzZSBrTWVkaWFDb250cm9sbGVyX1BhdXNlX05hbWU6CiAgICAgIHZhciBwYXJhbXMgPSByZWFkZXIuZGVjb2RlU3RydWN0KE1lZGlhQ29udHJvbGxlcl9QYXVzZV9QYXJhbXMpOwogICAgICB0aGlzLnBhdXNlKCk7CiAgICAgIHJldHVybiB0cnVlOwogICAgY2FzZSBrTWVkaWFDb250cm9sbGVyX1NldE11dGVfTmFtZToKICAgICAgdmFyIHBhcmFtcyA9IHJlYWRlci5kZWNvZGVTdHJ1Y3QoTWVkaWFDb250cm9sbGVyX1NldE11dGVfUGFyYW1zKTsKICAgICAgdGhpcy5zZXRNdXRlKHBhcmFtcy5tdXRlKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICBjYXNlIGtNZWRpYUNvbnRyb2xsZXJfU2V0Vm9sdW1lX05hbWU6CiAgICAgIHZhciBwYXJhbXMgPSByZWFkZXIuZGVjb2RlU3RydWN0KE1lZGlhQ29udHJvbGxlcl9TZXRWb2x1bWVfUGFyYW1zKTsKICAgICAgdGhpcy5zZXRWb2x1bWUocGFyYW1zLnZvbHVtZSk7CiAgICAgIHJldHVybiB0cnVlOwogICAgY2FzZSBrTWVkaWFDb250cm9sbGVyX1NlZWtfTmFtZToKICAgICAgdmFyIHBhcmFtcyA9IHJlYWRlci5kZWNvZGVTdHJ1Y3QoTWVkaWFDb250cm9sbGVyX1NlZWtfUGFyYW1zKTsKICAgICAgdGhpcy5zZWVrKHBhcmFtcy50aW1lKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICBjYXNlIGtNZWRpYUNvbnRyb2xsZXJfQ29ubmVjdEhhbmdvdXRzTWVkaWFSb3V0ZUNvbnRyb2xsZXJfTmFtZToKICAgICAgdmFyIHBhcmFtcyA9IHJlYWRlci5kZWNvZGVTdHJ1Y3QoTWVkaWFDb250cm9sbGVyX0Nvbm5lY3RIYW5nb3V0c01lZGlhUm91dGVDb250cm9sbGVyX1BhcmFtcyk7CiAgICAgIHRoaXMuY29ubmVjdEhhbmdvdXRzTWVkaWFSb3V0ZUNvbnRyb2xsZXIocGFyYW1zLmNvbnRyb2xsZXJSZXF1ZXN0KTsKICAgICAgcmV0dXJuIHRydWU7CiAgICBkZWZhdWx0OgogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfTsKCiAgTWVkaWFDb250cm9sbGVyU3R1Yi5wcm90b3R5cGUuYWNjZXB0V2l0aFJlc3BvbmRlciA9CiAgICAgIGZ1bmN0aW9uKG1lc3NhZ2UsIHJlc3BvbmRlcikgewogICAgdmFyIHJlYWRlciA9IG5ldyBjb2RlYy5NZXNzYWdlUmVhZGVyKG1lc3NhZ2UpOwogICAgc3dpdGNoIChyZWFkZXIubWVzc2FnZU5hbWUpIHsKICAgIGRlZmF1bHQ6CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9OwoKICBmdW5jdGlvbiB2YWxpZGF0ZU1lZGlhQ29udHJvbGxlclJlcXVlc3QobWVzc2FnZVZhbGlkYXRvcikgewogICAgdmFyIG1lc3NhZ2UgPSBtZXNzYWdlVmFsaWRhdG9yLm1lc3NhZ2U7CiAgICB2YXIgcGFyYW1zQ2xhc3MgPSBudWxsOwogICAgc3dpdGNoIChtZXNzYWdlLmdldE5hbWUoKSkgewogICAgICBjYXNlIGtNZWRpYUNvbnRyb2xsZXJfUGxheV9OYW1lOgogICAgICAgIGlmICghbWVzc2FnZS5leHBlY3RzUmVzcG9uc2UoKSAmJiAhbWVzc2FnZS5pc1Jlc3BvbnNlKCkpCiAgICAgICAgICBwYXJhbXNDbGFzcyA9IE1lZGlhQ29udHJvbGxlcl9QbGF5X1BhcmFtczsKICAgICAgYnJlYWs7CiAgICAgIGNhc2Uga01lZGlhQ29udHJvbGxlcl9QYXVzZV9OYW1lOgogICAgICAgIGlmICghbWVzc2FnZS5leHBlY3RzUmVzcG9uc2UoKSAmJiAhbWVzc2FnZS5pc1Jlc3BvbnNlKCkpCiAgICAgICAgICBwYXJhbXNDbGFzcyA9IE1lZGlhQ29udHJvbGxlcl9QYXVzZV9QYXJhbXM7CiAgICAgIGJyZWFrOwogICAgICBjYXNlIGtNZWRpYUNvbnRyb2xsZXJfU2V0TXV0ZV9OYW1lOgogICAgICAgIGlmICghbWVzc2FnZS5leHBlY3RzUmVzcG9uc2UoKSAmJiAhbWVzc2FnZS5pc1Jlc3BvbnNlKCkpCiAgICAgICAgICBwYXJhbXNDbGFzcyA9IE1lZGlhQ29udHJvbGxlcl9TZXRNdXRlX1BhcmFtczsKICAgICAgYnJlYWs7CiAgICAgIGNhc2Uga01lZGlhQ29udHJvbGxlcl9TZXRWb2x1bWVfTmFtZToKICAgICAgICBpZiAoIW1lc3NhZ2UuZXhwZWN0c1Jlc3BvbnNlKCkgJiYgIW1lc3NhZ2UuaXNSZXNwb25zZSgpKQogICAgICAgICAgcGFyYW1zQ2xhc3MgPSBNZWRpYUNvbnRyb2xsZXJfU2V0Vm9sdW1lX1BhcmFtczsKICAgICAgYnJlYWs7CiAgICAgIGNhc2Uga01lZGlhQ29udHJvbGxlcl9TZWVrX05hbWU6CiAgICAgICAgaWYgKCFtZXNzYWdlLmV4cGVjdHNSZXNwb25zZSgpICYmICFtZXNzYWdlLmlzUmVzcG9uc2UoKSkKICAgICAgICAgIHBhcmFtc0NsYXNzID0gTWVkaWFDb250cm9sbGVyX1NlZWtfUGFyYW1zOwogICAgICBicmVhazsKICAgICAgY2FzZSBrTWVkaWFDb250cm9sbGVyX0Nvbm5lY3RIYW5nb3V0c01lZGlhUm91dGVDb250cm9sbGVyX05hbWU6CiAgICAgICAgaWYgKCFtZXNzYWdlLmV4cGVjdHNSZXNwb25zZSgpICYmICFtZXNzYWdlLmlzUmVzcG9uc2UoKSkKICAgICAgICAgIHBhcmFtc0NsYXNzID0gTWVkaWFDb250cm9sbGVyX0Nvbm5lY3RIYW5nb3V0c01lZGlhUm91dGVDb250cm9sbGVyX1BhcmFtczsKICAgICAgYnJlYWs7CiAgICB9CiAgICBpZiAocGFyYW1zQ2xhc3MgPT09IG51bGwpCiAgICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CiAgICByZXR1cm4gcGFyYW1zQ2xhc3MudmFsaWRhdGUobWVzc2FnZVZhbGlkYXRvciwgbWVzc2FnZVZhbGlkYXRvci5tZXNzYWdlLmdldEhlYWRlck51bUJ5dGVzKCkpOwogIH0KCiAgZnVuY3Rpb24gdmFsaWRhdGVNZWRpYUNvbnRyb2xsZXJSZXNwb25zZShtZXNzYWdlVmFsaWRhdG9yKSB7CiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwogIH0KCiAgdmFyIE1lZGlhQ29udHJvbGxlciA9IHsKICAgIG5hbWU6ICdtZWRpYV9yb3V0ZXI6Om1vam9tOjpNZWRpYUNvbnRyb2xsZXInLAogICAga1ZlcnNpb246IDAsCiAgICBwdHJDbGFzczogTWVkaWFDb250cm9sbGVyUHRyLAogICAgcHJveHlDbGFzczogTWVkaWFDb250cm9sbGVyUHJveHksCiAgICBzdHViQ2xhc3M6IE1lZGlhQ29udHJvbGxlclN0dWIsCiAgICB2YWxpZGF0ZVJlcXVlc3Q6IHZhbGlkYXRlTWVkaWFDb250cm9sbGVyUmVxdWVzdCwKICAgIHZhbGlkYXRlUmVzcG9uc2U6IG51bGwsCiAgfTsKICBNZWRpYUNvbnRyb2xsZXJTdHViLnByb3RvdHlwZS52YWxpZGF0b3IgPSB2YWxpZGF0ZU1lZGlhQ29udHJvbGxlclJlcXVlc3Q7CiAgTWVkaWFDb250cm9sbGVyUHJveHkucHJvdG90eXBlLnZhbGlkYXRvciA9IG51bGw7CiAgdmFyIGtIYW5nb3V0c01lZGlhUm91dGVDb250cm9sbGVyX1NldExvY2FsUHJlc2VudF9OYW1lID0gMTEwMjg5MDU5ODsKCiAgZnVuY3Rpb24gSGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlclB0cihoYW5kbGVPclB0ckluZm8pIHsKICAgIHRoaXMucHRyID0gbmV3IGJpbmRpbmdzLkludGVyZmFjZVB0ckNvbnRyb2xsZXIoSGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlT3JQdHJJbmZvKTsKICB9CgogIGZ1bmN0aW9uIEhhbmdvdXRzTWVkaWFSb3V0ZUNvbnRyb2xsZXJBc3NvY2lhdGVkUHRyKGFzc29jaWF0ZWRJbnRlcmZhY2VQdHJJbmZvKSB7CiAgICB0aGlzLnB0ciA9IG5ldyBhc3NvY2lhdGVkQmluZGluZ3MuQXNzb2NpYXRlZEludGVyZmFjZVB0ckNvbnRyb2xsZXIoCiAgICAgICAgSGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlciwgYXNzb2NpYXRlZEludGVyZmFjZVB0ckluZm8pOwogIH0KCiAgSGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlckFzc29jaWF0ZWRQdHIucHJvdG90eXBlID0KICAgICAgT2JqZWN0LmNyZWF0ZShIYW5nb3V0c01lZGlhUm91dGVDb250cm9sbGVyUHRyLnByb3RvdHlwZSk7CiAgSGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlckFzc29jaWF0ZWRQdHIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0KICAgICAgSGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlckFzc29jaWF0ZWRQdHI7CgogIGZ1bmN0aW9uIEhhbmdvdXRzTWVkaWFSb3V0ZUNvbnRyb2xsZXJQcm94eShyZWNlaXZlcikgewogICAgdGhpcy5yZWNlaXZlcl8gPSByZWNlaXZlcjsKICB9CiAgSGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlclB0ci5wcm90b3R5cGUuc2V0TG9jYWxQcmVzZW50ID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gSGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlclByb3h5LnByb3RvdHlwZS5zZXRMb2NhbFByZXNlbnQKICAgICAgICAuYXBwbHkodGhpcy5wdHIuZ2V0UHJveHkoKSwgYXJndW1lbnRzKTsKICB9OwoKICBIYW5nb3V0c01lZGlhUm91dGVDb250cm9sbGVyUHJveHkucHJvdG90eXBlLnNldExvY2FsUHJlc2VudCA9IGZ1bmN0aW9uKGxvY2FsUHJlc2VudCkgewogICAgdmFyIHBhcmFtcyA9IG5ldyBIYW5nb3V0c01lZGlhUm91dGVDb250cm9sbGVyX1NldExvY2FsUHJlc2VudF9QYXJhbXMoKTsKICAgIHBhcmFtcy5sb2NhbFByZXNlbnQgPSBsb2NhbFByZXNlbnQ7CiAgICB2YXIgYnVpbGRlciA9IG5ldyBjb2RlYy5NZXNzYWdlVjBCdWlsZGVyKAogICAgICAgIGtIYW5nb3V0c01lZGlhUm91dGVDb250cm9sbGVyX1NldExvY2FsUHJlc2VudF9OYW1lLAogICAgICAgIGNvZGVjLmFsaWduKEhhbmdvdXRzTWVkaWFSb3V0ZUNvbnRyb2xsZXJfU2V0TG9jYWxQcmVzZW50X1BhcmFtcy5lbmNvZGVkU2l6ZSkpOwogICAgYnVpbGRlci5lbmNvZGVTdHJ1Y3QoSGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlcl9TZXRMb2NhbFByZXNlbnRfUGFyYW1zLCBwYXJhbXMpOwogICAgdmFyIG1lc3NhZ2UgPSBidWlsZGVyLmZpbmlzaCgpOwogICAgdGhpcy5yZWNlaXZlcl8uYWNjZXB0KG1lc3NhZ2UpOwogIH07CgogIGZ1bmN0aW9uIEhhbmdvdXRzTWVkaWFSb3V0ZUNvbnRyb2xsZXJTdHViKGRlbGVnYXRlKSB7CiAgICB0aGlzLmRlbGVnYXRlXyA9IGRlbGVnYXRlOwogIH0KICBIYW5nb3V0c01lZGlhUm91dGVDb250cm9sbGVyU3R1Yi5wcm90b3R5cGUuc2V0TG9jYWxQcmVzZW50ID0gZnVuY3Rpb24obG9jYWxQcmVzZW50KSB7CiAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZV8gJiYgdGhpcy5kZWxlZ2F0ZV8uc2V0TG9jYWxQcmVzZW50ICYmIHRoaXMuZGVsZWdhdGVfLnNldExvY2FsUHJlc2VudChsb2NhbFByZXNlbnQpOwogIH0KCiAgSGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlclN0dWIucHJvdG90eXBlLmFjY2VwdCA9IGZ1bmN0aW9uKG1lc3NhZ2UpIHsKICAgIHZhciByZWFkZXIgPSBuZXcgY29kZWMuTWVzc2FnZVJlYWRlcihtZXNzYWdlKTsKICAgIHN3aXRjaCAocmVhZGVyLm1lc3NhZ2VOYW1lKSB7CiAgICBjYXNlIGtIYW5nb3V0c01lZGlhUm91dGVDb250cm9sbGVyX1NldExvY2FsUHJlc2VudF9OYW1lOgogICAgICB2YXIgcGFyYW1zID0gcmVhZGVyLmRlY29kZVN0cnVjdChIYW5nb3V0c01lZGlhUm91dGVDb250cm9sbGVyX1NldExvY2FsUHJlc2VudF9QYXJhbXMpOwogICAgICB0aGlzLnNldExvY2FsUHJlc2VudChwYXJhbXMubG9jYWxQcmVzZW50KTsKICAgICAgcmV0dXJuIHRydWU7CiAgICBkZWZhdWx0OgogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfTsKCiAgSGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlclN0dWIucHJvdG90eXBlLmFjY2VwdFdpdGhSZXNwb25kZXIgPQogICAgICBmdW5jdGlvbihtZXNzYWdlLCByZXNwb25kZXIpIHsKICAgIHZhciByZWFkZXIgPSBuZXcgY29kZWMuTWVzc2FnZVJlYWRlcihtZXNzYWdlKTsKICAgIHN3aXRjaCAocmVhZGVyLm1lc3NhZ2VOYW1lKSB7CiAgICBkZWZhdWx0OgogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfTsKCiAgZnVuY3Rpb24gdmFsaWRhdGVIYW5nb3V0c01lZGlhUm91dGVDb250cm9sbGVyUmVxdWVzdChtZXNzYWdlVmFsaWRhdG9yKSB7CiAgICB2YXIgbWVzc2FnZSA9IG1lc3NhZ2VWYWxpZGF0b3IubWVzc2FnZTsKICAgIHZhciBwYXJhbXNDbGFzcyA9IG51bGw7CiAgICBzd2l0Y2ggKG1lc3NhZ2UuZ2V0TmFtZSgpKSB7CiAgICAgIGNhc2Uga0hhbmdvdXRzTWVkaWFSb3V0ZUNvbnRyb2xsZXJfU2V0TG9jYWxQcmVzZW50X05hbWU6CiAgICAgICAgaWYgKCFtZXNzYWdlLmV4cGVjdHNSZXNwb25zZSgpICYmICFtZXNzYWdlLmlzUmVzcG9uc2UoKSkKICAgICAgICAgIHBhcmFtc0NsYXNzID0gSGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlcl9TZXRMb2NhbFByZXNlbnRfUGFyYW1zOwogICAgICBicmVhazsKICAgIH0KICAgIGlmIChwYXJhbXNDbGFzcyA9PT0gbnVsbCkKICAgICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICAgIHJldHVybiBwYXJhbXNDbGFzcy52YWxpZGF0ZShtZXNzYWdlVmFsaWRhdG9yLCBtZXNzYWdlVmFsaWRhdG9yLm1lc3NhZ2UuZ2V0SGVhZGVyTnVtQnl0ZXMoKSk7CiAgfQoKICBmdW5jdGlvbiB2YWxpZGF0ZUhhbmdvdXRzTWVkaWFSb3V0ZUNvbnRyb2xsZXJSZXNwb25zZShtZXNzYWdlVmFsaWRhdG9yKSB7CiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwogIH0KCiAgdmFyIEhhbmdvdXRzTWVkaWFSb3V0ZUNvbnRyb2xsZXIgPSB7CiAgICBuYW1lOiAnbWVkaWFfcm91dGVyOjptb2pvbTo6SGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlcicsCiAgICBrVmVyc2lvbjogMCwKICAgIHB0ckNsYXNzOiBIYW5nb3V0c01lZGlhUm91dGVDb250cm9sbGVyUHRyLAogICAgcHJveHlDbGFzczogSGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlclByb3h5LAogICAgc3R1YkNsYXNzOiBIYW5nb3V0c01lZGlhUm91dGVDb250cm9sbGVyU3R1YiwKICAgIHZhbGlkYXRlUmVxdWVzdDogdmFsaWRhdGVIYW5nb3V0c01lZGlhUm91dGVDb250cm9sbGVyUmVxdWVzdCwKICAgIHZhbGlkYXRlUmVzcG9uc2U6IG51bGwsCiAgfTsKICBIYW5nb3V0c01lZGlhUm91dGVDb250cm9sbGVyU3R1Yi5wcm90b3R5cGUudmFsaWRhdG9yID0gdmFsaWRhdGVIYW5nb3V0c01lZGlhUm91dGVDb250cm9sbGVyUmVxdWVzdDsKICBIYW5nb3V0c01lZGlhUm91dGVDb250cm9sbGVyUHJveHkucHJvdG90eXBlLnZhbGlkYXRvciA9IG51bGw7CiAgZXhwb3J0cy5NZWRpYUNvbnRyb2xsZXIgPSBNZWRpYUNvbnRyb2xsZXI7CiAgZXhwb3J0cy5NZWRpYUNvbnRyb2xsZXJQdHIgPSBNZWRpYUNvbnRyb2xsZXJQdHI7CiAgZXhwb3J0cy5NZWRpYUNvbnRyb2xsZXJBc3NvY2lhdGVkUHRyID0gTWVkaWFDb250cm9sbGVyQXNzb2NpYXRlZFB0cjsKICBleHBvcnRzLkhhbmdvdXRzTWVkaWFSb3V0ZUNvbnRyb2xsZXIgPSBIYW5nb3V0c01lZGlhUm91dGVDb250cm9sbGVyOwogIGV4cG9ydHMuSGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlclB0ciA9IEhhbmdvdXRzTWVkaWFSb3V0ZUNvbnRyb2xsZXJQdHI7CiAgZXhwb3J0cy5IYW5nb3V0c01lZGlhUm91dGVDb250cm9sbGVyQXNzb2NpYXRlZFB0ciA9IEhhbmdvdXRzTWVkaWFSb3V0ZUNvbnRyb2xsZXJBc3NvY2lhdGVkUHRyOwp9KSgpOy8vIENvcHlyaWdodCAyMDE0IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgovLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgondXNlIHN0cmljdCc7CgooZnVuY3Rpb24oKSB7CiAgdmFyIG1vam9tSWQgPSAnY2hyb21lL2NvbW1vbi9tZWRpYV9yb3V0ZXIvbW9qby9tZWRpYV9yb3V0ZXIubW9qb20nOwogIGlmIChtb2pvLmludGVybmFsLmlzTW9qb21Mb2FkZWQobW9qb21JZCkpIHsKICAgIGNvbnNvbGUud2FybignVGhlIGZvbGxvd2luZyBtb2pvbSBpcyBsb2FkZWQgbXVsdGlwbGUgdGltZXM6ICcgKyBtb2pvbUlkKTsKICAgIHJldHVybjsKICB9CiAgbW9qby5pbnRlcm5hbC5tYXJrTW9qb21Mb2FkZWQobW9qb21JZCk7CiAgdmFyIGJpbmRpbmdzID0gbW9qbzsKICB2YXIgYXNzb2NpYXRlZEJpbmRpbmdzID0gbW9qbzsKICB2YXIgY29kZWMgPSBtb2pvLmludGVybmFsOwogIHZhciB2YWxpZGF0b3IgPSBtb2pvLmludGVybmFsOwoKICB2YXIgZXhwb3J0cyA9IG1vam8uaW50ZXJuYWwuZXhwb3NlTmFtZXNwYWNlKCdtZWRpYVJvdXRlci5tb2pvbScpOwogIHZhciBtZWRpYV9jb250cm9sbGVyJCA9CiAgICAgIG1vam8uaW50ZXJuYWwuZXhwb3NlTmFtZXNwYWNlKCdtZWRpYVJvdXRlci5tb2pvbScpOwogIGlmIChtb2pvLmNvbmZpZy5hdXRvTG9hZE1vam9tRGVwcykgewogICAgbW9qby5pbnRlcm5hbC5sb2FkTW9qb21JZk5lY2Vzc2FyeSgKICAgICAgICAnY2hyb21lL2NvbW1vbi9tZWRpYV9yb3V0ZXIvbW9qby9tZWRpYV9jb250cm9sbGVyLm1vam9tJywgJ21lZGlhX2NvbnRyb2xsZXIubW9qb20uanMnKTsKICB9CiAgdmFyIG1lZGlhX3N0YXR1cyQgPQogICAgICBtb2pvLmludGVybmFsLmV4cG9zZU5hbWVzcGFjZSgnbWVkaWFSb3V0ZXIubW9qb20nKTsKICBpZiAobW9qby5jb25maWcuYXV0b0xvYWRNb2pvbURlcHMpIHsKICAgIG1vam8uaW50ZXJuYWwubG9hZE1vam9tSWZOZWNlc3NhcnkoCiAgICAgICAgJ2Nocm9tZS9jb21tb24vbWVkaWFfcm91dGVyL21vam8vbWVkaWFfc3RhdHVzLm1vam9tJywgJ21lZGlhX3N0YXR1cy5tb2pvbS5qcycpOwogIH0KICB2YXIgbWlycm9yX3NlcnZpY2VfcmVtb3RpbmckID0KICAgICAgbW9qby5pbnRlcm5hbC5leHBvc2VOYW1lc3BhY2UoJ21lZGlhLm1vam9tJyk7CiAgaWYgKG1vam8uY29uZmlnLmF1dG9Mb2FkTW9qb21EZXBzKSB7CiAgICBtb2pvLmludGVybmFsLmxvYWRNb2pvbUlmTmVjZXNzYXJ5KAogICAgICAgICdtZWRpYS9tb2pvL2ludGVyZmFjZXMvbWlycm9yX3NlcnZpY2VfcmVtb3RpbmcubW9qb20nLCAnLi4vLi4vLi4vLi4vbWVkaWEvbW9qby9pbnRlcmZhY2VzL21pcnJvcl9zZXJ2aWNlX3JlbW90aW5nLm1vam9tLmpzJyk7CiAgfQogIHZhciB0aW1lJCA9CiAgICAgIG1vam8uaW50ZXJuYWwuZXhwb3NlTmFtZXNwYWNlKCdtb2pvLmNvbW1vbi5tb2pvbScpOwogIGlmIChtb2pvLmNvbmZpZy5hdXRvTG9hZE1vam9tRGVwcykgewogICAgbW9qby5pbnRlcm5hbC5sb2FkTW9qb21JZk5lY2Vzc2FyeSgKICAgICAgICAnbW9qby9jb21tb24vdGltZS5tb2pvbScsICcuLi8uLi8uLi8uLi9tb2pvL2NvbW1vbi90aW1lLm1vam9tLmpzJyk7CiAgfQogIHZhciBpcF9hZGRyZXNzJCA9CiAgICAgIG1vam8uaW50ZXJuYWwuZXhwb3NlTmFtZXNwYWNlKCduZXQuaW50ZXJmYWNlcycpOwogIGlmIChtb2pvLmNvbmZpZy5hdXRvTG9hZE1vam9tRGVwcykgewogICAgbW9qby5pbnRlcm5hbC5sb2FkTW9qb21JZk5lY2Vzc2FyeSgKICAgICAgICAnbmV0L2ludGVyZmFjZXMvaXBfYWRkcmVzcy5tb2pvbScsICcuLi8uLi8uLi8uLi9uZXQvaW50ZXJmYWNlcy9pcF9hZGRyZXNzLm1vam9tLmpzJyk7CiAgfQogIHZhciBpcF9lbmRwb2ludCQgPQogICAgICBtb2pvLmludGVybmFsLmV4cG9zZU5hbWVzcGFjZSgnbmV0LmludGVyZmFjZXMnKTsKICBpZiAobW9qby5jb25maWcuYXV0b0xvYWRNb2pvbURlcHMpIHsKICAgIG1vam8uaW50ZXJuYWwubG9hZE1vam9tSWZOZWNlc3NhcnkoCiAgICAgICAgJ25ldC9pbnRlcmZhY2VzL2lwX2VuZHBvaW50Lm1vam9tJywgJy4uLy4uLy4uLy4uL25ldC9pbnRlcmZhY2VzL2lwX2VuZHBvaW50Lm1vam9tLmpzJyk7CiAgfQogIHZhciBvcmlnaW4kID0KICAgICAgbW9qby5pbnRlcm5hbC5leHBvc2VOYW1lc3BhY2UoJ3VybC5tb2pvbScpOwogIGlmIChtb2pvLmNvbmZpZy5hdXRvTG9hZE1vam9tRGVwcykgewogICAgbW9qby5pbnRlcm5hbC5sb2FkTW9qb21JZk5lY2Vzc2FyeSgKICAgICAgICAndXJsL21vam8vb3JpZ2luLm1vam9tJywgJy4uLy4uLy4uLy4uL3VybC9tb2pvL29yaWdpbi5tb2pvbS5qcycpOwogIH0KICB2YXIgdXJsJCA9CiAgICAgIG1vam8uaW50ZXJuYWwuZXhwb3NlTmFtZXNwYWNlKCd1cmwubW9qb20nKTsKICBpZiAobW9qby5jb25maWcuYXV0b0xvYWRNb2pvbURlcHMpIHsKICAgIG1vam8uaW50ZXJuYWwubG9hZE1vam9tSWZOZWNlc3NhcnkoCiAgICAgICAgJ3VybC9tb2pvL3VybC5tb2pvbScsICcuLi8uLi8uLi8uLi91cmwvbW9qby91cmwubW9qb20uanMnKTsKICB9CgoKICB2YXIgU2lua0ljb25UeXBlID0ge307CiAgU2lua0ljb25UeXBlLkNBU1QgPSAwOwogIFNpbmtJY29uVHlwZS5DQVNUX0FVRElPX0dST1VQID0gU2lua0ljb25UeXBlLkNBU1QgKyAxOwogIFNpbmtJY29uVHlwZS5DQVNUX0FVRElPID0gU2lua0ljb25UeXBlLkNBU1RfQVVESU9fR1JPVVAgKyAxOwogIFNpbmtJY29uVHlwZS5NRUVUSU5HID0gU2lua0ljb25UeXBlLkNBU1RfQVVESU8gKyAxOwogIFNpbmtJY29uVHlwZS5IQU5HT1VUID0gU2lua0ljb25UeXBlLk1FRVRJTkcgKyAxOwogIFNpbmtJY29uVHlwZS5FRFVDQVRJT04gPSBTaW5rSWNvblR5cGUuSEFOR09VVCArIDE7CiAgU2lua0ljb25UeXBlLldJUkVEX0RJU1BMQVkgPSBTaW5rSWNvblR5cGUuRURVQ0FUSU9OICsgMTsKICBTaW5rSWNvblR5cGUuR0VORVJJQyA9IFNpbmtJY29uVHlwZS5XSVJFRF9ESVNQTEFZICsgMTsKCiAgU2lua0ljb25UeXBlLmlzS25vd25FbnVtVmFsdWUgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgc3dpdGNoICh2YWx1ZSkgewogICAgY2FzZSAwOgogICAgY2FzZSAxOgogICAgY2FzZSAyOgogICAgY2FzZSAzOgogICAgY2FzZSA0OgogICAgY2FzZSA1OgogICAgY2FzZSA2OgogICAgY2FzZSA3OgogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9OwoKICBTaW5rSWNvblR5cGUudmFsaWRhdGUgPSBmdW5jdGlvbihlbnVtVmFsdWUpIHsKICAgIHZhciBpc0V4dGVuc2libGUgPSBmYWxzZTsKICAgIGlmIChpc0V4dGVuc2libGUgfHwgdGhpcy5pc0tub3duRW51bVZhbHVlKGVudW1WYWx1ZSkpCiAgICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuVU5LTk9XTl9FTlVNX1ZBTFVFOwogIH07CiAgdmFyIFJvdXRlQ29udHJvbGxlclR5cGUgPSB7fTsKICBSb3V0ZUNvbnRyb2xsZXJUeXBlLmtOb25lID0gMDsKICBSb3V0ZUNvbnRyb2xsZXJUeXBlLmtHZW5lcmljID0gUm91dGVDb250cm9sbGVyVHlwZS5rTm9uZSArIDE7CiAgUm91dGVDb250cm9sbGVyVHlwZS5rSGFuZ291dHMgPSBSb3V0ZUNvbnRyb2xsZXJUeXBlLmtHZW5lcmljICsgMTsKICBSb3V0ZUNvbnRyb2xsZXJUeXBlLmtNaXJyb3JpbmcgPSBSb3V0ZUNvbnRyb2xsZXJUeXBlLmtIYW5nb3V0cyArIDE7CgogIFJvdXRlQ29udHJvbGxlclR5cGUuaXNLbm93bkVudW1WYWx1ZSA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICBzd2l0Y2ggKHZhbHVlKSB7CiAgICBjYXNlIDA6CiAgICBjYXNlIDE6CiAgICBjYXNlIDI6CiAgICBjYXNlIDM6CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH07CgogIFJvdXRlQ29udHJvbGxlclR5cGUudmFsaWRhdGUgPSBmdW5jdGlvbihlbnVtVmFsdWUpIHsKICAgIHZhciBpc0V4dGVuc2libGUgPSBmYWxzZTsKICAgIGlmIChpc0V4dGVuc2libGUgfHwgdGhpcy5pc0tub3duRW51bVZhbHVlKGVudW1WYWx1ZSkpCiAgICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuVU5LTk9XTl9FTlVNX1ZBTFVFOwogIH07CiAgdmFyIFJvdXRlUmVxdWVzdFJlc3VsdENvZGUgPSB7fTsKICBSb3V0ZVJlcXVlc3RSZXN1bHRDb2RlLlVOS05PV05fRVJST1IgPSAwOwogIFJvdXRlUmVxdWVzdFJlc3VsdENvZGUuT0sgPSBSb3V0ZVJlcXVlc3RSZXN1bHRDb2RlLlVOS05PV05fRVJST1IgKyAxOwogIFJvdXRlUmVxdWVzdFJlc3VsdENvZGUuVElNRURfT1VUID0gUm91dGVSZXF1ZXN0UmVzdWx0Q29kZS5PSyArIDE7CiAgUm91dGVSZXF1ZXN0UmVzdWx0Q29kZS5ST1VURV9OT1RfRk9VTkQgPSBSb3V0ZVJlcXVlc3RSZXN1bHRDb2RlLlRJTUVEX09VVCArIDE7CiAgUm91dGVSZXF1ZXN0UmVzdWx0Q29kZS5TSU5LX05PVF9GT1VORCA9IFJvdXRlUmVxdWVzdFJlc3VsdENvZGUuUk9VVEVfTk9UX0ZPVU5EICsgMTsKICBSb3V0ZVJlcXVlc3RSZXN1bHRDb2RlLklOVkFMSURfT1JJR0lOID0gUm91dGVSZXF1ZXN0UmVzdWx0Q29kZS5TSU5LX05PVF9GT1VORCArIDE7CiAgUm91dGVSZXF1ZXN0UmVzdWx0Q29kZS5JTkNPR05JVE9fTUlTTUFUQ0ggPSBSb3V0ZVJlcXVlc3RSZXN1bHRDb2RlLklOVkFMSURfT1JJR0lOICsgMTsKICBSb3V0ZVJlcXVlc3RSZXN1bHRDb2RlLk5PX1NVUFBPUlRFRF9QUk9WSURFUiA9IFJvdXRlUmVxdWVzdFJlc3VsdENvZGUuSU5DT0dOSVRPX01JU01BVENIICsgMTsKICBSb3V0ZVJlcXVlc3RSZXN1bHRDb2RlLkNBTkNFTExFRCA9IFJvdXRlUmVxdWVzdFJlc3VsdENvZGUuTk9fU1VQUE9SVEVEX1BST1ZJREVSICsgMTsKCiAgUm91dGVSZXF1ZXN0UmVzdWx0Q29kZS5pc0tub3duRW51bVZhbHVlID0gZnVuY3Rpb24odmFsdWUpIHsKICAgIHN3aXRjaCAodmFsdWUpIHsKICAgIGNhc2UgMDoKICAgIGNhc2UgMToKICAgIGNhc2UgMjoKICAgIGNhc2UgMzoKICAgIGNhc2UgNDoKICAgIGNhc2UgNToKICAgIGNhc2UgNjoKICAgIGNhc2UgNzoKICAgIGNhc2UgODoKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfTsKCiAgUm91dGVSZXF1ZXN0UmVzdWx0Q29kZS52YWxpZGF0ZSA9IGZ1bmN0aW9uKGVudW1WYWx1ZSkgewogICAgdmFyIGlzRXh0ZW5zaWJsZSA9IGZhbHNlOwogICAgaWYgKGlzRXh0ZW5zaWJsZSB8fCB0aGlzLmlzS25vd25FbnVtVmFsdWUoZW51bVZhbHVlKSkKICAgICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKCiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5VTktOT1dOX0VOVU1fVkFMVUU7CiAgfTsKCiAgZnVuY3Rpb24gTWVkaWFTaW5rKHZhbHVlcykgewogICAgdGhpcy5pbml0RGVmYXVsdHNfKCk7CiAgICB0aGlzLmluaXRGaWVsZHNfKHZhbHVlcyk7CiAgfQoKCiAgTWVkaWFTaW5rLnByb3RvdHlwZS5pbml0RGVmYXVsdHNfID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLnNpbmtJZCA9IG51bGw7CiAgICB0aGlzLm5hbWUgPSBudWxsOwogICAgdGhpcy5kZXNjcmlwdGlvbiA9IG51bGw7CiAgICB0aGlzLmRvbWFpbiA9IG51bGw7CiAgICB0aGlzLmljb25UeXBlID0gMDsKICAgIHRoaXMucHJvdmlkZXJJZCA9IDA7CiAgICB0aGlzLmV4dHJhRGF0YSA9IG51bGw7CiAgfTsKICBNZWRpYVNpbmsucHJvdG90eXBlLmluaXRGaWVsZHNfID0gZnVuY3Rpb24oZmllbGRzKSB7CiAgICBmb3IodmFyIGZpZWxkIGluIGZpZWxkcykgewogICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGZpZWxkKSkKICAgICAgICAgIHRoaXNbZmllbGRdID0gZmllbGRzW2ZpZWxkXTsKICAgIH0KICB9OwoKICBNZWRpYVNpbmsudmFsaWRhdGUgPSBmdW5jdGlvbihtZXNzYWdlVmFsaWRhdG9yLCBvZmZzZXQpIHsKICAgIHZhciBlcnI7CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0SGVhZGVyKG9mZnNldCwgY29kZWMua1N0cnVjdEhlYWRlclNpemUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgdmFyIGtWZXJzaW9uU2l6ZXMgPSBbCiAgICAgIHt2ZXJzaW9uOiAwLCBudW1CeXRlczogNjR9CiAgICBdOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFZlcnNpb24ob2Zmc2V0LCBrVmVyc2lvblNpemVzKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVNpbmsuc2lua0lkCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nUG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDAsIGZhbHNlKQogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhU2luay5uYW1lCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nUG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDgsIGZhbHNlKQogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhU2luay5kZXNjcmlwdGlvbgogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cmluZ1BvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAxNiwgdHJ1ZSkKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVNpbmsuZG9tYWluCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nUG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDI0LCB0cnVlKQogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhU2luay5pY29uVHlwZQogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZUVudW0ob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAzMiwgU2lua0ljb25UeXBlKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVNpbmsucHJvdmlkZXJJZAogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZUVudW0ob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAzNiwgTWVkaWFSb3V0ZVByb3ZpZGVyLklkKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVNpbmsuZXh0cmFEYXRhCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlVW5pb24ob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA0MCwgTWVkaWFTaW5rRXh0cmFEYXRhLCB0cnVlKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CiAgfTsKCiAgTWVkaWFTaW5rLmVuY29kZWRTaXplID0gY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA1NjsKCiAgTWVkaWFTaW5rLmRlY29kZSA9IGZ1bmN0aW9uKGRlY29kZXIpIHsKICAgIHZhciBwYWNrZWQ7CiAgICB2YXIgdmFsID0gbmV3IE1lZGlhU2luaygpOwogICAgdmFyIG51bWJlck9mQnl0ZXMgPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhciB2ZXJzaW9uID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YWwuc2lua0lkID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nKTsKICAgIHZhbC5uYW1lID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nKTsKICAgIHZhbC5kZXNjcmlwdGlvbiA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLk51bGxhYmxlU3RyaW5nKTsKICAgIHZhbC5kb21haW4gPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5OdWxsYWJsZVN0cmluZyk7CiAgICB2YWwuaWNvblR5cGUgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5JbnQzMik7CiAgICB2YWwucHJvdmlkZXJJZCA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLkludDMyKTsKICAgIHZhbC5leHRyYURhdGEgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChNZWRpYVNpbmtFeHRyYURhdGEpOwogICAgcmV0dXJuIHZhbDsKICB9OwoKICBNZWRpYVNpbmsuZW5jb2RlID0gZnVuY3Rpb24oZW5jb2RlciwgdmFsKSB7CiAgICB2YXIgcGFja2VkOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMihNZWRpYVNpbmsuZW5jb2RlZFNpemUpOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMigwKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLlN0cmluZywgdmFsLnNpbmtJZCk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5TdHJpbmcsIHZhbC5uYW1lKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLk51bGxhYmxlU3RyaW5nLCB2YWwuZGVzY3JpcHRpb24pOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuTnVsbGFibGVTdHJpbmcsIHZhbC5kb21haW4pOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuSW50MzIsIHZhbC5pY29uVHlwZSk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5JbnQzMiwgdmFsLnByb3ZpZGVySWQpOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoTWVkaWFTaW5rRXh0cmFEYXRhLCB2YWwuZXh0cmFEYXRhKTsKICB9OwogIGZ1bmN0aW9uIERpYWxNZWRpYVNpbmsodmFsdWVzKSB7CiAgICB0aGlzLmluaXREZWZhdWx0c18oKTsKICAgIHRoaXMuaW5pdEZpZWxkc18odmFsdWVzKTsKICB9CgoKICBEaWFsTWVkaWFTaW5rLnByb3RvdHlwZS5pbml0RGVmYXVsdHNfID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLmlwQWRkcmVzcyA9IG51bGw7CiAgICB0aGlzLm1vZGVsTmFtZSA9IG51bGw7CiAgICB0aGlzLmFwcFVybCA9IG51bGw7CiAgfTsKICBEaWFsTWVkaWFTaW5rLnByb3RvdHlwZS5pbml0RmllbGRzXyA9IGZ1bmN0aW9uKGZpZWxkcykgewogICAgZm9yKHZhciBmaWVsZCBpbiBmaWVsZHMpIHsKICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpCiAgICAgICAgICB0aGlzW2ZpZWxkXSA9IGZpZWxkc1tmaWVsZF07CiAgICB9CiAgfTsKCiAgRGlhbE1lZGlhU2luay52YWxpZGF0ZSA9IGZ1bmN0aW9uKG1lc3NhZ2VWYWxpZGF0b3IsIG9mZnNldCkgewogICAgdmFyIGVycjsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RIZWFkZXIob2Zmc2V0LCBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICB2YXIga1ZlcnNpb25TaXplcyA9IFsKICAgICAge3ZlcnNpb246IDAsIG51bUJ5dGVzOiAzMn0KICAgIF07CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0VmVyc2lvbihvZmZzZXQsIGtWZXJzaW9uU2l6ZXMpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIERpYWxNZWRpYVNpbmsuaXBBZGRyZXNzCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0UG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDAsIGlwX2FkZHJlc3MkLklQQWRkcmVzcywgZmFsc2UpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIERpYWxNZWRpYVNpbmsubW9kZWxOYW1lCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nUG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDgsIGZhbHNlKQogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIERpYWxNZWRpYVNpbmsuYXBwVXJsCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0UG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDE2LCB1cmwkLlVybCwgZmFsc2UpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICB9OwoKICBEaWFsTWVkaWFTaW5rLmVuY29kZWRTaXplID0gY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAyNDsKCiAgRGlhbE1lZGlhU2luay5kZWNvZGUgPSBmdW5jdGlvbihkZWNvZGVyKSB7CiAgICB2YXIgcGFja2VkOwogICAgdmFyIHZhbCA9IG5ldyBEaWFsTWVkaWFTaW5rKCk7CiAgICB2YXIgbnVtYmVyT2ZCeXRlcyA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFyIHZlcnNpb24gPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhbC5pcEFkZHJlc3MgPSBkZWNvZGVyLmRlY29kZVN0cnVjdFBvaW50ZXIoaXBfYWRkcmVzcyQuSVBBZGRyZXNzKTsKICAgIHZhbC5tb2RlbE5hbWUgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5TdHJpbmcpOwogICAgdmFsLmFwcFVybCA9IGRlY29kZXIuZGVjb2RlU3RydWN0UG9pbnRlcih1cmwkLlVybCk7CiAgICByZXR1cm4gdmFsOwogIH07CgogIERpYWxNZWRpYVNpbmsuZW5jb2RlID0gZnVuY3Rpb24oZW5jb2RlciwgdmFsKSB7CiAgICB2YXIgcGFja2VkOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMihEaWFsTWVkaWFTaW5rLmVuY29kZWRTaXplKTsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoMCk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdFBvaW50ZXIoaXBfYWRkcmVzcyQuSVBBZGRyZXNzLCB2YWwuaXBBZGRyZXNzKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLlN0cmluZywgdmFsLm1vZGVsTmFtZSk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdFBvaW50ZXIodXJsJC5VcmwsIHZhbC5hcHBVcmwpOwogIH07CiAgZnVuY3Rpb24gQ2FzdE1lZGlhU2luayh2YWx1ZXMpIHsKICAgIHRoaXMuaW5pdERlZmF1bHRzXygpOwogICAgdGhpcy5pbml0RmllbGRzXyh2YWx1ZXMpOwogIH0KCgogIENhc3RNZWRpYVNpbmsucHJvdG90eXBlLmluaXREZWZhdWx0c18gPSBmdW5jdGlvbigpIHsKICAgIHRoaXMuaXBFbmRwb2ludCA9IG51bGw7CiAgICB0aGlzLm1vZGVsTmFtZSA9IG51bGw7CiAgICB0aGlzLmNhcGFiaWxpdGllcyA9IDA7CiAgICB0aGlzLmNhc3RDaGFubmVsSWQgPSAwOwogIH07CiAgQ2FzdE1lZGlhU2luay5wcm90b3R5cGUuaW5pdEZpZWxkc18gPSBmdW5jdGlvbihmaWVsZHMpIHsKICAgIGZvcih2YXIgZmllbGQgaW4gZmllbGRzKSB7CiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoZmllbGQpKQogICAgICAgICAgdGhpc1tmaWVsZF0gPSBmaWVsZHNbZmllbGRdOwogICAgfQogIH07CgogIENhc3RNZWRpYVNpbmsudmFsaWRhdGUgPSBmdW5jdGlvbihtZXNzYWdlVmFsaWRhdG9yLCBvZmZzZXQpIHsKICAgIHZhciBlcnI7CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0SGVhZGVyKG9mZnNldCwgY29kZWMua1N0cnVjdEhlYWRlclNpemUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgdmFyIGtWZXJzaW9uU2l6ZXMgPSBbCiAgICAgIHt2ZXJzaW9uOiAwLCBudW1CeXRlczogMzJ9CiAgICBdOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFZlcnNpb24ob2Zmc2V0LCBrVmVyc2lvblNpemVzKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBDYXN0TWVkaWFTaW5rLmlwRW5kcG9pbnQKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RQb2ludGVyKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMCwgaXBfZW5kcG9pbnQkLklQRW5kUG9pbnQsIGZhbHNlKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBDYXN0TWVkaWFTaW5rLm1vZGVsTmFtZQogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cmluZ1BvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA4LCBmYWxzZSkKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICB9OwoKICBDYXN0TWVkaWFTaW5rLmVuY29kZWRTaXplID0gY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAyNDsKCiAgQ2FzdE1lZGlhU2luay5kZWNvZGUgPSBmdW5jdGlvbihkZWNvZGVyKSB7CiAgICB2YXIgcGFja2VkOwogICAgdmFyIHZhbCA9IG5ldyBDYXN0TWVkaWFTaW5rKCk7CiAgICB2YXIgbnVtYmVyT2ZCeXRlcyA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFyIHZlcnNpb24gPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhbC5pcEVuZHBvaW50ID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3RQb2ludGVyKGlwX2VuZHBvaW50JC5JUEVuZFBvaW50KTsKICAgIHZhbC5tb2RlbE5hbWUgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5TdHJpbmcpOwogICAgdmFsLmNhcGFiaWxpdGllcyA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLlVpbnQ4KTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIHZhbC5jYXN0Q2hhbm5lbElkID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuSW50MzIpOwogICAgcmV0dXJuIHZhbDsKICB9OwoKICBDYXN0TWVkaWFTaW5rLmVuY29kZSA9IGZ1bmN0aW9uKGVuY29kZXIsIHZhbCkgewogICAgdmFyIHBhY2tlZDsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoQ2FzdE1lZGlhU2luay5lbmNvZGVkU2l6ZSk7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKDApOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3RQb2ludGVyKGlwX2VuZHBvaW50JC5JUEVuZFBvaW50LCB2YWwuaXBFbmRwb2ludCk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5TdHJpbmcsIHZhbC5tb2RlbE5hbWUpOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuVWludDgsIHZhbC5jYXBhYmlsaXRpZXMpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuSW50MzIsIHZhbC5jYXN0Q2hhbm5lbElkKTsKICB9OwogIGZ1bmN0aW9uIE1lZGlhUm91dGUodmFsdWVzKSB7CiAgICB0aGlzLmluaXREZWZhdWx0c18oKTsKICAgIHRoaXMuaW5pdEZpZWxkc18odmFsdWVzKTsKICB9CgoKICBNZWRpYVJvdXRlLnByb3RvdHlwZS5pbml0RGVmYXVsdHNfID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLm1lZGlhUm91dGVJZCA9IG51bGw7CiAgICB0aGlzLnByZXNlbnRhdGlvbklkID0gbnVsbDsKICAgIHRoaXMubWVkaWFTb3VyY2UgPSBudWxsOwogICAgdGhpcy5tZWRpYVNpbmtJZCA9IG51bGw7CiAgICB0aGlzLmRlc2NyaXB0aW9uID0gbnVsbDsKICAgIHRoaXMuaXNMb2NhbCA9IGZhbHNlOwogICAgdGhpcy5mb3JEaXNwbGF5ID0gZmFsc2U7CiAgICB0aGlzLmlzSW5jb2duaXRvID0gZmFsc2U7CiAgICB0aGlzLmlzTG9jYWxQcmVzZW50YXRpb24gPSBmYWxzZTsKICAgIHRoaXMuY29udHJvbGxlclR5cGUgPSAwOwogIH07CiAgTWVkaWFSb3V0ZS5wcm90b3R5cGUuaW5pdEZpZWxkc18gPSBmdW5jdGlvbihmaWVsZHMpIHsKICAgIGZvcih2YXIgZmllbGQgaW4gZmllbGRzKSB7CiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoZmllbGQpKQogICAgICAgICAgdGhpc1tmaWVsZF0gPSBmaWVsZHNbZmllbGRdOwogICAgfQogIH07CgogIE1lZGlhUm91dGUudmFsaWRhdGUgPSBmdW5jdGlvbihtZXNzYWdlVmFsaWRhdG9yLCBvZmZzZXQpIHsKICAgIHZhciBlcnI7CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0SGVhZGVyKG9mZnNldCwgY29kZWMua1N0cnVjdEhlYWRlclNpemUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgdmFyIGtWZXJzaW9uU2l6ZXMgPSBbCiAgICAgIHt2ZXJzaW9uOiAwLCBudW1CeXRlczogNTZ9CiAgICBdOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFZlcnNpb24ob2Zmc2V0LCBrVmVyc2lvblNpemVzKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVJvdXRlLm1lZGlhUm91dGVJZAogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cmluZ1BvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAwLCBmYWxzZSkKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVJvdXRlLnByZXNlbnRhdGlvbklkCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nUG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDgsIGZhbHNlKQogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhUm91dGUubWVkaWFTb3VyY2UKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJpbmdQb2ludGVyKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMTYsIHRydWUpCiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFSb3V0ZS5tZWRpYVNpbmtJZAogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cmluZ1BvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAyNCwgZmFsc2UpCiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFSb3V0ZS5kZXNjcmlwdGlvbgogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cmluZ1BvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAzMiwgZmFsc2UpCiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhUm91dGUuY29udHJvbGxlclR5cGUKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVFbnVtKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgNDQsIFJvdXRlQ29udHJvbGxlclR5cGUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKCgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICB9OwoKICBNZWRpYVJvdXRlLmVuY29kZWRTaXplID0gY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA0ODsKCiAgTWVkaWFSb3V0ZS5kZWNvZGUgPSBmdW5jdGlvbihkZWNvZGVyKSB7CiAgICB2YXIgcGFja2VkOwogICAgdmFyIHZhbCA9IG5ldyBNZWRpYVJvdXRlKCk7CiAgICB2YXIgbnVtYmVyT2ZCeXRlcyA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFyIHZlcnNpb24gPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhbC5tZWRpYVJvdXRlSWQgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5TdHJpbmcpOwogICAgdmFsLnByZXNlbnRhdGlvbklkID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nKTsKICAgIHZhbC5tZWRpYVNvdXJjZSA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLk51bGxhYmxlU3RyaW5nKTsKICAgIHZhbC5tZWRpYVNpbmtJZCA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLlN0cmluZyk7CiAgICB2YWwuZGVzY3JpcHRpb24gPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5TdHJpbmcpOwogICAgcGFja2VkID0gZGVjb2Rlci5yZWFkVWludDgoKTsKICAgIHZhbC5pc0xvY2FsID0gKHBhY2tlZCA+PiAwKSAmIDEgPyB0cnVlIDogZmFsc2U7CiAgICB2YWwuZm9yRGlzcGxheSA9IChwYWNrZWQgPj4gMSkgJiAxID8gdHJ1ZSA6IGZhbHNlOwogICAgdmFsLmlzSW5jb2duaXRvID0gKHBhY2tlZCA+PiAyKSAmIDEgPyB0cnVlIDogZmFsc2U7CiAgICB2YWwuaXNMb2NhbFByZXNlbnRhdGlvbiA9IChwYWNrZWQgPj4gMykgJiAxID8gdHJ1ZSA6IGZhbHNlOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgdmFsLmNvbnRyb2xsZXJUeXBlID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuSW50MzIpOwogICAgcmV0dXJuIHZhbDsKICB9OwoKICBNZWRpYVJvdXRlLmVuY29kZSA9IGZ1bmN0aW9uKGVuY29kZXIsIHZhbCkgewogICAgdmFyIHBhY2tlZDsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoTWVkaWFSb3V0ZS5lbmNvZGVkU2l6ZSk7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKDApOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nLCB2YWwubWVkaWFSb3V0ZUlkKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLlN0cmluZywgdmFsLnByZXNlbnRhdGlvbklkKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLk51bGxhYmxlU3RyaW5nLCB2YWwubWVkaWFTb3VyY2UpOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nLCB2YWwubWVkaWFTaW5rSWQpOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nLCB2YWwuZGVzY3JpcHRpb24pOwogICAgcGFja2VkID0gMDsKICAgIHBhY2tlZCB8PSAodmFsLmlzTG9jYWwgJiAxKSA8PCAwCiAgICBwYWNrZWQgfD0gKHZhbC5mb3JEaXNwbGF5ICYgMSkgPDwgMQogICAgcGFja2VkIHw9ICh2YWwuaXNJbmNvZ25pdG8gJiAxKSA8PCAyCiAgICBwYWNrZWQgfD0gKHZhbC5pc0xvY2FsUHJlc2VudGF0aW9uICYgMSkgPDwgMwogICAgZW5jb2Rlci53cml0ZVVpbnQ4KHBhY2tlZCk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5JbnQzMiwgdmFsLmNvbnRyb2xsZXJUeXBlKTsKICB9OwogIGZ1bmN0aW9uIElzc3VlKHZhbHVlcykgewogICAgdGhpcy5pbml0RGVmYXVsdHNfKCk7CiAgICB0aGlzLmluaXRGaWVsZHNfKHZhbHVlcyk7CiAgfQoKICBJc3N1ZS5TZXZlcml0eSA9IHt9OwogIElzc3VlLlNldmVyaXR5LkZBVEFMID0gMDsKICBJc3N1ZS5TZXZlcml0eS5XQVJOSU5HID0gSXNzdWUuU2V2ZXJpdHkuRkFUQUwgKyAxOwogIElzc3VlLlNldmVyaXR5Lk5PVElGSUNBVElPTiA9IElzc3VlLlNldmVyaXR5LldBUk5JTkcgKyAxOwoKICBJc3N1ZS5TZXZlcml0eS5pc0tub3duRW51bVZhbHVlID0gZnVuY3Rpb24odmFsdWUpIHsKICAgIHN3aXRjaCAodmFsdWUpIHsKICAgIGNhc2UgMDoKICAgIGNhc2UgMToKICAgIGNhc2UgMjoKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfTsKCiAgSXNzdWUuU2V2ZXJpdHkudmFsaWRhdGUgPSBmdW5jdGlvbihlbnVtVmFsdWUpIHsKICAgIHZhciBpc0V4dGVuc2libGUgPSBmYWxzZTsKICAgIGlmIChpc0V4dGVuc2libGUgfHwgdGhpcy5pc0tub3duRW51bVZhbHVlKGVudW1WYWx1ZSkpCiAgICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuVU5LTk9XTl9FTlVNX1ZBTFVFOwogIH07CiAgSXNzdWUuQWN0aW9uVHlwZSA9IHt9OwogIElzc3VlLkFjdGlvblR5cGUuRElTTUlTUyA9IDA7CiAgSXNzdWUuQWN0aW9uVHlwZS5MRUFSTl9NT1JFID0gSXNzdWUuQWN0aW9uVHlwZS5ESVNNSVNTICsgMTsKCiAgSXNzdWUuQWN0aW9uVHlwZS5pc0tub3duRW51bVZhbHVlID0gZnVuY3Rpb24odmFsdWUpIHsKICAgIHN3aXRjaCAodmFsdWUpIHsKICAgIGNhc2UgMDoKICAgIGNhc2UgMToKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfTsKCiAgSXNzdWUuQWN0aW9uVHlwZS52YWxpZGF0ZSA9IGZ1bmN0aW9uKGVudW1WYWx1ZSkgewogICAgdmFyIGlzRXh0ZW5zaWJsZSA9IGZhbHNlOwogICAgaWYgKGlzRXh0ZW5zaWJsZSB8fCB0aGlzLmlzS25vd25FbnVtVmFsdWUoZW51bVZhbHVlKSkKICAgICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKCiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5VTktOT1dOX0VOVU1fVkFMVUU7CiAgfTsKCiAgSXNzdWUucHJvdG90eXBlLmluaXREZWZhdWx0c18gPSBmdW5jdGlvbigpIHsKICAgIHRoaXMucm91dGVJZCA9IG51bGw7CiAgICB0aGlzLnNldmVyaXR5ID0gMDsKICAgIHRoaXMuaXNCbG9ja2luZyA9IGZhbHNlOwogICAgdGhpcy50aXRsZSA9IG51bGw7CiAgICB0aGlzLm1lc3NhZ2UgPSBudWxsOwogICAgdGhpcy5kZWZhdWx0QWN0aW9uID0gMDsKICAgIHRoaXMuaGVscFBhZ2VJZCA9IDA7CiAgICB0aGlzLnNlY29uZGFyeUFjdGlvbnMgPSBudWxsOwogIH07CiAgSXNzdWUucHJvdG90eXBlLmluaXRGaWVsZHNfID0gZnVuY3Rpb24oZmllbGRzKSB7CiAgICBmb3IodmFyIGZpZWxkIGluIGZpZWxkcykgewogICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGZpZWxkKSkKICAgICAgICAgIHRoaXNbZmllbGRdID0gZmllbGRzW2ZpZWxkXTsKICAgIH0KICB9OwoKICBJc3N1ZS52YWxpZGF0ZSA9IGZ1bmN0aW9uKG1lc3NhZ2VWYWxpZGF0b3IsIG9mZnNldCkgewogICAgdmFyIGVycjsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RIZWFkZXIob2Zmc2V0LCBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICB2YXIga1ZlcnNpb25TaXplcyA9IFsKICAgICAge3ZlcnNpb246IDAsIG51bUJ5dGVzOiA1Nn0KICAgIF07CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0VmVyc2lvbihvZmZzZXQsIGtWZXJzaW9uU2l6ZXMpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIElzc3VlLnJvdXRlSWQKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJpbmdQb2ludGVyKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMCwgdHJ1ZSkKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBJc3N1ZS5zZXZlcml0eQogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZUVudW0ob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA4LCBJc3N1ZS5TZXZlcml0eSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgoKICAgIC8vIHZhbGlkYXRlIElzc3VlLnRpdGxlCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nUG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDE2LCBmYWxzZSkKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBJc3N1ZS5tZXNzYWdlCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nUG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDI0LCB0cnVlKQogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIElzc3VlLmRlZmF1bHRBY3Rpb24KICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVFbnVtKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMzIsIElzc3VlLkFjdGlvblR5cGUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIElzc3VlLnNlY29uZGFyeUFjdGlvbnMKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVBcnJheVBvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA0MCwgNCwgbmV3IGNvZGVjLkVudW0oSXNzdWUuQWN0aW9uVHlwZSksIGZhbHNlLCBbMF0sIDApOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CiAgfTsKCiAgSXNzdWUuZW5jb2RlZFNpemUgPSBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDQ4OwoKICBJc3N1ZS5kZWNvZGUgPSBmdW5jdGlvbihkZWNvZGVyKSB7CiAgICB2YXIgcGFja2VkOwogICAgdmFyIHZhbCA9IG5ldyBJc3N1ZSgpOwogICAgdmFyIG51bWJlck9mQnl0ZXMgPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhciB2ZXJzaW9uID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YWwucm91dGVJZCA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLk51bGxhYmxlU3RyaW5nKTsKICAgIHZhbC5zZXZlcml0eSA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLkludDMyKTsKICAgIHBhY2tlZCA9IGRlY29kZXIucmVhZFVpbnQ4KCk7CiAgICB2YWwuaXNCbG9ja2luZyA9IChwYWNrZWQgPj4gMCkgJiAxID8gdHJ1ZSA6IGZhbHNlOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgdmFsLnRpdGxlID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nKTsKICAgIHZhbC5tZXNzYWdlID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuTnVsbGFibGVTdHJpbmcpOwogICAgdmFsLmRlZmF1bHRBY3Rpb24gPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5JbnQzMik7CiAgICB2YWwuaGVscFBhZ2VJZCA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLkludDMyKTsKICAgIHZhbC5zZWNvbmRhcnlBY3Rpb25zID0gZGVjb2Rlci5kZWNvZGVBcnJheVBvaW50ZXIobmV3IGNvZGVjLkVudW0oSXNzdWUuQWN0aW9uVHlwZSkpOwogICAgcmV0dXJuIHZhbDsKICB9OwoKICBJc3N1ZS5lbmNvZGUgPSBmdW5jdGlvbihlbmNvZGVyLCB2YWwpIHsKICAgIHZhciBwYWNrZWQ7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKElzc3VlLmVuY29kZWRTaXplKTsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoMCk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5OdWxsYWJsZVN0cmluZywgdmFsLnJvdXRlSWQpOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuSW50MzIsIHZhbC5zZXZlcml0eSk7CiAgICBwYWNrZWQgPSAwOwogICAgcGFja2VkIHw9ICh2YWwuaXNCbG9ja2luZyAmIDEpIDw8IDAKICAgIGVuY29kZXIud3JpdGVVaW50OChwYWNrZWQpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nLCB2YWwudGl0bGUpOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuTnVsbGFibGVTdHJpbmcsIHZhbC5tZXNzYWdlKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLkludDMyLCB2YWwuZGVmYXVsdEFjdGlvbik7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5JbnQzMiwgdmFsLmhlbHBQYWdlSWQpOwogICAgZW5jb2Rlci5lbmNvZGVBcnJheVBvaW50ZXIobmV3IGNvZGVjLkVudW0oSXNzdWUuQWN0aW9uVHlwZSksIHZhbC5zZWNvbmRhcnlBY3Rpb25zKTsKICB9OwogIGZ1bmN0aW9uIFJvdXRlTWVzc2FnZSh2YWx1ZXMpIHsKICAgIHRoaXMuaW5pdERlZmF1bHRzXygpOwogICAgdGhpcy5pbml0RmllbGRzXyh2YWx1ZXMpOwogIH0KCiAgUm91dGVNZXNzYWdlLlR5cGUgPSB7fTsKICBSb3V0ZU1lc3NhZ2UuVHlwZS5URVhUID0gMDsKICBSb3V0ZU1lc3NhZ2UuVHlwZS5CSU5BUlkgPSBSb3V0ZU1lc3NhZ2UuVHlwZS5URVhUICsgMTsKCiAgUm91dGVNZXNzYWdlLlR5cGUuaXNLbm93bkVudW1WYWx1ZSA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICBzd2l0Y2ggKHZhbHVlKSB7CiAgICBjYXNlIDA6CiAgICBjYXNlIDE6CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH07CgogIFJvdXRlTWVzc2FnZS5UeXBlLnZhbGlkYXRlID0gZnVuY3Rpb24oZW51bVZhbHVlKSB7CiAgICB2YXIgaXNFeHRlbnNpYmxlID0gZmFsc2U7CiAgICBpZiAoaXNFeHRlbnNpYmxlIHx8IHRoaXMuaXNLbm93bkVudW1WYWx1ZShlbnVtVmFsdWUpKQogICAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLlVOS05PV05fRU5VTV9WQUxVRTsKICB9OwoKICBSb3V0ZU1lc3NhZ2UucHJvdG90eXBlLmluaXREZWZhdWx0c18gPSBmdW5jdGlvbigpIHsKICAgIHRoaXMudHlwZSA9IDA7CiAgICB0aGlzLm1lc3NhZ2UgPSBudWxsOwogICAgdGhpcy5kYXRhID0gbnVsbDsKICB9OwogIFJvdXRlTWVzc2FnZS5wcm90b3R5cGUuaW5pdEZpZWxkc18gPSBmdW5jdGlvbihmaWVsZHMpIHsKICAgIGZvcih2YXIgZmllbGQgaW4gZmllbGRzKSB7CiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoZmllbGQpKQogICAgICAgICAgdGhpc1tmaWVsZF0gPSBmaWVsZHNbZmllbGRdOwogICAgfQogIH07CgogIFJvdXRlTWVzc2FnZS52YWxpZGF0ZSA9IGZ1bmN0aW9uKG1lc3NhZ2VWYWxpZGF0b3IsIG9mZnNldCkgewogICAgdmFyIGVycjsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RIZWFkZXIob2Zmc2V0LCBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICB2YXIga1ZlcnNpb25TaXplcyA9IFsKICAgICAge3ZlcnNpb246IDAsIG51bUJ5dGVzOiAzMn0KICAgIF07CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0VmVyc2lvbihvZmZzZXQsIGtWZXJzaW9uU2l6ZXMpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIFJvdXRlTWVzc2FnZS50eXBlCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlRW51bShvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDAsIFJvdXRlTWVzc2FnZS5UeXBlKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBSb3V0ZU1lc3NhZ2UubWVzc2FnZQogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cmluZ1BvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA4LCB0cnVlKQogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIFJvdXRlTWVzc2FnZS5kYXRhCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlQXJyYXlQb2ludGVyKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMTYsIDEsIGNvZGVjLlVpbnQ4LCB0cnVlLCBbMF0sIDApOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICB9OwoKICBSb3V0ZU1lc3NhZ2UuZW5jb2RlZFNpemUgPSBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDI0OwoKICBSb3V0ZU1lc3NhZ2UuZGVjb2RlID0gZnVuY3Rpb24oZGVjb2RlcikgewogICAgdmFyIHBhY2tlZDsKICAgIHZhciB2YWwgPSBuZXcgUm91dGVNZXNzYWdlKCk7CiAgICB2YXIgbnVtYmVyT2ZCeXRlcyA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFyIHZlcnNpb24gPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhbC50eXBlID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuSW50MzIpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgdmFsLm1lc3NhZ2UgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5OdWxsYWJsZVN0cmluZyk7CiAgICB2YWwuZGF0YSA9IGRlY29kZXIuZGVjb2RlQXJyYXlQb2ludGVyKGNvZGVjLlVpbnQ4KTsKICAgIHJldHVybiB2YWw7CiAgfTsKCiAgUm91dGVNZXNzYWdlLmVuY29kZSA9IGZ1bmN0aW9uKGVuY29kZXIsIHZhbCkgewogICAgdmFyIHBhY2tlZDsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoUm91dGVNZXNzYWdlLmVuY29kZWRTaXplKTsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoMCk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5JbnQzMiwgdmFsLnR5cGUpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuTnVsbGFibGVTdHJpbmcsIHZhbC5tZXNzYWdlKTsKICAgIGVuY29kZXIuZW5jb2RlQXJyYXlQb2ludGVyKGNvZGVjLlVpbnQ4LCB2YWwuZGF0YSk7CiAgfTsKICBmdW5jdGlvbiBTaW5rU2VhcmNoQ3JpdGVyaWEodmFsdWVzKSB7CiAgICB0aGlzLmluaXREZWZhdWx0c18oKTsKICAgIHRoaXMuaW5pdEZpZWxkc18odmFsdWVzKTsKICB9CgoKICBTaW5rU2VhcmNoQ3JpdGVyaWEucHJvdG90eXBlLmluaXREZWZhdWx0c18gPSBmdW5jdGlvbigpIHsKICAgIHRoaXMuaW5wdXQgPSBudWxsOwogICAgdGhpcy5kb21haW4gPSBudWxsOwogIH07CiAgU2lua1NlYXJjaENyaXRlcmlhLnByb3RvdHlwZS5pbml0RmllbGRzXyA9IGZ1bmN0aW9uKGZpZWxkcykgewogICAgZm9yKHZhciBmaWVsZCBpbiBmaWVsZHMpIHsKICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpCiAgICAgICAgICB0aGlzW2ZpZWxkXSA9IGZpZWxkc1tmaWVsZF07CiAgICB9CiAgfTsKCiAgU2lua1NlYXJjaENyaXRlcmlhLnZhbGlkYXRlID0gZnVuY3Rpb24obWVzc2FnZVZhbGlkYXRvciwgb2Zmc2V0KSB7CiAgICB2YXIgZXJyOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdEhlYWRlcihvZmZzZXQsIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHZhciBrVmVyc2lvblNpemVzID0gWwogICAgICB7dmVyc2lvbjogMCwgbnVtQnl0ZXM6IDI0fQogICAgXTsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RWZXJzaW9uKG9mZnNldCwga1ZlcnNpb25TaXplcyk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgU2lua1NlYXJjaENyaXRlcmlhLmlucHV0CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nUG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDAsIGZhbHNlKQogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIFNpbmtTZWFyY2hDcml0ZXJpYS5kb21haW4KICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJpbmdQb2ludGVyKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgOCwgZmFsc2UpCiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwogIH07CgogIFNpbmtTZWFyY2hDcml0ZXJpYS5lbmNvZGVkU2l6ZSA9IGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMTY7CgogIFNpbmtTZWFyY2hDcml0ZXJpYS5kZWNvZGUgPSBmdW5jdGlvbihkZWNvZGVyKSB7CiAgICB2YXIgcGFja2VkOwogICAgdmFyIHZhbCA9IG5ldyBTaW5rU2VhcmNoQ3JpdGVyaWEoKTsKICAgIHZhciBudW1iZXJPZkJ5dGVzID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YXIgdmVyc2lvbiA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFsLmlucHV0ID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nKTsKICAgIHZhbC5kb21haW4gPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5TdHJpbmcpOwogICAgcmV0dXJuIHZhbDsKICB9OwoKICBTaW5rU2VhcmNoQ3JpdGVyaWEuZW5jb2RlID0gZnVuY3Rpb24oZW5jb2RlciwgdmFsKSB7CiAgICB2YXIgcGFja2VkOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMihTaW5rU2VhcmNoQ3JpdGVyaWEuZW5jb2RlZFNpemUpOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMigwKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLlN0cmluZywgdmFsLmlucHV0KTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLlN0cmluZywgdmFsLmRvbWFpbik7CiAgfTsKICBmdW5jdGlvbiBNZWRpYVJvdXRlUHJvdmlkZXJDb25maWcodmFsdWVzKSB7CiAgICB0aGlzLmluaXREZWZhdWx0c18oKTsKICAgIHRoaXMuaW5pdEZpZWxkc18odmFsdWVzKTsKICB9CgoKICBNZWRpYVJvdXRlUHJvdmlkZXJDb25maWcucHJvdG90eXBlLmluaXREZWZhdWx0c18gPSBmdW5jdGlvbigpIHsKICAgIHRoaXMuZW5hYmxlRGlhbERpc2NvdmVyeSA9IGZhbHNlOwogICAgdGhpcy5lbmFibGVDYXN0RGlzY292ZXJ5ID0gZmFsc2U7CiAgfTsKICBNZWRpYVJvdXRlUHJvdmlkZXJDb25maWcucHJvdG90eXBlLmluaXRGaWVsZHNfID0gZnVuY3Rpb24oZmllbGRzKSB7CiAgICBmb3IodmFyIGZpZWxkIGluIGZpZWxkcykgewogICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGZpZWxkKSkKICAgICAgICAgIHRoaXNbZmllbGRdID0gZmllbGRzW2ZpZWxkXTsKICAgIH0KICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJDb25maWcudmFsaWRhdGUgPSBmdW5jdGlvbihtZXNzYWdlVmFsaWRhdG9yLCBvZmZzZXQpIHsKICAgIHZhciBlcnI7CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0SGVhZGVyKG9mZnNldCwgY29kZWMua1N0cnVjdEhlYWRlclNpemUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgdmFyIGtWZXJzaW9uU2l6ZXMgPSBbCiAgICAgIHt2ZXJzaW9uOiAwLCBudW1CeXRlczogMTZ9CiAgICBdOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFZlcnNpb24ob2Zmc2V0LCBrVmVyc2lvblNpemVzKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJDb25maWcuZW5jb2RlZFNpemUgPSBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDg7CgogIE1lZGlhUm91dGVQcm92aWRlckNvbmZpZy5kZWNvZGUgPSBmdW5jdGlvbihkZWNvZGVyKSB7CiAgICB2YXIgcGFja2VkOwogICAgdmFyIHZhbCA9IG5ldyBNZWRpYVJvdXRlUHJvdmlkZXJDb25maWcoKTsKICAgIHZhciBudW1iZXJPZkJ5dGVzID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YXIgdmVyc2lvbiA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgcGFja2VkID0gZGVjb2Rlci5yZWFkVWludDgoKTsKICAgIHZhbC5lbmFibGVEaWFsRGlzY292ZXJ5ID0gKHBhY2tlZCA+PiAwKSAmIDEgPyB0cnVlIDogZmFsc2U7CiAgICB2YWwuZW5hYmxlQ2FzdERpc2NvdmVyeSA9IChwYWNrZWQgPj4gMSkgJiAxID8gdHJ1ZSA6IGZhbHNlOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgcmV0dXJuIHZhbDsKICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJDb25maWcuZW5jb2RlID0gZnVuY3Rpb24oZW5jb2RlciwgdmFsKSB7CiAgICB2YXIgcGFja2VkOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMihNZWRpYVJvdXRlUHJvdmlkZXJDb25maWcuZW5jb2RlZFNpemUpOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMigwKTsKICAgIHBhY2tlZCA9IDA7CiAgICBwYWNrZWQgfD0gKHZhbC5lbmFibGVEaWFsRGlzY292ZXJ5ICYgMSkgPDwgMAogICAgcGFja2VkIHw9ICh2YWwuZW5hYmxlQ2FzdERpc2NvdmVyeSAmIDEpIDw8IDEKICAgIGVuY29kZXIud3JpdGVVaW50OChwYWNrZWQpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogIH07CiAgZnVuY3Rpb24gTWVkaWFSb3V0ZVByb3ZpZGVyX0NyZWF0ZVJvdXRlX1BhcmFtcyh2YWx1ZXMpIHsKICAgIHRoaXMuaW5pdERlZmF1bHRzXygpOwogICAgdGhpcy5pbml0RmllbGRzXyh2YWx1ZXMpOwogIH0KCgogIE1lZGlhUm91dGVQcm92aWRlcl9DcmVhdGVSb3V0ZV9QYXJhbXMucHJvdG90eXBlLmluaXREZWZhdWx0c18gPSBmdW5jdGlvbigpIHsKICAgIHRoaXMubWVkaWFTb3VyY2UgPSBudWxsOwogICAgdGhpcy5zaW5rSWQgPSBudWxsOwogICAgdGhpcy5vcmlnaW5hbFByZXNlbnRhdGlvbklkID0gbnVsbDsKICAgIHRoaXMub3JpZ2luID0gbnVsbDsKICAgIHRoaXMudGFiSWQgPSAwOwogICAgdGhpcy5pbmNvZ25pdG8gPSBmYWxzZTsKICAgIHRoaXMudGltZW91dCA9IG51bGw7CiAgfTsKICBNZWRpYVJvdXRlUHJvdmlkZXJfQ3JlYXRlUm91dGVfUGFyYW1zLnByb3RvdHlwZS5pbml0RmllbGRzXyA9IGZ1bmN0aW9uKGZpZWxkcykgewogICAgZm9yKHZhciBmaWVsZCBpbiBmaWVsZHMpIHsKICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpCiAgICAgICAgICB0aGlzW2ZpZWxkXSA9IGZpZWxkc1tmaWVsZF07CiAgICB9CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX0NyZWF0ZVJvdXRlX1BhcmFtcy52YWxpZGF0ZSA9IGZ1bmN0aW9uKG1lc3NhZ2VWYWxpZGF0b3IsIG9mZnNldCkgewogICAgdmFyIGVycjsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RIZWFkZXIob2Zmc2V0LCBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICB2YXIga1ZlcnNpb25TaXplcyA9IFsKICAgICAge3ZlcnNpb246IDAsIG51bUJ5dGVzOiA1Nn0KICAgIF07CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0VmVyc2lvbihvZmZzZXQsIGtWZXJzaW9uU2l6ZXMpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhUm91dGVQcm92aWRlcl9DcmVhdGVSb3V0ZV9QYXJhbXMubWVkaWFTb3VyY2UKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJpbmdQb2ludGVyKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMCwgZmFsc2UpCiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFSb3V0ZVByb3ZpZGVyX0NyZWF0ZVJvdXRlX1BhcmFtcy5zaW5rSWQKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJpbmdQb2ludGVyKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgOCwgZmFsc2UpCiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFSb3V0ZVByb3ZpZGVyX0NyZWF0ZVJvdXRlX1BhcmFtcy5vcmlnaW5hbFByZXNlbnRhdGlvbklkCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nUG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDE2LCBmYWxzZSkKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVJvdXRlUHJvdmlkZXJfQ3JlYXRlUm91dGVfUGFyYW1zLm9yaWdpbgogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFBvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAyNCwgb3JpZ2luJC5PcmlnaW4sIGZhbHNlKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFSb3V0ZVByb3ZpZGVyX0NyZWF0ZVJvdXRlX1BhcmFtcy50aW1lb3V0CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0UG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDQwLCB0aW1lJC5UaW1lRGVsdGEsIGZhbHNlKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwogIH07CgogIE1lZGlhUm91dGVQcm92aWRlcl9DcmVhdGVSb3V0ZV9QYXJhbXMuZW5jb2RlZFNpemUgPSBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDQ4OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfQ3JlYXRlUm91dGVfUGFyYW1zLmRlY29kZSA9IGZ1bmN0aW9uKGRlY29kZXIpIHsKICAgIHZhciBwYWNrZWQ7CiAgICB2YXIgdmFsID0gbmV3IE1lZGlhUm91dGVQcm92aWRlcl9DcmVhdGVSb3V0ZV9QYXJhbXMoKTsKICAgIHZhciBudW1iZXJPZkJ5dGVzID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YXIgdmVyc2lvbiA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFsLm1lZGlhU291cmNlID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nKTsKICAgIHZhbC5zaW5rSWQgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5TdHJpbmcpOwogICAgdmFsLm9yaWdpbmFsUHJlc2VudGF0aW9uSWQgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5TdHJpbmcpOwogICAgdmFsLm9yaWdpbiA9IGRlY29kZXIuZGVjb2RlU3RydWN0UG9pbnRlcihvcmlnaW4kLk9yaWdpbik7CiAgICB2YWwudGFiSWQgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5JbnQzMik7CiAgICBwYWNrZWQgPSBkZWNvZGVyLnJlYWRVaW50OCgpOwogICAgdmFsLmluY29nbml0byA9IChwYWNrZWQgPj4gMCkgJiAxID8gdHJ1ZSA6IGZhbHNlOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgdmFsLnRpbWVvdXQgPSBkZWNvZGVyLmRlY29kZVN0cnVjdFBvaW50ZXIodGltZSQuVGltZURlbHRhKTsKICAgIHJldHVybiB2YWw7CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX0NyZWF0ZVJvdXRlX1BhcmFtcy5lbmNvZGUgPSBmdW5jdGlvbihlbmNvZGVyLCB2YWwpIHsKICAgIHZhciBwYWNrZWQ7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKE1lZGlhUm91dGVQcm92aWRlcl9DcmVhdGVSb3V0ZV9QYXJhbXMuZW5jb2RlZFNpemUpOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMigwKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLlN0cmluZywgdmFsLm1lZGlhU291cmNlKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLlN0cmluZywgdmFsLnNpbmtJZCk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5TdHJpbmcsIHZhbC5vcmlnaW5hbFByZXNlbnRhdGlvbklkKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0UG9pbnRlcihvcmlnaW4kLk9yaWdpbiwgdmFsLm9yaWdpbik7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5JbnQzMiwgdmFsLnRhYklkKTsKICAgIHBhY2tlZCA9IDA7CiAgICBwYWNrZWQgfD0gKHZhbC5pbmNvZ25pdG8gJiAxKSA8PCAwCiAgICBlbmNvZGVyLndyaXRlVWludDgocGFja2VkKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0UG9pbnRlcih0aW1lJC5UaW1lRGVsdGEsIHZhbC50aW1lb3V0KTsKICB9OwogIGZ1bmN0aW9uIE1lZGlhUm91dGVQcm92aWRlcl9DcmVhdGVSb3V0ZV9SZXNwb25zZVBhcmFtcyh2YWx1ZXMpIHsKICAgIHRoaXMuaW5pdERlZmF1bHRzXygpOwogICAgdGhpcy5pbml0RmllbGRzXyh2YWx1ZXMpOwogIH0KCgogIE1lZGlhUm91dGVQcm92aWRlcl9DcmVhdGVSb3V0ZV9SZXNwb25zZVBhcmFtcy5wcm90b3R5cGUuaW5pdERlZmF1bHRzXyA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy5yb3V0ZSA9IG51bGw7CiAgICB0aGlzLmVycm9yVGV4dCA9IG51bGw7CiAgICB0aGlzLnJlc3VsdENvZGUgPSAwOwogIH07CiAgTWVkaWFSb3V0ZVByb3ZpZGVyX0NyZWF0ZVJvdXRlX1Jlc3BvbnNlUGFyYW1zLnByb3RvdHlwZS5pbml0RmllbGRzXyA9IGZ1bmN0aW9uKGZpZWxkcykgewogICAgZm9yKHZhciBmaWVsZCBpbiBmaWVsZHMpIHsKICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpCiAgICAgICAgICB0aGlzW2ZpZWxkXSA9IGZpZWxkc1tmaWVsZF07CiAgICB9CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX0NyZWF0ZVJvdXRlX1Jlc3BvbnNlUGFyYW1zLnZhbGlkYXRlID0gZnVuY3Rpb24obWVzc2FnZVZhbGlkYXRvciwgb2Zmc2V0KSB7CiAgICB2YXIgZXJyOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdEhlYWRlcihvZmZzZXQsIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHZhciBrVmVyc2lvblNpemVzID0gWwogICAgICB7dmVyc2lvbjogMCwgbnVtQnl0ZXM6IDMyfQogICAgXTsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RWZXJzaW9uKG9mZnNldCwga1ZlcnNpb25TaXplcyk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFSb3V0ZVByb3ZpZGVyX0NyZWF0ZVJvdXRlX1Jlc3BvbnNlUGFyYW1zLnJvdXRlCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0UG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDAsIE1lZGlhUm91dGUsIHRydWUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhUm91dGVQcm92aWRlcl9DcmVhdGVSb3V0ZV9SZXNwb25zZVBhcmFtcy5lcnJvclRleHQKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJpbmdQb2ludGVyKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgOCwgdHJ1ZSkKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVJvdXRlUHJvdmlkZXJfQ3JlYXRlUm91dGVfUmVzcG9uc2VQYXJhbXMucmVzdWx0Q29kZQogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZUVudW0ob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAxNiwgUm91dGVSZXF1ZXN0UmVzdWx0Q29kZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwogIH07CgogIE1lZGlhUm91dGVQcm92aWRlcl9DcmVhdGVSb3V0ZV9SZXNwb25zZVBhcmFtcy5lbmNvZGVkU2l6ZSA9IGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMjQ7CgogIE1lZGlhUm91dGVQcm92aWRlcl9DcmVhdGVSb3V0ZV9SZXNwb25zZVBhcmFtcy5kZWNvZGUgPSBmdW5jdGlvbihkZWNvZGVyKSB7CiAgICB2YXIgcGFja2VkOwogICAgdmFyIHZhbCA9IG5ldyBNZWRpYVJvdXRlUHJvdmlkZXJfQ3JlYXRlUm91dGVfUmVzcG9uc2VQYXJhbXMoKTsKICAgIHZhciBudW1iZXJPZkJ5dGVzID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YXIgdmVyc2lvbiA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFsLnJvdXRlID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3RQb2ludGVyKE1lZGlhUm91dGUpOwogICAgdmFsLmVycm9yVGV4dCA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLk51bGxhYmxlU3RyaW5nKTsKICAgIHZhbC5yZXN1bHRDb2RlID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuSW50MzIpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgcmV0dXJuIHZhbDsKICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfQ3JlYXRlUm91dGVfUmVzcG9uc2VQYXJhbXMuZW5jb2RlID0gZnVuY3Rpb24oZW5jb2RlciwgdmFsKSB7CiAgICB2YXIgcGFja2VkOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMihNZWRpYVJvdXRlUHJvdmlkZXJfQ3JlYXRlUm91dGVfUmVzcG9uc2VQYXJhbXMuZW5jb2RlZFNpemUpOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMigwKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0UG9pbnRlcihNZWRpYVJvdXRlLCB2YWwucm91dGUpOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuTnVsbGFibGVTdHJpbmcsIHZhbC5lcnJvclRleHQpOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuSW50MzIsIHZhbC5yZXN1bHRDb2RlKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICB9OwogIGZ1bmN0aW9uIE1lZGlhUm91dGVQcm92aWRlcl9Kb2luUm91dGVfUGFyYW1zKHZhbHVlcykgewogICAgdGhpcy5pbml0RGVmYXVsdHNfKCk7CiAgICB0aGlzLmluaXRGaWVsZHNfKHZhbHVlcyk7CiAgfQoKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX0pvaW5Sb3V0ZV9QYXJhbXMucHJvdG90eXBlLmluaXREZWZhdWx0c18gPSBmdW5jdGlvbigpIHsKICAgIHRoaXMubWVkaWFTb3VyY2UgPSBudWxsOwogICAgdGhpcy5wcmVzZW50YXRpb25JZCA9IG51bGw7CiAgICB0aGlzLm9yaWdpbiA9IG51bGw7CiAgICB0aGlzLnRhYklkID0gMDsKICAgIHRoaXMuaW5jb2duaXRvID0gZmFsc2U7CiAgICB0aGlzLnRpbWVvdXQgPSBudWxsOwogIH07CiAgTWVkaWFSb3V0ZVByb3ZpZGVyX0pvaW5Sb3V0ZV9QYXJhbXMucHJvdG90eXBlLmluaXRGaWVsZHNfID0gZnVuY3Rpb24oZmllbGRzKSB7CiAgICBmb3IodmFyIGZpZWxkIGluIGZpZWxkcykgewogICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGZpZWxkKSkKICAgICAgICAgIHRoaXNbZmllbGRdID0gZmllbGRzW2ZpZWxkXTsKICAgIH0KICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfSm9pblJvdXRlX1BhcmFtcy52YWxpZGF0ZSA9IGZ1bmN0aW9uKG1lc3NhZ2VWYWxpZGF0b3IsIG9mZnNldCkgewogICAgdmFyIGVycjsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RIZWFkZXIob2Zmc2V0LCBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICB2YXIga1ZlcnNpb25TaXplcyA9IFsKICAgICAge3ZlcnNpb246IDAsIG51bUJ5dGVzOiA0OH0KICAgIF07CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0VmVyc2lvbihvZmZzZXQsIGtWZXJzaW9uU2l6ZXMpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhUm91dGVQcm92aWRlcl9Kb2luUm91dGVfUGFyYW1zLm1lZGlhU291cmNlCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nUG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDAsIGZhbHNlKQogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhUm91dGVQcm92aWRlcl9Kb2luUm91dGVfUGFyYW1zLnByZXNlbnRhdGlvbklkCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nUG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDgsIGZhbHNlKQogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhUm91dGVQcm92aWRlcl9Kb2luUm91dGVfUGFyYW1zLm9yaWdpbgogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFBvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAxNiwgb3JpZ2luJC5PcmlnaW4sIGZhbHNlKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFSb3V0ZVByb3ZpZGVyX0pvaW5Sb3V0ZV9QYXJhbXMudGltZW91dAogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFBvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAzMiwgdGltZSQuVGltZURlbHRhLCBmYWxzZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfSm9pblJvdXRlX1BhcmFtcy5lbmNvZGVkU2l6ZSA9IGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgNDA7CgogIE1lZGlhUm91dGVQcm92aWRlcl9Kb2luUm91dGVfUGFyYW1zLmRlY29kZSA9IGZ1bmN0aW9uKGRlY29kZXIpIHsKICAgIHZhciBwYWNrZWQ7CiAgICB2YXIgdmFsID0gbmV3IE1lZGlhUm91dGVQcm92aWRlcl9Kb2luUm91dGVfUGFyYW1zKCk7CiAgICB2YXIgbnVtYmVyT2ZCeXRlcyA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFyIHZlcnNpb24gPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhbC5tZWRpYVNvdXJjZSA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLlN0cmluZyk7CiAgICB2YWwucHJlc2VudGF0aW9uSWQgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5TdHJpbmcpOwogICAgdmFsLm9yaWdpbiA9IGRlY29kZXIuZGVjb2RlU3RydWN0UG9pbnRlcihvcmlnaW4kLk9yaWdpbik7CiAgICB2YWwudGFiSWQgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5JbnQzMik7CiAgICBwYWNrZWQgPSBkZWNvZGVyLnJlYWRVaW50OCgpOwogICAgdmFsLmluY29nbml0byA9IChwYWNrZWQgPj4gMCkgJiAxID8gdHJ1ZSA6IGZhbHNlOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgdmFsLnRpbWVvdXQgPSBkZWNvZGVyLmRlY29kZVN0cnVjdFBvaW50ZXIodGltZSQuVGltZURlbHRhKTsKICAgIHJldHVybiB2YWw7CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX0pvaW5Sb3V0ZV9QYXJhbXMuZW5jb2RlID0gZnVuY3Rpb24oZW5jb2RlciwgdmFsKSB7CiAgICB2YXIgcGFja2VkOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMihNZWRpYVJvdXRlUHJvdmlkZXJfSm9pblJvdXRlX1BhcmFtcy5lbmNvZGVkU2l6ZSk7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKDApOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nLCB2YWwubWVkaWFTb3VyY2UpOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nLCB2YWwucHJlc2VudGF0aW9uSWQpOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3RQb2ludGVyKG9yaWdpbiQuT3JpZ2luLCB2YWwub3JpZ2luKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLkludDMyLCB2YWwudGFiSWQpOwogICAgcGFja2VkID0gMDsKICAgIHBhY2tlZCB8PSAodmFsLmluY29nbml0byAmIDEpIDw8IDAKICAgIGVuY29kZXIud3JpdGVVaW50OChwYWNrZWQpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3RQb2ludGVyKHRpbWUkLlRpbWVEZWx0YSwgdmFsLnRpbWVvdXQpOwogIH07CiAgZnVuY3Rpb24gTWVkaWFSb3V0ZVByb3ZpZGVyX0pvaW5Sb3V0ZV9SZXNwb25zZVBhcmFtcyh2YWx1ZXMpIHsKICAgIHRoaXMuaW5pdERlZmF1bHRzXygpOwogICAgdGhpcy5pbml0RmllbGRzXyh2YWx1ZXMpOwogIH0KCgogIE1lZGlhUm91dGVQcm92aWRlcl9Kb2luUm91dGVfUmVzcG9uc2VQYXJhbXMucHJvdG90eXBlLmluaXREZWZhdWx0c18gPSBmdW5jdGlvbigpIHsKICAgIHRoaXMucm91dGUgPSBudWxsOwogICAgdGhpcy5lcnJvclRleHQgPSBudWxsOwogICAgdGhpcy5yZXN1bHRDb2RlID0gMDsKICB9OwogIE1lZGlhUm91dGVQcm92aWRlcl9Kb2luUm91dGVfUmVzcG9uc2VQYXJhbXMucHJvdG90eXBlLmluaXRGaWVsZHNfID0gZnVuY3Rpb24oZmllbGRzKSB7CiAgICBmb3IodmFyIGZpZWxkIGluIGZpZWxkcykgewogICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGZpZWxkKSkKICAgICAgICAgIHRoaXNbZmllbGRdID0gZmllbGRzW2ZpZWxkXTsKICAgIH0KICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfSm9pblJvdXRlX1Jlc3BvbnNlUGFyYW1zLnZhbGlkYXRlID0gZnVuY3Rpb24obWVzc2FnZVZhbGlkYXRvciwgb2Zmc2V0KSB7CiAgICB2YXIgZXJyOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdEhlYWRlcihvZmZzZXQsIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHZhciBrVmVyc2lvblNpemVzID0gWwogICAgICB7dmVyc2lvbjogMCwgbnVtQnl0ZXM6IDMyfQogICAgXTsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RWZXJzaW9uKG9mZnNldCwga1ZlcnNpb25TaXplcyk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFSb3V0ZVByb3ZpZGVyX0pvaW5Sb3V0ZV9SZXNwb25zZVBhcmFtcy5yb3V0ZQogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFBvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAwLCBNZWRpYVJvdXRlLCB0cnVlKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVJvdXRlUHJvdmlkZXJfSm9pblJvdXRlX1Jlc3BvbnNlUGFyYW1zLmVycm9yVGV4dAogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cmluZ1BvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA4LCB0cnVlKQogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhUm91dGVQcm92aWRlcl9Kb2luUm91dGVfUmVzcG9uc2VQYXJhbXMucmVzdWx0Q29kZQogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZUVudW0ob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAxNiwgUm91dGVSZXF1ZXN0UmVzdWx0Q29kZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwogIH07CgogIE1lZGlhUm91dGVQcm92aWRlcl9Kb2luUm91dGVfUmVzcG9uc2VQYXJhbXMuZW5jb2RlZFNpemUgPSBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDI0OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfSm9pblJvdXRlX1Jlc3BvbnNlUGFyYW1zLmRlY29kZSA9IGZ1bmN0aW9uKGRlY29kZXIpIHsKICAgIHZhciBwYWNrZWQ7CiAgICB2YXIgdmFsID0gbmV3IE1lZGlhUm91dGVQcm92aWRlcl9Kb2luUm91dGVfUmVzcG9uc2VQYXJhbXMoKTsKICAgIHZhciBudW1iZXJPZkJ5dGVzID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YXIgdmVyc2lvbiA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFsLnJvdXRlID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3RQb2ludGVyKE1lZGlhUm91dGUpOwogICAgdmFsLmVycm9yVGV4dCA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLk51bGxhYmxlU3RyaW5nKTsKICAgIHZhbC5yZXN1bHRDb2RlID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuSW50MzIpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgcmV0dXJuIHZhbDsKICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfSm9pblJvdXRlX1Jlc3BvbnNlUGFyYW1zLmVuY29kZSA9IGZ1bmN0aW9uKGVuY29kZXIsIHZhbCkgewogICAgdmFyIHBhY2tlZDsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoTWVkaWFSb3V0ZVByb3ZpZGVyX0pvaW5Sb3V0ZV9SZXNwb25zZVBhcmFtcy5lbmNvZGVkU2l6ZSk7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKDApOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3RQb2ludGVyKE1lZGlhUm91dGUsIHZhbC5yb3V0ZSk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5OdWxsYWJsZVN0cmluZywgdmFsLmVycm9yVGV4dCk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5JbnQzMiwgdmFsLnJlc3VsdENvZGUpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogIH07CiAgZnVuY3Rpb24gTWVkaWFSb3V0ZVByb3ZpZGVyX0Nvbm5lY3RSb3V0ZUJ5Um91dGVJZF9QYXJhbXModmFsdWVzKSB7CiAgICB0aGlzLmluaXREZWZhdWx0c18oKTsKICAgIHRoaXMuaW5pdEZpZWxkc18odmFsdWVzKTsKICB9CgoKICBNZWRpYVJvdXRlUHJvdmlkZXJfQ29ubmVjdFJvdXRlQnlSb3V0ZUlkX1BhcmFtcy5wcm90b3R5cGUuaW5pdERlZmF1bHRzXyA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy5tZWRpYVNvdXJjZSA9IG51bGw7CiAgICB0aGlzLnJvdXRlSWQgPSBudWxsOwogICAgdGhpcy5wcmVzZW50YXRpb25JZCA9IG51bGw7CiAgICB0aGlzLm9yaWdpbiA9IG51bGw7CiAgICB0aGlzLnRhYklkID0gMDsKICAgIHRoaXMuaW5jb2duaXRvID0gZmFsc2U7CiAgICB0aGlzLnRpbWVvdXQgPSBudWxsOwogIH07CiAgTWVkaWFSb3V0ZVByb3ZpZGVyX0Nvbm5lY3RSb3V0ZUJ5Um91dGVJZF9QYXJhbXMucHJvdG90eXBlLmluaXRGaWVsZHNfID0gZnVuY3Rpb24oZmllbGRzKSB7CiAgICBmb3IodmFyIGZpZWxkIGluIGZpZWxkcykgewogICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGZpZWxkKSkKICAgICAgICAgIHRoaXNbZmllbGRdID0gZmllbGRzW2ZpZWxkXTsKICAgIH0KICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfQ29ubmVjdFJvdXRlQnlSb3V0ZUlkX1BhcmFtcy52YWxpZGF0ZSA9IGZ1bmN0aW9uKG1lc3NhZ2VWYWxpZGF0b3IsIG9mZnNldCkgewogICAgdmFyIGVycjsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RIZWFkZXIob2Zmc2V0LCBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICB2YXIga1ZlcnNpb25TaXplcyA9IFsKICAgICAge3ZlcnNpb246IDAsIG51bUJ5dGVzOiA1Nn0KICAgIF07CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0VmVyc2lvbihvZmZzZXQsIGtWZXJzaW9uU2l6ZXMpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhUm91dGVQcm92aWRlcl9Db25uZWN0Um91dGVCeVJvdXRlSWRfUGFyYW1zLm1lZGlhU291cmNlCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nUG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDAsIGZhbHNlKQogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhUm91dGVQcm92aWRlcl9Db25uZWN0Um91dGVCeVJvdXRlSWRfUGFyYW1zLnJvdXRlSWQKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJpbmdQb2ludGVyKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgOCwgZmFsc2UpCiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFSb3V0ZVByb3ZpZGVyX0Nvbm5lY3RSb3V0ZUJ5Um91dGVJZF9QYXJhbXMucHJlc2VudGF0aW9uSWQKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJpbmdQb2ludGVyKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMTYsIGZhbHNlKQogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhUm91dGVQcm92aWRlcl9Db25uZWN0Um91dGVCeVJvdXRlSWRfUGFyYW1zLm9yaWdpbgogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFBvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAyNCwgb3JpZ2luJC5PcmlnaW4sIGZhbHNlKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFSb3V0ZVByb3ZpZGVyX0Nvbm5lY3RSb3V0ZUJ5Um91dGVJZF9QYXJhbXMudGltZW91dAogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFBvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA0MCwgdGltZSQuVGltZURlbHRhLCBmYWxzZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfQ29ubmVjdFJvdXRlQnlSb3V0ZUlkX1BhcmFtcy5lbmNvZGVkU2l6ZSA9IGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgNDg7CgogIE1lZGlhUm91dGVQcm92aWRlcl9Db25uZWN0Um91dGVCeVJvdXRlSWRfUGFyYW1zLmRlY29kZSA9IGZ1bmN0aW9uKGRlY29kZXIpIHsKICAgIHZhciBwYWNrZWQ7CiAgICB2YXIgdmFsID0gbmV3IE1lZGlhUm91dGVQcm92aWRlcl9Db25uZWN0Um91dGVCeVJvdXRlSWRfUGFyYW1zKCk7CiAgICB2YXIgbnVtYmVyT2ZCeXRlcyA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFyIHZlcnNpb24gPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhbC5tZWRpYVNvdXJjZSA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLlN0cmluZyk7CiAgICB2YWwucm91dGVJZCA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLlN0cmluZyk7CiAgICB2YWwucHJlc2VudGF0aW9uSWQgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5TdHJpbmcpOwogICAgdmFsLm9yaWdpbiA9IGRlY29kZXIuZGVjb2RlU3RydWN0UG9pbnRlcihvcmlnaW4kLk9yaWdpbik7CiAgICB2YWwudGFiSWQgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5JbnQzMik7CiAgICBwYWNrZWQgPSBkZWNvZGVyLnJlYWRVaW50OCgpOwogICAgdmFsLmluY29nbml0byA9IChwYWNrZWQgPj4gMCkgJiAxID8gdHJ1ZSA6IGZhbHNlOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgdmFsLnRpbWVvdXQgPSBkZWNvZGVyLmRlY29kZVN0cnVjdFBvaW50ZXIodGltZSQuVGltZURlbHRhKTsKICAgIHJldHVybiB2YWw7CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX0Nvbm5lY3RSb3V0ZUJ5Um91dGVJZF9QYXJhbXMuZW5jb2RlID0gZnVuY3Rpb24oZW5jb2RlciwgdmFsKSB7CiAgICB2YXIgcGFja2VkOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMihNZWRpYVJvdXRlUHJvdmlkZXJfQ29ubmVjdFJvdXRlQnlSb3V0ZUlkX1BhcmFtcy5lbmNvZGVkU2l6ZSk7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKDApOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nLCB2YWwubWVkaWFTb3VyY2UpOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nLCB2YWwucm91dGVJZCk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5TdHJpbmcsIHZhbC5wcmVzZW50YXRpb25JZCk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdFBvaW50ZXIob3JpZ2luJC5PcmlnaW4sIHZhbC5vcmlnaW4pOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuSW50MzIsIHZhbC50YWJJZCk7CiAgICBwYWNrZWQgPSAwOwogICAgcGFja2VkIHw9ICh2YWwuaW5jb2duaXRvICYgMSkgPDwgMAogICAgZW5jb2Rlci53cml0ZVVpbnQ4KHBhY2tlZCk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdFBvaW50ZXIodGltZSQuVGltZURlbHRhLCB2YWwudGltZW91dCk7CiAgfTsKICBmdW5jdGlvbiBNZWRpYVJvdXRlUHJvdmlkZXJfQ29ubmVjdFJvdXRlQnlSb3V0ZUlkX1Jlc3BvbnNlUGFyYW1zKHZhbHVlcykgewogICAgdGhpcy5pbml0RGVmYXVsdHNfKCk7CiAgICB0aGlzLmluaXRGaWVsZHNfKHZhbHVlcyk7CiAgfQoKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX0Nvbm5lY3RSb3V0ZUJ5Um91dGVJZF9SZXNwb25zZVBhcmFtcy5wcm90b3R5cGUuaW5pdERlZmF1bHRzXyA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy5yb3V0ZSA9IG51bGw7CiAgICB0aGlzLmVycm9yVGV4dCA9IG51bGw7CiAgICB0aGlzLnJlc3VsdENvZGUgPSAwOwogIH07CiAgTWVkaWFSb3V0ZVByb3ZpZGVyX0Nvbm5lY3RSb3V0ZUJ5Um91dGVJZF9SZXNwb25zZVBhcmFtcy5wcm90b3R5cGUuaW5pdEZpZWxkc18gPSBmdW5jdGlvbihmaWVsZHMpIHsKICAgIGZvcih2YXIgZmllbGQgaW4gZmllbGRzKSB7CiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoZmllbGQpKQogICAgICAgICAgdGhpc1tmaWVsZF0gPSBmaWVsZHNbZmllbGRdOwogICAgfQogIH07CgogIE1lZGlhUm91dGVQcm92aWRlcl9Db25uZWN0Um91dGVCeVJvdXRlSWRfUmVzcG9uc2VQYXJhbXMudmFsaWRhdGUgPSBmdW5jdGlvbihtZXNzYWdlVmFsaWRhdG9yLCBvZmZzZXQpIHsKICAgIHZhciBlcnI7CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0SGVhZGVyKG9mZnNldCwgY29kZWMua1N0cnVjdEhlYWRlclNpemUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgdmFyIGtWZXJzaW9uU2l6ZXMgPSBbCiAgICAgIHt2ZXJzaW9uOiAwLCBudW1CeXRlczogMzJ9CiAgICBdOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFZlcnNpb24ob2Zmc2V0LCBrVmVyc2lvblNpemVzKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVJvdXRlUHJvdmlkZXJfQ29ubmVjdFJvdXRlQnlSb3V0ZUlkX1Jlc3BvbnNlUGFyYW1zLnJvdXRlCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0UG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDAsIE1lZGlhUm91dGUsIHRydWUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhUm91dGVQcm92aWRlcl9Db25uZWN0Um91dGVCeVJvdXRlSWRfUmVzcG9uc2VQYXJhbXMuZXJyb3JUZXh0CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nUG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDgsIHRydWUpCiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFSb3V0ZVByb3ZpZGVyX0Nvbm5lY3RSb3V0ZUJ5Um91dGVJZF9SZXNwb25zZVBhcmFtcy5yZXN1bHRDb2RlCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlRW51bShvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDE2LCBSb3V0ZVJlcXVlc3RSZXN1bHRDb2RlKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX0Nvbm5lY3RSb3V0ZUJ5Um91dGVJZF9SZXNwb25zZVBhcmFtcy5lbmNvZGVkU2l6ZSA9IGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMjQ7CgogIE1lZGlhUm91dGVQcm92aWRlcl9Db25uZWN0Um91dGVCeVJvdXRlSWRfUmVzcG9uc2VQYXJhbXMuZGVjb2RlID0gZnVuY3Rpb24oZGVjb2RlcikgewogICAgdmFyIHBhY2tlZDsKICAgIHZhciB2YWwgPSBuZXcgTWVkaWFSb3V0ZVByb3ZpZGVyX0Nvbm5lY3RSb3V0ZUJ5Um91dGVJZF9SZXNwb25zZVBhcmFtcygpOwogICAgdmFyIG51bWJlck9mQnl0ZXMgPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhciB2ZXJzaW9uID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YWwucm91dGUgPSBkZWNvZGVyLmRlY29kZVN0cnVjdFBvaW50ZXIoTWVkaWFSb3V0ZSk7CiAgICB2YWwuZXJyb3JUZXh0ID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuTnVsbGFibGVTdHJpbmcpOwogICAgdmFsLnJlc3VsdENvZGUgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5JbnQzMik7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICByZXR1cm4gdmFsOwogIH07CgogIE1lZGlhUm91dGVQcm92aWRlcl9Db25uZWN0Um91dGVCeVJvdXRlSWRfUmVzcG9uc2VQYXJhbXMuZW5jb2RlID0gZnVuY3Rpb24oZW5jb2RlciwgdmFsKSB7CiAgICB2YXIgcGFja2VkOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMihNZWRpYVJvdXRlUHJvdmlkZXJfQ29ubmVjdFJvdXRlQnlSb3V0ZUlkX1Jlc3BvbnNlUGFyYW1zLmVuY29kZWRTaXplKTsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoMCk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdFBvaW50ZXIoTWVkaWFSb3V0ZSwgdmFsLnJvdXRlKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLk51bGxhYmxlU3RyaW5nLCB2YWwuZXJyb3JUZXh0KTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLkludDMyLCB2YWwucmVzdWx0Q29kZSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgfTsKICBmdW5jdGlvbiBNZWRpYVJvdXRlUHJvdmlkZXJfVGVybWluYXRlUm91dGVfUGFyYW1zKHZhbHVlcykgewogICAgdGhpcy5pbml0RGVmYXVsdHNfKCk7CiAgICB0aGlzLmluaXRGaWVsZHNfKHZhbHVlcyk7CiAgfQoKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1Rlcm1pbmF0ZVJvdXRlX1BhcmFtcy5wcm90b3R5cGUuaW5pdERlZmF1bHRzXyA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy5yb3V0ZUlkID0gbnVsbDsKICB9OwogIE1lZGlhUm91dGVQcm92aWRlcl9UZXJtaW5hdGVSb3V0ZV9QYXJhbXMucHJvdG90eXBlLmluaXRGaWVsZHNfID0gZnVuY3Rpb24oZmllbGRzKSB7CiAgICBmb3IodmFyIGZpZWxkIGluIGZpZWxkcykgewogICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGZpZWxkKSkKICAgICAgICAgIHRoaXNbZmllbGRdID0gZmllbGRzW2ZpZWxkXTsKICAgIH0KICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfVGVybWluYXRlUm91dGVfUGFyYW1zLnZhbGlkYXRlID0gZnVuY3Rpb24obWVzc2FnZVZhbGlkYXRvciwgb2Zmc2V0KSB7CiAgICB2YXIgZXJyOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdEhlYWRlcihvZmZzZXQsIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHZhciBrVmVyc2lvblNpemVzID0gWwogICAgICB7dmVyc2lvbjogMCwgbnVtQnl0ZXM6IDE2fQogICAgXTsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RWZXJzaW9uKG9mZnNldCwga1ZlcnNpb25TaXplcyk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFSb3V0ZVByb3ZpZGVyX1Rlcm1pbmF0ZVJvdXRlX1BhcmFtcy5yb3V0ZUlkCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nUG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDAsIGZhbHNlKQogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfVGVybWluYXRlUm91dGVfUGFyYW1zLmVuY29kZWRTaXplID0gY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA4OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfVGVybWluYXRlUm91dGVfUGFyYW1zLmRlY29kZSA9IGZ1bmN0aW9uKGRlY29kZXIpIHsKICAgIHZhciBwYWNrZWQ7CiAgICB2YXIgdmFsID0gbmV3IE1lZGlhUm91dGVQcm92aWRlcl9UZXJtaW5hdGVSb3V0ZV9QYXJhbXMoKTsKICAgIHZhciBudW1iZXJPZkJ5dGVzID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YXIgdmVyc2lvbiA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFsLnJvdXRlSWQgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5TdHJpbmcpOwogICAgcmV0dXJuIHZhbDsKICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfVGVybWluYXRlUm91dGVfUGFyYW1zLmVuY29kZSA9IGZ1bmN0aW9uKGVuY29kZXIsIHZhbCkgewogICAgdmFyIHBhY2tlZDsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoTWVkaWFSb3V0ZVByb3ZpZGVyX1Rlcm1pbmF0ZVJvdXRlX1BhcmFtcy5lbmNvZGVkU2l6ZSk7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKDApOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nLCB2YWwucm91dGVJZCk7CiAgfTsKICBmdW5jdGlvbiBNZWRpYVJvdXRlUHJvdmlkZXJfVGVybWluYXRlUm91dGVfUmVzcG9uc2VQYXJhbXModmFsdWVzKSB7CiAgICB0aGlzLmluaXREZWZhdWx0c18oKTsKICAgIHRoaXMuaW5pdEZpZWxkc18odmFsdWVzKTsKICB9CgoKICBNZWRpYVJvdXRlUHJvdmlkZXJfVGVybWluYXRlUm91dGVfUmVzcG9uc2VQYXJhbXMucHJvdG90eXBlLmluaXREZWZhdWx0c18gPSBmdW5jdGlvbigpIHsKICAgIHRoaXMuZXJyb3JUZXh0ID0gbnVsbDsKICAgIHRoaXMucmVzdWx0Q29kZSA9IDA7CiAgfTsKICBNZWRpYVJvdXRlUHJvdmlkZXJfVGVybWluYXRlUm91dGVfUmVzcG9uc2VQYXJhbXMucHJvdG90eXBlLmluaXRGaWVsZHNfID0gZnVuY3Rpb24oZmllbGRzKSB7CiAgICBmb3IodmFyIGZpZWxkIGluIGZpZWxkcykgewogICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGZpZWxkKSkKICAgICAgICAgIHRoaXNbZmllbGRdID0gZmllbGRzW2ZpZWxkXTsKICAgIH0KICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfVGVybWluYXRlUm91dGVfUmVzcG9uc2VQYXJhbXMudmFsaWRhdGUgPSBmdW5jdGlvbihtZXNzYWdlVmFsaWRhdG9yLCBvZmZzZXQpIHsKICAgIHZhciBlcnI7CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0SGVhZGVyKG9mZnNldCwgY29kZWMua1N0cnVjdEhlYWRlclNpemUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgdmFyIGtWZXJzaW9uU2l6ZXMgPSBbCiAgICAgIHt2ZXJzaW9uOiAwLCBudW1CeXRlczogMjR9CiAgICBdOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFZlcnNpb24ob2Zmc2V0LCBrVmVyc2lvblNpemVzKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVJvdXRlUHJvdmlkZXJfVGVybWluYXRlUm91dGVfUmVzcG9uc2VQYXJhbXMuZXJyb3JUZXh0CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nUG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDAsIHRydWUpCiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFSb3V0ZVByb3ZpZGVyX1Rlcm1pbmF0ZVJvdXRlX1Jlc3BvbnNlUGFyYW1zLnJlc3VsdENvZGUKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVFbnVtKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgOCwgUm91dGVSZXF1ZXN0UmVzdWx0Q29kZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwogIH07CgogIE1lZGlhUm91dGVQcm92aWRlcl9UZXJtaW5hdGVSb3V0ZV9SZXNwb25zZVBhcmFtcy5lbmNvZGVkU2l6ZSA9IGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMTY7CgogIE1lZGlhUm91dGVQcm92aWRlcl9UZXJtaW5hdGVSb3V0ZV9SZXNwb25zZVBhcmFtcy5kZWNvZGUgPSBmdW5jdGlvbihkZWNvZGVyKSB7CiAgICB2YXIgcGFja2VkOwogICAgdmFyIHZhbCA9IG5ldyBNZWRpYVJvdXRlUHJvdmlkZXJfVGVybWluYXRlUm91dGVfUmVzcG9uc2VQYXJhbXMoKTsKICAgIHZhciBudW1iZXJPZkJ5dGVzID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YXIgdmVyc2lvbiA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFsLmVycm9yVGV4dCA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLk51bGxhYmxlU3RyaW5nKTsKICAgIHZhbC5yZXN1bHRDb2RlID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuSW50MzIpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgcmV0dXJuIHZhbDsKICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfVGVybWluYXRlUm91dGVfUmVzcG9uc2VQYXJhbXMuZW5jb2RlID0gZnVuY3Rpb24oZW5jb2RlciwgdmFsKSB7CiAgICB2YXIgcGFja2VkOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMihNZWRpYVJvdXRlUHJvdmlkZXJfVGVybWluYXRlUm91dGVfUmVzcG9uc2VQYXJhbXMuZW5jb2RlZFNpemUpOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMigwKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLk51bGxhYmxlU3RyaW5nLCB2YWwuZXJyb3JUZXh0KTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLkludDMyLCB2YWwucmVzdWx0Q29kZSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgfTsKICBmdW5jdGlvbiBNZWRpYVJvdXRlUHJvdmlkZXJfU2VuZFJvdXRlTWVzc2FnZV9QYXJhbXModmFsdWVzKSB7CiAgICB0aGlzLmluaXREZWZhdWx0c18oKTsKICAgIHRoaXMuaW5pdEZpZWxkc18odmFsdWVzKTsKICB9CgoKICBNZWRpYVJvdXRlUHJvdmlkZXJfU2VuZFJvdXRlTWVzc2FnZV9QYXJhbXMucHJvdG90eXBlLmluaXREZWZhdWx0c18gPSBmdW5jdGlvbigpIHsKICAgIHRoaXMubWVkaWFSb3V0ZUlkID0gbnVsbDsKICAgIHRoaXMubWVzc2FnZSA9IG51bGw7CiAgfTsKICBNZWRpYVJvdXRlUHJvdmlkZXJfU2VuZFJvdXRlTWVzc2FnZV9QYXJhbXMucHJvdG90eXBlLmluaXRGaWVsZHNfID0gZnVuY3Rpb24oZmllbGRzKSB7CiAgICBmb3IodmFyIGZpZWxkIGluIGZpZWxkcykgewogICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGZpZWxkKSkKICAgICAgICAgIHRoaXNbZmllbGRdID0gZmllbGRzW2ZpZWxkXTsKICAgIH0KICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfU2VuZFJvdXRlTWVzc2FnZV9QYXJhbXMudmFsaWRhdGUgPSBmdW5jdGlvbihtZXNzYWdlVmFsaWRhdG9yLCBvZmZzZXQpIHsKICAgIHZhciBlcnI7CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0SGVhZGVyKG9mZnNldCwgY29kZWMua1N0cnVjdEhlYWRlclNpemUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgdmFyIGtWZXJzaW9uU2l6ZXMgPSBbCiAgICAgIHt2ZXJzaW9uOiAwLCBudW1CeXRlczogMjR9CiAgICBdOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFZlcnNpb24ob2Zmc2V0LCBrVmVyc2lvblNpemVzKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVJvdXRlUHJvdmlkZXJfU2VuZFJvdXRlTWVzc2FnZV9QYXJhbXMubWVkaWFSb3V0ZUlkCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nUG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDAsIGZhbHNlKQogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhUm91dGVQcm92aWRlcl9TZW5kUm91dGVNZXNzYWdlX1BhcmFtcy5tZXNzYWdlCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nUG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDgsIGZhbHNlKQogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfU2VuZFJvdXRlTWVzc2FnZV9QYXJhbXMuZW5jb2RlZFNpemUgPSBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDE2OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfU2VuZFJvdXRlTWVzc2FnZV9QYXJhbXMuZGVjb2RlID0gZnVuY3Rpb24oZGVjb2RlcikgewogICAgdmFyIHBhY2tlZDsKICAgIHZhciB2YWwgPSBuZXcgTWVkaWFSb3V0ZVByb3ZpZGVyX1NlbmRSb3V0ZU1lc3NhZ2VfUGFyYW1zKCk7CiAgICB2YXIgbnVtYmVyT2ZCeXRlcyA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFyIHZlcnNpb24gPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhbC5tZWRpYVJvdXRlSWQgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5TdHJpbmcpOwogICAgdmFsLm1lc3NhZ2UgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5TdHJpbmcpOwogICAgcmV0dXJuIHZhbDsKICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfU2VuZFJvdXRlTWVzc2FnZV9QYXJhbXMuZW5jb2RlID0gZnVuY3Rpb24oZW5jb2RlciwgdmFsKSB7CiAgICB2YXIgcGFja2VkOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMihNZWRpYVJvdXRlUHJvdmlkZXJfU2VuZFJvdXRlTWVzc2FnZV9QYXJhbXMuZW5jb2RlZFNpemUpOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMigwKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLlN0cmluZywgdmFsLm1lZGlhUm91dGVJZCk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5TdHJpbmcsIHZhbC5tZXNzYWdlKTsKICB9OwogIGZ1bmN0aW9uIE1lZGlhUm91dGVQcm92aWRlcl9TZW5kUm91dGVNZXNzYWdlX1Jlc3BvbnNlUGFyYW1zKHZhbHVlcykgewogICAgdGhpcy5pbml0RGVmYXVsdHNfKCk7CiAgICB0aGlzLmluaXRGaWVsZHNfKHZhbHVlcyk7CiAgfQoKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1NlbmRSb3V0ZU1lc3NhZ2VfUmVzcG9uc2VQYXJhbXMucHJvdG90eXBlLmluaXREZWZhdWx0c18gPSBmdW5jdGlvbigpIHsKICAgIHRoaXMuc2VudCA9IGZhbHNlOwogIH07CiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1NlbmRSb3V0ZU1lc3NhZ2VfUmVzcG9uc2VQYXJhbXMucHJvdG90eXBlLmluaXRGaWVsZHNfID0gZnVuY3Rpb24oZmllbGRzKSB7CiAgICBmb3IodmFyIGZpZWxkIGluIGZpZWxkcykgewogICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGZpZWxkKSkKICAgICAgICAgIHRoaXNbZmllbGRdID0gZmllbGRzW2ZpZWxkXTsKICAgIH0KICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfU2VuZFJvdXRlTWVzc2FnZV9SZXNwb25zZVBhcmFtcy52YWxpZGF0ZSA9IGZ1bmN0aW9uKG1lc3NhZ2VWYWxpZGF0b3IsIG9mZnNldCkgewogICAgdmFyIGVycjsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RIZWFkZXIob2Zmc2V0LCBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICB2YXIga1ZlcnNpb25TaXplcyA9IFsKICAgICAge3ZlcnNpb246IDAsIG51bUJ5dGVzOiAxNn0KICAgIF07CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0VmVyc2lvbihvZmZzZXQsIGtWZXJzaW9uU2l6ZXMpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1NlbmRSb3V0ZU1lc3NhZ2VfUmVzcG9uc2VQYXJhbXMuZW5jb2RlZFNpemUgPSBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDg7CgogIE1lZGlhUm91dGVQcm92aWRlcl9TZW5kUm91dGVNZXNzYWdlX1Jlc3BvbnNlUGFyYW1zLmRlY29kZSA9IGZ1bmN0aW9uKGRlY29kZXIpIHsKICAgIHZhciBwYWNrZWQ7CiAgICB2YXIgdmFsID0gbmV3IE1lZGlhUm91dGVQcm92aWRlcl9TZW5kUm91dGVNZXNzYWdlX1Jlc3BvbnNlUGFyYW1zKCk7CiAgICB2YXIgbnVtYmVyT2ZCeXRlcyA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFyIHZlcnNpb24gPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHBhY2tlZCA9IGRlY29kZXIucmVhZFVpbnQ4KCk7CiAgICB2YWwuc2VudCA9IChwYWNrZWQgPj4gMCkgJiAxID8gdHJ1ZSA6IGZhbHNlOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgcmV0dXJuIHZhbDsKICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfU2VuZFJvdXRlTWVzc2FnZV9SZXNwb25zZVBhcmFtcy5lbmNvZGUgPSBmdW5jdGlvbihlbmNvZGVyLCB2YWwpIHsKICAgIHZhciBwYWNrZWQ7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKE1lZGlhUm91dGVQcm92aWRlcl9TZW5kUm91dGVNZXNzYWdlX1Jlc3BvbnNlUGFyYW1zLmVuY29kZWRTaXplKTsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoMCk7CiAgICBwYWNrZWQgPSAwOwogICAgcGFja2VkIHw9ICh2YWwuc2VudCAmIDEpIDw8IDAKICAgIGVuY29kZXIud3JpdGVVaW50OChwYWNrZWQpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogIH07CiAgZnVuY3Rpb24gTWVkaWFSb3V0ZVByb3ZpZGVyX1NlbmRSb3V0ZUJpbmFyeU1lc3NhZ2VfUGFyYW1zKHZhbHVlcykgewogICAgdGhpcy5pbml0RGVmYXVsdHNfKCk7CiAgICB0aGlzLmluaXRGaWVsZHNfKHZhbHVlcyk7CiAgfQoKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1NlbmRSb3V0ZUJpbmFyeU1lc3NhZ2VfUGFyYW1zLnByb3RvdHlwZS5pbml0RGVmYXVsdHNfID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLm1lZGlhUm91dGVJZCA9IG51bGw7CiAgICB0aGlzLmRhdGEgPSBudWxsOwogIH07CiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1NlbmRSb3V0ZUJpbmFyeU1lc3NhZ2VfUGFyYW1zLnByb3RvdHlwZS5pbml0RmllbGRzXyA9IGZ1bmN0aW9uKGZpZWxkcykgewogICAgZm9yKHZhciBmaWVsZCBpbiBmaWVsZHMpIHsKICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpCiAgICAgICAgICB0aGlzW2ZpZWxkXSA9IGZpZWxkc1tmaWVsZF07CiAgICB9CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1NlbmRSb3V0ZUJpbmFyeU1lc3NhZ2VfUGFyYW1zLnZhbGlkYXRlID0gZnVuY3Rpb24obWVzc2FnZVZhbGlkYXRvciwgb2Zmc2V0KSB7CiAgICB2YXIgZXJyOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdEhlYWRlcihvZmZzZXQsIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHZhciBrVmVyc2lvblNpemVzID0gWwogICAgICB7dmVyc2lvbjogMCwgbnVtQnl0ZXM6IDI0fQogICAgXTsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RWZXJzaW9uKG9mZnNldCwga1ZlcnNpb25TaXplcyk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFSb3V0ZVByb3ZpZGVyX1NlbmRSb3V0ZUJpbmFyeU1lc3NhZ2VfUGFyYW1zLm1lZGlhUm91dGVJZAogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cmluZ1BvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAwLCBmYWxzZSkKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVJvdXRlUHJvdmlkZXJfU2VuZFJvdXRlQmluYXJ5TWVzc2FnZV9QYXJhbXMuZGF0YQogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZUFycmF5UG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDgsIDEsIGNvZGVjLlVpbnQ4LCBmYWxzZSwgWzBdLCAwKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1NlbmRSb3V0ZUJpbmFyeU1lc3NhZ2VfUGFyYW1zLmVuY29kZWRTaXplID0gY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAxNjsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1NlbmRSb3V0ZUJpbmFyeU1lc3NhZ2VfUGFyYW1zLmRlY29kZSA9IGZ1bmN0aW9uKGRlY29kZXIpIHsKICAgIHZhciBwYWNrZWQ7CiAgICB2YXIgdmFsID0gbmV3IE1lZGlhUm91dGVQcm92aWRlcl9TZW5kUm91dGVCaW5hcnlNZXNzYWdlX1BhcmFtcygpOwogICAgdmFyIG51bWJlck9mQnl0ZXMgPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhciB2ZXJzaW9uID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YWwubWVkaWFSb3V0ZUlkID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nKTsKICAgIHZhbC5kYXRhID0gZGVjb2Rlci5kZWNvZGVBcnJheVBvaW50ZXIoY29kZWMuVWludDgpOwogICAgcmV0dXJuIHZhbDsKICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfU2VuZFJvdXRlQmluYXJ5TWVzc2FnZV9QYXJhbXMuZW5jb2RlID0gZnVuY3Rpb24oZW5jb2RlciwgdmFsKSB7CiAgICB2YXIgcGFja2VkOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMihNZWRpYVJvdXRlUHJvdmlkZXJfU2VuZFJvdXRlQmluYXJ5TWVzc2FnZV9QYXJhbXMuZW5jb2RlZFNpemUpOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMigwKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLlN0cmluZywgdmFsLm1lZGlhUm91dGVJZCk7CiAgICBlbmNvZGVyLmVuY29kZUFycmF5UG9pbnRlcihjb2RlYy5VaW50OCwgdmFsLmRhdGEpOwogIH07CiAgZnVuY3Rpb24gTWVkaWFSb3V0ZVByb3ZpZGVyX1NlbmRSb3V0ZUJpbmFyeU1lc3NhZ2VfUmVzcG9uc2VQYXJhbXModmFsdWVzKSB7CiAgICB0aGlzLmluaXREZWZhdWx0c18oKTsKICAgIHRoaXMuaW5pdEZpZWxkc18odmFsdWVzKTsKICB9CgoKICBNZWRpYVJvdXRlUHJvdmlkZXJfU2VuZFJvdXRlQmluYXJ5TWVzc2FnZV9SZXNwb25zZVBhcmFtcy5wcm90b3R5cGUuaW5pdERlZmF1bHRzXyA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy5zZW50ID0gZmFsc2U7CiAgfTsKICBNZWRpYVJvdXRlUHJvdmlkZXJfU2VuZFJvdXRlQmluYXJ5TWVzc2FnZV9SZXNwb25zZVBhcmFtcy5wcm90b3R5cGUuaW5pdEZpZWxkc18gPSBmdW5jdGlvbihmaWVsZHMpIHsKICAgIGZvcih2YXIgZmllbGQgaW4gZmllbGRzKSB7CiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoZmllbGQpKQogICAgICAgICAgdGhpc1tmaWVsZF0gPSBmaWVsZHNbZmllbGRdOwogICAgfQogIH07CgogIE1lZGlhUm91dGVQcm92aWRlcl9TZW5kUm91dGVCaW5hcnlNZXNzYWdlX1Jlc3BvbnNlUGFyYW1zLnZhbGlkYXRlID0gZnVuY3Rpb24obWVzc2FnZVZhbGlkYXRvciwgb2Zmc2V0KSB7CiAgICB2YXIgZXJyOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdEhlYWRlcihvZmZzZXQsIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHZhciBrVmVyc2lvblNpemVzID0gWwogICAgICB7dmVyc2lvbjogMCwgbnVtQnl0ZXM6IDE2fQogICAgXTsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RWZXJzaW9uKG9mZnNldCwga1ZlcnNpb25TaXplcyk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfU2VuZFJvdXRlQmluYXJ5TWVzc2FnZV9SZXNwb25zZVBhcmFtcy5lbmNvZGVkU2l6ZSA9IGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgODsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1NlbmRSb3V0ZUJpbmFyeU1lc3NhZ2VfUmVzcG9uc2VQYXJhbXMuZGVjb2RlID0gZnVuY3Rpb24oZGVjb2RlcikgewogICAgdmFyIHBhY2tlZDsKICAgIHZhciB2YWwgPSBuZXcgTWVkaWFSb3V0ZVByb3ZpZGVyX1NlbmRSb3V0ZUJpbmFyeU1lc3NhZ2VfUmVzcG9uc2VQYXJhbXMoKTsKICAgIHZhciBudW1iZXJPZkJ5dGVzID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YXIgdmVyc2lvbiA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgcGFja2VkID0gZGVjb2Rlci5yZWFkVWludDgoKTsKICAgIHZhbC5zZW50ID0gKHBhY2tlZCA+PiAwKSAmIDEgPyB0cnVlIDogZmFsc2U7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICByZXR1cm4gdmFsOwogIH07CgogIE1lZGlhUm91dGVQcm92aWRlcl9TZW5kUm91dGVCaW5hcnlNZXNzYWdlX1Jlc3BvbnNlUGFyYW1zLmVuY29kZSA9IGZ1bmN0aW9uKGVuY29kZXIsIHZhbCkgewogICAgdmFyIHBhY2tlZDsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoTWVkaWFSb3V0ZVByb3ZpZGVyX1NlbmRSb3V0ZUJpbmFyeU1lc3NhZ2VfUmVzcG9uc2VQYXJhbXMuZW5jb2RlZFNpemUpOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMigwKTsKICAgIHBhY2tlZCA9IDA7CiAgICBwYWNrZWQgfD0gKHZhbC5zZW50ICYgMSkgPDwgMAogICAgZW5jb2Rlci53cml0ZVVpbnQ4KHBhY2tlZCk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgfTsKICBmdW5jdGlvbiBNZWRpYVJvdXRlUHJvdmlkZXJfU3RhcnRPYnNlcnZpbmdNZWRpYVNpbmtzX1BhcmFtcyh2YWx1ZXMpIHsKICAgIHRoaXMuaW5pdERlZmF1bHRzXygpOwogICAgdGhpcy5pbml0RmllbGRzXyh2YWx1ZXMpOwogIH0KCgogIE1lZGlhUm91dGVQcm92aWRlcl9TdGFydE9ic2VydmluZ01lZGlhU2lua3NfUGFyYW1zLnByb3RvdHlwZS5pbml0RGVmYXVsdHNfID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLm1lZGlhU291cmNlID0gbnVsbDsKICB9OwogIE1lZGlhUm91dGVQcm92aWRlcl9TdGFydE9ic2VydmluZ01lZGlhU2lua3NfUGFyYW1zLnByb3RvdHlwZS5pbml0RmllbGRzXyA9IGZ1bmN0aW9uKGZpZWxkcykgewogICAgZm9yKHZhciBmaWVsZCBpbiBmaWVsZHMpIHsKICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpCiAgICAgICAgICB0aGlzW2ZpZWxkXSA9IGZpZWxkc1tmaWVsZF07CiAgICB9CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1N0YXJ0T2JzZXJ2aW5nTWVkaWFTaW5rc19QYXJhbXMudmFsaWRhdGUgPSBmdW5jdGlvbihtZXNzYWdlVmFsaWRhdG9yLCBvZmZzZXQpIHsKICAgIHZhciBlcnI7CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0SGVhZGVyKG9mZnNldCwgY29kZWMua1N0cnVjdEhlYWRlclNpemUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgdmFyIGtWZXJzaW9uU2l6ZXMgPSBbCiAgICAgIHt2ZXJzaW9uOiAwLCBudW1CeXRlczogMTZ9CiAgICBdOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFZlcnNpb24ob2Zmc2V0LCBrVmVyc2lvblNpemVzKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVJvdXRlUHJvdmlkZXJfU3RhcnRPYnNlcnZpbmdNZWRpYVNpbmtzX1BhcmFtcy5tZWRpYVNvdXJjZQogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cmluZ1BvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAwLCBmYWxzZSkKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1N0YXJ0T2JzZXJ2aW5nTWVkaWFTaW5rc19QYXJhbXMuZW5jb2RlZFNpemUgPSBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDg7CgogIE1lZGlhUm91dGVQcm92aWRlcl9TdGFydE9ic2VydmluZ01lZGlhU2lua3NfUGFyYW1zLmRlY29kZSA9IGZ1bmN0aW9uKGRlY29kZXIpIHsKICAgIHZhciBwYWNrZWQ7CiAgICB2YXIgdmFsID0gbmV3IE1lZGlhUm91dGVQcm92aWRlcl9TdGFydE9ic2VydmluZ01lZGlhU2lua3NfUGFyYW1zKCk7CiAgICB2YXIgbnVtYmVyT2ZCeXRlcyA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFyIHZlcnNpb24gPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhbC5tZWRpYVNvdXJjZSA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLlN0cmluZyk7CiAgICByZXR1cm4gdmFsOwogIH07CgogIE1lZGlhUm91dGVQcm92aWRlcl9TdGFydE9ic2VydmluZ01lZGlhU2lua3NfUGFyYW1zLmVuY29kZSA9IGZ1bmN0aW9uKGVuY29kZXIsIHZhbCkgewogICAgdmFyIHBhY2tlZDsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoTWVkaWFSb3V0ZVByb3ZpZGVyX1N0YXJ0T2JzZXJ2aW5nTWVkaWFTaW5rc19QYXJhbXMuZW5jb2RlZFNpemUpOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMigwKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLlN0cmluZywgdmFsLm1lZGlhU291cmNlKTsKICB9OwogIGZ1bmN0aW9uIE1lZGlhUm91dGVQcm92aWRlcl9TdG9wT2JzZXJ2aW5nTWVkaWFTaW5rc19QYXJhbXModmFsdWVzKSB7CiAgICB0aGlzLmluaXREZWZhdWx0c18oKTsKICAgIHRoaXMuaW5pdEZpZWxkc18odmFsdWVzKTsKICB9CgoKICBNZWRpYVJvdXRlUHJvdmlkZXJfU3RvcE9ic2VydmluZ01lZGlhU2lua3NfUGFyYW1zLnByb3RvdHlwZS5pbml0RGVmYXVsdHNfID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLm1lZGlhU291cmNlID0gbnVsbDsKICB9OwogIE1lZGlhUm91dGVQcm92aWRlcl9TdG9wT2JzZXJ2aW5nTWVkaWFTaW5rc19QYXJhbXMucHJvdG90eXBlLmluaXRGaWVsZHNfID0gZnVuY3Rpb24oZmllbGRzKSB7CiAgICBmb3IodmFyIGZpZWxkIGluIGZpZWxkcykgewogICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGZpZWxkKSkKICAgICAgICAgIHRoaXNbZmllbGRdID0gZmllbGRzW2ZpZWxkXTsKICAgIH0KICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfU3RvcE9ic2VydmluZ01lZGlhU2lua3NfUGFyYW1zLnZhbGlkYXRlID0gZnVuY3Rpb24obWVzc2FnZVZhbGlkYXRvciwgb2Zmc2V0KSB7CiAgICB2YXIgZXJyOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdEhlYWRlcihvZmZzZXQsIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHZhciBrVmVyc2lvblNpemVzID0gWwogICAgICB7dmVyc2lvbjogMCwgbnVtQnl0ZXM6IDE2fQogICAgXTsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RWZXJzaW9uKG9mZnNldCwga1ZlcnNpb25TaXplcyk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFSb3V0ZVByb3ZpZGVyX1N0b3BPYnNlcnZpbmdNZWRpYVNpbmtzX1BhcmFtcy5tZWRpYVNvdXJjZQogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cmluZ1BvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAwLCBmYWxzZSkKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1N0b3BPYnNlcnZpbmdNZWRpYVNpbmtzX1BhcmFtcy5lbmNvZGVkU2l6ZSA9IGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgODsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1N0b3BPYnNlcnZpbmdNZWRpYVNpbmtzX1BhcmFtcy5kZWNvZGUgPSBmdW5jdGlvbihkZWNvZGVyKSB7CiAgICB2YXIgcGFja2VkOwogICAgdmFyIHZhbCA9IG5ldyBNZWRpYVJvdXRlUHJvdmlkZXJfU3RvcE9ic2VydmluZ01lZGlhU2lua3NfUGFyYW1zKCk7CiAgICB2YXIgbnVtYmVyT2ZCeXRlcyA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFyIHZlcnNpb24gPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhbC5tZWRpYVNvdXJjZSA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLlN0cmluZyk7CiAgICByZXR1cm4gdmFsOwogIH07CgogIE1lZGlhUm91dGVQcm92aWRlcl9TdG9wT2JzZXJ2aW5nTWVkaWFTaW5rc19QYXJhbXMuZW5jb2RlID0gZnVuY3Rpb24oZW5jb2RlciwgdmFsKSB7CiAgICB2YXIgcGFja2VkOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMihNZWRpYVJvdXRlUHJvdmlkZXJfU3RvcE9ic2VydmluZ01lZGlhU2lua3NfUGFyYW1zLmVuY29kZWRTaXplKTsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoMCk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5TdHJpbmcsIHZhbC5tZWRpYVNvdXJjZSk7CiAgfTsKICBmdW5jdGlvbiBNZWRpYVJvdXRlUHJvdmlkZXJfU3RhcnRPYnNlcnZpbmdNZWRpYVJvdXRlc19QYXJhbXModmFsdWVzKSB7CiAgICB0aGlzLmluaXREZWZhdWx0c18oKTsKICAgIHRoaXMuaW5pdEZpZWxkc18odmFsdWVzKTsKICB9CgoKICBNZWRpYVJvdXRlUHJvdmlkZXJfU3RhcnRPYnNlcnZpbmdNZWRpYVJvdXRlc19QYXJhbXMucHJvdG90eXBlLmluaXREZWZhdWx0c18gPSBmdW5jdGlvbigpIHsKICAgIHRoaXMubWVkaWFTb3VyY2UgPSBudWxsOwogIH07CiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1N0YXJ0T2JzZXJ2aW5nTWVkaWFSb3V0ZXNfUGFyYW1zLnByb3RvdHlwZS5pbml0RmllbGRzXyA9IGZ1bmN0aW9uKGZpZWxkcykgewogICAgZm9yKHZhciBmaWVsZCBpbiBmaWVsZHMpIHsKICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpCiAgICAgICAgICB0aGlzW2ZpZWxkXSA9IGZpZWxkc1tmaWVsZF07CiAgICB9CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1N0YXJ0T2JzZXJ2aW5nTWVkaWFSb3V0ZXNfUGFyYW1zLnZhbGlkYXRlID0gZnVuY3Rpb24obWVzc2FnZVZhbGlkYXRvciwgb2Zmc2V0KSB7CiAgICB2YXIgZXJyOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdEhlYWRlcihvZmZzZXQsIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHZhciBrVmVyc2lvblNpemVzID0gWwogICAgICB7dmVyc2lvbjogMCwgbnVtQnl0ZXM6IDE2fQogICAgXTsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RWZXJzaW9uKG9mZnNldCwga1ZlcnNpb25TaXplcyk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFSb3V0ZVByb3ZpZGVyX1N0YXJ0T2JzZXJ2aW5nTWVkaWFSb3V0ZXNfUGFyYW1zLm1lZGlhU291cmNlCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nUG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDAsIGZhbHNlKQogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfU3RhcnRPYnNlcnZpbmdNZWRpYVJvdXRlc19QYXJhbXMuZW5jb2RlZFNpemUgPSBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDg7CgogIE1lZGlhUm91dGVQcm92aWRlcl9TdGFydE9ic2VydmluZ01lZGlhUm91dGVzX1BhcmFtcy5kZWNvZGUgPSBmdW5jdGlvbihkZWNvZGVyKSB7CiAgICB2YXIgcGFja2VkOwogICAgdmFyIHZhbCA9IG5ldyBNZWRpYVJvdXRlUHJvdmlkZXJfU3RhcnRPYnNlcnZpbmdNZWRpYVJvdXRlc19QYXJhbXMoKTsKICAgIHZhciBudW1iZXJPZkJ5dGVzID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YXIgdmVyc2lvbiA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFsLm1lZGlhU291cmNlID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nKTsKICAgIHJldHVybiB2YWw7CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1N0YXJ0T2JzZXJ2aW5nTWVkaWFSb3V0ZXNfUGFyYW1zLmVuY29kZSA9IGZ1bmN0aW9uKGVuY29kZXIsIHZhbCkgewogICAgdmFyIHBhY2tlZDsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoTWVkaWFSb3V0ZVByb3ZpZGVyX1N0YXJ0T2JzZXJ2aW5nTWVkaWFSb3V0ZXNfUGFyYW1zLmVuY29kZWRTaXplKTsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoMCk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5TdHJpbmcsIHZhbC5tZWRpYVNvdXJjZSk7CiAgfTsKICBmdW5jdGlvbiBNZWRpYVJvdXRlUHJvdmlkZXJfU3RvcE9ic2VydmluZ01lZGlhUm91dGVzX1BhcmFtcyh2YWx1ZXMpIHsKICAgIHRoaXMuaW5pdERlZmF1bHRzXygpOwogICAgdGhpcy5pbml0RmllbGRzXyh2YWx1ZXMpOwogIH0KCgogIE1lZGlhUm91dGVQcm92aWRlcl9TdG9wT2JzZXJ2aW5nTWVkaWFSb3V0ZXNfUGFyYW1zLnByb3RvdHlwZS5pbml0RGVmYXVsdHNfID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLm1lZGlhU291cmNlID0gbnVsbDsKICB9OwogIE1lZGlhUm91dGVQcm92aWRlcl9TdG9wT2JzZXJ2aW5nTWVkaWFSb3V0ZXNfUGFyYW1zLnByb3RvdHlwZS5pbml0RmllbGRzXyA9IGZ1bmN0aW9uKGZpZWxkcykgewogICAgZm9yKHZhciBmaWVsZCBpbiBmaWVsZHMpIHsKICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpCiAgICAgICAgICB0aGlzW2ZpZWxkXSA9IGZpZWxkc1tmaWVsZF07CiAgICB9CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1N0b3BPYnNlcnZpbmdNZWRpYVJvdXRlc19QYXJhbXMudmFsaWRhdGUgPSBmdW5jdGlvbihtZXNzYWdlVmFsaWRhdG9yLCBvZmZzZXQpIHsKICAgIHZhciBlcnI7CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0SGVhZGVyKG9mZnNldCwgY29kZWMua1N0cnVjdEhlYWRlclNpemUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgdmFyIGtWZXJzaW9uU2l6ZXMgPSBbCiAgICAgIHt2ZXJzaW9uOiAwLCBudW1CeXRlczogMTZ9CiAgICBdOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFZlcnNpb24ob2Zmc2V0LCBrVmVyc2lvblNpemVzKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVJvdXRlUHJvdmlkZXJfU3RvcE9ic2VydmluZ01lZGlhUm91dGVzX1BhcmFtcy5tZWRpYVNvdXJjZQogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cmluZ1BvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAwLCBmYWxzZSkKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1N0b3BPYnNlcnZpbmdNZWRpYVJvdXRlc19QYXJhbXMuZW5jb2RlZFNpemUgPSBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDg7CgogIE1lZGlhUm91dGVQcm92aWRlcl9TdG9wT2JzZXJ2aW5nTWVkaWFSb3V0ZXNfUGFyYW1zLmRlY29kZSA9IGZ1bmN0aW9uKGRlY29kZXIpIHsKICAgIHZhciBwYWNrZWQ7CiAgICB2YXIgdmFsID0gbmV3IE1lZGlhUm91dGVQcm92aWRlcl9TdG9wT2JzZXJ2aW5nTWVkaWFSb3V0ZXNfUGFyYW1zKCk7CiAgICB2YXIgbnVtYmVyT2ZCeXRlcyA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFyIHZlcnNpb24gPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhbC5tZWRpYVNvdXJjZSA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLlN0cmluZyk7CiAgICByZXR1cm4gdmFsOwogIH07CgogIE1lZGlhUm91dGVQcm92aWRlcl9TdG9wT2JzZXJ2aW5nTWVkaWFSb3V0ZXNfUGFyYW1zLmVuY29kZSA9IGZ1bmN0aW9uKGVuY29kZXIsIHZhbCkgewogICAgdmFyIHBhY2tlZDsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoTWVkaWFSb3V0ZVByb3ZpZGVyX1N0b3BPYnNlcnZpbmdNZWRpYVJvdXRlc19QYXJhbXMuZW5jb2RlZFNpemUpOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMigwKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLlN0cmluZywgdmFsLm1lZGlhU291cmNlKTsKICB9OwogIGZ1bmN0aW9uIE1lZGlhUm91dGVQcm92aWRlcl9TdGFydExpc3RlbmluZ0ZvclJvdXRlTWVzc2FnZXNfUGFyYW1zKHZhbHVlcykgewogICAgdGhpcy5pbml0RGVmYXVsdHNfKCk7CiAgICB0aGlzLmluaXRGaWVsZHNfKHZhbHVlcyk7CiAgfQoKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1N0YXJ0TGlzdGVuaW5nRm9yUm91dGVNZXNzYWdlc19QYXJhbXMucHJvdG90eXBlLmluaXREZWZhdWx0c18gPSBmdW5jdGlvbigpIHsKICAgIHRoaXMucm91dGVJZCA9IG51bGw7CiAgfTsKICBNZWRpYVJvdXRlUHJvdmlkZXJfU3RhcnRMaXN0ZW5pbmdGb3JSb3V0ZU1lc3NhZ2VzX1BhcmFtcy5wcm90b3R5cGUuaW5pdEZpZWxkc18gPSBmdW5jdGlvbihmaWVsZHMpIHsKICAgIGZvcih2YXIgZmllbGQgaW4gZmllbGRzKSB7CiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoZmllbGQpKQogICAgICAgICAgdGhpc1tmaWVsZF0gPSBmaWVsZHNbZmllbGRdOwogICAgfQogIH07CgogIE1lZGlhUm91dGVQcm92aWRlcl9TdGFydExpc3RlbmluZ0ZvclJvdXRlTWVzc2FnZXNfUGFyYW1zLnZhbGlkYXRlID0gZnVuY3Rpb24obWVzc2FnZVZhbGlkYXRvciwgb2Zmc2V0KSB7CiAgICB2YXIgZXJyOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdEhlYWRlcihvZmZzZXQsIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHZhciBrVmVyc2lvblNpemVzID0gWwogICAgICB7dmVyc2lvbjogMCwgbnVtQnl0ZXM6IDE2fQogICAgXTsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RWZXJzaW9uKG9mZnNldCwga1ZlcnNpb25TaXplcyk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFSb3V0ZVByb3ZpZGVyX1N0YXJ0TGlzdGVuaW5nRm9yUm91dGVNZXNzYWdlc19QYXJhbXMucm91dGVJZAogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cmluZ1BvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAwLCBmYWxzZSkKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1N0YXJ0TGlzdGVuaW5nRm9yUm91dGVNZXNzYWdlc19QYXJhbXMuZW5jb2RlZFNpemUgPSBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDg7CgogIE1lZGlhUm91dGVQcm92aWRlcl9TdGFydExpc3RlbmluZ0ZvclJvdXRlTWVzc2FnZXNfUGFyYW1zLmRlY29kZSA9IGZ1bmN0aW9uKGRlY29kZXIpIHsKICAgIHZhciBwYWNrZWQ7CiAgICB2YXIgdmFsID0gbmV3IE1lZGlhUm91dGVQcm92aWRlcl9TdGFydExpc3RlbmluZ0ZvclJvdXRlTWVzc2FnZXNfUGFyYW1zKCk7CiAgICB2YXIgbnVtYmVyT2ZCeXRlcyA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFyIHZlcnNpb24gPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhbC5yb3V0ZUlkID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nKTsKICAgIHJldHVybiB2YWw7CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1N0YXJ0TGlzdGVuaW5nRm9yUm91dGVNZXNzYWdlc19QYXJhbXMuZW5jb2RlID0gZnVuY3Rpb24oZW5jb2RlciwgdmFsKSB7CiAgICB2YXIgcGFja2VkOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMihNZWRpYVJvdXRlUHJvdmlkZXJfU3RhcnRMaXN0ZW5pbmdGb3JSb3V0ZU1lc3NhZ2VzX1BhcmFtcy5lbmNvZGVkU2l6ZSk7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKDApOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nLCB2YWwucm91dGVJZCk7CiAgfTsKICBmdW5jdGlvbiBNZWRpYVJvdXRlUHJvdmlkZXJfU3RvcExpc3RlbmluZ0ZvclJvdXRlTWVzc2FnZXNfUGFyYW1zKHZhbHVlcykgewogICAgdGhpcy5pbml0RGVmYXVsdHNfKCk7CiAgICB0aGlzLmluaXRGaWVsZHNfKHZhbHVlcyk7CiAgfQoKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1N0b3BMaXN0ZW5pbmdGb3JSb3V0ZU1lc3NhZ2VzX1BhcmFtcy5wcm90b3R5cGUuaW5pdERlZmF1bHRzXyA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy5yb3V0ZUlkID0gbnVsbDsKICB9OwogIE1lZGlhUm91dGVQcm92aWRlcl9TdG9wTGlzdGVuaW5nRm9yUm91dGVNZXNzYWdlc19QYXJhbXMucHJvdG90eXBlLmluaXRGaWVsZHNfID0gZnVuY3Rpb24oZmllbGRzKSB7CiAgICBmb3IodmFyIGZpZWxkIGluIGZpZWxkcykgewogICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGZpZWxkKSkKICAgICAgICAgIHRoaXNbZmllbGRdID0gZmllbGRzW2ZpZWxkXTsKICAgIH0KICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfU3RvcExpc3RlbmluZ0ZvclJvdXRlTWVzc2FnZXNfUGFyYW1zLnZhbGlkYXRlID0gZnVuY3Rpb24obWVzc2FnZVZhbGlkYXRvciwgb2Zmc2V0KSB7CiAgICB2YXIgZXJyOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdEhlYWRlcihvZmZzZXQsIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHZhciBrVmVyc2lvblNpemVzID0gWwogICAgICB7dmVyc2lvbjogMCwgbnVtQnl0ZXM6IDE2fQogICAgXTsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RWZXJzaW9uKG9mZnNldCwga1ZlcnNpb25TaXplcyk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFSb3V0ZVByb3ZpZGVyX1N0b3BMaXN0ZW5pbmdGb3JSb3V0ZU1lc3NhZ2VzX1BhcmFtcy5yb3V0ZUlkCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nUG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDAsIGZhbHNlKQogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfU3RvcExpc3RlbmluZ0ZvclJvdXRlTWVzc2FnZXNfUGFyYW1zLmVuY29kZWRTaXplID0gY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA4OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfU3RvcExpc3RlbmluZ0ZvclJvdXRlTWVzc2FnZXNfUGFyYW1zLmRlY29kZSA9IGZ1bmN0aW9uKGRlY29kZXIpIHsKICAgIHZhciBwYWNrZWQ7CiAgICB2YXIgdmFsID0gbmV3IE1lZGlhUm91dGVQcm92aWRlcl9TdG9wTGlzdGVuaW5nRm9yUm91dGVNZXNzYWdlc19QYXJhbXMoKTsKICAgIHZhciBudW1iZXJPZkJ5dGVzID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YXIgdmVyc2lvbiA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFsLnJvdXRlSWQgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5TdHJpbmcpOwogICAgcmV0dXJuIHZhbDsKICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfU3RvcExpc3RlbmluZ0ZvclJvdXRlTWVzc2FnZXNfUGFyYW1zLmVuY29kZSA9IGZ1bmN0aW9uKGVuY29kZXIsIHZhbCkgewogICAgdmFyIHBhY2tlZDsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoTWVkaWFSb3V0ZVByb3ZpZGVyX1N0b3BMaXN0ZW5pbmdGb3JSb3V0ZU1lc3NhZ2VzX1BhcmFtcy5lbmNvZGVkU2l6ZSk7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKDApOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nLCB2YWwucm91dGVJZCk7CiAgfTsKICBmdW5jdGlvbiBNZWRpYVJvdXRlUHJvdmlkZXJfRGV0YWNoUm91dGVfUGFyYW1zKHZhbHVlcykgewogICAgdGhpcy5pbml0RGVmYXVsdHNfKCk7CiAgICB0aGlzLmluaXRGaWVsZHNfKHZhbHVlcyk7CiAgfQoKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX0RldGFjaFJvdXRlX1BhcmFtcy5wcm90b3R5cGUuaW5pdERlZmF1bHRzXyA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy5yb3V0ZUlkID0gbnVsbDsKICB9OwogIE1lZGlhUm91dGVQcm92aWRlcl9EZXRhY2hSb3V0ZV9QYXJhbXMucHJvdG90eXBlLmluaXRGaWVsZHNfID0gZnVuY3Rpb24oZmllbGRzKSB7CiAgICBmb3IodmFyIGZpZWxkIGluIGZpZWxkcykgewogICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGZpZWxkKSkKICAgICAgICAgIHRoaXNbZmllbGRdID0gZmllbGRzW2ZpZWxkXTsKICAgIH0KICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfRGV0YWNoUm91dGVfUGFyYW1zLnZhbGlkYXRlID0gZnVuY3Rpb24obWVzc2FnZVZhbGlkYXRvciwgb2Zmc2V0KSB7CiAgICB2YXIgZXJyOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdEhlYWRlcihvZmZzZXQsIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHZhciBrVmVyc2lvblNpemVzID0gWwogICAgICB7dmVyc2lvbjogMCwgbnVtQnl0ZXM6IDE2fQogICAgXTsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RWZXJzaW9uKG9mZnNldCwga1ZlcnNpb25TaXplcyk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFSb3V0ZVByb3ZpZGVyX0RldGFjaFJvdXRlX1BhcmFtcy5yb3V0ZUlkCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nUG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDAsIGZhbHNlKQogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfRGV0YWNoUm91dGVfUGFyYW1zLmVuY29kZWRTaXplID0gY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA4OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfRGV0YWNoUm91dGVfUGFyYW1zLmRlY29kZSA9IGZ1bmN0aW9uKGRlY29kZXIpIHsKICAgIHZhciBwYWNrZWQ7CiAgICB2YXIgdmFsID0gbmV3IE1lZGlhUm91dGVQcm92aWRlcl9EZXRhY2hSb3V0ZV9QYXJhbXMoKTsKICAgIHZhciBudW1iZXJPZkJ5dGVzID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YXIgdmVyc2lvbiA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFsLnJvdXRlSWQgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5TdHJpbmcpOwogICAgcmV0dXJuIHZhbDsKICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfRGV0YWNoUm91dGVfUGFyYW1zLmVuY29kZSA9IGZ1bmN0aW9uKGVuY29kZXIsIHZhbCkgewogICAgdmFyIHBhY2tlZDsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoTWVkaWFSb3V0ZVByb3ZpZGVyX0RldGFjaFJvdXRlX1BhcmFtcy5lbmNvZGVkU2l6ZSk7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKDApOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nLCB2YWwucm91dGVJZCk7CiAgfTsKICBmdW5jdGlvbiBNZWRpYVJvdXRlUHJvdmlkZXJfRW5hYmxlTWRuc0Rpc2NvdmVyeV9QYXJhbXModmFsdWVzKSB7CiAgICB0aGlzLmluaXREZWZhdWx0c18oKTsKICAgIHRoaXMuaW5pdEZpZWxkc18odmFsdWVzKTsKICB9CgoKICBNZWRpYVJvdXRlUHJvdmlkZXJfRW5hYmxlTWRuc0Rpc2NvdmVyeV9QYXJhbXMucHJvdG90eXBlLmluaXREZWZhdWx0c18gPSBmdW5jdGlvbigpIHsKICB9OwogIE1lZGlhUm91dGVQcm92aWRlcl9FbmFibGVNZG5zRGlzY292ZXJ5X1BhcmFtcy5wcm90b3R5cGUuaW5pdEZpZWxkc18gPSBmdW5jdGlvbihmaWVsZHMpIHsKICAgIGZvcih2YXIgZmllbGQgaW4gZmllbGRzKSB7CiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoZmllbGQpKQogICAgICAgICAgdGhpc1tmaWVsZF0gPSBmaWVsZHNbZmllbGRdOwogICAgfQogIH07CgogIE1lZGlhUm91dGVQcm92aWRlcl9FbmFibGVNZG5zRGlzY292ZXJ5X1BhcmFtcy52YWxpZGF0ZSA9IGZ1bmN0aW9uKG1lc3NhZ2VWYWxpZGF0b3IsIG9mZnNldCkgewogICAgdmFyIGVycjsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RIZWFkZXIob2Zmc2V0LCBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICB2YXIga1ZlcnNpb25TaXplcyA9IFsKICAgICAge3ZlcnNpb246IDAsIG51bUJ5dGVzOiA4fQogICAgXTsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RWZXJzaW9uKG9mZnNldCwga1ZlcnNpb25TaXplcyk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwogIH07CgogIE1lZGlhUm91dGVQcm92aWRlcl9FbmFibGVNZG5zRGlzY292ZXJ5X1BhcmFtcy5lbmNvZGVkU2l6ZSA9IGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMDsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX0VuYWJsZU1kbnNEaXNjb3ZlcnlfUGFyYW1zLmRlY29kZSA9IGZ1bmN0aW9uKGRlY29kZXIpIHsKICAgIHZhciBwYWNrZWQ7CiAgICB2YXIgdmFsID0gbmV3IE1lZGlhUm91dGVQcm92aWRlcl9FbmFibGVNZG5zRGlzY292ZXJ5X1BhcmFtcygpOwogICAgdmFyIG51bWJlck9mQnl0ZXMgPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhciB2ZXJzaW9uID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICByZXR1cm4gdmFsOwogIH07CgogIE1lZGlhUm91dGVQcm92aWRlcl9FbmFibGVNZG5zRGlzY292ZXJ5X1BhcmFtcy5lbmNvZGUgPSBmdW5jdGlvbihlbmNvZGVyLCB2YWwpIHsKICAgIHZhciBwYWNrZWQ7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKE1lZGlhUm91dGVQcm92aWRlcl9FbmFibGVNZG5zRGlzY292ZXJ5X1BhcmFtcy5lbmNvZGVkU2l6ZSk7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKDApOwogIH07CiAgZnVuY3Rpb24gTWVkaWFSb3V0ZVByb3ZpZGVyX1VwZGF0ZU1lZGlhU2lua3NfUGFyYW1zKHZhbHVlcykgewogICAgdGhpcy5pbml0RGVmYXVsdHNfKCk7CiAgICB0aGlzLmluaXRGaWVsZHNfKHZhbHVlcyk7CiAgfQoKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1VwZGF0ZU1lZGlhU2lua3NfUGFyYW1zLnByb3RvdHlwZS5pbml0RGVmYXVsdHNfID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLm1lZGlhU291cmNlID0gbnVsbDsKICB9OwogIE1lZGlhUm91dGVQcm92aWRlcl9VcGRhdGVNZWRpYVNpbmtzX1BhcmFtcy5wcm90b3R5cGUuaW5pdEZpZWxkc18gPSBmdW5jdGlvbihmaWVsZHMpIHsKICAgIGZvcih2YXIgZmllbGQgaW4gZmllbGRzKSB7CiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoZmllbGQpKQogICAgICAgICAgdGhpc1tmaWVsZF0gPSBmaWVsZHNbZmllbGRdOwogICAgfQogIH07CgogIE1lZGlhUm91dGVQcm92aWRlcl9VcGRhdGVNZWRpYVNpbmtzX1BhcmFtcy52YWxpZGF0ZSA9IGZ1bmN0aW9uKG1lc3NhZ2VWYWxpZGF0b3IsIG9mZnNldCkgewogICAgdmFyIGVycjsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RIZWFkZXIob2Zmc2V0LCBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICB2YXIga1ZlcnNpb25TaXplcyA9IFsKICAgICAge3ZlcnNpb246IDAsIG51bUJ5dGVzOiAxNn0KICAgIF07CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0VmVyc2lvbihvZmZzZXQsIGtWZXJzaW9uU2l6ZXMpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhUm91dGVQcm92aWRlcl9VcGRhdGVNZWRpYVNpbmtzX1BhcmFtcy5tZWRpYVNvdXJjZQogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cmluZ1BvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAwLCBmYWxzZSkKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1VwZGF0ZU1lZGlhU2lua3NfUGFyYW1zLmVuY29kZWRTaXplID0gY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA4OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfVXBkYXRlTWVkaWFTaW5rc19QYXJhbXMuZGVjb2RlID0gZnVuY3Rpb24oZGVjb2RlcikgewogICAgdmFyIHBhY2tlZDsKICAgIHZhciB2YWwgPSBuZXcgTWVkaWFSb3V0ZVByb3ZpZGVyX1VwZGF0ZU1lZGlhU2lua3NfUGFyYW1zKCk7CiAgICB2YXIgbnVtYmVyT2ZCeXRlcyA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFyIHZlcnNpb24gPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhbC5tZWRpYVNvdXJjZSA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLlN0cmluZyk7CiAgICByZXR1cm4gdmFsOwogIH07CgogIE1lZGlhUm91dGVQcm92aWRlcl9VcGRhdGVNZWRpYVNpbmtzX1BhcmFtcy5lbmNvZGUgPSBmdW5jdGlvbihlbmNvZGVyLCB2YWwpIHsKICAgIHZhciBwYWNrZWQ7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKE1lZGlhUm91dGVQcm92aWRlcl9VcGRhdGVNZWRpYVNpbmtzX1BhcmFtcy5lbmNvZGVkU2l6ZSk7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKDApOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nLCB2YWwubWVkaWFTb3VyY2UpOwogIH07CiAgZnVuY3Rpb24gTWVkaWFSb3V0ZVByb3ZpZGVyX1NlYXJjaFNpbmtzX1BhcmFtcyh2YWx1ZXMpIHsKICAgIHRoaXMuaW5pdERlZmF1bHRzXygpOwogICAgdGhpcy5pbml0RmllbGRzXyh2YWx1ZXMpOwogIH0KCgogIE1lZGlhUm91dGVQcm92aWRlcl9TZWFyY2hTaW5rc19QYXJhbXMucHJvdG90eXBlLmluaXREZWZhdWx0c18gPSBmdW5jdGlvbigpIHsKICAgIHRoaXMuc2lua0lkID0gbnVsbDsKICAgIHRoaXMubWVkaWFTb3VyY2UgPSBudWxsOwogICAgdGhpcy5zZWFyY2hDcml0ZXJpYSA9IG51bGw7CiAgfTsKICBNZWRpYVJvdXRlUHJvdmlkZXJfU2VhcmNoU2lua3NfUGFyYW1zLnByb3RvdHlwZS5pbml0RmllbGRzXyA9IGZ1bmN0aW9uKGZpZWxkcykgewogICAgZm9yKHZhciBmaWVsZCBpbiBmaWVsZHMpIHsKICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpCiAgICAgICAgICB0aGlzW2ZpZWxkXSA9IGZpZWxkc1tmaWVsZF07CiAgICB9CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1NlYXJjaFNpbmtzX1BhcmFtcy52YWxpZGF0ZSA9IGZ1bmN0aW9uKG1lc3NhZ2VWYWxpZGF0b3IsIG9mZnNldCkgewogICAgdmFyIGVycjsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RIZWFkZXIob2Zmc2V0LCBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICB2YXIga1ZlcnNpb25TaXplcyA9IFsKICAgICAge3ZlcnNpb246IDAsIG51bUJ5dGVzOiAzMn0KICAgIF07CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0VmVyc2lvbihvZmZzZXQsIGtWZXJzaW9uU2l6ZXMpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhUm91dGVQcm92aWRlcl9TZWFyY2hTaW5rc19QYXJhbXMuc2lua0lkCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nUG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDAsIGZhbHNlKQogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhUm91dGVQcm92aWRlcl9TZWFyY2hTaW5rc19QYXJhbXMubWVkaWFTb3VyY2UKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJpbmdQb2ludGVyKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgOCwgZmFsc2UpCiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFSb3V0ZVByb3ZpZGVyX1NlYXJjaFNpbmtzX1BhcmFtcy5zZWFyY2hDcml0ZXJpYQogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFBvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAxNiwgU2lua1NlYXJjaENyaXRlcmlhLCBmYWxzZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwogIH07CgogIE1lZGlhUm91dGVQcm92aWRlcl9TZWFyY2hTaW5rc19QYXJhbXMuZW5jb2RlZFNpemUgPSBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDI0OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfU2VhcmNoU2lua3NfUGFyYW1zLmRlY29kZSA9IGZ1bmN0aW9uKGRlY29kZXIpIHsKICAgIHZhciBwYWNrZWQ7CiAgICB2YXIgdmFsID0gbmV3IE1lZGlhUm91dGVQcm92aWRlcl9TZWFyY2hTaW5rc19QYXJhbXMoKTsKICAgIHZhciBudW1iZXJPZkJ5dGVzID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YXIgdmVyc2lvbiA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFsLnNpbmtJZCA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLlN0cmluZyk7CiAgICB2YWwubWVkaWFTb3VyY2UgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5TdHJpbmcpOwogICAgdmFsLnNlYXJjaENyaXRlcmlhID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3RQb2ludGVyKFNpbmtTZWFyY2hDcml0ZXJpYSk7CiAgICByZXR1cm4gdmFsOwogIH07CgogIE1lZGlhUm91dGVQcm92aWRlcl9TZWFyY2hTaW5rc19QYXJhbXMuZW5jb2RlID0gZnVuY3Rpb24oZW5jb2RlciwgdmFsKSB7CiAgICB2YXIgcGFja2VkOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMihNZWRpYVJvdXRlUHJvdmlkZXJfU2VhcmNoU2lua3NfUGFyYW1zLmVuY29kZWRTaXplKTsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoMCk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5TdHJpbmcsIHZhbC5zaW5rSWQpOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nLCB2YWwubWVkaWFTb3VyY2UpOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3RQb2ludGVyKFNpbmtTZWFyY2hDcml0ZXJpYSwgdmFsLnNlYXJjaENyaXRlcmlhKTsKICB9OwogIGZ1bmN0aW9uIE1lZGlhUm91dGVQcm92aWRlcl9TZWFyY2hTaW5rc19SZXNwb25zZVBhcmFtcyh2YWx1ZXMpIHsKICAgIHRoaXMuaW5pdERlZmF1bHRzXygpOwogICAgdGhpcy5pbml0RmllbGRzXyh2YWx1ZXMpOwogIH0KCgogIE1lZGlhUm91dGVQcm92aWRlcl9TZWFyY2hTaW5rc19SZXNwb25zZVBhcmFtcy5wcm90b3R5cGUuaW5pdERlZmF1bHRzXyA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy5zaW5rSWQgPSBudWxsOwogIH07CiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1NlYXJjaFNpbmtzX1Jlc3BvbnNlUGFyYW1zLnByb3RvdHlwZS5pbml0RmllbGRzXyA9IGZ1bmN0aW9uKGZpZWxkcykgewogICAgZm9yKHZhciBmaWVsZCBpbiBmaWVsZHMpIHsKICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpCiAgICAgICAgICB0aGlzW2ZpZWxkXSA9IGZpZWxkc1tmaWVsZF07CiAgICB9CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1NlYXJjaFNpbmtzX1Jlc3BvbnNlUGFyYW1zLnZhbGlkYXRlID0gZnVuY3Rpb24obWVzc2FnZVZhbGlkYXRvciwgb2Zmc2V0KSB7CiAgICB2YXIgZXJyOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdEhlYWRlcihvZmZzZXQsIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHZhciBrVmVyc2lvblNpemVzID0gWwogICAgICB7dmVyc2lvbjogMCwgbnVtQnl0ZXM6IDE2fQogICAgXTsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RWZXJzaW9uKG9mZnNldCwga1ZlcnNpb25TaXplcyk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFSb3V0ZVByb3ZpZGVyX1NlYXJjaFNpbmtzX1Jlc3BvbnNlUGFyYW1zLnNpbmtJZAogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cmluZ1BvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAwLCBmYWxzZSkKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1NlYXJjaFNpbmtzX1Jlc3BvbnNlUGFyYW1zLmVuY29kZWRTaXplID0gY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA4OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfU2VhcmNoU2lua3NfUmVzcG9uc2VQYXJhbXMuZGVjb2RlID0gZnVuY3Rpb24oZGVjb2RlcikgewogICAgdmFyIHBhY2tlZDsKICAgIHZhciB2YWwgPSBuZXcgTWVkaWFSb3V0ZVByb3ZpZGVyX1NlYXJjaFNpbmtzX1Jlc3BvbnNlUGFyYW1zKCk7CiAgICB2YXIgbnVtYmVyT2ZCeXRlcyA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFyIHZlcnNpb24gPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhbC5zaW5rSWQgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5TdHJpbmcpOwogICAgcmV0dXJuIHZhbDsKICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfU2VhcmNoU2lua3NfUmVzcG9uc2VQYXJhbXMuZW5jb2RlID0gZnVuY3Rpb24oZW5jb2RlciwgdmFsKSB7CiAgICB2YXIgcGFja2VkOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMihNZWRpYVJvdXRlUHJvdmlkZXJfU2VhcmNoU2lua3NfUmVzcG9uc2VQYXJhbXMuZW5jb2RlZFNpemUpOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMigwKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLlN0cmluZywgdmFsLnNpbmtJZCk7CiAgfTsKICBmdW5jdGlvbiBNZWRpYVJvdXRlUHJvdmlkZXJfUHJvdmlkZVNpbmtzX1BhcmFtcyh2YWx1ZXMpIHsKICAgIHRoaXMuaW5pdERlZmF1bHRzXygpOwogICAgdGhpcy5pbml0RmllbGRzXyh2YWx1ZXMpOwogIH0KCgogIE1lZGlhUm91dGVQcm92aWRlcl9Qcm92aWRlU2lua3NfUGFyYW1zLnByb3RvdHlwZS5pbml0RGVmYXVsdHNfID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLnByb3ZpZGVyTmFtZSA9IG51bGw7CiAgICB0aGlzLnNpbmtzID0gbnVsbDsKICB9OwogIE1lZGlhUm91dGVQcm92aWRlcl9Qcm92aWRlU2lua3NfUGFyYW1zLnByb3RvdHlwZS5pbml0RmllbGRzXyA9IGZ1bmN0aW9uKGZpZWxkcykgewogICAgZm9yKHZhciBmaWVsZCBpbiBmaWVsZHMpIHsKICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpCiAgICAgICAgICB0aGlzW2ZpZWxkXSA9IGZpZWxkc1tmaWVsZF07CiAgICB9CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1Byb3ZpZGVTaW5rc19QYXJhbXMudmFsaWRhdGUgPSBmdW5jdGlvbihtZXNzYWdlVmFsaWRhdG9yLCBvZmZzZXQpIHsKICAgIHZhciBlcnI7CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0SGVhZGVyKG9mZnNldCwgY29kZWMua1N0cnVjdEhlYWRlclNpemUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgdmFyIGtWZXJzaW9uU2l6ZXMgPSBbCiAgICAgIHt2ZXJzaW9uOiAwLCBudW1CeXRlczogMjR9CiAgICBdOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFZlcnNpb24ob2Zmc2V0LCBrVmVyc2lvblNpemVzKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVJvdXRlUHJvdmlkZXJfUHJvdmlkZVNpbmtzX1BhcmFtcy5wcm92aWRlck5hbWUKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJpbmdQb2ludGVyKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMCwgZmFsc2UpCiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFSb3V0ZVByb3ZpZGVyX1Byb3ZpZGVTaW5rc19QYXJhbXMuc2lua3MKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVBcnJheVBvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA4LCA4LCBuZXcgY29kZWMuUG9pbnRlclRvKE1lZGlhU2luayksIGZhbHNlLCBbMF0sIDApOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfUHJvdmlkZVNpbmtzX1BhcmFtcy5lbmNvZGVkU2l6ZSA9IGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMTY7CgogIE1lZGlhUm91dGVQcm92aWRlcl9Qcm92aWRlU2lua3NfUGFyYW1zLmRlY29kZSA9IGZ1bmN0aW9uKGRlY29kZXIpIHsKICAgIHZhciBwYWNrZWQ7CiAgICB2YXIgdmFsID0gbmV3IE1lZGlhUm91dGVQcm92aWRlcl9Qcm92aWRlU2lua3NfUGFyYW1zKCk7CiAgICB2YXIgbnVtYmVyT2ZCeXRlcyA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFyIHZlcnNpb24gPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhbC5wcm92aWRlck5hbWUgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5TdHJpbmcpOwogICAgdmFsLnNpbmtzID0gZGVjb2Rlci5kZWNvZGVBcnJheVBvaW50ZXIobmV3IGNvZGVjLlBvaW50ZXJUbyhNZWRpYVNpbmspKTsKICAgIHJldHVybiB2YWw7CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1Byb3ZpZGVTaW5rc19QYXJhbXMuZW5jb2RlID0gZnVuY3Rpb24oZW5jb2RlciwgdmFsKSB7CiAgICB2YXIgcGFja2VkOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMihNZWRpYVJvdXRlUHJvdmlkZXJfUHJvdmlkZVNpbmtzX1BhcmFtcy5lbmNvZGVkU2l6ZSk7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKDApOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nLCB2YWwucHJvdmlkZXJOYW1lKTsKICAgIGVuY29kZXIuZW5jb2RlQXJyYXlQb2ludGVyKG5ldyBjb2RlYy5Qb2ludGVyVG8oTWVkaWFTaW5rKSwgdmFsLnNpbmtzKTsKICB9OwogIGZ1bmN0aW9uIE1lZGlhUm91dGVQcm92aWRlcl9DcmVhdGVNZWRpYVJvdXRlQ29udHJvbGxlcl9QYXJhbXModmFsdWVzKSB7CiAgICB0aGlzLmluaXREZWZhdWx0c18oKTsKICAgIHRoaXMuaW5pdEZpZWxkc18odmFsdWVzKTsKICB9CgoKICBNZWRpYVJvdXRlUHJvdmlkZXJfQ3JlYXRlTWVkaWFSb3V0ZUNvbnRyb2xsZXJfUGFyYW1zLnByb3RvdHlwZS5pbml0RGVmYXVsdHNfID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLnJvdXRlSWQgPSBudWxsOwogICAgdGhpcy5tZWRpYUNvbnRyb2xsZXIgPSBuZXcgYmluZGluZ3MuSW50ZXJmYWNlUmVxdWVzdCgpOwogICAgdGhpcy5vYnNlcnZlciA9IG5ldyBtZWRpYV9zdGF0dXMkLk1lZGlhU3RhdHVzT2JzZXJ2ZXJQdHIoKTsKICB9OwogIE1lZGlhUm91dGVQcm92aWRlcl9DcmVhdGVNZWRpYVJvdXRlQ29udHJvbGxlcl9QYXJhbXMucHJvdG90eXBlLmluaXRGaWVsZHNfID0gZnVuY3Rpb24oZmllbGRzKSB7CiAgICBmb3IodmFyIGZpZWxkIGluIGZpZWxkcykgewogICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGZpZWxkKSkKICAgICAgICAgIHRoaXNbZmllbGRdID0gZmllbGRzW2ZpZWxkXTsKICAgIH0KICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfQ3JlYXRlTWVkaWFSb3V0ZUNvbnRyb2xsZXJfUGFyYW1zLnZhbGlkYXRlID0gZnVuY3Rpb24obWVzc2FnZVZhbGlkYXRvciwgb2Zmc2V0KSB7CiAgICB2YXIgZXJyOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdEhlYWRlcihvZmZzZXQsIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHZhciBrVmVyc2lvblNpemVzID0gWwogICAgICB7dmVyc2lvbjogMCwgbnVtQnl0ZXM6IDMyfQogICAgXTsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RWZXJzaW9uKG9mZnNldCwga1ZlcnNpb25TaXplcyk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFSb3V0ZVByb3ZpZGVyX0NyZWF0ZU1lZGlhUm91dGVDb250cm9sbGVyX1BhcmFtcy5yb3V0ZUlkCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nUG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDAsIGZhbHNlKQogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhUm91dGVQcm92aWRlcl9DcmVhdGVNZWRpYVJvdXRlQ29udHJvbGxlcl9QYXJhbXMubWVkaWFDb250cm9sbGVyCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlSW50ZXJmYWNlUmVxdWVzdChvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDgsIGZhbHNlKQogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhUm91dGVQcm92aWRlcl9DcmVhdGVNZWRpYVJvdXRlQ29udHJvbGxlcl9QYXJhbXMub2JzZXJ2ZXIKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVJbnRlcmZhY2Uob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAxMiwgZmFsc2UpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfQ3JlYXRlTWVkaWFSb3V0ZUNvbnRyb2xsZXJfUGFyYW1zLmVuY29kZWRTaXplID0gY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAyNDsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX0NyZWF0ZU1lZGlhUm91dGVDb250cm9sbGVyX1BhcmFtcy5kZWNvZGUgPSBmdW5jdGlvbihkZWNvZGVyKSB7CiAgICB2YXIgcGFja2VkOwogICAgdmFyIHZhbCA9IG5ldyBNZWRpYVJvdXRlUHJvdmlkZXJfQ3JlYXRlTWVkaWFSb3V0ZUNvbnRyb2xsZXJfUGFyYW1zKCk7CiAgICB2YXIgbnVtYmVyT2ZCeXRlcyA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFyIHZlcnNpb24gPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhbC5yb3V0ZUlkID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nKTsKICAgIHZhbC5tZWRpYUNvbnRyb2xsZXIgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5JbnRlcmZhY2VSZXF1ZXN0KTsKICAgIHZhbC5vYnNlcnZlciA9IGRlY29kZXIuZGVjb2RlU3RydWN0KG5ldyBjb2RlYy5JbnRlcmZhY2UobWVkaWFfc3RhdHVzJC5NZWRpYVN0YXR1c09ic2VydmVyUHRyKSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICByZXR1cm4gdmFsOwogIH07CgogIE1lZGlhUm91dGVQcm92aWRlcl9DcmVhdGVNZWRpYVJvdXRlQ29udHJvbGxlcl9QYXJhbXMuZW5jb2RlID0gZnVuY3Rpb24oZW5jb2RlciwgdmFsKSB7CiAgICB2YXIgcGFja2VkOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMihNZWRpYVJvdXRlUHJvdmlkZXJfQ3JlYXRlTWVkaWFSb3V0ZUNvbnRyb2xsZXJfUGFyYW1zLmVuY29kZWRTaXplKTsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoMCk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5TdHJpbmcsIHZhbC5yb3V0ZUlkKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLkludGVyZmFjZVJlcXVlc3QsIHZhbC5tZWRpYUNvbnRyb2xsZXIpOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QobmV3IGNvZGVjLkludGVyZmFjZShtZWRpYV9zdGF0dXMkLk1lZGlhU3RhdHVzT2JzZXJ2ZXJQdHIpLCB2YWwub2JzZXJ2ZXIpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogIH07CiAgZnVuY3Rpb24gTWVkaWFSb3V0ZVByb3ZpZGVyX0NyZWF0ZU1lZGlhUm91dGVDb250cm9sbGVyX1Jlc3BvbnNlUGFyYW1zKHZhbHVlcykgewogICAgdGhpcy5pbml0RGVmYXVsdHNfKCk7CiAgICB0aGlzLmluaXRGaWVsZHNfKHZhbHVlcyk7CiAgfQoKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX0NyZWF0ZU1lZGlhUm91dGVDb250cm9sbGVyX1Jlc3BvbnNlUGFyYW1zLnByb3RvdHlwZS5pbml0RGVmYXVsdHNfID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLnN1Y2Nlc3MgPSBmYWxzZTsKICB9OwogIE1lZGlhUm91dGVQcm92aWRlcl9DcmVhdGVNZWRpYVJvdXRlQ29udHJvbGxlcl9SZXNwb25zZVBhcmFtcy5wcm90b3R5cGUuaW5pdEZpZWxkc18gPSBmdW5jdGlvbihmaWVsZHMpIHsKICAgIGZvcih2YXIgZmllbGQgaW4gZmllbGRzKSB7CiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoZmllbGQpKQogICAgICAgICAgdGhpc1tmaWVsZF0gPSBmaWVsZHNbZmllbGRdOwogICAgfQogIH07CgogIE1lZGlhUm91dGVQcm92aWRlcl9DcmVhdGVNZWRpYVJvdXRlQ29udHJvbGxlcl9SZXNwb25zZVBhcmFtcy52YWxpZGF0ZSA9IGZ1bmN0aW9uKG1lc3NhZ2VWYWxpZGF0b3IsIG9mZnNldCkgewogICAgdmFyIGVycjsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RIZWFkZXIob2Zmc2V0LCBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICB2YXIga1ZlcnNpb25TaXplcyA9IFsKICAgICAge3ZlcnNpb246IDAsIG51bUJ5dGVzOiAxNn0KICAgIF07CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0VmVyc2lvbihvZmZzZXQsIGtWZXJzaW9uU2l6ZXMpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX0NyZWF0ZU1lZGlhUm91dGVDb250cm9sbGVyX1Jlc3BvbnNlUGFyYW1zLmVuY29kZWRTaXplID0gY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA4OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfQ3JlYXRlTWVkaWFSb3V0ZUNvbnRyb2xsZXJfUmVzcG9uc2VQYXJhbXMuZGVjb2RlID0gZnVuY3Rpb24oZGVjb2RlcikgewogICAgdmFyIHBhY2tlZDsKICAgIHZhciB2YWwgPSBuZXcgTWVkaWFSb3V0ZVByb3ZpZGVyX0NyZWF0ZU1lZGlhUm91dGVDb250cm9sbGVyX1Jlc3BvbnNlUGFyYW1zKCk7CiAgICB2YXIgbnVtYmVyT2ZCeXRlcyA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFyIHZlcnNpb24gPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHBhY2tlZCA9IGRlY29kZXIucmVhZFVpbnQ4KCk7CiAgICB2YWwuc3VjY2VzcyA9IChwYWNrZWQgPj4gMCkgJiAxID8gdHJ1ZSA6IGZhbHNlOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgcmV0dXJuIHZhbDsKICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfQ3JlYXRlTWVkaWFSb3V0ZUNvbnRyb2xsZXJfUmVzcG9uc2VQYXJhbXMuZW5jb2RlID0gZnVuY3Rpb24oZW5jb2RlciwgdmFsKSB7CiAgICB2YXIgcGFja2VkOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMihNZWRpYVJvdXRlUHJvdmlkZXJfQ3JlYXRlTWVkaWFSb3V0ZUNvbnRyb2xsZXJfUmVzcG9uc2VQYXJhbXMuZW5jb2RlZFNpemUpOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMigwKTsKICAgIHBhY2tlZCA9IDA7CiAgICBwYWNrZWQgfD0gKHZhbC5zdWNjZXNzICYgMSkgPDwgMAogICAgZW5jb2Rlci53cml0ZVVpbnQ4KHBhY2tlZCk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgfTsKICBmdW5jdGlvbiBNZWRpYVJvdXRlcl9SZWdpc3Rlck1lZGlhUm91dGVQcm92aWRlcl9QYXJhbXModmFsdWVzKSB7CiAgICB0aGlzLmluaXREZWZhdWx0c18oKTsKICAgIHRoaXMuaW5pdEZpZWxkc18odmFsdWVzKTsKICB9CgoKICBNZWRpYVJvdXRlcl9SZWdpc3Rlck1lZGlhUm91dGVQcm92aWRlcl9QYXJhbXMucHJvdG90eXBlLmluaXREZWZhdWx0c18gPSBmdW5jdGlvbigpIHsKICAgIHRoaXMucHJvdmlkZXJJZCA9IDA7CiAgICB0aGlzLm1lZGlhUm91dGVyUHJvdmlkZXIgPSBuZXcgTWVkaWFSb3V0ZVByb3ZpZGVyUHRyKCk7CiAgfTsKICBNZWRpYVJvdXRlcl9SZWdpc3Rlck1lZGlhUm91dGVQcm92aWRlcl9QYXJhbXMucHJvdG90eXBlLmluaXRGaWVsZHNfID0gZnVuY3Rpb24oZmllbGRzKSB7CiAgICBmb3IodmFyIGZpZWxkIGluIGZpZWxkcykgewogICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGZpZWxkKSkKICAgICAgICAgIHRoaXNbZmllbGRdID0gZmllbGRzW2ZpZWxkXTsKICAgIH0KICB9OwoKICBNZWRpYVJvdXRlcl9SZWdpc3Rlck1lZGlhUm91dGVQcm92aWRlcl9QYXJhbXMudmFsaWRhdGUgPSBmdW5jdGlvbihtZXNzYWdlVmFsaWRhdG9yLCBvZmZzZXQpIHsKICAgIHZhciBlcnI7CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0SGVhZGVyKG9mZnNldCwgY29kZWMua1N0cnVjdEhlYWRlclNpemUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgdmFyIGtWZXJzaW9uU2l6ZXMgPSBbCiAgICAgIHt2ZXJzaW9uOiAwLCBudW1CeXRlczogMjR9CiAgICBdOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFZlcnNpb24ob2Zmc2V0LCBrVmVyc2lvblNpemVzKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVJvdXRlcl9SZWdpc3Rlck1lZGlhUm91dGVQcm92aWRlcl9QYXJhbXMucHJvdmlkZXJJZAogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZUVudW0ob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAwLCBNZWRpYVJvdXRlUHJvdmlkZXIuSWQpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhUm91dGVyX1JlZ2lzdGVyTWVkaWFSb3V0ZVByb3ZpZGVyX1BhcmFtcy5tZWRpYVJvdXRlclByb3ZpZGVyCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlSW50ZXJmYWNlKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgNCwgZmFsc2UpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICB9OwoKICBNZWRpYVJvdXRlcl9SZWdpc3Rlck1lZGlhUm91dGVQcm92aWRlcl9QYXJhbXMuZW5jb2RlZFNpemUgPSBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDE2OwoKICBNZWRpYVJvdXRlcl9SZWdpc3Rlck1lZGlhUm91dGVQcm92aWRlcl9QYXJhbXMuZGVjb2RlID0gZnVuY3Rpb24oZGVjb2RlcikgewogICAgdmFyIHBhY2tlZDsKICAgIHZhciB2YWwgPSBuZXcgTWVkaWFSb3V0ZXJfUmVnaXN0ZXJNZWRpYVJvdXRlUHJvdmlkZXJfUGFyYW1zKCk7CiAgICB2YXIgbnVtYmVyT2ZCeXRlcyA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFyIHZlcnNpb24gPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhbC5wcm92aWRlcklkID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuSW50MzIpOwogICAgdmFsLm1lZGlhUm91dGVyUHJvdmlkZXIgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChuZXcgY29kZWMuSW50ZXJmYWNlKE1lZGlhUm91dGVQcm92aWRlclB0cikpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgcmV0dXJuIHZhbDsKICB9OwoKICBNZWRpYVJvdXRlcl9SZWdpc3Rlck1lZGlhUm91dGVQcm92aWRlcl9QYXJhbXMuZW5jb2RlID0gZnVuY3Rpb24oZW5jb2RlciwgdmFsKSB7CiAgICB2YXIgcGFja2VkOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMihNZWRpYVJvdXRlcl9SZWdpc3Rlck1lZGlhUm91dGVQcm92aWRlcl9QYXJhbXMuZW5jb2RlZFNpemUpOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMigwKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLkludDMyLCB2YWwucHJvdmlkZXJJZCk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChuZXcgY29kZWMuSW50ZXJmYWNlKE1lZGlhUm91dGVQcm92aWRlclB0ciksIHZhbC5tZWRpYVJvdXRlclByb3ZpZGVyKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICB9OwogIGZ1bmN0aW9uIE1lZGlhUm91dGVyX1JlZ2lzdGVyTWVkaWFSb3V0ZVByb3ZpZGVyX1Jlc3BvbnNlUGFyYW1zKHZhbHVlcykgewogICAgdGhpcy5pbml0RGVmYXVsdHNfKCk7CiAgICB0aGlzLmluaXRGaWVsZHNfKHZhbHVlcyk7CiAgfQoKCiAgTWVkaWFSb3V0ZXJfUmVnaXN0ZXJNZWRpYVJvdXRlUHJvdmlkZXJfUmVzcG9uc2VQYXJhbXMucHJvdG90eXBlLmluaXREZWZhdWx0c18gPSBmdW5jdGlvbigpIHsKICAgIHRoaXMuaW5zdGFuY2VJZCA9IG51bGw7CiAgICB0aGlzLmNvbmZpZyA9IG51bGw7CiAgfTsKICBNZWRpYVJvdXRlcl9SZWdpc3Rlck1lZGlhUm91dGVQcm92aWRlcl9SZXNwb25zZVBhcmFtcy5wcm90b3R5cGUuaW5pdEZpZWxkc18gPSBmdW5jdGlvbihmaWVsZHMpIHsKICAgIGZvcih2YXIgZmllbGQgaW4gZmllbGRzKSB7CiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoZmllbGQpKQogICAgICAgICAgdGhpc1tmaWVsZF0gPSBmaWVsZHNbZmllbGRdOwogICAgfQogIH07CgogIE1lZGlhUm91dGVyX1JlZ2lzdGVyTWVkaWFSb3V0ZVByb3ZpZGVyX1Jlc3BvbnNlUGFyYW1zLnZhbGlkYXRlID0gZnVuY3Rpb24obWVzc2FnZVZhbGlkYXRvciwgb2Zmc2V0KSB7CiAgICB2YXIgZXJyOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdEhlYWRlcihvZmZzZXQsIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHZhciBrVmVyc2lvblNpemVzID0gWwogICAgICB7dmVyc2lvbjogMCwgbnVtQnl0ZXM6IDI0fQogICAgXTsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RWZXJzaW9uKG9mZnNldCwga1ZlcnNpb25TaXplcyk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFSb3V0ZXJfUmVnaXN0ZXJNZWRpYVJvdXRlUHJvdmlkZXJfUmVzcG9uc2VQYXJhbXMuaW5zdGFuY2VJZAogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cmluZ1BvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAwLCBmYWxzZSkKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVJvdXRlcl9SZWdpc3Rlck1lZGlhUm91dGVQcm92aWRlcl9SZXNwb25zZVBhcmFtcy5jb25maWcKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RQb2ludGVyKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgOCwgTWVkaWFSb3V0ZVByb3ZpZGVyQ29uZmlnLCBmYWxzZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwogIH07CgogIE1lZGlhUm91dGVyX1JlZ2lzdGVyTWVkaWFSb3V0ZVByb3ZpZGVyX1Jlc3BvbnNlUGFyYW1zLmVuY29kZWRTaXplID0gY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAxNjsKCiAgTWVkaWFSb3V0ZXJfUmVnaXN0ZXJNZWRpYVJvdXRlUHJvdmlkZXJfUmVzcG9uc2VQYXJhbXMuZGVjb2RlID0gZnVuY3Rpb24oZGVjb2RlcikgewogICAgdmFyIHBhY2tlZDsKICAgIHZhciB2YWwgPSBuZXcgTWVkaWFSb3V0ZXJfUmVnaXN0ZXJNZWRpYVJvdXRlUHJvdmlkZXJfUmVzcG9uc2VQYXJhbXMoKTsKICAgIHZhciBudW1iZXJPZkJ5dGVzID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YXIgdmVyc2lvbiA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFsLmluc3RhbmNlSWQgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5TdHJpbmcpOwogICAgdmFsLmNvbmZpZyA9IGRlY29kZXIuZGVjb2RlU3RydWN0UG9pbnRlcihNZWRpYVJvdXRlUHJvdmlkZXJDb25maWcpOwogICAgcmV0dXJuIHZhbDsKICB9OwoKICBNZWRpYVJvdXRlcl9SZWdpc3Rlck1lZGlhUm91dGVQcm92aWRlcl9SZXNwb25zZVBhcmFtcy5lbmNvZGUgPSBmdW5jdGlvbihlbmNvZGVyLCB2YWwpIHsKICAgIHZhciBwYWNrZWQ7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKE1lZGlhUm91dGVyX1JlZ2lzdGVyTWVkaWFSb3V0ZVByb3ZpZGVyX1Jlc3BvbnNlUGFyYW1zLmVuY29kZWRTaXplKTsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoMCk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5TdHJpbmcsIHZhbC5pbnN0YW5jZUlkKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0UG9pbnRlcihNZWRpYVJvdXRlUHJvdmlkZXJDb25maWcsIHZhbC5jb25maWcpOwogIH07CiAgZnVuY3Rpb24gTWVkaWFSb3V0ZXJfT25TaW5rc1JlY2VpdmVkX1BhcmFtcyh2YWx1ZXMpIHsKICAgIHRoaXMuaW5pdERlZmF1bHRzXygpOwogICAgdGhpcy5pbml0RmllbGRzXyh2YWx1ZXMpOwogIH0KCgogIE1lZGlhUm91dGVyX09uU2lua3NSZWNlaXZlZF9QYXJhbXMucHJvdG90eXBlLmluaXREZWZhdWx0c18gPSBmdW5jdGlvbigpIHsKICAgIHRoaXMucHJvdmlkZXJJZCA9IDA7CiAgICB0aGlzLm1lZGlhU291cmNlID0gbnVsbDsKICAgIHRoaXMuc2lua3MgPSBudWxsOwogICAgdGhpcy5vcmlnaW5zID0gbnVsbDsKICB9OwogIE1lZGlhUm91dGVyX09uU2lua3NSZWNlaXZlZF9QYXJhbXMucHJvdG90eXBlLmluaXRGaWVsZHNfID0gZnVuY3Rpb24oZmllbGRzKSB7CiAgICBmb3IodmFyIGZpZWxkIGluIGZpZWxkcykgewogICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGZpZWxkKSkKICAgICAgICAgIHRoaXNbZmllbGRdID0gZmllbGRzW2ZpZWxkXTsKICAgIH0KICB9OwoKICBNZWRpYVJvdXRlcl9PblNpbmtzUmVjZWl2ZWRfUGFyYW1zLnZhbGlkYXRlID0gZnVuY3Rpb24obWVzc2FnZVZhbGlkYXRvciwgb2Zmc2V0KSB7CiAgICB2YXIgZXJyOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdEhlYWRlcihvZmZzZXQsIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHZhciBrVmVyc2lvblNpemVzID0gWwogICAgICB7dmVyc2lvbjogMCwgbnVtQnl0ZXM6IDQwfQogICAgXTsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RWZXJzaW9uKG9mZnNldCwga1ZlcnNpb25TaXplcyk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFSb3V0ZXJfT25TaW5rc1JlY2VpdmVkX1BhcmFtcy5wcm92aWRlcklkCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlRW51bShvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDAsIE1lZGlhUm91dGVQcm92aWRlci5JZCk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFSb3V0ZXJfT25TaW5rc1JlY2VpdmVkX1BhcmFtcy5tZWRpYVNvdXJjZQogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cmluZ1BvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA4LCBmYWxzZSkKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVJvdXRlcl9PblNpbmtzUmVjZWl2ZWRfUGFyYW1zLnNpbmtzCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlQXJyYXlQb2ludGVyKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMTYsIDgsIG5ldyBjb2RlYy5Qb2ludGVyVG8oTWVkaWFTaW5rKSwgZmFsc2UsIFswXSwgMCk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFSb3V0ZXJfT25TaW5rc1JlY2VpdmVkX1BhcmFtcy5vcmlnaW5zCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlQXJyYXlQb2ludGVyKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMjQsIDgsIG5ldyBjb2RlYy5Qb2ludGVyVG8ob3JpZ2luJC5PcmlnaW4pLCBmYWxzZSwgWzBdLCAwKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CiAgfTsKCiAgTWVkaWFSb3V0ZXJfT25TaW5rc1JlY2VpdmVkX1BhcmFtcy5lbmNvZGVkU2l6ZSA9IGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMzI7CgogIE1lZGlhUm91dGVyX09uU2lua3NSZWNlaXZlZF9QYXJhbXMuZGVjb2RlID0gZnVuY3Rpb24oZGVjb2RlcikgewogICAgdmFyIHBhY2tlZDsKICAgIHZhciB2YWwgPSBuZXcgTWVkaWFSb3V0ZXJfT25TaW5rc1JlY2VpdmVkX1BhcmFtcygpOwogICAgdmFyIG51bWJlck9mQnl0ZXMgPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhciB2ZXJzaW9uID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YWwucHJvdmlkZXJJZCA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLkludDMyKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIHZhbC5tZWRpYVNvdXJjZSA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLlN0cmluZyk7CiAgICB2YWwuc2lua3MgPSBkZWNvZGVyLmRlY29kZUFycmF5UG9pbnRlcihuZXcgY29kZWMuUG9pbnRlclRvKE1lZGlhU2luaykpOwogICAgdmFsLm9yaWdpbnMgPSBkZWNvZGVyLmRlY29kZUFycmF5UG9pbnRlcihuZXcgY29kZWMuUG9pbnRlclRvKG9yaWdpbiQuT3JpZ2luKSk7CiAgICByZXR1cm4gdmFsOwogIH07CgogIE1lZGlhUm91dGVyX09uU2lua3NSZWNlaXZlZF9QYXJhbXMuZW5jb2RlID0gZnVuY3Rpb24oZW5jb2RlciwgdmFsKSB7CiAgICB2YXIgcGFja2VkOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMihNZWRpYVJvdXRlcl9PblNpbmtzUmVjZWl2ZWRfUGFyYW1zLmVuY29kZWRTaXplKTsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoMCk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5JbnQzMiwgdmFsLnByb3ZpZGVySWQpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nLCB2YWwubWVkaWFTb3VyY2UpOwogICAgZW5jb2Rlci5lbmNvZGVBcnJheVBvaW50ZXIobmV3IGNvZGVjLlBvaW50ZXJUbyhNZWRpYVNpbmspLCB2YWwuc2lua3MpOwogICAgZW5jb2Rlci5lbmNvZGVBcnJheVBvaW50ZXIobmV3IGNvZGVjLlBvaW50ZXJUbyhvcmlnaW4kLk9yaWdpbiksIHZhbC5vcmlnaW5zKTsKICB9OwogIGZ1bmN0aW9uIE1lZGlhUm91dGVyX09uSXNzdWVfUGFyYW1zKHZhbHVlcykgewogICAgdGhpcy5pbml0RGVmYXVsdHNfKCk7CiAgICB0aGlzLmluaXRGaWVsZHNfKHZhbHVlcyk7CiAgfQoKCiAgTWVkaWFSb3V0ZXJfT25Jc3N1ZV9QYXJhbXMucHJvdG90eXBlLmluaXREZWZhdWx0c18gPSBmdW5jdGlvbigpIHsKICAgIHRoaXMuaXNzdWUgPSBudWxsOwogIH07CiAgTWVkaWFSb3V0ZXJfT25Jc3N1ZV9QYXJhbXMucHJvdG90eXBlLmluaXRGaWVsZHNfID0gZnVuY3Rpb24oZmllbGRzKSB7CiAgICBmb3IodmFyIGZpZWxkIGluIGZpZWxkcykgewogICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGZpZWxkKSkKICAgICAgICAgIHRoaXNbZmllbGRdID0gZmllbGRzW2ZpZWxkXTsKICAgIH0KICB9OwoKICBNZWRpYVJvdXRlcl9Pbklzc3VlX1BhcmFtcy52YWxpZGF0ZSA9IGZ1bmN0aW9uKG1lc3NhZ2VWYWxpZGF0b3IsIG9mZnNldCkgewogICAgdmFyIGVycjsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RIZWFkZXIob2Zmc2V0LCBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICB2YXIga1ZlcnNpb25TaXplcyA9IFsKICAgICAge3ZlcnNpb246IDAsIG51bUJ5dGVzOiAxNn0KICAgIF07CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0VmVyc2lvbihvZmZzZXQsIGtWZXJzaW9uU2l6ZXMpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhUm91dGVyX09uSXNzdWVfUGFyYW1zLmlzc3VlCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0UG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDAsIElzc3VlLCBmYWxzZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwogIH07CgogIE1lZGlhUm91dGVyX09uSXNzdWVfUGFyYW1zLmVuY29kZWRTaXplID0gY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA4OwoKICBNZWRpYVJvdXRlcl9Pbklzc3VlX1BhcmFtcy5kZWNvZGUgPSBmdW5jdGlvbihkZWNvZGVyKSB7CiAgICB2YXIgcGFja2VkOwogICAgdmFyIHZhbCA9IG5ldyBNZWRpYVJvdXRlcl9Pbklzc3VlX1BhcmFtcygpOwogICAgdmFyIG51bWJlck9mQnl0ZXMgPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhciB2ZXJzaW9uID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YWwuaXNzdWUgPSBkZWNvZGVyLmRlY29kZVN0cnVjdFBvaW50ZXIoSXNzdWUpOwogICAgcmV0dXJuIHZhbDsKICB9OwoKICBNZWRpYVJvdXRlcl9Pbklzc3VlX1BhcmFtcy5lbmNvZGUgPSBmdW5jdGlvbihlbmNvZGVyLCB2YWwpIHsKICAgIHZhciBwYWNrZWQ7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKE1lZGlhUm91dGVyX09uSXNzdWVfUGFyYW1zLmVuY29kZWRTaXplKTsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoMCk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdFBvaW50ZXIoSXNzdWUsIHZhbC5pc3N1ZSk7CiAgfTsKICBmdW5jdGlvbiBNZWRpYVJvdXRlcl9PblJvdXRlc1VwZGF0ZWRfUGFyYW1zKHZhbHVlcykgewogICAgdGhpcy5pbml0RGVmYXVsdHNfKCk7CiAgICB0aGlzLmluaXRGaWVsZHNfKHZhbHVlcyk7CiAgfQoKCiAgTWVkaWFSb3V0ZXJfT25Sb3V0ZXNVcGRhdGVkX1BhcmFtcy5wcm90b3R5cGUuaW5pdERlZmF1bHRzXyA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy5wcm92aWRlcklkID0gMDsKICAgIHRoaXMucm91dGVzID0gbnVsbDsKICAgIHRoaXMubWVkaWFTb3VyY2UgPSBudWxsOwogICAgdGhpcy5qb2luYWJsZVJvdXRlSWRzID0gbnVsbDsKICB9OwogIE1lZGlhUm91dGVyX09uUm91dGVzVXBkYXRlZF9QYXJhbXMucHJvdG90eXBlLmluaXRGaWVsZHNfID0gZnVuY3Rpb24oZmllbGRzKSB7CiAgICBmb3IodmFyIGZpZWxkIGluIGZpZWxkcykgewogICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGZpZWxkKSkKICAgICAgICAgIHRoaXNbZmllbGRdID0gZmllbGRzW2ZpZWxkXTsKICAgIH0KICB9OwoKICBNZWRpYVJvdXRlcl9PblJvdXRlc1VwZGF0ZWRfUGFyYW1zLnZhbGlkYXRlID0gZnVuY3Rpb24obWVzc2FnZVZhbGlkYXRvciwgb2Zmc2V0KSB7CiAgICB2YXIgZXJyOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdEhlYWRlcihvZmZzZXQsIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHZhciBrVmVyc2lvblNpemVzID0gWwogICAgICB7dmVyc2lvbjogMCwgbnVtQnl0ZXM6IDQwfQogICAgXTsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RWZXJzaW9uKG9mZnNldCwga1ZlcnNpb25TaXplcyk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFSb3V0ZXJfT25Sb3V0ZXNVcGRhdGVkX1BhcmFtcy5wcm92aWRlcklkCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlRW51bShvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDAsIE1lZGlhUm91dGVQcm92aWRlci5JZCk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFSb3V0ZXJfT25Sb3V0ZXNVcGRhdGVkX1BhcmFtcy5yb3V0ZXMKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVBcnJheVBvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA4LCA4LCBuZXcgY29kZWMuUG9pbnRlclRvKE1lZGlhUm91dGUpLCBmYWxzZSwgWzBdLCAwKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVJvdXRlcl9PblJvdXRlc1VwZGF0ZWRfUGFyYW1zLm1lZGlhU291cmNlCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nUG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDE2LCBmYWxzZSkKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVJvdXRlcl9PblJvdXRlc1VwZGF0ZWRfUGFyYW1zLmpvaW5hYmxlUm91dGVJZHMKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVBcnJheVBvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAyNCwgOCwgY29kZWMuU3RyaW5nLCBmYWxzZSwgWzAsIDBdLCAwKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CiAgfTsKCiAgTWVkaWFSb3V0ZXJfT25Sb3V0ZXNVcGRhdGVkX1BhcmFtcy5lbmNvZGVkU2l6ZSA9IGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMzI7CgogIE1lZGlhUm91dGVyX09uUm91dGVzVXBkYXRlZF9QYXJhbXMuZGVjb2RlID0gZnVuY3Rpb24oZGVjb2RlcikgewogICAgdmFyIHBhY2tlZDsKICAgIHZhciB2YWwgPSBuZXcgTWVkaWFSb3V0ZXJfT25Sb3V0ZXNVcGRhdGVkX1BhcmFtcygpOwogICAgdmFyIG51bWJlck9mQnl0ZXMgPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhciB2ZXJzaW9uID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YWwucHJvdmlkZXJJZCA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLkludDMyKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIHZhbC5yb3V0ZXMgPSBkZWNvZGVyLmRlY29kZUFycmF5UG9pbnRlcihuZXcgY29kZWMuUG9pbnRlclRvKE1lZGlhUm91dGUpKTsKICAgIHZhbC5tZWRpYVNvdXJjZSA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLlN0cmluZyk7CiAgICB2YWwuam9pbmFibGVSb3V0ZUlkcyA9IGRlY29kZXIuZGVjb2RlQXJyYXlQb2ludGVyKGNvZGVjLlN0cmluZyk7CiAgICByZXR1cm4gdmFsOwogIH07CgogIE1lZGlhUm91dGVyX09uUm91dGVzVXBkYXRlZF9QYXJhbXMuZW5jb2RlID0gZnVuY3Rpb24oZW5jb2RlciwgdmFsKSB7CiAgICB2YXIgcGFja2VkOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMihNZWRpYVJvdXRlcl9PblJvdXRlc1VwZGF0ZWRfUGFyYW1zLmVuY29kZWRTaXplKTsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoMCk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5JbnQzMiwgdmFsLnByb3ZpZGVySWQpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5lbmNvZGVBcnJheVBvaW50ZXIobmV3IGNvZGVjLlBvaW50ZXJUbyhNZWRpYVJvdXRlKSwgdmFsLnJvdXRlcyk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5TdHJpbmcsIHZhbC5tZWRpYVNvdXJjZSk7CiAgICBlbmNvZGVyLmVuY29kZUFycmF5UG9pbnRlcihjb2RlYy5TdHJpbmcsIHZhbC5qb2luYWJsZVJvdXRlSWRzKTsKICB9OwogIGZ1bmN0aW9uIE1lZGlhUm91dGVyX09uU2lua0F2YWlsYWJpbGl0eVVwZGF0ZWRfUGFyYW1zKHZhbHVlcykgewogICAgdGhpcy5pbml0RGVmYXVsdHNfKCk7CiAgICB0aGlzLmluaXRGaWVsZHNfKHZhbHVlcyk7CiAgfQoKCiAgTWVkaWFSb3V0ZXJfT25TaW5rQXZhaWxhYmlsaXR5VXBkYXRlZF9QYXJhbXMucHJvdG90eXBlLmluaXREZWZhdWx0c18gPSBmdW5jdGlvbigpIHsKICAgIHRoaXMucHJvdmlkZXJJZCA9IDA7CiAgICB0aGlzLmF2YWlsYWJpbGl0eSA9IDA7CiAgfTsKICBNZWRpYVJvdXRlcl9PblNpbmtBdmFpbGFiaWxpdHlVcGRhdGVkX1BhcmFtcy5wcm90b3R5cGUuaW5pdEZpZWxkc18gPSBmdW5jdGlvbihmaWVsZHMpIHsKICAgIGZvcih2YXIgZmllbGQgaW4gZmllbGRzKSB7CiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoZmllbGQpKQogICAgICAgICAgdGhpc1tmaWVsZF0gPSBmaWVsZHNbZmllbGRdOwogICAgfQogIH07CgogIE1lZGlhUm91dGVyX09uU2lua0F2YWlsYWJpbGl0eVVwZGF0ZWRfUGFyYW1zLnZhbGlkYXRlID0gZnVuY3Rpb24obWVzc2FnZVZhbGlkYXRvciwgb2Zmc2V0KSB7CiAgICB2YXIgZXJyOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdEhlYWRlcihvZmZzZXQsIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHZhciBrVmVyc2lvblNpemVzID0gWwogICAgICB7dmVyc2lvbjogMCwgbnVtQnl0ZXM6IDE2fQogICAgXTsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RWZXJzaW9uKG9mZnNldCwga1ZlcnNpb25TaXplcyk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFSb3V0ZXJfT25TaW5rQXZhaWxhYmlsaXR5VXBkYXRlZF9QYXJhbXMucHJvdmlkZXJJZAogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZUVudW0ob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAwLCBNZWRpYVJvdXRlUHJvdmlkZXIuSWQpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhUm91dGVyX09uU2lua0F2YWlsYWJpbGl0eVVwZGF0ZWRfUGFyYW1zLmF2YWlsYWJpbGl0eQogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZUVudW0ob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA0LCBNZWRpYVJvdXRlci5TaW5rQXZhaWxhYmlsaXR5KTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CiAgfTsKCiAgTWVkaWFSb3V0ZXJfT25TaW5rQXZhaWxhYmlsaXR5VXBkYXRlZF9QYXJhbXMuZW5jb2RlZFNpemUgPSBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDg7CgogIE1lZGlhUm91dGVyX09uU2lua0F2YWlsYWJpbGl0eVVwZGF0ZWRfUGFyYW1zLmRlY29kZSA9IGZ1bmN0aW9uKGRlY29kZXIpIHsKICAgIHZhciBwYWNrZWQ7CiAgICB2YXIgdmFsID0gbmV3IE1lZGlhUm91dGVyX09uU2lua0F2YWlsYWJpbGl0eVVwZGF0ZWRfUGFyYW1zKCk7CiAgICB2YXIgbnVtYmVyT2ZCeXRlcyA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFyIHZlcnNpb24gPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhbC5wcm92aWRlcklkID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuSW50MzIpOwogICAgdmFsLmF2YWlsYWJpbGl0eSA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLkludDMyKTsKICAgIHJldHVybiB2YWw7CiAgfTsKCiAgTWVkaWFSb3V0ZXJfT25TaW5rQXZhaWxhYmlsaXR5VXBkYXRlZF9QYXJhbXMuZW5jb2RlID0gZnVuY3Rpb24oZW5jb2RlciwgdmFsKSB7CiAgICB2YXIgcGFja2VkOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMihNZWRpYVJvdXRlcl9PblNpbmtBdmFpbGFiaWxpdHlVcGRhdGVkX1BhcmFtcy5lbmNvZGVkU2l6ZSk7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKDApOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuSW50MzIsIHZhbC5wcm92aWRlcklkKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLkludDMyLCB2YWwuYXZhaWxhYmlsaXR5KTsKICB9OwogIGZ1bmN0aW9uIE1lZGlhUm91dGVyX09uUHJlc2VudGF0aW9uQ29ubmVjdGlvblN0YXRlQ2hhbmdlZF9QYXJhbXModmFsdWVzKSB7CiAgICB0aGlzLmluaXREZWZhdWx0c18oKTsKICAgIHRoaXMuaW5pdEZpZWxkc18odmFsdWVzKTsKICB9CgoKICBNZWRpYVJvdXRlcl9PblByZXNlbnRhdGlvbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZWRfUGFyYW1zLnByb3RvdHlwZS5pbml0RGVmYXVsdHNfID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLnJvdXRlSWQgPSBudWxsOwogICAgdGhpcy5zdGF0ZSA9IDA7CiAgfTsKICBNZWRpYVJvdXRlcl9PblByZXNlbnRhdGlvbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZWRfUGFyYW1zLnByb3RvdHlwZS5pbml0RmllbGRzXyA9IGZ1bmN0aW9uKGZpZWxkcykgewogICAgZm9yKHZhciBmaWVsZCBpbiBmaWVsZHMpIHsKICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpCiAgICAgICAgICB0aGlzW2ZpZWxkXSA9IGZpZWxkc1tmaWVsZF07CiAgICB9CiAgfTsKCiAgTWVkaWFSb3V0ZXJfT25QcmVzZW50YXRpb25Db25uZWN0aW9uU3RhdGVDaGFuZ2VkX1BhcmFtcy52YWxpZGF0ZSA9IGZ1bmN0aW9uKG1lc3NhZ2VWYWxpZGF0b3IsIG9mZnNldCkgewogICAgdmFyIGVycjsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RIZWFkZXIob2Zmc2V0LCBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICB2YXIga1ZlcnNpb25TaXplcyA9IFsKICAgICAge3ZlcnNpb246IDAsIG51bUJ5dGVzOiAyNH0KICAgIF07CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0VmVyc2lvbihvZmZzZXQsIGtWZXJzaW9uU2l6ZXMpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhUm91dGVyX09uUHJlc2VudGF0aW9uQ29ubmVjdGlvblN0YXRlQ2hhbmdlZF9QYXJhbXMucm91dGVJZAogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cmluZ1BvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAwLCBmYWxzZSkKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVJvdXRlcl9PblByZXNlbnRhdGlvbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZWRfUGFyYW1zLnN0YXRlCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlRW51bShvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDgsIE1lZGlhUm91dGVyLlByZXNlbnRhdGlvbkNvbm5lY3Rpb25TdGF0ZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwogIH07CgogIE1lZGlhUm91dGVyX09uUHJlc2VudGF0aW9uQ29ubmVjdGlvblN0YXRlQ2hhbmdlZF9QYXJhbXMuZW5jb2RlZFNpemUgPSBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDE2OwoKICBNZWRpYVJvdXRlcl9PblByZXNlbnRhdGlvbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZWRfUGFyYW1zLmRlY29kZSA9IGZ1bmN0aW9uKGRlY29kZXIpIHsKICAgIHZhciBwYWNrZWQ7CiAgICB2YXIgdmFsID0gbmV3IE1lZGlhUm91dGVyX09uUHJlc2VudGF0aW9uQ29ubmVjdGlvblN0YXRlQ2hhbmdlZF9QYXJhbXMoKTsKICAgIHZhciBudW1iZXJPZkJ5dGVzID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YXIgdmVyc2lvbiA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFsLnJvdXRlSWQgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5TdHJpbmcpOwogICAgdmFsLnN0YXRlID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuSW50MzIpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgcmV0dXJuIHZhbDsKICB9OwoKICBNZWRpYVJvdXRlcl9PblByZXNlbnRhdGlvbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZWRfUGFyYW1zLmVuY29kZSA9IGZ1bmN0aW9uKGVuY29kZXIsIHZhbCkgewogICAgdmFyIHBhY2tlZDsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoTWVkaWFSb3V0ZXJfT25QcmVzZW50YXRpb25Db25uZWN0aW9uU3RhdGVDaGFuZ2VkX1BhcmFtcy5lbmNvZGVkU2l6ZSk7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKDApOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nLCB2YWwucm91dGVJZCk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5JbnQzMiwgdmFsLnN0YXRlKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICB9OwogIGZ1bmN0aW9uIE1lZGlhUm91dGVyX09uUHJlc2VudGF0aW9uQ29ubmVjdGlvbkNsb3NlZF9QYXJhbXModmFsdWVzKSB7CiAgICB0aGlzLmluaXREZWZhdWx0c18oKTsKICAgIHRoaXMuaW5pdEZpZWxkc18odmFsdWVzKTsKICB9CgoKICBNZWRpYVJvdXRlcl9PblByZXNlbnRhdGlvbkNvbm5lY3Rpb25DbG9zZWRfUGFyYW1zLnByb3RvdHlwZS5pbml0RGVmYXVsdHNfID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLnJvdXRlSWQgPSBudWxsOwogICAgdGhpcy5yZWFzb24gPSAwOwogICAgdGhpcy5tZXNzYWdlID0gbnVsbDsKICB9OwogIE1lZGlhUm91dGVyX09uUHJlc2VudGF0aW9uQ29ubmVjdGlvbkNsb3NlZF9QYXJhbXMucHJvdG90eXBlLmluaXRGaWVsZHNfID0gZnVuY3Rpb24oZmllbGRzKSB7CiAgICBmb3IodmFyIGZpZWxkIGluIGZpZWxkcykgewogICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGZpZWxkKSkKICAgICAgICAgIHRoaXNbZmllbGRdID0gZmllbGRzW2ZpZWxkXTsKICAgIH0KICB9OwoKICBNZWRpYVJvdXRlcl9PblByZXNlbnRhdGlvbkNvbm5lY3Rpb25DbG9zZWRfUGFyYW1zLnZhbGlkYXRlID0gZnVuY3Rpb24obWVzc2FnZVZhbGlkYXRvciwgb2Zmc2V0KSB7CiAgICB2YXIgZXJyOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdEhlYWRlcihvZmZzZXQsIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHZhciBrVmVyc2lvblNpemVzID0gWwogICAgICB7dmVyc2lvbjogMCwgbnVtQnl0ZXM6IDMyfQogICAgXTsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RWZXJzaW9uKG9mZnNldCwga1ZlcnNpb25TaXplcyk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFSb3V0ZXJfT25QcmVzZW50YXRpb25Db25uZWN0aW9uQ2xvc2VkX1BhcmFtcy5yb3V0ZUlkCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nUG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDAsIGZhbHNlKQogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhUm91dGVyX09uUHJlc2VudGF0aW9uQ29ubmVjdGlvbkNsb3NlZF9QYXJhbXMucmVhc29uCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlRW51bShvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDgsIE1lZGlhUm91dGVyLlByZXNlbnRhdGlvbkNvbm5lY3Rpb25DbG9zZVJlYXNvbik7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFSb3V0ZXJfT25QcmVzZW50YXRpb25Db25uZWN0aW9uQ2xvc2VkX1BhcmFtcy5tZXNzYWdlCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nUG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDE2LCBmYWxzZSkKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CiAgfTsKCiAgTWVkaWFSb3V0ZXJfT25QcmVzZW50YXRpb25Db25uZWN0aW9uQ2xvc2VkX1BhcmFtcy5lbmNvZGVkU2l6ZSA9IGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMjQ7CgogIE1lZGlhUm91dGVyX09uUHJlc2VudGF0aW9uQ29ubmVjdGlvbkNsb3NlZF9QYXJhbXMuZGVjb2RlID0gZnVuY3Rpb24oZGVjb2RlcikgewogICAgdmFyIHBhY2tlZDsKICAgIHZhciB2YWwgPSBuZXcgTWVkaWFSb3V0ZXJfT25QcmVzZW50YXRpb25Db25uZWN0aW9uQ2xvc2VkX1BhcmFtcygpOwogICAgdmFyIG51bWJlck9mQnl0ZXMgPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhciB2ZXJzaW9uID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YWwucm91dGVJZCA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLlN0cmluZyk7CiAgICB2YWwucmVhc29uID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuSW50MzIpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgdmFsLm1lc3NhZ2UgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5TdHJpbmcpOwogICAgcmV0dXJuIHZhbDsKICB9OwoKICBNZWRpYVJvdXRlcl9PblByZXNlbnRhdGlvbkNvbm5lY3Rpb25DbG9zZWRfUGFyYW1zLmVuY29kZSA9IGZ1bmN0aW9uKGVuY29kZXIsIHZhbCkgewogICAgdmFyIHBhY2tlZDsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoTWVkaWFSb3V0ZXJfT25QcmVzZW50YXRpb25Db25uZWN0aW9uQ2xvc2VkX1BhcmFtcy5lbmNvZGVkU2l6ZSk7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKDApOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nLCB2YWwucm91dGVJZCk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5JbnQzMiwgdmFsLnJlYXNvbik7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5TdHJpbmcsIHZhbC5tZXNzYWdlKTsKICB9OwogIGZ1bmN0aW9uIE1lZGlhUm91dGVyX09uUm91dGVNZXNzYWdlc1JlY2VpdmVkX1BhcmFtcyh2YWx1ZXMpIHsKICAgIHRoaXMuaW5pdERlZmF1bHRzXygpOwogICAgdGhpcy5pbml0RmllbGRzXyh2YWx1ZXMpOwogIH0KCgogIE1lZGlhUm91dGVyX09uUm91dGVNZXNzYWdlc1JlY2VpdmVkX1BhcmFtcy5wcm90b3R5cGUuaW5pdERlZmF1bHRzXyA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy5yb3V0ZUlkID0gbnVsbDsKICAgIHRoaXMubWVzc2FnZXMgPSBudWxsOwogIH07CiAgTWVkaWFSb3V0ZXJfT25Sb3V0ZU1lc3NhZ2VzUmVjZWl2ZWRfUGFyYW1zLnByb3RvdHlwZS5pbml0RmllbGRzXyA9IGZ1bmN0aW9uKGZpZWxkcykgewogICAgZm9yKHZhciBmaWVsZCBpbiBmaWVsZHMpIHsKICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpCiAgICAgICAgICB0aGlzW2ZpZWxkXSA9IGZpZWxkc1tmaWVsZF07CiAgICB9CiAgfTsKCiAgTWVkaWFSb3V0ZXJfT25Sb3V0ZU1lc3NhZ2VzUmVjZWl2ZWRfUGFyYW1zLnZhbGlkYXRlID0gZnVuY3Rpb24obWVzc2FnZVZhbGlkYXRvciwgb2Zmc2V0KSB7CiAgICB2YXIgZXJyOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdEhlYWRlcihvZmZzZXQsIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHZhciBrVmVyc2lvblNpemVzID0gWwogICAgICB7dmVyc2lvbjogMCwgbnVtQnl0ZXM6IDI0fQogICAgXTsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RWZXJzaW9uKG9mZnNldCwga1ZlcnNpb25TaXplcyk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFSb3V0ZXJfT25Sb3V0ZU1lc3NhZ2VzUmVjZWl2ZWRfUGFyYW1zLnJvdXRlSWQKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJpbmdQb2ludGVyKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMCwgZmFsc2UpCiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFSb3V0ZXJfT25Sb3V0ZU1lc3NhZ2VzUmVjZWl2ZWRfUGFyYW1zLm1lc3NhZ2VzCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlQXJyYXlQb2ludGVyKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgOCwgOCwgbmV3IGNvZGVjLlBvaW50ZXJUbyhSb3V0ZU1lc3NhZ2UpLCBmYWxzZSwgWzBdLCAwKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CiAgfTsKCiAgTWVkaWFSb3V0ZXJfT25Sb3V0ZU1lc3NhZ2VzUmVjZWl2ZWRfUGFyYW1zLmVuY29kZWRTaXplID0gY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAxNjsKCiAgTWVkaWFSb3V0ZXJfT25Sb3V0ZU1lc3NhZ2VzUmVjZWl2ZWRfUGFyYW1zLmRlY29kZSA9IGZ1bmN0aW9uKGRlY29kZXIpIHsKICAgIHZhciBwYWNrZWQ7CiAgICB2YXIgdmFsID0gbmV3IE1lZGlhUm91dGVyX09uUm91dGVNZXNzYWdlc1JlY2VpdmVkX1BhcmFtcygpOwogICAgdmFyIG51bWJlck9mQnl0ZXMgPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhciB2ZXJzaW9uID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YWwucm91dGVJZCA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLlN0cmluZyk7CiAgICB2YWwubWVzc2FnZXMgPSBkZWNvZGVyLmRlY29kZUFycmF5UG9pbnRlcihuZXcgY29kZWMuUG9pbnRlclRvKFJvdXRlTWVzc2FnZSkpOwogICAgcmV0dXJuIHZhbDsKICB9OwoKICBNZWRpYVJvdXRlcl9PblJvdXRlTWVzc2FnZXNSZWNlaXZlZF9QYXJhbXMuZW5jb2RlID0gZnVuY3Rpb24oZW5jb2RlciwgdmFsKSB7CiAgICB2YXIgcGFja2VkOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMihNZWRpYVJvdXRlcl9PblJvdXRlTWVzc2FnZXNSZWNlaXZlZF9QYXJhbXMuZW5jb2RlZFNpemUpOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMigwKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLlN0cmluZywgdmFsLnJvdXRlSWQpOwogICAgZW5jb2Rlci5lbmNvZGVBcnJheVBvaW50ZXIobmV3IGNvZGVjLlBvaW50ZXJUbyhSb3V0ZU1lc3NhZ2UpLCB2YWwubWVzc2FnZXMpOwogIH07CiAgZnVuY3Rpb24gTWVkaWFSb3V0ZXJfT25NZWRpYVJlbW90ZXJDcmVhdGVkX1BhcmFtcyh2YWx1ZXMpIHsKICAgIHRoaXMuaW5pdERlZmF1bHRzXygpOwogICAgdGhpcy5pbml0RmllbGRzXyh2YWx1ZXMpOwogIH0KCgogIE1lZGlhUm91dGVyX09uTWVkaWFSZW1vdGVyQ3JlYXRlZF9QYXJhbXMucHJvdG90eXBlLmluaXREZWZhdWx0c18gPSBmdW5jdGlvbigpIHsKICAgIHRoaXMudGFiSWQgPSAwOwogICAgdGhpcy5yZW1vdGVyID0gbmV3IG1pcnJvcl9zZXJ2aWNlX3JlbW90aW5nJC5NaXJyb3JTZXJ2aWNlUmVtb3RlclB0cigpOwogICAgdGhpcy5yZW1vdGluZ1NvdXJjZSA9IG5ldyBiaW5kaW5ncy5JbnRlcmZhY2VSZXF1ZXN0KCk7CiAgfTsKICBNZWRpYVJvdXRlcl9Pbk1lZGlhUmVtb3RlckNyZWF0ZWRfUGFyYW1zLnByb3RvdHlwZS5pbml0RmllbGRzXyA9IGZ1bmN0aW9uKGZpZWxkcykgewogICAgZm9yKHZhciBmaWVsZCBpbiBmaWVsZHMpIHsKICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpCiAgICAgICAgICB0aGlzW2ZpZWxkXSA9IGZpZWxkc1tmaWVsZF07CiAgICB9CiAgfTsKCiAgTWVkaWFSb3V0ZXJfT25NZWRpYVJlbW90ZXJDcmVhdGVkX1BhcmFtcy52YWxpZGF0ZSA9IGZ1bmN0aW9uKG1lc3NhZ2VWYWxpZGF0b3IsIG9mZnNldCkgewogICAgdmFyIGVycjsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RIZWFkZXIob2Zmc2V0LCBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICB2YXIga1ZlcnNpb25TaXplcyA9IFsKICAgICAge3ZlcnNpb246IDAsIG51bUJ5dGVzOiAyNH0KICAgIF07CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0VmVyc2lvbihvZmZzZXQsIGtWZXJzaW9uU2l6ZXMpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVJvdXRlcl9Pbk1lZGlhUmVtb3RlckNyZWF0ZWRfUGFyYW1zLnJlbW90ZXIKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVJbnRlcmZhY2Uob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA0LCBmYWxzZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFSb3V0ZXJfT25NZWRpYVJlbW90ZXJDcmVhdGVkX1BhcmFtcy5yZW1vdGluZ1NvdXJjZQogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZUludGVyZmFjZVJlcXVlc3Qob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAxMiwgZmFsc2UpCiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwogIH07CgogIE1lZGlhUm91dGVyX09uTWVkaWFSZW1vdGVyQ3JlYXRlZF9QYXJhbXMuZW5jb2RlZFNpemUgPSBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDE2OwoKICBNZWRpYVJvdXRlcl9Pbk1lZGlhUmVtb3RlckNyZWF0ZWRfUGFyYW1zLmRlY29kZSA9IGZ1bmN0aW9uKGRlY29kZXIpIHsKICAgIHZhciBwYWNrZWQ7CiAgICB2YXIgdmFsID0gbmV3IE1lZGlhUm91dGVyX09uTWVkaWFSZW1vdGVyQ3JlYXRlZF9QYXJhbXMoKTsKICAgIHZhciBudW1iZXJPZkJ5dGVzID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YXIgdmVyc2lvbiA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFsLnRhYklkID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuSW50MzIpOwogICAgdmFsLnJlbW90ZXIgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChuZXcgY29kZWMuSW50ZXJmYWNlKG1pcnJvcl9zZXJ2aWNlX3JlbW90aW5nJC5NaXJyb3JTZXJ2aWNlUmVtb3RlclB0cikpOwogICAgdmFsLnJlbW90aW5nU291cmNlID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuSW50ZXJmYWNlUmVxdWVzdCk7CiAgICByZXR1cm4gdmFsOwogIH07CgogIE1lZGlhUm91dGVyX09uTWVkaWFSZW1vdGVyQ3JlYXRlZF9QYXJhbXMuZW5jb2RlID0gZnVuY3Rpb24oZW5jb2RlciwgdmFsKSB7CiAgICB2YXIgcGFja2VkOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMihNZWRpYVJvdXRlcl9Pbk1lZGlhUmVtb3RlckNyZWF0ZWRfUGFyYW1zLmVuY29kZWRTaXplKTsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoMCk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5JbnQzMiwgdmFsLnRhYklkKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KG5ldyBjb2RlYy5JbnRlcmZhY2UobWlycm9yX3NlcnZpY2VfcmVtb3RpbmckLk1pcnJvclNlcnZpY2VSZW1vdGVyUHRyKSwgdmFsLnJlbW90ZXIpOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuSW50ZXJmYWNlUmVxdWVzdCwgdmFsLnJlbW90aW5nU291cmNlKTsKICB9OwoKICBmdW5jdGlvbiBNZWRpYVNpbmtFeHRyYURhdGEodmFsdWUpIHsKICAgIHRoaXMuaW5pdERlZmF1bHRfKCk7CiAgICB0aGlzLmluaXRWYWx1ZV8odmFsdWUpOwogIH0KICAKICAKICBNZWRpYVNpbmtFeHRyYURhdGEuVGFncyA9IHsKICAgIGRpYWxNZWRpYVNpbms6IDAsCiAgICBjYXN0TWVkaWFTaW5rOiAxLAogIH07CiAgCiAgTWVkaWFTaW5rRXh0cmFEYXRhLnByb3RvdHlwZS5pbml0RGVmYXVsdF8gPSBmdW5jdGlvbigpIHsKICAgIHRoaXMuJGRhdGEgPSBudWxsOwogICAgdGhpcy4kdGFnID0gdW5kZWZpbmVkOwogIH0KICAKICBNZWRpYVNpbmtFeHRyYURhdGEucHJvdG90eXBlLmluaXRWYWx1ZV8gPSBmdW5jdGlvbih2YWx1ZSkgewogICAgaWYgKHZhbHVlID09IHVuZGVmaW5lZCkgewogICAgICByZXR1cm47CiAgICB9CiAgCiAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHZhbHVlKTsKICAgIGlmIChrZXlzLmxlbmd0aCA9PSAwKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAKICAgIGlmIChrZXlzLmxlbmd0aCA+IDEpIHsKICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiWW91IG1heSBzZXQgb25seSBvbmUgbWVtYmVyIG9uIGEgdW5pb24uIik7CiAgICB9CiAgCiAgICB2YXIgZmllbGRzID0gWwogICAgICAgICJkaWFsTWVkaWFTaW5rIiwKICAgICAgICAiY2FzdE1lZGlhU2luayIsCiAgICBdOwogIAogICAgaWYgKGZpZWxkcy5pbmRleE9mKGtleXNbMF0pIDwgMCkgewogICAgICB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3Ioa2V5c1swXSArICIgaXMgbm90IGEgTWVkaWFTaW5rRXh0cmFEYXRhIG1lbWJlci4iKTsKICAKICAgIH0KICAKICAgIHRoaXNba2V5c1swXV0gPSB2YWx1ZVtrZXlzWzBdXTsKICB9CiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KE1lZGlhU2lua0V4dHJhRGF0YS5wcm90b3R5cGUsICJkaWFsTWVkaWFTaW5rIiwgewogICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgaWYgKHRoaXMuJHRhZyAhPSBNZWRpYVNpbmtFeHRyYURhdGEuVGFncy5kaWFsTWVkaWFTaW5rKSB7CiAgICAgICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKAogICAgICAgICAgICAiTWVkaWFTaW5rRXh0cmFEYXRhLmRpYWxNZWRpYVNpbmsgaXMgbm90IGN1cnJlbnRseSBzZXQuIik7CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXMuJGRhdGE7CiAgICB9LAogIAogICAgc2V0OiBmdW5jdGlvbih2YWx1ZSkgewogICAgICB0aGlzLiR0YWcgPSBNZWRpYVNpbmtFeHRyYURhdGEuVGFncy5kaWFsTWVkaWFTaW5rOwogICAgICB0aGlzLiRkYXRhID0gdmFsdWU7CiAgICB9CiAgfSk7CiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KE1lZGlhU2lua0V4dHJhRGF0YS5wcm90b3R5cGUsICJjYXN0TWVkaWFTaW5rIiwgewogICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgaWYgKHRoaXMuJHRhZyAhPSBNZWRpYVNpbmtFeHRyYURhdGEuVGFncy5jYXN0TWVkaWFTaW5rKSB7CiAgICAgICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKAogICAgICAgICAgICAiTWVkaWFTaW5rRXh0cmFEYXRhLmNhc3RNZWRpYVNpbmsgaXMgbm90IGN1cnJlbnRseSBzZXQuIik7CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXMuJGRhdGE7CiAgICB9LAogIAogICAgc2V0OiBmdW5jdGlvbih2YWx1ZSkgewogICAgICB0aGlzLiR0YWcgPSBNZWRpYVNpbmtFeHRyYURhdGEuVGFncy5jYXN0TWVkaWFTaW5rOwogICAgICB0aGlzLiRkYXRhID0gdmFsdWU7CiAgICB9CiAgfSk7CiAgCiAgCiAgICBNZWRpYVNpbmtFeHRyYURhdGEuZW5jb2RlID0gZnVuY3Rpb24oZW5jb2RlciwgdmFsKSB7CiAgICAgIGlmICh2YWwgPT0gbnVsbCkgewogICAgICAgIGVuY29kZXIud3JpdGVVaW50NjQoMCk7CiAgICAgICAgZW5jb2Rlci53cml0ZVVpbnQ2NCgwKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaWYgKHZhbC4kdGFnID09IHVuZGVmaW5lZCkgewogICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBlbmNvZGUgdW5pb25zIHdpdGggYW4gdW5rbm93biBtZW1iZXIgc2V0LiIpOwogICAgICB9CiAgICAKICAgICAgZW5jb2Rlci53cml0ZVVpbnQzMigxNik7CiAgICAgIGVuY29kZXIud3JpdGVVaW50MzIodmFsLiR0YWcpOwogICAgICBzd2l0Y2ggKHZhbC4kdGFnKSB7CiAgICAgICAgY2FzZSBNZWRpYVNpbmtFeHRyYURhdGEuVGFncy5kaWFsTWVkaWFTaW5rOgogICAgICAgICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3RQb2ludGVyKERpYWxNZWRpYVNpbmssIHZhbC5kaWFsTWVkaWFTaW5rKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTWVkaWFTaW5rRXh0cmFEYXRhLlRhZ3MuY2FzdE1lZGlhU2luazoKICAgICAgICAgIGVuY29kZXIuZW5jb2RlU3RydWN0UG9pbnRlcihDYXN0TWVkaWFTaW5rLCB2YWwuY2FzdE1lZGlhU2luayk7CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgICBlbmNvZGVyLmFsaWduKCk7CiAgICB9OwogIAogIAogICAgTWVkaWFTaW5rRXh0cmFEYXRhLmRlY29kZSA9IGZ1bmN0aW9uKGRlY29kZXIpIHsKICAgICAgdmFyIHNpemUgPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgICAgaWYgKHNpemUgPT0gMCkgewogICAgICAgIGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgICAgIGRlY29kZXIucmVhZFVpbnQ2NCgpOwogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAKICAgICAgdmFyIHJlc3VsdCA9IG5ldyBNZWRpYVNpbmtFeHRyYURhdGEoKTsKICAgICAgdmFyIHRhZyA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgICBzd2l0Y2ggKHRhZykgewogICAgICAgIGNhc2UgTWVkaWFTaW5rRXh0cmFEYXRhLlRhZ3MuZGlhbE1lZGlhU2luazoKICAgICAgICAgIHJlc3VsdC5kaWFsTWVkaWFTaW5rID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3RQb2ludGVyKERpYWxNZWRpYVNpbmspOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBNZWRpYVNpbmtFeHRyYURhdGEuVGFncy5jYXN0TWVkaWFTaW5rOgogICAgICAgICAgcmVzdWx0LmNhc3RNZWRpYVNpbmsgPSBkZWNvZGVyLmRlY29kZVN0cnVjdFBvaW50ZXIoQ2FzdE1lZGlhU2luayk7CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgICBkZWNvZGVyLmFsaWduKCk7CiAgICAKICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH07CiAgCiAgCiAgICBNZWRpYVNpbmtFeHRyYURhdGEudmFsaWRhdGUgPSBmdW5jdGlvbihtZXNzYWdlVmFsaWRhdG9yLCBvZmZzZXQpIHsKICAgICAgdmFyIHNpemUgPSBtZXNzYWdlVmFsaWRhdG9yLmRlY29kZVVuaW9uU2l6ZShvZmZzZXQpOwogICAgICBpZiAoc2l6ZSAhPSAxNikgewogICAgICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLklOVkFMSURfVU5JT05fU0laRTsKICAgICAgfQogICAgCiAgICAgIHZhciB0YWcgPSBtZXNzYWdlVmFsaWRhdG9yLmRlY29kZVVuaW9uVGFnKG9mZnNldCk7CiAgICAgIHZhciBkYXRhX29mZnNldCA9IG9mZnNldCArIDg7CiAgICAgIHZhciBlcnI7CiAgICAgIHN3aXRjaCAodGFnKSB7CiAgICAgICAgY2FzZSBNZWRpYVNpbmtFeHRyYURhdGEuVGFncy5kaWFsTWVkaWFTaW5rOgogICAgICAgICAgCiAgICAKICAgIC8vIHZhbGlkYXRlIE1lZGlhU2lua0V4dHJhRGF0YS5kaWFsTWVkaWFTaW5rCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0UG9pbnRlcihkYXRhX29mZnNldCwgRGlhbE1lZGlhU2luaywgZmFsc2UpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE1lZGlhU2lua0V4dHJhRGF0YS5UYWdzLmNhc3RNZWRpYVNpbms6CiAgICAgICAgICAKICAgIAogICAgLy8gdmFsaWRhdGUgTWVkaWFTaW5rRXh0cmFEYXRhLmNhc3RNZWRpYVNpbmsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RQb2ludGVyKGRhdGFfb2Zmc2V0LCBDYXN0TWVkaWFTaW5rLCBmYWxzZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICAKICAgICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICAgIH07CiAgCiAgTWVkaWFTaW5rRXh0cmFEYXRhLmVuY29kZWRTaXplID0gMTY7CiAgdmFyIGtNZWRpYVJvdXRlUHJvdmlkZXJfQ3JlYXRlUm91dGVfTmFtZSA9IDgyNDE1NDQ0MjsKICB2YXIga01lZGlhUm91dGVQcm92aWRlcl9Kb2luUm91dGVfTmFtZSA9IDM5ODYzMzcwOwogIHZhciBrTWVkaWFSb3V0ZVByb3ZpZGVyX0Nvbm5lY3RSb3V0ZUJ5Um91dGVJZF9OYW1lID0gMTk4NTQ4MDQ4MTsKICB2YXIga01lZGlhUm91dGVQcm92aWRlcl9UZXJtaW5hdGVSb3V0ZV9OYW1lID0gMTczNzYyNDQ5OTsKICB2YXIga01lZGlhUm91dGVQcm92aWRlcl9TZW5kUm91dGVNZXNzYWdlX05hbWUgPSA2ODc0ODk1NjE7CiAgdmFyIGtNZWRpYVJvdXRlUHJvdmlkZXJfU2VuZFJvdXRlQmluYXJ5TWVzc2FnZV9OYW1lID0gMTQwMzMzNTAxNTsKICB2YXIga01lZGlhUm91dGVQcm92aWRlcl9TdGFydE9ic2VydmluZ01lZGlhU2lua3NfTmFtZSA9IDIwNTIzNzYwNzY7CiAgdmFyIGtNZWRpYVJvdXRlUHJvdmlkZXJfU3RvcE9ic2VydmluZ01lZGlhU2lua3NfTmFtZSA9IDM2NTE1MDI1NjsKICB2YXIga01lZGlhUm91dGVQcm92aWRlcl9TdGFydE9ic2VydmluZ01lZGlhUm91dGVzX05hbWUgPSAxOTg2NzI4NTI3OwogIHZhciBrTWVkaWFSb3V0ZVByb3ZpZGVyX1N0b3BPYnNlcnZpbmdNZWRpYVJvdXRlc19OYW1lID0gOTMwODczNzA7CiAgdmFyIGtNZWRpYVJvdXRlUHJvdmlkZXJfU3RhcnRMaXN0ZW5pbmdGb3JSb3V0ZU1lc3NhZ2VzX05hbWUgPSA0NjM0MTE0NTk7CiAgdmFyIGtNZWRpYVJvdXRlUHJvdmlkZXJfU3RvcExpc3RlbmluZ0ZvclJvdXRlTWVzc2FnZXNfTmFtZSA9IDE2ODgwODAxNDU7CiAgdmFyIGtNZWRpYVJvdXRlUHJvdmlkZXJfRGV0YWNoUm91dGVfTmFtZSA9IDcwODM4MDI2NzsKICB2YXIga01lZGlhUm91dGVQcm92aWRlcl9FbmFibGVNZG5zRGlzY292ZXJ5X05hbWUgPSAxMDQyMTYzMzIwOwogIHZhciBrTWVkaWFSb3V0ZVByb3ZpZGVyX1VwZGF0ZU1lZGlhU2lua3NfTmFtZSA9IDYxOTgzNjIzODsKICB2YXIga01lZGlhUm91dGVQcm92aWRlcl9TZWFyY2hTaW5rc19OYW1lID0gMjExOTAzNjkwMjsKICB2YXIga01lZGlhUm91dGVQcm92aWRlcl9Qcm92aWRlU2lua3NfTmFtZSA9IDYzMjE0OTI5NTsKICB2YXIga01lZGlhUm91dGVQcm92aWRlcl9DcmVhdGVNZWRpYVJvdXRlQ29udHJvbGxlcl9OYW1lID0gMTYwNTY1Njc5NzsKCiAgZnVuY3Rpb24gTWVkaWFSb3V0ZVByb3ZpZGVyUHRyKGhhbmRsZU9yUHRySW5mbykgewogICAgdGhpcy5wdHIgPSBuZXcgYmluZGluZ3MuSW50ZXJmYWNlUHRyQ29udHJvbGxlcihNZWRpYVJvdXRlUHJvdmlkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZU9yUHRySW5mbyk7CiAgfQoKICBmdW5jdGlvbiBNZWRpYVJvdXRlUHJvdmlkZXJBc3NvY2lhdGVkUHRyKGFzc29jaWF0ZWRJbnRlcmZhY2VQdHJJbmZvKSB7CiAgICB0aGlzLnB0ciA9IG5ldyBhc3NvY2lhdGVkQmluZGluZ3MuQXNzb2NpYXRlZEludGVyZmFjZVB0ckNvbnRyb2xsZXIoCiAgICAgICAgTWVkaWFSb3V0ZVByb3ZpZGVyLCBhc3NvY2lhdGVkSW50ZXJmYWNlUHRySW5mbyk7CiAgfQoKICBNZWRpYVJvdXRlUHJvdmlkZXJBc3NvY2lhdGVkUHRyLnByb3RvdHlwZSA9CiAgICAgIE9iamVjdC5jcmVhdGUoTWVkaWFSb3V0ZVByb3ZpZGVyUHRyLnByb3RvdHlwZSk7CiAgTWVkaWFSb3V0ZVByb3ZpZGVyQXNzb2NpYXRlZFB0ci5wcm90b3R5cGUuY29uc3RydWN0b3IgPQogICAgICBNZWRpYVJvdXRlUHJvdmlkZXJBc3NvY2lhdGVkUHRyOwoKICBmdW5jdGlvbiBNZWRpYVJvdXRlUHJvdmlkZXJQcm94eShyZWNlaXZlcikgewogICAgdGhpcy5yZWNlaXZlcl8gPSByZWNlaXZlcjsKICB9CiAgTWVkaWFSb3V0ZVByb3ZpZGVyUHRyLnByb3RvdHlwZS5jcmVhdGVSb3V0ZSA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIE1lZGlhUm91dGVQcm92aWRlclByb3h5LnByb3RvdHlwZS5jcmVhdGVSb3V0ZQogICAgICAgIC5hcHBseSh0aGlzLnB0ci5nZXRQcm94eSgpLCBhcmd1bWVudHMpOwogIH07CgogIE1lZGlhUm91dGVQcm92aWRlclByb3h5LnByb3RvdHlwZS5jcmVhdGVSb3V0ZSA9IGZ1bmN0aW9uKG1lZGlhU291cmNlLCBzaW5rSWQsIG9yaWdpbmFsUHJlc2VudGF0aW9uSWQsIG9yaWdpbiwgdGFiSWQsIHRpbWVvdXQsIGluY29nbml0bykgewogICAgdmFyIHBhcmFtcyA9IG5ldyBNZWRpYVJvdXRlUHJvdmlkZXJfQ3JlYXRlUm91dGVfUGFyYW1zKCk7CiAgICBwYXJhbXMubWVkaWFTb3VyY2UgPSBtZWRpYVNvdXJjZTsKICAgIHBhcmFtcy5zaW5rSWQgPSBzaW5rSWQ7CiAgICBwYXJhbXMub3JpZ2luYWxQcmVzZW50YXRpb25JZCA9IG9yaWdpbmFsUHJlc2VudGF0aW9uSWQ7CiAgICBwYXJhbXMub3JpZ2luID0gb3JpZ2luOwogICAgcGFyYW1zLnRhYklkID0gdGFiSWQ7CiAgICBwYXJhbXMudGltZW91dCA9IHRpbWVvdXQ7CiAgICBwYXJhbXMuaW5jb2duaXRvID0gaW5jb2duaXRvOwogICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkgewogICAgICB2YXIgYnVpbGRlciA9IG5ldyBjb2RlYy5NZXNzYWdlVjFCdWlsZGVyKAogICAgICAgICAga01lZGlhUm91dGVQcm92aWRlcl9DcmVhdGVSb3V0ZV9OYW1lLAogICAgICAgICAgY29kZWMuYWxpZ24oTWVkaWFSb3V0ZVByb3ZpZGVyX0NyZWF0ZVJvdXRlX1BhcmFtcy5lbmNvZGVkU2l6ZSksCiAgICAgICAgICBjb2RlYy5rTWVzc2FnZUV4cGVjdHNSZXNwb25zZSwgMCk7CiAgICAgIGJ1aWxkZXIuZW5jb2RlU3RydWN0KE1lZGlhUm91dGVQcm92aWRlcl9DcmVhdGVSb3V0ZV9QYXJhbXMsIHBhcmFtcyk7CiAgICAgIHZhciBtZXNzYWdlID0gYnVpbGRlci5maW5pc2goKTsKICAgICAgdGhpcy5yZWNlaXZlcl8uYWNjZXB0QW5kRXhwZWN0UmVzcG9uc2UobWVzc2FnZSkudGhlbihmdW5jdGlvbihtZXNzYWdlKSB7CiAgICAgICAgdmFyIHJlYWRlciA9IG5ldyBjb2RlYy5NZXNzYWdlUmVhZGVyKG1lc3NhZ2UpOwogICAgICAgIHZhciByZXNwb25zZVBhcmFtcyA9CiAgICAgICAgICAgIHJlYWRlci5kZWNvZGVTdHJ1Y3QoTWVkaWFSb3V0ZVByb3ZpZGVyX0NyZWF0ZVJvdXRlX1Jlc3BvbnNlUGFyYW1zKTsKICAgICAgICByZXNvbHZlKHJlc3BvbnNlUGFyYW1zKTsKICAgICAgfSkuY2F0Y2goZnVuY3Rpb24ocmVzdWx0KSB7CiAgICAgICAgcmVqZWN0KEVycm9yKCJDb25uZWN0aW9uIGVycm9yOiAiICsgcmVzdWx0KSk7CiAgICAgIH0pOwogICAgfS5iaW5kKHRoaXMpKTsKICB9OwogIE1lZGlhUm91dGVQcm92aWRlclB0ci5wcm90b3R5cGUuam9pblJvdXRlID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gTWVkaWFSb3V0ZVByb3ZpZGVyUHJveHkucHJvdG90eXBlLmpvaW5Sb3V0ZQogICAgICAgIC5hcHBseSh0aGlzLnB0ci5nZXRQcm94eSgpLCBhcmd1bWVudHMpOwogIH07CgogIE1lZGlhUm91dGVQcm92aWRlclByb3h5LnByb3RvdHlwZS5qb2luUm91dGUgPSBmdW5jdGlvbihtZWRpYVNvdXJjZSwgcHJlc2VudGF0aW9uSWQsIG9yaWdpbiwgdGFiSWQsIHRpbWVvdXQsIGluY29nbml0bykgewogICAgdmFyIHBhcmFtcyA9IG5ldyBNZWRpYVJvdXRlUHJvdmlkZXJfSm9pblJvdXRlX1BhcmFtcygpOwogICAgcGFyYW1zLm1lZGlhU291cmNlID0gbWVkaWFTb3VyY2U7CiAgICBwYXJhbXMucHJlc2VudGF0aW9uSWQgPSBwcmVzZW50YXRpb25JZDsKICAgIHBhcmFtcy5vcmlnaW4gPSBvcmlnaW47CiAgICBwYXJhbXMudGFiSWQgPSB0YWJJZDsKICAgIHBhcmFtcy50aW1lb3V0ID0gdGltZW91dDsKICAgIHBhcmFtcy5pbmNvZ25pdG8gPSBpbmNvZ25pdG87CiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgIHZhciBidWlsZGVyID0gbmV3IGNvZGVjLk1lc3NhZ2VWMUJ1aWxkZXIoCiAgICAgICAgICBrTWVkaWFSb3V0ZVByb3ZpZGVyX0pvaW5Sb3V0ZV9OYW1lLAogICAgICAgICAgY29kZWMuYWxpZ24oTWVkaWFSb3V0ZVByb3ZpZGVyX0pvaW5Sb3V0ZV9QYXJhbXMuZW5jb2RlZFNpemUpLAogICAgICAgICAgY29kZWMua01lc3NhZ2VFeHBlY3RzUmVzcG9uc2UsIDApOwogICAgICBidWlsZGVyLmVuY29kZVN0cnVjdChNZWRpYVJvdXRlUHJvdmlkZXJfSm9pblJvdXRlX1BhcmFtcywgcGFyYW1zKTsKICAgICAgdmFyIG1lc3NhZ2UgPSBidWlsZGVyLmZpbmlzaCgpOwogICAgICB0aGlzLnJlY2VpdmVyXy5hY2NlcHRBbmRFeHBlY3RSZXNwb25zZShtZXNzYWdlKS50aGVuKGZ1bmN0aW9uKG1lc3NhZ2UpIHsKICAgICAgICB2YXIgcmVhZGVyID0gbmV3IGNvZGVjLk1lc3NhZ2VSZWFkZXIobWVzc2FnZSk7CiAgICAgICAgdmFyIHJlc3BvbnNlUGFyYW1zID0KICAgICAgICAgICAgcmVhZGVyLmRlY29kZVN0cnVjdChNZWRpYVJvdXRlUHJvdmlkZXJfSm9pblJvdXRlX1Jlc3BvbnNlUGFyYW1zKTsKICAgICAgICByZXNvbHZlKHJlc3BvbnNlUGFyYW1zKTsKICAgICAgfSkuY2F0Y2goZnVuY3Rpb24ocmVzdWx0KSB7CiAgICAgICAgcmVqZWN0KEVycm9yKCJDb25uZWN0aW9uIGVycm9yOiAiICsgcmVzdWx0KSk7CiAgICAgIH0pOwogICAgfS5iaW5kKHRoaXMpKTsKICB9OwogIE1lZGlhUm91dGVQcm92aWRlclB0ci5wcm90b3R5cGUuY29ubmVjdFJvdXRlQnlSb3V0ZUlkID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gTWVkaWFSb3V0ZVByb3ZpZGVyUHJveHkucHJvdG90eXBlLmNvbm5lY3RSb3V0ZUJ5Um91dGVJZAogICAgICAgIC5hcHBseSh0aGlzLnB0ci5nZXRQcm94eSgpLCBhcmd1bWVudHMpOwogIH07CgogIE1lZGlhUm91dGVQcm92aWRlclByb3h5LnByb3RvdHlwZS5jb25uZWN0Um91dGVCeVJvdXRlSWQgPSBmdW5jdGlvbihtZWRpYVNvdXJjZSwgcm91dGVJZCwgcHJlc2VudGF0aW9uSWQsIG9yaWdpbiwgdGFiSWQsIHRpbWVvdXQsIGluY29nbml0bykgewogICAgdmFyIHBhcmFtcyA9IG5ldyBNZWRpYVJvdXRlUHJvdmlkZXJfQ29ubmVjdFJvdXRlQnlSb3V0ZUlkX1BhcmFtcygpOwogICAgcGFyYW1zLm1lZGlhU291cmNlID0gbWVkaWFTb3VyY2U7CiAgICBwYXJhbXMucm91dGVJZCA9IHJvdXRlSWQ7CiAgICBwYXJhbXMucHJlc2VudGF0aW9uSWQgPSBwcmVzZW50YXRpb25JZDsKICAgIHBhcmFtcy5vcmlnaW4gPSBvcmlnaW47CiAgICBwYXJhbXMudGFiSWQgPSB0YWJJZDsKICAgIHBhcmFtcy50aW1lb3V0ID0gdGltZW91dDsKICAgIHBhcmFtcy5pbmNvZ25pdG8gPSBpbmNvZ25pdG87CiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgIHZhciBidWlsZGVyID0gbmV3IGNvZGVjLk1lc3NhZ2VWMUJ1aWxkZXIoCiAgICAgICAgICBrTWVkaWFSb3V0ZVByb3ZpZGVyX0Nvbm5lY3RSb3V0ZUJ5Um91dGVJZF9OYW1lLAogICAgICAgICAgY29kZWMuYWxpZ24oTWVkaWFSb3V0ZVByb3ZpZGVyX0Nvbm5lY3RSb3V0ZUJ5Um91dGVJZF9QYXJhbXMuZW5jb2RlZFNpemUpLAogICAgICAgICAgY29kZWMua01lc3NhZ2VFeHBlY3RzUmVzcG9uc2UsIDApOwogICAgICBidWlsZGVyLmVuY29kZVN0cnVjdChNZWRpYVJvdXRlUHJvdmlkZXJfQ29ubmVjdFJvdXRlQnlSb3V0ZUlkX1BhcmFtcywgcGFyYW1zKTsKICAgICAgdmFyIG1lc3NhZ2UgPSBidWlsZGVyLmZpbmlzaCgpOwogICAgICB0aGlzLnJlY2VpdmVyXy5hY2NlcHRBbmRFeHBlY3RSZXNwb25zZShtZXNzYWdlKS50aGVuKGZ1bmN0aW9uKG1lc3NhZ2UpIHsKICAgICAgICB2YXIgcmVhZGVyID0gbmV3IGNvZGVjLk1lc3NhZ2VSZWFkZXIobWVzc2FnZSk7CiAgICAgICAgdmFyIHJlc3BvbnNlUGFyYW1zID0KICAgICAgICAgICAgcmVhZGVyLmRlY29kZVN0cnVjdChNZWRpYVJvdXRlUHJvdmlkZXJfQ29ubmVjdFJvdXRlQnlSb3V0ZUlkX1Jlc3BvbnNlUGFyYW1zKTsKICAgICAgICByZXNvbHZlKHJlc3BvbnNlUGFyYW1zKTsKICAgICAgfSkuY2F0Y2goZnVuY3Rpb24ocmVzdWx0KSB7CiAgICAgICAgcmVqZWN0KEVycm9yKCJDb25uZWN0aW9uIGVycm9yOiAiICsgcmVzdWx0KSk7CiAgICAgIH0pOwogICAgfS5iaW5kKHRoaXMpKTsKICB9OwogIE1lZGlhUm91dGVQcm92aWRlclB0ci5wcm90b3R5cGUudGVybWluYXRlUm91dGUgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBNZWRpYVJvdXRlUHJvdmlkZXJQcm94eS5wcm90b3R5cGUudGVybWluYXRlUm91dGUKICAgICAgICAuYXBwbHkodGhpcy5wdHIuZ2V0UHJveHkoKSwgYXJndW1lbnRzKTsKICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJQcm94eS5wcm90b3R5cGUudGVybWluYXRlUm91dGUgPSBmdW5jdGlvbihyb3V0ZUlkKSB7CiAgICB2YXIgcGFyYW1zID0gbmV3IE1lZGlhUm91dGVQcm92aWRlcl9UZXJtaW5hdGVSb3V0ZV9QYXJhbXMoKTsKICAgIHBhcmFtcy5yb3V0ZUlkID0gcm91dGVJZDsKICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHsKICAgICAgdmFyIGJ1aWxkZXIgPSBuZXcgY29kZWMuTWVzc2FnZVYxQnVpbGRlcigKICAgICAgICAgIGtNZWRpYVJvdXRlUHJvdmlkZXJfVGVybWluYXRlUm91dGVfTmFtZSwKICAgICAgICAgIGNvZGVjLmFsaWduKE1lZGlhUm91dGVQcm92aWRlcl9UZXJtaW5hdGVSb3V0ZV9QYXJhbXMuZW5jb2RlZFNpemUpLAogICAgICAgICAgY29kZWMua01lc3NhZ2VFeHBlY3RzUmVzcG9uc2UsIDApOwogICAgICBidWlsZGVyLmVuY29kZVN0cnVjdChNZWRpYVJvdXRlUHJvdmlkZXJfVGVybWluYXRlUm91dGVfUGFyYW1zLCBwYXJhbXMpOwogICAgICB2YXIgbWVzc2FnZSA9IGJ1aWxkZXIuZmluaXNoKCk7CiAgICAgIHRoaXMucmVjZWl2ZXJfLmFjY2VwdEFuZEV4cGVjdFJlc3BvbnNlKG1lc3NhZ2UpLnRoZW4oZnVuY3Rpb24obWVzc2FnZSkgewogICAgICAgIHZhciByZWFkZXIgPSBuZXcgY29kZWMuTWVzc2FnZVJlYWRlcihtZXNzYWdlKTsKICAgICAgICB2YXIgcmVzcG9uc2VQYXJhbXMgPQogICAgICAgICAgICByZWFkZXIuZGVjb2RlU3RydWN0KE1lZGlhUm91dGVQcm92aWRlcl9UZXJtaW5hdGVSb3V0ZV9SZXNwb25zZVBhcmFtcyk7CiAgICAgICAgcmVzb2x2ZShyZXNwb25zZVBhcmFtcyk7CiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKHJlc3VsdCkgewogICAgICAgIHJlamVjdChFcnJvcigiQ29ubmVjdGlvbiBlcnJvcjogIiArIHJlc3VsdCkpOwogICAgICB9KTsKICAgIH0uYmluZCh0aGlzKSk7CiAgfTsKICBNZWRpYVJvdXRlUHJvdmlkZXJQdHIucHJvdG90eXBlLnNlbmRSb3V0ZU1lc3NhZ2UgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBNZWRpYVJvdXRlUHJvdmlkZXJQcm94eS5wcm90b3R5cGUuc2VuZFJvdXRlTWVzc2FnZQogICAgICAgIC5hcHBseSh0aGlzLnB0ci5nZXRQcm94eSgpLCBhcmd1bWVudHMpOwogIH07CgogIE1lZGlhUm91dGVQcm92aWRlclByb3h5LnByb3RvdHlwZS5zZW5kUm91dGVNZXNzYWdlID0gZnVuY3Rpb24obWVkaWFSb3V0ZUlkLCBtZXNzYWdlKSB7CiAgICB2YXIgcGFyYW1zID0gbmV3IE1lZGlhUm91dGVQcm92aWRlcl9TZW5kUm91dGVNZXNzYWdlX1BhcmFtcygpOwogICAgcGFyYW1zLm1lZGlhUm91dGVJZCA9IG1lZGlhUm91dGVJZDsKICAgIHBhcmFtcy5tZXNzYWdlID0gbWVzc2FnZTsKICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHsKICAgICAgdmFyIGJ1aWxkZXIgPSBuZXcgY29kZWMuTWVzc2FnZVYxQnVpbGRlcigKICAgICAgICAgIGtNZWRpYVJvdXRlUHJvdmlkZXJfU2VuZFJvdXRlTWVzc2FnZV9OYW1lLAogICAgICAgICAgY29kZWMuYWxpZ24oTWVkaWFSb3V0ZVByb3ZpZGVyX1NlbmRSb3V0ZU1lc3NhZ2VfUGFyYW1zLmVuY29kZWRTaXplKSwKICAgICAgICAgIGNvZGVjLmtNZXNzYWdlRXhwZWN0c1Jlc3BvbnNlLCAwKTsKICAgICAgYnVpbGRlci5lbmNvZGVTdHJ1Y3QoTWVkaWFSb3V0ZVByb3ZpZGVyX1NlbmRSb3V0ZU1lc3NhZ2VfUGFyYW1zLCBwYXJhbXMpOwogICAgICB2YXIgbWVzc2FnZSA9IGJ1aWxkZXIuZmluaXNoKCk7CiAgICAgIHRoaXMucmVjZWl2ZXJfLmFjY2VwdEFuZEV4cGVjdFJlc3BvbnNlKG1lc3NhZ2UpLnRoZW4oZnVuY3Rpb24obWVzc2FnZSkgewogICAgICAgIHZhciByZWFkZXIgPSBuZXcgY29kZWMuTWVzc2FnZVJlYWRlcihtZXNzYWdlKTsKICAgICAgICB2YXIgcmVzcG9uc2VQYXJhbXMgPQogICAgICAgICAgICByZWFkZXIuZGVjb2RlU3RydWN0KE1lZGlhUm91dGVQcm92aWRlcl9TZW5kUm91dGVNZXNzYWdlX1Jlc3BvbnNlUGFyYW1zKTsKICAgICAgICByZXNvbHZlKHJlc3BvbnNlUGFyYW1zKTsKICAgICAgfSkuY2F0Y2goZnVuY3Rpb24ocmVzdWx0KSB7CiAgICAgICAgcmVqZWN0KEVycm9yKCJDb25uZWN0aW9uIGVycm9yOiAiICsgcmVzdWx0KSk7CiAgICAgIH0pOwogICAgfS5iaW5kKHRoaXMpKTsKICB9OwogIE1lZGlhUm91dGVQcm92aWRlclB0ci5wcm90b3R5cGUuc2VuZFJvdXRlQmluYXJ5TWVzc2FnZSA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIE1lZGlhUm91dGVQcm92aWRlclByb3h5LnByb3RvdHlwZS5zZW5kUm91dGVCaW5hcnlNZXNzYWdlCiAgICAgICAgLmFwcGx5KHRoaXMucHRyLmdldFByb3h5KCksIGFyZ3VtZW50cyk7CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyUHJveHkucHJvdG90eXBlLnNlbmRSb3V0ZUJpbmFyeU1lc3NhZ2UgPSBmdW5jdGlvbihtZWRpYVJvdXRlSWQsIGRhdGEpIHsKICAgIHZhciBwYXJhbXMgPSBuZXcgTWVkaWFSb3V0ZVByb3ZpZGVyX1NlbmRSb3V0ZUJpbmFyeU1lc3NhZ2VfUGFyYW1zKCk7CiAgICBwYXJhbXMubWVkaWFSb3V0ZUlkID0gbWVkaWFSb3V0ZUlkOwogICAgcGFyYW1zLmRhdGEgPSBkYXRhOwogICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkgewogICAgICB2YXIgYnVpbGRlciA9IG5ldyBjb2RlYy5NZXNzYWdlVjFCdWlsZGVyKAogICAgICAgICAga01lZGlhUm91dGVQcm92aWRlcl9TZW5kUm91dGVCaW5hcnlNZXNzYWdlX05hbWUsCiAgICAgICAgICBjb2RlYy5hbGlnbihNZWRpYVJvdXRlUHJvdmlkZXJfU2VuZFJvdXRlQmluYXJ5TWVzc2FnZV9QYXJhbXMuZW5jb2RlZFNpemUpLAogICAgICAgICAgY29kZWMua01lc3NhZ2VFeHBlY3RzUmVzcG9uc2UsIDApOwogICAgICBidWlsZGVyLmVuY29kZVN0cnVjdChNZWRpYVJvdXRlUHJvdmlkZXJfU2VuZFJvdXRlQmluYXJ5TWVzc2FnZV9QYXJhbXMsIHBhcmFtcyk7CiAgICAgIHZhciBtZXNzYWdlID0gYnVpbGRlci5maW5pc2goKTsKICAgICAgdGhpcy5yZWNlaXZlcl8uYWNjZXB0QW5kRXhwZWN0UmVzcG9uc2UobWVzc2FnZSkudGhlbihmdW5jdGlvbihtZXNzYWdlKSB7CiAgICAgICAgdmFyIHJlYWRlciA9IG5ldyBjb2RlYy5NZXNzYWdlUmVhZGVyKG1lc3NhZ2UpOwogICAgICAgIHZhciByZXNwb25zZVBhcmFtcyA9CiAgICAgICAgICAgIHJlYWRlci5kZWNvZGVTdHJ1Y3QoTWVkaWFSb3V0ZVByb3ZpZGVyX1NlbmRSb3V0ZUJpbmFyeU1lc3NhZ2VfUmVzcG9uc2VQYXJhbXMpOwogICAgICAgIHJlc29sdmUocmVzcG9uc2VQYXJhbXMpOwogICAgICB9KS5jYXRjaChmdW5jdGlvbihyZXN1bHQpIHsKICAgICAgICByZWplY3QoRXJyb3IoIkNvbm5lY3Rpb24gZXJyb3I6ICIgKyByZXN1bHQpKTsKICAgICAgfSk7CiAgICB9LmJpbmQodGhpcykpOwogIH07CiAgTWVkaWFSb3V0ZVByb3ZpZGVyUHRyLnByb3RvdHlwZS5zdGFydE9ic2VydmluZ01lZGlhU2lua3MgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBNZWRpYVJvdXRlUHJvdmlkZXJQcm94eS5wcm90b3R5cGUuc3RhcnRPYnNlcnZpbmdNZWRpYVNpbmtzCiAgICAgICAgLmFwcGx5KHRoaXMucHRyLmdldFByb3h5KCksIGFyZ3VtZW50cyk7CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyUHJveHkucHJvdG90eXBlLnN0YXJ0T2JzZXJ2aW5nTWVkaWFTaW5rcyA9IGZ1bmN0aW9uKG1lZGlhU291cmNlKSB7CiAgICB2YXIgcGFyYW1zID0gbmV3IE1lZGlhUm91dGVQcm92aWRlcl9TdGFydE9ic2VydmluZ01lZGlhU2lua3NfUGFyYW1zKCk7CiAgICBwYXJhbXMubWVkaWFTb3VyY2UgPSBtZWRpYVNvdXJjZTsKICAgIHZhciBidWlsZGVyID0gbmV3IGNvZGVjLk1lc3NhZ2VWMEJ1aWxkZXIoCiAgICAgICAga01lZGlhUm91dGVQcm92aWRlcl9TdGFydE9ic2VydmluZ01lZGlhU2lua3NfTmFtZSwKICAgICAgICBjb2RlYy5hbGlnbihNZWRpYVJvdXRlUHJvdmlkZXJfU3RhcnRPYnNlcnZpbmdNZWRpYVNpbmtzX1BhcmFtcy5lbmNvZGVkU2l6ZSkpOwogICAgYnVpbGRlci5lbmNvZGVTdHJ1Y3QoTWVkaWFSb3V0ZVByb3ZpZGVyX1N0YXJ0T2JzZXJ2aW5nTWVkaWFTaW5rc19QYXJhbXMsIHBhcmFtcyk7CiAgICB2YXIgbWVzc2FnZSA9IGJ1aWxkZXIuZmluaXNoKCk7CiAgICB0aGlzLnJlY2VpdmVyXy5hY2NlcHQobWVzc2FnZSk7CiAgfTsKICBNZWRpYVJvdXRlUHJvdmlkZXJQdHIucHJvdG90eXBlLnN0b3BPYnNlcnZpbmdNZWRpYVNpbmtzID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gTWVkaWFSb3V0ZVByb3ZpZGVyUHJveHkucHJvdG90eXBlLnN0b3BPYnNlcnZpbmdNZWRpYVNpbmtzCiAgICAgICAgLmFwcGx5KHRoaXMucHRyLmdldFByb3h5KCksIGFyZ3VtZW50cyk7CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyUHJveHkucHJvdG90eXBlLnN0b3BPYnNlcnZpbmdNZWRpYVNpbmtzID0gZnVuY3Rpb24obWVkaWFTb3VyY2UpIHsKICAgIHZhciBwYXJhbXMgPSBuZXcgTWVkaWFSb3V0ZVByb3ZpZGVyX1N0b3BPYnNlcnZpbmdNZWRpYVNpbmtzX1BhcmFtcygpOwogICAgcGFyYW1zLm1lZGlhU291cmNlID0gbWVkaWFTb3VyY2U7CiAgICB2YXIgYnVpbGRlciA9IG5ldyBjb2RlYy5NZXNzYWdlVjBCdWlsZGVyKAogICAgICAgIGtNZWRpYVJvdXRlUHJvdmlkZXJfU3RvcE9ic2VydmluZ01lZGlhU2lua3NfTmFtZSwKICAgICAgICBjb2RlYy5hbGlnbihNZWRpYVJvdXRlUHJvdmlkZXJfU3RvcE9ic2VydmluZ01lZGlhU2lua3NfUGFyYW1zLmVuY29kZWRTaXplKSk7CiAgICBidWlsZGVyLmVuY29kZVN0cnVjdChNZWRpYVJvdXRlUHJvdmlkZXJfU3RvcE9ic2VydmluZ01lZGlhU2lua3NfUGFyYW1zLCBwYXJhbXMpOwogICAgdmFyIG1lc3NhZ2UgPSBidWlsZGVyLmZpbmlzaCgpOwogICAgdGhpcy5yZWNlaXZlcl8uYWNjZXB0KG1lc3NhZ2UpOwogIH07CiAgTWVkaWFSb3V0ZVByb3ZpZGVyUHRyLnByb3RvdHlwZS5zdGFydE9ic2VydmluZ01lZGlhUm91dGVzID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gTWVkaWFSb3V0ZVByb3ZpZGVyUHJveHkucHJvdG90eXBlLnN0YXJ0T2JzZXJ2aW5nTWVkaWFSb3V0ZXMKICAgICAgICAuYXBwbHkodGhpcy5wdHIuZ2V0UHJveHkoKSwgYXJndW1lbnRzKTsKICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJQcm94eS5wcm90b3R5cGUuc3RhcnRPYnNlcnZpbmdNZWRpYVJvdXRlcyA9IGZ1bmN0aW9uKG1lZGlhU291cmNlKSB7CiAgICB2YXIgcGFyYW1zID0gbmV3IE1lZGlhUm91dGVQcm92aWRlcl9TdGFydE9ic2VydmluZ01lZGlhUm91dGVzX1BhcmFtcygpOwogICAgcGFyYW1zLm1lZGlhU291cmNlID0gbWVkaWFTb3VyY2U7CiAgICB2YXIgYnVpbGRlciA9IG5ldyBjb2RlYy5NZXNzYWdlVjBCdWlsZGVyKAogICAgICAgIGtNZWRpYVJvdXRlUHJvdmlkZXJfU3RhcnRPYnNlcnZpbmdNZWRpYVJvdXRlc19OYW1lLAogICAgICAgIGNvZGVjLmFsaWduKE1lZGlhUm91dGVQcm92aWRlcl9TdGFydE9ic2VydmluZ01lZGlhUm91dGVzX1BhcmFtcy5lbmNvZGVkU2l6ZSkpOwogICAgYnVpbGRlci5lbmNvZGVTdHJ1Y3QoTWVkaWFSb3V0ZVByb3ZpZGVyX1N0YXJ0T2JzZXJ2aW5nTWVkaWFSb3V0ZXNfUGFyYW1zLCBwYXJhbXMpOwogICAgdmFyIG1lc3NhZ2UgPSBidWlsZGVyLmZpbmlzaCgpOwogICAgdGhpcy5yZWNlaXZlcl8uYWNjZXB0KG1lc3NhZ2UpOwogIH07CiAgTWVkaWFSb3V0ZVByb3ZpZGVyUHRyLnByb3RvdHlwZS5zdG9wT2JzZXJ2aW5nTWVkaWFSb3V0ZXMgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBNZWRpYVJvdXRlUHJvdmlkZXJQcm94eS5wcm90b3R5cGUuc3RvcE9ic2VydmluZ01lZGlhUm91dGVzCiAgICAgICAgLmFwcGx5KHRoaXMucHRyLmdldFByb3h5KCksIGFyZ3VtZW50cyk7CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyUHJveHkucHJvdG90eXBlLnN0b3BPYnNlcnZpbmdNZWRpYVJvdXRlcyA9IGZ1bmN0aW9uKG1lZGlhU291cmNlKSB7CiAgICB2YXIgcGFyYW1zID0gbmV3IE1lZGlhUm91dGVQcm92aWRlcl9TdG9wT2JzZXJ2aW5nTWVkaWFSb3V0ZXNfUGFyYW1zKCk7CiAgICBwYXJhbXMubWVkaWFTb3VyY2UgPSBtZWRpYVNvdXJjZTsKICAgIHZhciBidWlsZGVyID0gbmV3IGNvZGVjLk1lc3NhZ2VWMEJ1aWxkZXIoCiAgICAgICAga01lZGlhUm91dGVQcm92aWRlcl9TdG9wT2JzZXJ2aW5nTWVkaWFSb3V0ZXNfTmFtZSwKICAgICAgICBjb2RlYy5hbGlnbihNZWRpYVJvdXRlUHJvdmlkZXJfU3RvcE9ic2VydmluZ01lZGlhUm91dGVzX1BhcmFtcy5lbmNvZGVkU2l6ZSkpOwogICAgYnVpbGRlci5lbmNvZGVTdHJ1Y3QoTWVkaWFSb3V0ZVByb3ZpZGVyX1N0b3BPYnNlcnZpbmdNZWRpYVJvdXRlc19QYXJhbXMsIHBhcmFtcyk7CiAgICB2YXIgbWVzc2FnZSA9IGJ1aWxkZXIuZmluaXNoKCk7CiAgICB0aGlzLnJlY2VpdmVyXy5hY2NlcHQobWVzc2FnZSk7CiAgfTsKICBNZWRpYVJvdXRlUHJvdmlkZXJQdHIucHJvdG90eXBlLnN0YXJ0TGlzdGVuaW5nRm9yUm91dGVNZXNzYWdlcyA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIE1lZGlhUm91dGVQcm92aWRlclByb3h5LnByb3RvdHlwZS5zdGFydExpc3RlbmluZ0ZvclJvdXRlTWVzc2FnZXMKICAgICAgICAuYXBwbHkodGhpcy5wdHIuZ2V0UHJveHkoKSwgYXJndW1lbnRzKTsKICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJQcm94eS5wcm90b3R5cGUuc3RhcnRMaXN0ZW5pbmdGb3JSb3V0ZU1lc3NhZ2VzID0gZnVuY3Rpb24ocm91dGVJZCkgewogICAgdmFyIHBhcmFtcyA9IG5ldyBNZWRpYVJvdXRlUHJvdmlkZXJfU3RhcnRMaXN0ZW5pbmdGb3JSb3V0ZU1lc3NhZ2VzX1BhcmFtcygpOwogICAgcGFyYW1zLnJvdXRlSWQgPSByb3V0ZUlkOwogICAgdmFyIGJ1aWxkZXIgPSBuZXcgY29kZWMuTWVzc2FnZVYwQnVpbGRlcigKICAgICAgICBrTWVkaWFSb3V0ZVByb3ZpZGVyX1N0YXJ0TGlzdGVuaW5nRm9yUm91dGVNZXNzYWdlc19OYW1lLAogICAgICAgIGNvZGVjLmFsaWduKE1lZGlhUm91dGVQcm92aWRlcl9TdGFydExpc3RlbmluZ0ZvclJvdXRlTWVzc2FnZXNfUGFyYW1zLmVuY29kZWRTaXplKSk7CiAgICBidWlsZGVyLmVuY29kZVN0cnVjdChNZWRpYVJvdXRlUHJvdmlkZXJfU3RhcnRMaXN0ZW5pbmdGb3JSb3V0ZU1lc3NhZ2VzX1BhcmFtcywgcGFyYW1zKTsKICAgIHZhciBtZXNzYWdlID0gYnVpbGRlci5maW5pc2goKTsKICAgIHRoaXMucmVjZWl2ZXJfLmFjY2VwdChtZXNzYWdlKTsKICB9OwogIE1lZGlhUm91dGVQcm92aWRlclB0ci5wcm90b3R5cGUuc3RvcExpc3RlbmluZ0ZvclJvdXRlTWVzc2FnZXMgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBNZWRpYVJvdXRlUHJvdmlkZXJQcm94eS5wcm90b3R5cGUuc3RvcExpc3RlbmluZ0ZvclJvdXRlTWVzc2FnZXMKICAgICAgICAuYXBwbHkodGhpcy5wdHIuZ2V0UHJveHkoKSwgYXJndW1lbnRzKTsKICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJQcm94eS5wcm90b3R5cGUuc3RvcExpc3RlbmluZ0ZvclJvdXRlTWVzc2FnZXMgPSBmdW5jdGlvbihyb3V0ZUlkKSB7CiAgICB2YXIgcGFyYW1zID0gbmV3IE1lZGlhUm91dGVQcm92aWRlcl9TdG9wTGlzdGVuaW5nRm9yUm91dGVNZXNzYWdlc19QYXJhbXMoKTsKICAgIHBhcmFtcy5yb3V0ZUlkID0gcm91dGVJZDsKICAgIHZhciBidWlsZGVyID0gbmV3IGNvZGVjLk1lc3NhZ2VWMEJ1aWxkZXIoCiAgICAgICAga01lZGlhUm91dGVQcm92aWRlcl9TdG9wTGlzdGVuaW5nRm9yUm91dGVNZXNzYWdlc19OYW1lLAogICAgICAgIGNvZGVjLmFsaWduKE1lZGlhUm91dGVQcm92aWRlcl9TdG9wTGlzdGVuaW5nRm9yUm91dGVNZXNzYWdlc19QYXJhbXMuZW5jb2RlZFNpemUpKTsKICAgIGJ1aWxkZXIuZW5jb2RlU3RydWN0KE1lZGlhUm91dGVQcm92aWRlcl9TdG9wTGlzdGVuaW5nRm9yUm91dGVNZXNzYWdlc19QYXJhbXMsIHBhcmFtcyk7CiAgICB2YXIgbWVzc2FnZSA9IGJ1aWxkZXIuZmluaXNoKCk7CiAgICB0aGlzLnJlY2VpdmVyXy5hY2NlcHQobWVzc2FnZSk7CiAgfTsKICBNZWRpYVJvdXRlUHJvdmlkZXJQdHIucHJvdG90eXBlLmRldGFjaFJvdXRlID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gTWVkaWFSb3V0ZVByb3ZpZGVyUHJveHkucHJvdG90eXBlLmRldGFjaFJvdXRlCiAgICAgICAgLmFwcGx5KHRoaXMucHRyLmdldFByb3h5KCksIGFyZ3VtZW50cyk7CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyUHJveHkucHJvdG90eXBlLmRldGFjaFJvdXRlID0gZnVuY3Rpb24ocm91dGVJZCkgewogICAgdmFyIHBhcmFtcyA9IG5ldyBNZWRpYVJvdXRlUHJvdmlkZXJfRGV0YWNoUm91dGVfUGFyYW1zKCk7CiAgICBwYXJhbXMucm91dGVJZCA9IHJvdXRlSWQ7CiAgICB2YXIgYnVpbGRlciA9IG5ldyBjb2RlYy5NZXNzYWdlVjBCdWlsZGVyKAogICAgICAgIGtNZWRpYVJvdXRlUHJvdmlkZXJfRGV0YWNoUm91dGVfTmFtZSwKICAgICAgICBjb2RlYy5hbGlnbihNZWRpYVJvdXRlUHJvdmlkZXJfRGV0YWNoUm91dGVfUGFyYW1zLmVuY29kZWRTaXplKSk7CiAgICBidWlsZGVyLmVuY29kZVN0cnVjdChNZWRpYVJvdXRlUHJvdmlkZXJfRGV0YWNoUm91dGVfUGFyYW1zLCBwYXJhbXMpOwogICAgdmFyIG1lc3NhZ2UgPSBidWlsZGVyLmZpbmlzaCgpOwogICAgdGhpcy5yZWNlaXZlcl8uYWNjZXB0KG1lc3NhZ2UpOwogIH07CiAgTWVkaWFSb3V0ZVByb3ZpZGVyUHRyLnByb3RvdHlwZS5lbmFibGVNZG5zRGlzY292ZXJ5ID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gTWVkaWFSb3V0ZVByb3ZpZGVyUHJveHkucHJvdG90eXBlLmVuYWJsZU1kbnNEaXNjb3ZlcnkKICAgICAgICAuYXBwbHkodGhpcy5wdHIuZ2V0UHJveHkoKSwgYXJndW1lbnRzKTsKICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJQcm94eS5wcm90b3R5cGUuZW5hYmxlTWRuc0Rpc2NvdmVyeSA9IGZ1bmN0aW9uKCkgewogICAgdmFyIHBhcmFtcyA9IG5ldyBNZWRpYVJvdXRlUHJvdmlkZXJfRW5hYmxlTWRuc0Rpc2NvdmVyeV9QYXJhbXMoKTsKICAgIHZhciBidWlsZGVyID0gbmV3IGNvZGVjLk1lc3NhZ2VWMEJ1aWxkZXIoCiAgICAgICAga01lZGlhUm91dGVQcm92aWRlcl9FbmFibGVNZG5zRGlzY292ZXJ5X05hbWUsCiAgICAgICAgY29kZWMuYWxpZ24oTWVkaWFSb3V0ZVByb3ZpZGVyX0VuYWJsZU1kbnNEaXNjb3ZlcnlfUGFyYW1zLmVuY29kZWRTaXplKSk7CiAgICBidWlsZGVyLmVuY29kZVN0cnVjdChNZWRpYVJvdXRlUHJvdmlkZXJfRW5hYmxlTWRuc0Rpc2NvdmVyeV9QYXJhbXMsIHBhcmFtcyk7CiAgICB2YXIgbWVzc2FnZSA9IGJ1aWxkZXIuZmluaXNoKCk7CiAgICB0aGlzLnJlY2VpdmVyXy5hY2NlcHQobWVzc2FnZSk7CiAgfTsKICBNZWRpYVJvdXRlUHJvdmlkZXJQdHIucHJvdG90eXBlLnVwZGF0ZU1lZGlhU2lua3MgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBNZWRpYVJvdXRlUHJvdmlkZXJQcm94eS5wcm90b3R5cGUudXBkYXRlTWVkaWFTaW5rcwogICAgICAgIC5hcHBseSh0aGlzLnB0ci5nZXRQcm94eSgpLCBhcmd1bWVudHMpOwogIH07CgogIE1lZGlhUm91dGVQcm92aWRlclByb3h5LnByb3RvdHlwZS51cGRhdGVNZWRpYVNpbmtzID0gZnVuY3Rpb24obWVkaWFTb3VyY2UpIHsKICAgIHZhciBwYXJhbXMgPSBuZXcgTWVkaWFSb3V0ZVByb3ZpZGVyX1VwZGF0ZU1lZGlhU2lua3NfUGFyYW1zKCk7CiAgICBwYXJhbXMubWVkaWFTb3VyY2UgPSBtZWRpYVNvdXJjZTsKICAgIHZhciBidWlsZGVyID0gbmV3IGNvZGVjLk1lc3NhZ2VWMEJ1aWxkZXIoCiAgICAgICAga01lZGlhUm91dGVQcm92aWRlcl9VcGRhdGVNZWRpYVNpbmtzX05hbWUsCiAgICAgICAgY29kZWMuYWxpZ24oTWVkaWFSb3V0ZVByb3ZpZGVyX1VwZGF0ZU1lZGlhU2lua3NfUGFyYW1zLmVuY29kZWRTaXplKSk7CiAgICBidWlsZGVyLmVuY29kZVN0cnVjdChNZWRpYVJvdXRlUHJvdmlkZXJfVXBkYXRlTWVkaWFTaW5rc19QYXJhbXMsIHBhcmFtcyk7CiAgICB2YXIgbWVzc2FnZSA9IGJ1aWxkZXIuZmluaXNoKCk7CiAgICB0aGlzLnJlY2VpdmVyXy5hY2NlcHQobWVzc2FnZSk7CiAgfTsKICBNZWRpYVJvdXRlUHJvdmlkZXJQdHIucHJvdG90eXBlLnNlYXJjaFNpbmtzID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gTWVkaWFSb3V0ZVByb3ZpZGVyUHJveHkucHJvdG90eXBlLnNlYXJjaFNpbmtzCiAgICAgICAgLmFwcGx5KHRoaXMucHRyLmdldFByb3h5KCksIGFyZ3VtZW50cyk7CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyUHJveHkucHJvdG90eXBlLnNlYXJjaFNpbmtzID0gZnVuY3Rpb24oc2lua0lkLCBtZWRpYVNvdXJjZSwgc2VhcmNoQ3JpdGVyaWEpIHsKICAgIHZhciBwYXJhbXMgPSBuZXcgTWVkaWFSb3V0ZVByb3ZpZGVyX1NlYXJjaFNpbmtzX1BhcmFtcygpOwogICAgcGFyYW1zLnNpbmtJZCA9IHNpbmtJZDsKICAgIHBhcmFtcy5tZWRpYVNvdXJjZSA9IG1lZGlhU291cmNlOwogICAgcGFyYW1zLnNlYXJjaENyaXRlcmlhID0gc2VhcmNoQ3JpdGVyaWE7CiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgIHZhciBidWlsZGVyID0gbmV3IGNvZGVjLk1lc3NhZ2VWMUJ1aWxkZXIoCiAgICAgICAgICBrTWVkaWFSb3V0ZVByb3ZpZGVyX1NlYXJjaFNpbmtzX05hbWUsCiAgICAgICAgICBjb2RlYy5hbGlnbihNZWRpYVJvdXRlUHJvdmlkZXJfU2VhcmNoU2lua3NfUGFyYW1zLmVuY29kZWRTaXplKSwKICAgICAgICAgIGNvZGVjLmtNZXNzYWdlRXhwZWN0c1Jlc3BvbnNlLCAwKTsKICAgICAgYnVpbGRlci5lbmNvZGVTdHJ1Y3QoTWVkaWFSb3V0ZVByb3ZpZGVyX1NlYXJjaFNpbmtzX1BhcmFtcywgcGFyYW1zKTsKICAgICAgdmFyIG1lc3NhZ2UgPSBidWlsZGVyLmZpbmlzaCgpOwogICAgICB0aGlzLnJlY2VpdmVyXy5hY2NlcHRBbmRFeHBlY3RSZXNwb25zZShtZXNzYWdlKS50aGVuKGZ1bmN0aW9uKG1lc3NhZ2UpIHsKICAgICAgICB2YXIgcmVhZGVyID0gbmV3IGNvZGVjLk1lc3NhZ2VSZWFkZXIobWVzc2FnZSk7CiAgICAgICAgdmFyIHJlc3BvbnNlUGFyYW1zID0KICAgICAgICAgICAgcmVhZGVyLmRlY29kZVN0cnVjdChNZWRpYVJvdXRlUHJvdmlkZXJfU2VhcmNoU2lua3NfUmVzcG9uc2VQYXJhbXMpOwogICAgICAgIHJlc29sdmUocmVzcG9uc2VQYXJhbXMpOwogICAgICB9KS5jYXRjaChmdW5jdGlvbihyZXN1bHQpIHsKICAgICAgICByZWplY3QoRXJyb3IoIkNvbm5lY3Rpb24gZXJyb3I6ICIgKyByZXN1bHQpKTsKICAgICAgfSk7CiAgICB9LmJpbmQodGhpcykpOwogIH07CiAgTWVkaWFSb3V0ZVByb3ZpZGVyUHRyLnByb3RvdHlwZS5wcm92aWRlU2lua3MgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBNZWRpYVJvdXRlUHJvdmlkZXJQcm94eS5wcm90b3R5cGUucHJvdmlkZVNpbmtzCiAgICAgICAgLmFwcGx5KHRoaXMucHRyLmdldFByb3h5KCksIGFyZ3VtZW50cyk7CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyUHJveHkucHJvdG90eXBlLnByb3ZpZGVTaW5rcyA9IGZ1bmN0aW9uKHByb3ZpZGVyTmFtZSwgc2lua3MpIHsKICAgIHZhciBwYXJhbXMgPSBuZXcgTWVkaWFSb3V0ZVByb3ZpZGVyX1Byb3ZpZGVTaW5rc19QYXJhbXMoKTsKICAgIHBhcmFtcy5wcm92aWRlck5hbWUgPSBwcm92aWRlck5hbWU7CiAgICBwYXJhbXMuc2lua3MgPSBzaW5rczsKICAgIHZhciBidWlsZGVyID0gbmV3IGNvZGVjLk1lc3NhZ2VWMEJ1aWxkZXIoCiAgICAgICAga01lZGlhUm91dGVQcm92aWRlcl9Qcm92aWRlU2lua3NfTmFtZSwKICAgICAgICBjb2RlYy5hbGlnbihNZWRpYVJvdXRlUHJvdmlkZXJfUHJvdmlkZVNpbmtzX1BhcmFtcy5lbmNvZGVkU2l6ZSkpOwogICAgYnVpbGRlci5lbmNvZGVTdHJ1Y3QoTWVkaWFSb3V0ZVByb3ZpZGVyX1Byb3ZpZGVTaW5rc19QYXJhbXMsIHBhcmFtcyk7CiAgICB2YXIgbWVzc2FnZSA9IGJ1aWxkZXIuZmluaXNoKCk7CiAgICB0aGlzLnJlY2VpdmVyXy5hY2NlcHQobWVzc2FnZSk7CiAgfTsKICBNZWRpYVJvdXRlUHJvdmlkZXJQdHIucHJvdG90eXBlLmNyZWF0ZU1lZGlhUm91dGVDb250cm9sbGVyID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gTWVkaWFSb3V0ZVByb3ZpZGVyUHJveHkucHJvdG90eXBlLmNyZWF0ZU1lZGlhUm91dGVDb250cm9sbGVyCiAgICAgICAgLmFwcGx5KHRoaXMucHRyLmdldFByb3h5KCksIGFyZ3VtZW50cyk7CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyUHJveHkucHJvdG90eXBlLmNyZWF0ZU1lZGlhUm91dGVDb250cm9sbGVyID0gZnVuY3Rpb24ocm91dGVJZCwgbWVkaWFDb250cm9sbGVyLCBvYnNlcnZlcikgewogICAgdmFyIHBhcmFtcyA9IG5ldyBNZWRpYVJvdXRlUHJvdmlkZXJfQ3JlYXRlTWVkaWFSb3V0ZUNvbnRyb2xsZXJfUGFyYW1zKCk7CiAgICBwYXJhbXMucm91dGVJZCA9IHJvdXRlSWQ7CiAgICBwYXJhbXMubWVkaWFDb250cm9sbGVyID0gbWVkaWFDb250cm9sbGVyOwogICAgcGFyYW1zLm9ic2VydmVyID0gb2JzZXJ2ZXI7CiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgIHZhciBidWlsZGVyID0gbmV3IGNvZGVjLk1lc3NhZ2VWMUJ1aWxkZXIoCiAgICAgICAgICBrTWVkaWFSb3V0ZVByb3ZpZGVyX0NyZWF0ZU1lZGlhUm91dGVDb250cm9sbGVyX05hbWUsCiAgICAgICAgICBjb2RlYy5hbGlnbihNZWRpYVJvdXRlUHJvdmlkZXJfQ3JlYXRlTWVkaWFSb3V0ZUNvbnRyb2xsZXJfUGFyYW1zLmVuY29kZWRTaXplKSwKICAgICAgICAgIGNvZGVjLmtNZXNzYWdlRXhwZWN0c1Jlc3BvbnNlLCAwKTsKICAgICAgYnVpbGRlci5lbmNvZGVTdHJ1Y3QoTWVkaWFSb3V0ZVByb3ZpZGVyX0NyZWF0ZU1lZGlhUm91dGVDb250cm9sbGVyX1BhcmFtcywgcGFyYW1zKTsKICAgICAgdmFyIG1lc3NhZ2UgPSBidWlsZGVyLmZpbmlzaCgpOwogICAgICB0aGlzLnJlY2VpdmVyXy5hY2NlcHRBbmRFeHBlY3RSZXNwb25zZShtZXNzYWdlKS50aGVuKGZ1bmN0aW9uKG1lc3NhZ2UpIHsKICAgICAgICB2YXIgcmVhZGVyID0gbmV3IGNvZGVjLk1lc3NhZ2VSZWFkZXIobWVzc2FnZSk7CiAgICAgICAgdmFyIHJlc3BvbnNlUGFyYW1zID0KICAgICAgICAgICAgcmVhZGVyLmRlY29kZVN0cnVjdChNZWRpYVJvdXRlUHJvdmlkZXJfQ3JlYXRlTWVkaWFSb3V0ZUNvbnRyb2xsZXJfUmVzcG9uc2VQYXJhbXMpOwogICAgICAgIHJlc29sdmUocmVzcG9uc2VQYXJhbXMpOwogICAgICB9KS5jYXRjaChmdW5jdGlvbihyZXN1bHQpIHsKICAgICAgICByZWplY3QoRXJyb3IoIkNvbm5lY3Rpb24gZXJyb3I6ICIgKyByZXN1bHQpKTsKICAgICAgfSk7CiAgICB9LmJpbmQodGhpcykpOwogIH07CgogIGZ1bmN0aW9uIE1lZGlhUm91dGVQcm92aWRlclN0dWIoZGVsZWdhdGUpIHsKICAgIHRoaXMuZGVsZWdhdGVfID0gZGVsZWdhdGU7CiAgfQogIE1lZGlhUm91dGVQcm92aWRlclN0dWIucHJvdG90eXBlLmNyZWF0ZVJvdXRlID0gZnVuY3Rpb24obWVkaWFTb3VyY2UsIHNpbmtJZCwgb3JpZ2luYWxQcmVzZW50YXRpb25JZCwgb3JpZ2luLCB0YWJJZCwgdGltZW91dCwgaW5jb2duaXRvKSB7CiAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZV8gJiYgdGhpcy5kZWxlZ2F0ZV8uY3JlYXRlUm91dGUgJiYgdGhpcy5kZWxlZ2F0ZV8uY3JlYXRlUm91dGUobWVkaWFTb3VyY2UsIHNpbmtJZCwgb3JpZ2luYWxQcmVzZW50YXRpb25JZCwgb3JpZ2luLCB0YWJJZCwgdGltZW91dCwgaW5jb2duaXRvKTsKICB9CiAgTWVkaWFSb3V0ZVByb3ZpZGVyU3R1Yi5wcm90b3R5cGUuam9pblJvdXRlID0gZnVuY3Rpb24obWVkaWFTb3VyY2UsIHByZXNlbnRhdGlvbklkLCBvcmlnaW4sIHRhYklkLCB0aW1lb3V0LCBpbmNvZ25pdG8pIHsKICAgIHJldHVybiB0aGlzLmRlbGVnYXRlXyAmJiB0aGlzLmRlbGVnYXRlXy5qb2luUm91dGUgJiYgdGhpcy5kZWxlZ2F0ZV8uam9pblJvdXRlKG1lZGlhU291cmNlLCBwcmVzZW50YXRpb25JZCwgb3JpZ2luLCB0YWJJZCwgdGltZW91dCwgaW5jb2duaXRvKTsKICB9CiAgTWVkaWFSb3V0ZVByb3ZpZGVyU3R1Yi5wcm90b3R5cGUuY29ubmVjdFJvdXRlQnlSb3V0ZUlkID0gZnVuY3Rpb24obWVkaWFTb3VyY2UsIHJvdXRlSWQsIHByZXNlbnRhdGlvbklkLCBvcmlnaW4sIHRhYklkLCB0aW1lb3V0LCBpbmNvZ25pdG8pIHsKICAgIHJldHVybiB0aGlzLmRlbGVnYXRlXyAmJiB0aGlzLmRlbGVnYXRlXy5jb25uZWN0Um91dGVCeVJvdXRlSWQgJiYgdGhpcy5kZWxlZ2F0ZV8uY29ubmVjdFJvdXRlQnlSb3V0ZUlkKG1lZGlhU291cmNlLCByb3V0ZUlkLCBwcmVzZW50YXRpb25JZCwgb3JpZ2luLCB0YWJJZCwgdGltZW91dCwgaW5jb2duaXRvKTsKICB9CiAgTWVkaWFSb3V0ZVByb3ZpZGVyU3R1Yi5wcm90b3R5cGUudGVybWluYXRlUm91dGUgPSBmdW5jdGlvbihyb3V0ZUlkKSB7CiAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZV8gJiYgdGhpcy5kZWxlZ2F0ZV8udGVybWluYXRlUm91dGUgJiYgdGhpcy5kZWxlZ2F0ZV8udGVybWluYXRlUm91dGUocm91dGVJZCk7CiAgfQogIE1lZGlhUm91dGVQcm92aWRlclN0dWIucHJvdG90eXBlLnNlbmRSb3V0ZU1lc3NhZ2UgPSBmdW5jdGlvbihtZWRpYVJvdXRlSWQsIG1lc3NhZ2UpIHsKICAgIHJldHVybiB0aGlzLmRlbGVnYXRlXyAmJiB0aGlzLmRlbGVnYXRlXy5zZW5kUm91dGVNZXNzYWdlICYmIHRoaXMuZGVsZWdhdGVfLnNlbmRSb3V0ZU1lc3NhZ2UobWVkaWFSb3V0ZUlkLCBtZXNzYWdlKTsKICB9CiAgTWVkaWFSb3V0ZVByb3ZpZGVyU3R1Yi5wcm90b3R5cGUuc2VuZFJvdXRlQmluYXJ5TWVzc2FnZSA9IGZ1bmN0aW9uKG1lZGlhUm91dGVJZCwgZGF0YSkgewogICAgcmV0dXJuIHRoaXMuZGVsZWdhdGVfICYmIHRoaXMuZGVsZWdhdGVfLnNlbmRSb3V0ZUJpbmFyeU1lc3NhZ2UgJiYgdGhpcy5kZWxlZ2F0ZV8uc2VuZFJvdXRlQmluYXJ5TWVzc2FnZShtZWRpYVJvdXRlSWQsIGRhdGEpOwogIH0KICBNZWRpYVJvdXRlUHJvdmlkZXJTdHViLnByb3RvdHlwZS5zdGFydE9ic2VydmluZ01lZGlhU2lua3MgPSBmdW5jdGlvbihtZWRpYVNvdXJjZSkgewogICAgcmV0dXJuIHRoaXMuZGVsZWdhdGVfICYmIHRoaXMuZGVsZWdhdGVfLnN0YXJ0T2JzZXJ2aW5nTWVkaWFTaW5rcyAmJiB0aGlzLmRlbGVnYXRlXy5zdGFydE9ic2VydmluZ01lZGlhU2lua3MobWVkaWFTb3VyY2UpOwogIH0KICBNZWRpYVJvdXRlUHJvdmlkZXJTdHViLnByb3RvdHlwZS5zdG9wT2JzZXJ2aW5nTWVkaWFTaW5rcyA9IGZ1bmN0aW9uKG1lZGlhU291cmNlKSB7CiAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZV8gJiYgdGhpcy5kZWxlZ2F0ZV8uc3RvcE9ic2VydmluZ01lZGlhU2lua3MgJiYgdGhpcy5kZWxlZ2F0ZV8uc3RvcE9ic2VydmluZ01lZGlhU2lua3MobWVkaWFTb3VyY2UpOwogIH0KICBNZWRpYVJvdXRlUHJvdmlkZXJTdHViLnByb3RvdHlwZS5zdGFydE9ic2VydmluZ01lZGlhUm91dGVzID0gZnVuY3Rpb24obWVkaWFTb3VyY2UpIHsKICAgIHJldHVybiB0aGlzLmRlbGVnYXRlXyAmJiB0aGlzLmRlbGVnYXRlXy5zdGFydE9ic2VydmluZ01lZGlhUm91dGVzICYmIHRoaXMuZGVsZWdhdGVfLnN0YXJ0T2JzZXJ2aW5nTWVkaWFSb3V0ZXMobWVkaWFTb3VyY2UpOwogIH0KICBNZWRpYVJvdXRlUHJvdmlkZXJTdHViLnByb3RvdHlwZS5zdG9wT2JzZXJ2aW5nTWVkaWFSb3V0ZXMgPSBmdW5jdGlvbihtZWRpYVNvdXJjZSkgewogICAgcmV0dXJuIHRoaXMuZGVsZWdhdGVfICYmIHRoaXMuZGVsZWdhdGVfLnN0b3BPYnNlcnZpbmdNZWRpYVJvdXRlcyAmJiB0aGlzLmRlbGVnYXRlXy5zdG9wT2JzZXJ2aW5nTWVkaWFSb3V0ZXMobWVkaWFTb3VyY2UpOwogIH0KICBNZWRpYVJvdXRlUHJvdmlkZXJTdHViLnByb3RvdHlwZS5zdGFydExpc3RlbmluZ0ZvclJvdXRlTWVzc2FnZXMgPSBmdW5jdGlvbihyb3V0ZUlkKSB7CiAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZV8gJiYgdGhpcy5kZWxlZ2F0ZV8uc3RhcnRMaXN0ZW5pbmdGb3JSb3V0ZU1lc3NhZ2VzICYmIHRoaXMuZGVsZWdhdGVfLnN0YXJ0TGlzdGVuaW5nRm9yUm91dGVNZXNzYWdlcyhyb3V0ZUlkKTsKICB9CiAgTWVkaWFSb3V0ZVByb3ZpZGVyU3R1Yi5wcm90b3R5cGUuc3RvcExpc3RlbmluZ0ZvclJvdXRlTWVzc2FnZXMgPSBmdW5jdGlvbihyb3V0ZUlkKSB7CiAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZV8gJiYgdGhpcy5kZWxlZ2F0ZV8uc3RvcExpc3RlbmluZ0ZvclJvdXRlTWVzc2FnZXMgJiYgdGhpcy5kZWxlZ2F0ZV8uc3RvcExpc3RlbmluZ0ZvclJvdXRlTWVzc2FnZXMocm91dGVJZCk7CiAgfQogIE1lZGlhUm91dGVQcm92aWRlclN0dWIucHJvdG90eXBlLmRldGFjaFJvdXRlID0gZnVuY3Rpb24ocm91dGVJZCkgewogICAgcmV0dXJuIHRoaXMuZGVsZWdhdGVfICYmIHRoaXMuZGVsZWdhdGVfLmRldGFjaFJvdXRlICYmIHRoaXMuZGVsZWdhdGVfLmRldGFjaFJvdXRlKHJvdXRlSWQpOwogIH0KICBNZWRpYVJvdXRlUHJvdmlkZXJTdHViLnByb3RvdHlwZS5lbmFibGVNZG5zRGlzY292ZXJ5ID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZV8gJiYgdGhpcy5kZWxlZ2F0ZV8uZW5hYmxlTWRuc0Rpc2NvdmVyeSAmJiB0aGlzLmRlbGVnYXRlXy5lbmFibGVNZG5zRGlzY292ZXJ5KCk7CiAgfQogIE1lZGlhUm91dGVQcm92aWRlclN0dWIucHJvdG90eXBlLnVwZGF0ZU1lZGlhU2lua3MgPSBmdW5jdGlvbihtZWRpYVNvdXJjZSkgewogICAgcmV0dXJuIHRoaXMuZGVsZWdhdGVfICYmIHRoaXMuZGVsZWdhdGVfLnVwZGF0ZU1lZGlhU2lua3MgJiYgdGhpcy5kZWxlZ2F0ZV8udXBkYXRlTWVkaWFTaW5rcyhtZWRpYVNvdXJjZSk7CiAgfQogIE1lZGlhUm91dGVQcm92aWRlclN0dWIucHJvdG90eXBlLnNlYXJjaFNpbmtzID0gZnVuY3Rpb24oc2lua0lkLCBtZWRpYVNvdXJjZSwgc2VhcmNoQ3JpdGVyaWEpIHsKICAgIHJldHVybiB0aGlzLmRlbGVnYXRlXyAmJiB0aGlzLmRlbGVnYXRlXy5zZWFyY2hTaW5rcyAmJiB0aGlzLmRlbGVnYXRlXy5zZWFyY2hTaW5rcyhzaW5rSWQsIG1lZGlhU291cmNlLCBzZWFyY2hDcml0ZXJpYSk7CiAgfQogIE1lZGlhUm91dGVQcm92aWRlclN0dWIucHJvdG90eXBlLnByb3ZpZGVTaW5rcyA9IGZ1bmN0aW9uKHByb3ZpZGVyTmFtZSwgc2lua3MpIHsKICAgIHJldHVybiB0aGlzLmRlbGVnYXRlXyAmJiB0aGlzLmRlbGVnYXRlXy5wcm92aWRlU2lua3MgJiYgdGhpcy5kZWxlZ2F0ZV8ucHJvdmlkZVNpbmtzKHByb3ZpZGVyTmFtZSwgc2lua3MpOwogIH0KICBNZWRpYVJvdXRlUHJvdmlkZXJTdHViLnByb3RvdHlwZS5jcmVhdGVNZWRpYVJvdXRlQ29udHJvbGxlciA9IGZ1bmN0aW9uKHJvdXRlSWQsIG1lZGlhQ29udHJvbGxlciwgb2JzZXJ2ZXIpIHsKICAgIHJldHVybiB0aGlzLmRlbGVnYXRlXyAmJiB0aGlzLmRlbGVnYXRlXy5jcmVhdGVNZWRpYVJvdXRlQ29udHJvbGxlciAmJiB0aGlzLmRlbGVnYXRlXy5jcmVhdGVNZWRpYVJvdXRlQ29udHJvbGxlcihyb3V0ZUlkLCBtZWRpYUNvbnRyb2xsZXIsIG9ic2VydmVyKTsKICB9CgogIE1lZGlhUm91dGVQcm92aWRlclN0dWIucHJvdG90eXBlLmFjY2VwdCA9IGZ1bmN0aW9uKG1lc3NhZ2UpIHsKICAgIHZhciByZWFkZXIgPSBuZXcgY29kZWMuTWVzc2FnZVJlYWRlcihtZXNzYWdlKTsKICAgIHN3aXRjaCAocmVhZGVyLm1lc3NhZ2VOYW1lKSB7CiAgICBjYXNlIGtNZWRpYVJvdXRlUHJvdmlkZXJfU3RhcnRPYnNlcnZpbmdNZWRpYVNpbmtzX05hbWU6CiAgICAgIHZhciBwYXJhbXMgPSByZWFkZXIuZGVjb2RlU3RydWN0KE1lZGlhUm91dGVQcm92aWRlcl9TdGFydE9ic2VydmluZ01lZGlhU2lua3NfUGFyYW1zKTsKICAgICAgdGhpcy5zdGFydE9ic2VydmluZ01lZGlhU2lua3MocGFyYW1zLm1lZGlhU291cmNlKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICBjYXNlIGtNZWRpYVJvdXRlUHJvdmlkZXJfU3RvcE9ic2VydmluZ01lZGlhU2lua3NfTmFtZToKICAgICAgdmFyIHBhcmFtcyA9IHJlYWRlci5kZWNvZGVTdHJ1Y3QoTWVkaWFSb3V0ZVByb3ZpZGVyX1N0b3BPYnNlcnZpbmdNZWRpYVNpbmtzX1BhcmFtcyk7CiAgICAgIHRoaXMuc3RvcE9ic2VydmluZ01lZGlhU2lua3MocGFyYW1zLm1lZGlhU291cmNlKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICBjYXNlIGtNZWRpYVJvdXRlUHJvdmlkZXJfU3RhcnRPYnNlcnZpbmdNZWRpYVJvdXRlc19OYW1lOgogICAgICB2YXIgcGFyYW1zID0gcmVhZGVyLmRlY29kZVN0cnVjdChNZWRpYVJvdXRlUHJvdmlkZXJfU3RhcnRPYnNlcnZpbmdNZWRpYVJvdXRlc19QYXJhbXMpOwogICAgICB0aGlzLnN0YXJ0T2JzZXJ2aW5nTWVkaWFSb3V0ZXMocGFyYW1zLm1lZGlhU291cmNlKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICBjYXNlIGtNZWRpYVJvdXRlUHJvdmlkZXJfU3RvcE9ic2VydmluZ01lZGlhUm91dGVzX05hbWU6CiAgICAgIHZhciBwYXJhbXMgPSByZWFkZXIuZGVjb2RlU3RydWN0KE1lZGlhUm91dGVQcm92aWRlcl9TdG9wT2JzZXJ2aW5nTWVkaWFSb3V0ZXNfUGFyYW1zKTsKICAgICAgdGhpcy5zdG9wT2JzZXJ2aW5nTWVkaWFSb3V0ZXMocGFyYW1zLm1lZGlhU291cmNlKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICBjYXNlIGtNZWRpYVJvdXRlUHJvdmlkZXJfU3RhcnRMaXN0ZW5pbmdGb3JSb3V0ZU1lc3NhZ2VzX05hbWU6CiAgICAgIHZhciBwYXJhbXMgPSByZWFkZXIuZGVjb2RlU3RydWN0KE1lZGlhUm91dGVQcm92aWRlcl9TdGFydExpc3RlbmluZ0ZvclJvdXRlTWVzc2FnZXNfUGFyYW1zKTsKICAgICAgdGhpcy5zdGFydExpc3RlbmluZ0ZvclJvdXRlTWVzc2FnZXMocGFyYW1zLnJvdXRlSWQpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIGNhc2Uga01lZGlhUm91dGVQcm92aWRlcl9TdG9wTGlzdGVuaW5nRm9yUm91dGVNZXNzYWdlc19OYW1lOgogICAgICB2YXIgcGFyYW1zID0gcmVhZGVyLmRlY29kZVN0cnVjdChNZWRpYVJvdXRlUHJvdmlkZXJfU3RvcExpc3RlbmluZ0ZvclJvdXRlTWVzc2FnZXNfUGFyYW1zKTsKICAgICAgdGhpcy5zdG9wTGlzdGVuaW5nRm9yUm91dGVNZXNzYWdlcyhwYXJhbXMucm91dGVJZCk7CiAgICAgIHJldHVybiB0cnVlOwogICAgY2FzZSBrTWVkaWFSb3V0ZVByb3ZpZGVyX0RldGFjaFJvdXRlX05hbWU6CiAgICAgIHZhciBwYXJhbXMgPSByZWFkZXIuZGVjb2RlU3RydWN0KE1lZGlhUm91dGVQcm92aWRlcl9EZXRhY2hSb3V0ZV9QYXJhbXMpOwogICAgICB0aGlzLmRldGFjaFJvdXRlKHBhcmFtcy5yb3V0ZUlkKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICBjYXNlIGtNZWRpYVJvdXRlUHJvdmlkZXJfRW5hYmxlTWRuc0Rpc2NvdmVyeV9OYW1lOgogICAgICB2YXIgcGFyYW1zID0gcmVhZGVyLmRlY29kZVN0cnVjdChNZWRpYVJvdXRlUHJvdmlkZXJfRW5hYmxlTWRuc0Rpc2NvdmVyeV9QYXJhbXMpOwogICAgICB0aGlzLmVuYWJsZU1kbnNEaXNjb3ZlcnkoKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICBjYXNlIGtNZWRpYVJvdXRlUHJvdmlkZXJfVXBkYXRlTWVkaWFTaW5rc19OYW1lOgogICAgICB2YXIgcGFyYW1zID0gcmVhZGVyLmRlY29kZVN0cnVjdChNZWRpYVJvdXRlUHJvdmlkZXJfVXBkYXRlTWVkaWFTaW5rc19QYXJhbXMpOwogICAgICB0aGlzLnVwZGF0ZU1lZGlhU2lua3MocGFyYW1zLm1lZGlhU291cmNlKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICBjYXNlIGtNZWRpYVJvdXRlUHJvdmlkZXJfUHJvdmlkZVNpbmtzX05hbWU6CiAgICAgIHZhciBwYXJhbXMgPSByZWFkZXIuZGVjb2RlU3RydWN0KE1lZGlhUm91dGVQcm92aWRlcl9Qcm92aWRlU2lua3NfUGFyYW1zKTsKICAgICAgdGhpcy5wcm92aWRlU2lua3MocGFyYW1zLnByb3ZpZGVyTmFtZSwgcGFyYW1zLnNpbmtzKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICBkZWZhdWx0OgogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyU3R1Yi5wcm90b3R5cGUuYWNjZXB0V2l0aFJlc3BvbmRlciA9CiAgICAgIGZ1bmN0aW9uKG1lc3NhZ2UsIHJlc3BvbmRlcikgewogICAgdmFyIHJlYWRlciA9IG5ldyBjb2RlYy5NZXNzYWdlUmVhZGVyKG1lc3NhZ2UpOwogICAgc3dpdGNoIChyZWFkZXIubWVzc2FnZU5hbWUpIHsKICAgIGNhc2Uga01lZGlhUm91dGVQcm92aWRlcl9DcmVhdGVSb3V0ZV9OYW1lOgogICAgICB2YXIgcGFyYW1zID0gcmVhZGVyLmRlY29kZVN0cnVjdChNZWRpYVJvdXRlUHJvdmlkZXJfQ3JlYXRlUm91dGVfUGFyYW1zKTsKICAgICAgdGhpcy5jcmVhdGVSb3V0ZShwYXJhbXMubWVkaWFTb3VyY2UsIHBhcmFtcy5zaW5rSWQsIHBhcmFtcy5vcmlnaW5hbFByZXNlbnRhdGlvbklkLCBwYXJhbXMub3JpZ2luLCBwYXJhbXMudGFiSWQsIHBhcmFtcy50aW1lb3V0LCBwYXJhbXMuaW5jb2duaXRvKS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgdmFyIHJlc3BvbnNlUGFyYW1zID0KICAgICAgICAgICAgbmV3IE1lZGlhUm91dGVQcm92aWRlcl9DcmVhdGVSb3V0ZV9SZXNwb25zZVBhcmFtcygpOwogICAgICAgIHJlc3BvbnNlUGFyYW1zLnJvdXRlID0gcmVzcG9uc2Uucm91dGU7CiAgICAgICAgcmVzcG9uc2VQYXJhbXMuZXJyb3JUZXh0ID0gcmVzcG9uc2UuZXJyb3JUZXh0OwogICAgICAgIHJlc3BvbnNlUGFyYW1zLnJlc3VsdENvZGUgPSByZXNwb25zZS5yZXN1bHRDb2RlOwogICAgICAgIHZhciBidWlsZGVyID0gbmV3IGNvZGVjLk1lc3NhZ2VWMUJ1aWxkZXIoCiAgICAgICAgICAgIGtNZWRpYVJvdXRlUHJvdmlkZXJfQ3JlYXRlUm91dGVfTmFtZSwKICAgICAgICAgICAgY29kZWMuYWxpZ24oTWVkaWFSb3V0ZVByb3ZpZGVyX0NyZWF0ZVJvdXRlX1Jlc3BvbnNlUGFyYW1zLmVuY29kZWRTaXplKSwKICAgICAgICAgICAgY29kZWMua01lc3NhZ2VJc1Jlc3BvbnNlLCByZWFkZXIucmVxdWVzdElEKTsKICAgICAgICBidWlsZGVyLmVuY29kZVN0cnVjdChNZWRpYVJvdXRlUHJvdmlkZXJfQ3JlYXRlUm91dGVfUmVzcG9uc2VQYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VQYXJhbXMpOwogICAgICAgIHZhciBtZXNzYWdlID0gYnVpbGRlci5maW5pc2goKTsKICAgICAgICByZXNwb25kZXIuYWNjZXB0KG1lc3NhZ2UpOwogICAgICB9KTsKICAgICAgcmV0dXJuIHRydWU7CiAgICBjYXNlIGtNZWRpYVJvdXRlUHJvdmlkZXJfSm9pblJvdXRlX05hbWU6CiAgICAgIHZhciBwYXJhbXMgPSByZWFkZXIuZGVjb2RlU3RydWN0KE1lZGlhUm91dGVQcm92aWRlcl9Kb2luUm91dGVfUGFyYW1zKTsKICAgICAgdGhpcy5qb2luUm91dGUocGFyYW1zLm1lZGlhU291cmNlLCBwYXJhbXMucHJlc2VudGF0aW9uSWQsIHBhcmFtcy5vcmlnaW4sIHBhcmFtcy50YWJJZCwgcGFyYW1zLnRpbWVvdXQsIHBhcmFtcy5pbmNvZ25pdG8pLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsKICAgICAgICB2YXIgcmVzcG9uc2VQYXJhbXMgPQogICAgICAgICAgICBuZXcgTWVkaWFSb3V0ZVByb3ZpZGVyX0pvaW5Sb3V0ZV9SZXNwb25zZVBhcmFtcygpOwogICAgICAgIHJlc3BvbnNlUGFyYW1zLnJvdXRlID0gcmVzcG9uc2Uucm91dGU7CiAgICAgICAgcmVzcG9uc2VQYXJhbXMuZXJyb3JUZXh0ID0gcmVzcG9uc2UuZXJyb3JUZXh0OwogICAgICAgIHJlc3BvbnNlUGFyYW1zLnJlc3VsdENvZGUgPSByZXNwb25zZS5yZXN1bHRDb2RlOwogICAgICAgIHZhciBidWlsZGVyID0gbmV3IGNvZGVjLk1lc3NhZ2VWMUJ1aWxkZXIoCiAgICAgICAgICAgIGtNZWRpYVJvdXRlUHJvdmlkZXJfSm9pblJvdXRlX05hbWUsCiAgICAgICAgICAgIGNvZGVjLmFsaWduKE1lZGlhUm91dGVQcm92aWRlcl9Kb2luUm91dGVfUmVzcG9uc2VQYXJhbXMuZW5jb2RlZFNpemUpLAogICAgICAgICAgICBjb2RlYy5rTWVzc2FnZUlzUmVzcG9uc2UsIHJlYWRlci5yZXF1ZXN0SUQpOwogICAgICAgIGJ1aWxkZXIuZW5jb2RlU3RydWN0KE1lZGlhUm91dGVQcm92aWRlcl9Kb2luUm91dGVfUmVzcG9uc2VQYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VQYXJhbXMpOwogICAgICAgIHZhciBtZXNzYWdlID0gYnVpbGRlci5maW5pc2goKTsKICAgICAgICByZXNwb25kZXIuYWNjZXB0KG1lc3NhZ2UpOwogICAgICB9KTsKICAgICAgcmV0dXJuIHRydWU7CiAgICBjYXNlIGtNZWRpYVJvdXRlUHJvdmlkZXJfQ29ubmVjdFJvdXRlQnlSb3V0ZUlkX05hbWU6CiAgICAgIHZhciBwYXJhbXMgPSByZWFkZXIuZGVjb2RlU3RydWN0KE1lZGlhUm91dGVQcm92aWRlcl9Db25uZWN0Um91dGVCeVJvdXRlSWRfUGFyYW1zKTsKICAgICAgdGhpcy5jb25uZWN0Um91dGVCeVJvdXRlSWQocGFyYW1zLm1lZGlhU291cmNlLCBwYXJhbXMucm91dGVJZCwgcGFyYW1zLnByZXNlbnRhdGlvbklkLCBwYXJhbXMub3JpZ2luLCBwYXJhbXMudGFiSWQsIHBhcmFtcy50aW1lb3V0LCBwYXJhbXMuaW5jb2duaXRvKS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgdmFyIHJlc3BvbnNlUGFyYW1zID0KICAgICAgICAgICAgbmV3IE1lZGlhUm91dGVQcm92aWRlcl9Db25uZWN0Um91dGVCeVJvdXRlSWRfUmVzcG9uc2VQYXJhbXMoKTsKICAgICAgICByZXNwb25zZVBhcmFtcy5yb3V0ZSA9IHJlc3BvbnNlLnJvdXRlOwogICAgICAgIHJlc3BvbnNlUGFyYW1zLmVycm9yVGV4dCA9IHJlc3BvbnNlLmVycm9yVGV4dDsKICAgICAgICByZXNwb25zZVBhcmFtcy5yZXN1bHRDb2RlID0gcmVzcG9uc2UucmVzdWx0Q29kZTsKICAgICAgICB2YXIgYnVpbGRlciA9IG5ldyBjb2RlYy5NZXNzYWdlVjFCdWlsZGVyKAogICAgICAgICAgICBrTWVkaWFSb3V0ZVByb3ZpZGVyX0Nvbm5lY3RSb3V0ZUJ5Um91dGVJZF9OYW1lLAogICAgICAgICAgICBjb2RlYy5hbGlnbihNZWRpYVJvdXRlUHJvdmlkZXJfQ29ubmVjdFJvdXRlQnlSb3V0ZUlkX1Jlc3BvbnNlUGFyYW1zLmVuY29kZWRTaXplKSwKICAgICAgICAgICAgY29kZWMua01lc3NhZ2VJc1Jlc3BvbnNlLCByZWFkZXIucmVxdWVzdElEKTsKICAgICAgICBidWlsZGVyLmVuY29kZVN0cnVjdChNZWRpYVJvdXRlUHJvdmlkZXJfQ29ubmVjdFJvdXRlQnlSb3V0ZUlkX1Jlc3BvbnNlUGFyYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlUGFyYW1zKTsKICAgICAgICB2YXIgbWVzc2FnZSA9IGJ1aWxkZXIuZmluaXNoKCk7CiAgICAgICAgcmVzcG9uZGVyLmFjY2VwdChtZXNzYWdlKTsKICAgICAgfSk7CiAgICAgIHJldHVybiB0cnVlOwogICAgY2FzZSBrTWVkaWFSb3V0ZVByb3ZpZGVyX1Rlcm1pbmF0ZVJvdXRlX05hbWU6CiAgICAgIHZhciBwYXJhbXMgPSByZWFkZXIuZGVjb2RlU3RydWN0KE1lZGlhUm91dGVQcm92aWRlcl9UZXJtaW5hdGVSb3V0ZV9QYXJhbXMpOwogICAgICB0aGlzLnRlcm1pbmF0ZVJvdXRlKHBhcmFtcy5yb3V0ZUlkKS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgdmFyIHJlc3BvbnNlUGFyYW1zID0KICAgICAgICAgICAgbmV3IE1lZGlhUm91dGVQcm92aWRlcl9UZXJtaW5hdGVSb3V0ZV9SZXNwb25zZVBhcmFtcygpOwogICAgICAgIHJlc3BvbnNlUGFyYW1zLmVycm9yVGV4dCA9IHJlc3BvbnNlLmVycm9yVGV4dDsKICAgICAgICByZXNwb25zZVBhcmFtcy5yZXN1bHRDb2RlID0gcmVzcG9uc2UucmVzdWx0Q29kZTsKICAgICAgICB2YXIgYnVpbGRlciA9IG5ldyBjb2RlYy5NZXNzYWdlVjFCdWlsZGVyKAogICAgICAgICAgICBrTWVkaWFSb3V0ZVByb3ZpZGVyX1Rlcm1pbmF0ZVJvdXRlX05hbWUsCiAgICAgICAgICAgIGNvZGVjLmFsaWduKE1lZGlhUm91dGVQcm92aWRlcl9UZXJtaW5hdGVSb3V0ZV9SZXNwb25zZVBhcmFtcy5lbmNvZGVkU2l6ZSksCiAgICAgICAgICAgIGNvZGVjLmtNZXNzYWdlSXNSZXNwb25zZSwgcmVhZGVyLnJlcXVlc3RJRCk7CiAgICAgICAgYnVpbGRlci5lbmNvZGVTdHJ1Y3QoTWVkaWFSb3V0ZVByb3ZpZGVyX1Rlcm1pbmF0ZVJvdXRlX1Jlc3BvbnNlUGFyYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlUGFyYW1zKTsKICAgICAgICB2YXIgbWVzc2FnZSA9IGJ1aWxkZXIuZmluaXNoKCk7CiAgICAgICAgcmVzcG9uZGVyLmFjY2VwdChtZXNzYWdlKTsKICAgICAgfSk7CiAgICAgIHJldHVybiB0cnVlOwogICAgY2FzZSBrTWVkaWFSb3V0ZVByb3ZpZGVyX1NlbmRSb3V0ZU1lc3NhZ2VfTmFtZToKICAgICAgdmFyIHBhcmFtcyA9IHJlYWRlci5kZWNvZGVTdHJ1Y3QoTWVkaWFSb3V0ZVByb3ZpZGVyX1NlbmRSb3V0ZU1lc3NhZ2VfUGFyYW1zKTsKICAgICAgdGhpcy5zZW5kUm91dGVNZXNzYWdlKHBhcmFtcy5tZWRpYVJvdXRlSWQsIHBhcmFtcy5tZXNzYWdlKS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgdmFyIHJlc3BvbnNlUGFyYW1zID0KICAgICAgICAgICAgbmV3IE1lZGlhUm91dGVQcm92aWRlcl9TZW5kUm91dGVNZXNzYWdlX1Jlc3BvbnNlUGFyYW1zKCk7CiAgICAgICAgcmVzcG9uc2VQYXJhbXMuc2VudCA9IHJlc3BvbnNlLnNlbnQ7CiAgICAgICAgdmFyIGJ1aWxkZXIgPSBuZXcgY29kZWMuTWVzc2FnZVYxQnVpbGRlcigKICAgICAgICAgICAga01lZGlhUm91dGVQcm92aWRlcl9TZW5kUm91dGVNZXNzYWdlX05hbWUsCiAgICAgICAgICAgIGNvZGVjLmFsaWduKE1lZGlhUm91dGVQcm92aWRlcl9TZW5kUm91dGVNZXNzYWdlX1Jlc3BvbnNlUGFyYW1zLmVuY29kZWRTaXplKSwKICAgICAgICAgICAgY29kZWMua01lc3NhZ2VJc1Jlc3BvbnNlLCByZWFkZXIucmVxdWVzdElEKTsKICAgICAgICBidWlsZGVyLmVuY29kZVN0cnVjdChNZWRpYVJvdXRlUHJvdmlkZXJfU2VuZFJvdXRlTWVzc2FnZV9SZXNwb25zZVBhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZVBhcmFtcyk7CiAgICAgICAgdmFyIG1lc3NhZ2UgPSBidWlsZGVyLmZpbmlzaCgpOwogICAgICAgIHJlc3BvbmRlci5hY2NlcHQobWVzc2FnZSk7CiAgICAgIH0pOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIGNhc2Uga01lZGlhUm91dGVQcm92aWRlcl9TZW5kUm91dGVCaW5hcnlNZXNzYWdlX05hbWU6CiAgICAgIHZhciBwYXJhbXMgPSByZWFkZXIuZGVjb2RlU3RydWN0KE1lZGlhUm91dGVQcm92aWRlcl9TZW5kUm91dGVCaW5hcnlNZXNzYWdlX1BhcmFtcyk7CiAgICAgIHRoaXMuc2VuZFJvdXRlQmluYXJ5TWVzc2FnZShwYXJhbXMubWVkaWFSb3V0ZUlkLCBwYXJhbXMuZGF0YSkudGhlbihmdW5jdGlvbihyZXNwb25zZSkgewogICAgICAgIHZhciByZXNwb25zZVBhcmFtcyA9CiAgICAgICAgICAgIG5ldyBNZWRpYVJvdXRlUHJvdmlkZXJfU2VuZFJvdXRlQmluYXJ5TWVzc2FnZV9SZXNwb25zZVBhcmFtcygpOwogICAgICAgIHJlc3BvbnNlUGFyYW1zLnNlbnQgPSByZXNwb25zZS5zZW50OwogICAgICAgIHZhciBidWlsZGVyID0gbmV3IGNvZGVjLk1lc3NhZ2VWMUJ1aWxkZXIoCiAgICAgICAgICAgIGtNZWRpYVJvdXRlUHJvdmlkZXJfU2VuZFJvdXRlQmluYXJ5TWVzc2FnZV9OYW1lLAogICAgICAgICAgICBjb2RlYy5hbGlnbihNZWRpYVJvdXRlUHJvdmlkZXJfU2VuZFJvdXRlQmluYXJ5TWVzc2FnZV9SZXNwb25zZVBhcmFtcy5lbmNvZGVkU2l6ZSksCiAgICAgICAgICAgIGNvZGVjLmtNZXNzYWdlSXNSZXNwb25zZSwgcmVhZGVyLnJlcXVlc3RJRCk7CiAgICAgICAgYnVpbGRlci5lbmNvZGVTdHJ1Y3QoTWVkaWFSb3V0ZVByb3ZpZGVyX1NlbmRSb3V0ZUJpbmFyeU1lc3NhZ2VfUmVzcG9uc2VQYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VQYXJhbXMpOwogICAgICAgIHZhciBtZXNzYWdlID0gYnVpbGRlci5maW5pc2goKTsKICAgICAgICByZXNwb25kZXIuYWNjZXB0KG1lc3NhZ2UpOwogICAgICB9KTsKICAgICAgcmV0dXJuIHRydWU7CiAgICBjYXNlIGtNZWRpYVJvdXRlUHJvdmlkZXJfU2VhcmNoU2lua3NfTmFtZToKICAgICAgdmFyIHBhcmFtcyA9IHJlYWRlci5kZWNvZGVTdHJ1Y3QoTWVkaWFSb3V0ZVByb3ZpZGVyX1NlYXJjaFNpbmtzX1BhcmFtcyk7CiAgICAgIHRoaXMuc2VhcmNoU2lua3MocGFyYW1zLnNpbmtJZCwgcGFyYW1zLm1lZGlhU291cmNlLCBwYXJhbXMuc2VhcmNoQ3JpdGVyaWEpLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsKICAgICAgICB2YXIgcmVzcG9uc2VQYXJhbXMgPQogICAgICAgICAgICBuZXcgTWVkaWFSb3V0ZVByb3ZpZGVyX1NlYXJjaFNpbmtzX1Jlc3BvbnNlUGFyYW1zKCk7CiAgICAgICAgcmVzcG9uc2VQYXJhbXMuc2lua0lkID0gcmVzcG9uc2Uuc2lua0lkOwogICAgICAgIHZhciBidWlsZGVyID0gbmV3IGNvZGVjLk1lc3NhZ2VWMUJ1aWxkZXIoCiAgICAgICAgICAgIGtNZWRpYVJvdXRlUHJvdmlkZXJfU2VhcmNoU2lua3NfTmFtZSwKICAgICAgICAgICAgY29kZWMuYWxpZ24oTWVkaWFSb3V0ZVByb3ZpZGVyX1NlYXJjaFNpbmtzX1Jlc3BvbnNlUGFyYW1zLmVuY29kZWRTaXplKSwKICAgICAgICAgICAgY29kZWMua01lc3NhZ2VJc1Jlc3BvbnNlLCByZWFkZXIucmVxdWVzdElEKTsKICAgICAgICBidWlsZGVyLmVuY29kZVN0cnVjdChNZWRpYVJvdXRlUHJvdmlkZXJfU2VhcmNoU2lua3NfUmVzcG9uc2VQYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VQYXJhbXMpOwogICAgICAgIHZhciBtZXNzYWdlID0gYnVpbGRlci5maW5pc2goKTsKICAgICAgICByZXNwb25kZXIuYWNjZXB0KG1lc3NhZ2UpOwogICAgICB9KTsKICAgICAgcmV0dXJuIHRydWU7CiAgICBjYXNlIGtNZWRpYVJvdXRlUHJvdmlkZXJfQ3JlYXRlTWVkaWFSb3V0ZUNvbnRyb2xsZXJfTmFtZToKICAgICAgdmFyIHBhcmFtcyA9IHJlYWRlci5kZWNvZGVTdHJ1Y3QoTWVkaWFSb3V0ZVByb3ZpZGVyX0NyZWF0ZU1lZGlhUm91dGVDb250cm9sbGVyX1BhcmFtcyk7CiAgICAgIHRoaXMuY3JlYXRlTWVkaWFSb3V0ZUNvbnRyb2xsZXIocGFyYW1zLnJvdXRlSWQsIHBhcmFtcy5tZWRpYUNvbnRyb2xsZXIsIHBhcmFtcy5vYnNlcnZlcikudGhlbihmdW5jdGlvbihyZXNwb25zZSkgewogICAgICAgIHZhciByZXNwb25zZVBhcmFtcyA9CiAgICAgICAgICAgIG5ldyBNZWRpYVJvdXRlUHJvdmlkZXJfQ3JlYXRlTWVkaWFSb3V0ZUNvbnRyb2xsZXJfUmVzcG9uc2VQYXJhbXMoKTsKICAgICAgICByZXNwb25zZVBhcmFtcy5zdWNjZXNzID0gcmVzcG9uc2Uuc3VjY2VzczsKICAgICAgICB2YXIgYnVpbGRlciA9IG5ldyBjb2RlYy5NZXNzYWdlVjFCdWlsZGVyKAogICAgICAgICAgICBrTWVkaWFSb3V0ZVByb3ZpZGVyX0NyZWF0ZU1lZGlhUm91dGVDb250cm9sbGVyX05hbWUsCiAgICAgICAgICAgIGNvZGVjLmFsaWduKE1lZGlhUm91dGVQcm92aWRlcl9DcmVhdGVNZWRpYVJvdXRlQ29udHJvbGxlcl9SZXNwb25zZVBhcmFtcy5lbmNvZGVkU2l6ZSksCiAgICAgICAgICAgIGNvZGVjLmtNZXNzYWdlSXNSZXNwb25zZSwgcmVhZGVyLnJlcXVlc3RJRCk7CiAgICAgICAgYnVpbGRlci5lbmNvZGVTdHJ1Y3QoTWVkaWFSb3V0ZVByb3ZpZGVyX0NyZWF0ZU1lZGlhUm91dGVDb250cm9sbGVyX1Jlc3BvbnNlUGFyYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlUGFyYW1zKTsKICAgICAgICB2YXIgbWVzc2FnZSA9IGJ1aWxkZXIuZmluaXNoKCk7CiAgICAgICAgcmVzcG9uZGVyLmFjY2VwdChtZXNzYWdlKTsKICAgICAgfSk7CiAgICAgIHJldHVybiB0cnVlOwogICAgZGVmYXVsdDoKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH07CgogIGZ1bmN0aW9uIHZhbGlkYXRlTWVkaWFSb3V0ZVByb3ZpZGVyUmVxdWVzdChtZXNzYWdlVmFsaWRhdG9yKSB7CiAgICB2YXIgbWVzc2FnZSA9IG1lc3NhZ2VWYWxpZGF0b3IubWVzc2FnZTsKICAgIHZhciBwYXJhbXNDbGFzcyA9IG51bGw7CiAgICBzd2l0Y2ggKG1lc3NhZ2UuZ2V0TmFtZSgpKSB7CiAgICAgIGNhc2Uga01lZGlhUm91dGVQcm92aWRlcl9DcmVhdGVSb3V0ZV9OYW1lOgogICAgICAgIGlmIChtZXNzYWdlLmV4cGVjdHNSZXNwb25zZSgpKQogICAgICAgICAgcGFyYW1zQ2xhc3MgPSBNZWRpYVJvdXRlUHJvdmlkZXJfQ3JlYXRlUm91dGVfUGFyYW1zOwogICAgICBicmVhazsKICAgICAgY2FzZSBrTWVkaWFSb3V0ZVByb3ZpZGVyX0pvaW5Sb3V0ZV9OYW1lOgogICAgICAgIGlmIChtZXNzYWdlLmV4cGVjdHNSZXNwb25zZSgpKQogICAgICAgICAgcGFyYW1zQ2xhc3MgPSBNZWRpYVJvdXRlUHJvdmlkZXJfSm9pblJvdXRlX1BhcmFtczsKICAgICAgYnJlYWs7CiAgICAgIGNhc2Uga01lZGlhUm91dGVQcm92aWRlcl9Db25uZWN0Um91dGVCeVJvdXRlSWRfTmFtZToKICAgICAgICBpZiAobWVzc2FnZS5leHBlY3RzUmVzcG9uc2UoKSkKICAgICAgICAgIHBhcmFtc0NsYXNzID0gTWVkaWFSb3V0ZVByb3ZpZGVyX0Nvbm5lY3RSb3V0ZUJ5Um91dGVJZF9QYXJhbXM7CiAgICAgIGJyZWFrOwogICAgICBjYXNlIGtNZWRpYVJvdXRlUHJvdmlkZXJfVGVybWluYXRlUm91dGVfTmFtZToKICAgICAgICBpZiAobWVzc2FnZS5leHBlY3RzUmVzcG9uc2UoKSkKICAgICAgICAgIHBhcmFtc0NsYXNzID0gTWVkaWFSb3V0ZVByb3ZpZGVyX1Rlcm1pbmF0ZVJvdXRlX1BhcmFtczsKICAgICAgYnJlYWs7CiAgICAgIGNhc2Uga01lZGlhUm91dGVQcm92aWRlcl9TZW5kUm91dGVNZXNzYWdlX05hbWU6CiAgICAgICAgaWYgKG1lc3NhZ2UuZXhwZWN0c1Jlc3BvbnNlKCkpCiAgICAgICAgICBwYXJhbXNDbGFzcyA9IE1lZGlhUm91dGVQcm92aWRlcl9TZW5kUm91dGVNZXNzYWdlX1BhcmFtczsKICAgICAgYnJlYWs7CiAgICAgIGNhc2Uga01lZGlhUm91dGVQcm92aWRlcl9TZW5kUm91dGVCaW5hcnlNZXNzYWdlX05hbWU6CiAgICAgICAgaWYgKG1lc3NhZ2UuZXhwZWN0c1Jlc3BvbnNlKCkpCiAgICAgICAgICBwYXJhbXNDbGFzcyA9IE1lZGlhUm91dGVQcm92aWRlcl9TZW5kUm91dGVCaW5hcnlNZXNzYWdlX1BhcmFtczsKICAgICAgYnJlYWs7CiAgICAgIGNhc2Uga01lZGlhUm91dGVQcm92aWRlcl9TdGFydE9ic2VydmluZ01lZGlhU2lua3NfTmFtZToKICAgICAgICBpZiAoIW1lc3NhZ2UuZXhwZWN0c1Jlc3BvbnNlKCkgJiYgIW1lc3NhZ2UuaXNSZXNwb25zZSgpKQogICAgICAgICAgcGFyYW1zQ2xhc3MgPSBNZWRpYVJvdXRlUHJvdmlkZXJfU3RhcnRPYnNlcnZpbmdNZWRpYVNpbmtzX1BhcmFtczsKICAgICAgYnJlYWs7CiAgICAgIGNhc2Uga01lZGlhUm91dGVQcm92aWRlcl9TdG9wT2JzZXJ2aW5nTWVkaWFTaW5rc19OYW1lOgogICAgICAgIGlmICghbWVzc2FnZS5leHBlY3RzUmVzcG9uc2UoKSAmJiAhbWVzc2FnZS5pc1Jlc3BvbnNlKCkpCiAgICAgICAgICBwYXJhbXNDbGFzcyA9IE1lZGlhUm91dGVQcm92aWRlcl9TdG9wT2JzZXJ2aW5nTWVkaWFTaW5rc19QYXJhbXM7CiAgICAgIGJyZWFrOwogICAgICBjYXNlIGtNZWRpYVJvdXRlUHJvdmlkZXJfU3RhcnRPYnNlcnZpbmdNZWRpYVJvdXRlc19OYW1lOgogICAgICAgIGlmICghbWVzc2FnZS5leHBlY3RzUmVzcG9uc2UoKSAmJiAhbWVzc2FnZS5pc1Jlc3BvbnNlKCkpCiAgICAgICAgICBwYXJhbXNDbGFzcyA9IE1lZGlhUm91dGVQcm92aWRlcl9TdGFydE9ic2VydmluZ01lZGlhUm91dGVzX1BhcmFtczsKICAgICAgYnJlYWs7CiAgICAgIGNhc2Uga01lZGlhUm91dGVQcm92aWRlcl9TdG9wT2JzZXJ2aW5nTWVkaWFSb3V0ZXNfTmFtZToKICAgICAgICBpZiAoIW1lc3NhZ2UuZXhwZWN0c1Jlc3BvbnNlKCkgJiYgIW1lc3NhZ2UuaXNSZXNwb25zZSgpKQogICAgICAgICAgcGFyYW1zQ2xhc3MgPSBNZWRpYVJvdXRlUHJvdmlkZXJfU3RvcE9ic2VydmluZ01lZGlhUm91dGVzX1BhcmFtczsKICAgICAgYnJlYWs7CiAgICAgIGNhc2Uga01lZGlhUm91dGVQcm92aWRlcl9TdGFydExpc3RlbmluZ0ZvclJvdXRlTWVzc2FnZXNfTmFtZToKICAgICAgICBpZiAoIW1lc3NhZ2UuZXhwZWN0c1Jlc3BvbnNlKCkgJiYgIW1lc3NhZ2UuaXNSZXNwb25zZSgpKQogICAgICAgICAgcGFyYW1zQ2xhc3MgPSBNZWRpYVJvdXRlUHJvdmlkZXJfU3RhcnRMaXN0ZW5pbmdGb3JSb3V0ZU1lc3NhZ2VzX1BhcmFtczsKICAgICAgYnJlYWs7CiAgICAgIGNhc2Uga01lZGlhUm91dGVQcm92aWRlcl9TdG9wTGlzdGVuaW5nRm9yUm91dGVNZXNzYWdlc19OYW1lOgogICAgICAgIGlmICghbWVzc2FnZS5leHBlY3RzUmVzcG9uc2UoKSAmJiAhbWVzc2FnZS5pc1Jlc3BvbnNlKCkpCiAgICAgICAgICBwYXJhbXNDbGFzcyA9IE1lZGlhUm91dGVQcm92aWRlcl9TdG9wTGlzdGVuaW5nRm9yUm91dGVNZXNzYWdlc19QYXJhbXM7CiAgICAgIGJyZWFrOwogICAgICBjYXNlIGtNZWRpYVJvdXRlUHJvdmlkZXJfRGV0YWNoUm91dGVfTmFtZToKICAgICAgICBpZiAoIW1lc3NhZ2UuZXhwZWN0c1Jlc3BvbnNlKCkgJiYgIW1lc3NhZ2UuaXNSZXNwb25zZSgpKQogICAgICAgICAgcGFyYW1zQ2xhc3MgPSBNZWRpYVJvdXRlUHJvdmlkZXJfRGV0YWNoUm91dGVfUGFyYW1zOwogICAgICBicmVhazsKICAgICAgY2FzZSBrTWVkaWFSb3V0ZVByb3ZpZGVyX0VuYWJsZU1kbnNEaXNjb3ZlcnlfTmFtZToKICAgICAgICBpZiAoIW1lc3NhZ2UuZXhwZWN0c1Jlc3BvbnNlKCkgJiYgIW1lc3NhZ2UuaXNSZXNwb25zZSgpKQogICAgICAgICAgcGFyYW1zQ2xhc3MgPSBNZWRpYVJvdXRlUHJvdmlkZXJfRW5hYmxlTWRuc0Rpc2NvdmVyeV9QYXJhbXM7CiAgICAgIGJyZWFrOwogICAgICBjYXNlIGtNZWRpYVJvdXRlUHJvdmlkZXJfVXBkYXRlTWVkaWFTaW5rc19OYW1lOgogICAgICAgIGlmICghbWVzc2FnZS5leHBlY3RzUmVzcG9uc2UoKSAmJiAhbWVzc2FnZS5pc1Jlc3BvbnNlKCkpCiAgICAgICAgICBwYXJhbXNDbGFzcyA9IE1lZGlhUm91dGVQcm92aWRlcl9VcGRhdGVNZWRpYVNpbmtzX1BhcmFtczsKICAgICAgYnJlYWs7CiAgICAgIGNhc2Uga01lZGlhUm91dGVQcm92aWRlcl9TZWFyY2hTaW5rc19OYW1lOgogICAgICAgIGlmIChtZXNzYWdlLmV4cGVjdHNSZXNwb25zZSgpKQogICAgICAgICAgcGFyYW1zQ2xhc3MgPSBNZWRpYVJvdXRlUHJvdmlkZXJfU2VhcmNoU2lua3NfUGFyYW1zOwogICAgICBicmVhazsKICAgICAgY2FzZSBrTWVkaWFSb3V0ZVByb3ZpZGVyX1Byb3ZpZGVTaW5rc19OYW1lOgogICAgICAgIGlmICghbWVzc2FnZS5leHBlY3RzUmVzcG9uc2UoKSAmJiAhbWVzc2FnZS5pc1Jlc3BvbnNlKCkpCiAgICAgICAgICBwYXJhbXNDbGFzcyA9IE1lZGlhUm91dGVQcm92aWRlcl9Qcm92aWRlU2lua3NfUGFyYW1zOwogICAgICBicmVhazsKICAgICAgY2FzZSBrTWVkaWFSb3V0ZVByb3ZpZGVyX0NyZWF0ZU1lZGlhUm91dGVDb250cm9sbGVyX05hbWU6CiAgICAgICAgaWYgKG1lc3NhZ2UuZXhwZWN0c1Jlc3BvbnNlKCkpCiAgICAgICAgICBwYXJhbXNDbGFzcyA9IE1lZGlhUm91dGVQcm92aWRlcl9DcmVhdGVNZWRpYVJvdXRlQ29udHJvbGxlcl9QYXJhbXM7CiAgICAgIGJyZWFrOwogICAgfQogICAgaWYgKHBhcmFtc0NsYXNzID09PSBudWxsKQogICAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwogICAgcmV0dXJuIHBhcmFtc0NsYXNzLnZhbGlkYXRlKG1lc3NhZ2VWYWxpZGF0b3IsIG1lc3NhZ2VWYWxpZGF0b3IubWVzc2FnZS5nZXRIZWFkZXJOdW1CeXRlcygpKTsKICB9CgogIGZ1bmN0aW9uIHZhbGlkYXRlTWVkaWFSb3V0ZVByb3ZpZGVyUmVzcG9uc2UobWVzc2FnZVZhbGlkYXRvcikgewogICB2YXIgbWVzc2FnZSA9IG1lc3NhZ2VWYWxpZGF0b3IubWVzc2FnZTsKICAgdmFyIHBhcmFtc0NsYXNzID0gbnVsbDsKICAgc3dpdGNoIChtZXNzYWdlLmdldE5hbWUoKSkgewogICAgICBjYXNlIGtNZWRpYVJvdXRlUHJvdmlkZXJfQ3JlYXRlUm91dGVfTmFtZToKICAgICAgICBpZiAobWVzc2FnZS5pc1Jlc3BvbnNlKCkpCiAgICAgICAgICBwYXJhbXNDbGFzcyA9IE1lZGlhUm91dGVQcm92aWRlcl9DcmVhdGVSb3V0ZV9SZXNwb25zZVBhcmFtczsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBrTWVkaWFSb3V0ZVByb3ZpZGVyX0pvaW5Sb3V0ZV9OYW1lOgogICAgICAgIGlmIChtZXNzYWdlLmlzUmVzcG9uc2UoKSkKICAgICAgICAgIHBhcmFtc0NsYXNzID0gTWVkaWFSb3V0ZVByb3ZpZGVyX0pvaW5Sb3V0ZV9SZXNwb25zZVBhcmFtczsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBrTWVkaWFSb3V0ZVByb3ZpZGVyX0Nvbm5lY3RSb3V0ZUJ5Um91dGVJZF9OYW1lOgogICAgICAgIGlmIChtZXNzYWdlLmlzUmVzcG9uc2UoKSkKICAgICAgICAgIHBhcmFtc0NsYXNzID0gTWVkaWFSb3V0ZVByb3ZpZGVyX0Nvbm5lY3RSb3V0ZUJ5Um91dGVJZF9SZXNwb25zZVBhcmFtczsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBrTWVkaWFSb3V0ZVByb3ZpZGVyX1Rlcm1pbmF0ZVJvdXRlX05hbWU6CiAgICAgICAgaWYgKG1lc3NhZ2UuaXNSZXNwb25zZSgpKQogICAgICAgICAgcGFyYW1zQ2xhc3MgPSBNZWRpYVJvdXRlUHJvdmlkZXJfVGVybWluYXRlUm91dGVfUmVzcG9uc2VQYXJhbXM7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2Uga01lZGlhUm91dGVQcm92aWRlcl9TZW5kUm91dGVNZXNzYWdlX05hbWU6CiAgICAgICAgaWYgKG1lc3NhZ2UuaXNSZXNwb25zZSgpKQogICAgICAgICAgcGFyYW1zQ2xhc3MgPSBNZWRpYVJvdXRlUHJvdmlkZXJfU2VuZFJvdXRlTWVzc2FnZV9SZXNwb25zZVBhcmFtczsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBrTWVkaWFSb3V0ZVByb3ZpZGVyX1NlbmRSb3V0ZUJpbmFyeU1lc3NhZ2VfTmFtZToKICAgICAgICBpZiAobWVzc2FnZS5pc1Jlc3BvbnNlKCkpCiAgICAgICAgICBwYXJhbXNDbGFzcyA9IE1lZGlhUm91dGVQcm92aWRlcl9TZW5kUm91dGVCaW5hcnlNZXNzYWdlX1Jlc3BvbnNlUGFyYW1zOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIGtNZWRpYVJvdXRlUHJvdmlkZXJfU2VhcmNoU2lua3NfTmFtZToKICAgICAgICBpZiAobWVzc2FnZS5pc1Jlc3BvbnNlKCkpCiAgICAgICAgICBwYXJhbXNDbGFzcyA9IE1lZGlhUm91dGVQcm92aWRlcl9TZWFyY2hTaW5rc19SZXNwb25zZVBhcmFtczsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBrTWVkaWFSb3V0ZVByb3ZpZGVyX0NyZWF0ZU1lZGlhUm91dGVDb250cm9sbGVyX05hbWU6CiAgICAgICAgaWYgKG1lc3NhZ2UuaXNSZXNwb25zZSgpKQogICAgICAgICAgcGFyYW1zQ2xhc3MgPSBNZWRpYVJvdXRlUHJvdmlkZXJfQ3JlYXRlTWVkaWFSb3V0ZUNvbnRyb2xsZXJfUmVzcG9uc2VQYXJhbXM7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICBpZiAocGFyYW1zQ2xhc3MgPT09IG51bGwpCiAgICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CiAgICByZXR1cm4gcGFyYW1zQ2xhc3MudmFsaWRhdGUobWVzc2FnZVZhbGlkYXRvciwgbWVzc2FnZVZhbGlkYXRvci5tZXNzYWdlLmdldEhlYWRlck51bUJ5dGVzKCkpOwogIH0KCiAgdmFyIE1lZGlhUm91dGVQcm92aWRlciA9IHsKICAgIG5hbWU6ICdtZWRpYV9yb3V0ZXI6Om1vam9tOjpNZWRpYVJvdXRlUHJvdmlkZXInLAogICAga1ZlcnNpb246IDAsCiAgICBwdHJDbGFzczogTWVkaWFSb3V0ZVByb3ZpZGVyUHRyLAogICAgcHJveHlDbGFzczogTWVkaWFSb3V0ZVByb3ZpZGVyUHJveHksCiAgICBzdHViQ2xhc3M6IE1lZGlhUm91dGVQcm92aWRlclN0dWIsCiAgICB2YWxpZGF0ZVJlcXVlc3Q6IHZhbGlkYXRlTWVkaWFSb3V0ZVByb3ZpZGVyUmVxdWVzdCwKICAgIHZhbGlkYXRlUmVzcG9uc2U6IHZhbGlkYXRlTWVkaWFSb3V0ZVByb3ZpZGVyUmVzcG9uc2UsCiAgfTsKICBNZWRpYVJvdXRlUHJvdmlkZXIuSWQgPSB7fTsKICBNZWRpYVJvdXRlUHJvdmlkZXIuSWQuRVhURU5TSU9OID0gMDsKICBNZWRpYVJvdXRlUHJvdmlkZXIuSWQuV0lSRURfRElTUExBWSA9IE1lZGlhUm91dGVQcm92aWRlci5JZC5FWFRFTlNJT04gKyAxOwoKICBNZWRpYVJvdXRlUHJvdmlkZXIuSWQuaXNLbm93bkVudW1WYWx1ZSA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICBzd2l0Y2ggKHZhbHVlKSB7CiAgICBjYXNlIDA6CiAgICBjYXNlIDE6CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH07CgogIE1lZGlhUm91dGVQcm92aWRlci5JZC52YWxpZGF0ZSA9IGZ1bmN0aW9uKGVudW1WYWx1ZSkgewogICAgdmFyIGlzRXh0ZW5zaWJsZSA9IGZhbHNlOwogICAgaWYgKGlzRXh0ZW5zaWJsZSB8fCB0aGlzLmlzS25vd25FbnVtVmFsdWUoZW51bVZhbHVlKSkKICAgICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKCiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5VTktOT1dOX0VOVU1fVkFMVUU7CiAgfTsKICBNZWRpYVJvdXRlUHJvdmlkZXJTdHViLnByb3RvdHlwZS52YWxpZGF0b3IgPSB2YWxpZGF0ZU1lZGlhUm91dGVQcm92aWRlclJlcXVlc3Q7CiAgTWVkaWFSb3V0ZVByb3ZpZGVyUHJveHkucHJvdG90eXBlLnZhbGlkYXRvciA9IHZhbGlkYXRlTWVkaWFSb3V0ZVByb3ZpZGVyUmVzcG9uc2U7CiAgdmFyIGtNZWRpYVJvdXRlcl9SZWdpc3Rlck1lZGlhUm91dGVQcm92aWRlcl9OYW1lID0gMTM3MTExOTIxNzsKICB2YXIga01lZGlhUm91dGVyX09uU2lua3NSZWNlaXZlZF9OYW1lID0gMTI3Nzg0MDM5MTsKICB2YXIga01lZGlhUm91dGVyX09uSXNzdWVfTmFtZSA9IDExMTgyMDQwNzA7CiAgdmFyIGtNZWRpYVJvdXRlcl9PblJvdXRlc1VwZGF0ZWRfTmFtZSA9IDk1OTgyMjM5NjsKICB2YXIga01lZGlhUm91dGVyX09uU2lua0F2YWlsYWJpbGl0eVVwZGF0ZWRfTmFtZSA9IDE1ODI1NTE3OTg7CiAgdmFyIGtNZWRpYVJvdXRlcl9PblByZXNlbnRhdGlvbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZWRfTmFtZSA9IDEzNjcwNDM3MDU7CiAgdmFyIGtNZWRpYVJvdXRlcl9PblByZXNlbnRhdGlvbkNvbm5lY3Rpb25DbG9zZWRfTmFtZSA9IDE3MDEwNTc0MTsKICB2YXIga01lZGlhUm91dGVyX09uUm91dGVNZXNzYWdlc1JlY2VpdmVkX05hbWUgPSAyNzcwNTQwNjM7CiAgdmFyIGtNZWRpYVJvdXRlcl9Pbk1lZGlhUmVtb3RlckNyZWF0ZWRfTmFtZSA9IDY5NzE2MzE0OwoKICBmdW5jdGlvbiBNZWRpYVJvdXRlclB0cihoYW5kbGVPclB0ckluZm8pIHsKICAgIHRoaXMucHRyID0gbmV3IGJpbmRpbmdzLkludGVyZmFjZVB0ckNvbnRyb2xsZXIoTWVkaWFSb3V0ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZU9yUHRySW5mbyk7CiAgfQoKICBmdW5jdGlvbiBNZWRpYVJvdXRlckFzc29jaWF0ZWRQdHIoYXNzb2NpYXRlZEludGVyZmFjZVB0ckluZm8pIHsKICAgIHRoaXMucHRyID0gbmV3IGFzc29jaWF0ZWRCaW5kaW5ncy5Bc3NvY2lhdGVkSW50ZXJmYWNlUHRyQ29udHJvbGxlcigKICAgICAgICBNZWRpYVJvdXRlciwgYXNzb2NpYXRlZEludGVyZmFjZVB0ckluZm8pOwogIH0KCiAgTWVkaWFSb3V0ZXJBc3NvY2lhdGVkUHRyLnByb3RvdHlwZSA9CiAgICAgIE9iamVjdC5jcmVhdGUoTWVkaWFSb3V0ZXJQdHIucHJvdG90eXBlKTsKICBNZWRpYVJvdXRlckFzc29jaWF0ZWRQdHIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0KICAgICAgTWVkaWFSb3V0ZXJBc3NvY2lhdGVkUHRyOwoKICBmdW5jdGlvbiBNZWRpYVJvdXRlclByb3h5KHJlY2VpdmVyKSB7CiAgICB0aGlzLnJlY2VpdmVyXyA9IHJlY2VpdmVyOwogIH0KICBNZWRpYVJvdXRlclB0ci5wcm90b3R5cGUucmVnaXN0ZXJNZWRpYVJvdXRlUHJvdmlkZXIgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBNZWRpYVJvdXRlclByb3h5LnByb3RvdHlwZS5yZWdpc3Rlck1lZGlhUm91dGVQcm92aWRlcgogICAgICAgIC5hcHBseSh0aGlzLnB0ci5nZXRQcm94eSgpLCBhcmd1bWVudHMpOwogIH07CgogIE1lZGlhUm91dGVyUHJveHkucHJvdG90eXBlLnJlZ2lzdGVyTWVkaWFSb3V0ZVByb3ZpZGVyID0gZnVuY3Rpb24ocHJvdmlkZXJJZCwgbWVkaWFSb3V0ZXJQcm92aWRlcikgewogICAgdmFyIHBhcmFtcyA9IG5ldyBNZWRpYVJvdXRlcl9SZWdpc3Rlck1lZGlhUm91dGVQcm92aWRlcl9QYXJhbXMoKTsKICAgIHBhcmFtcy5wcm92aWRlcklkID0gcHJvdmlkZXJJZDsKICAgIHBhcmFtcy5tZWRpYVJvdXRlclByb3ZpZGVyID0gbWVkaWFSb3V0ZXJQcm92aWRlcjsKICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHsKICAgICAgdmFyIGJ1aWxkZXIgPSBuZXcgY29kZWMuTWVzc2FnZVYxQnVpbGRlcigKICAgICAgICAgIGtNZWRpYVJvdXRlcl9SZWdpc3Rlck1lZGlhUm91dGVQcm92aWRlcl9OYW1lLAogICAgICAgICAgY29kZWMuYWxpZ24oTWVkaWFSb3V0ZXJfUmVnaXN0ZXJNZWRpYVJvdXRlUHJvdmlkZXJfUGFyYW1zLmVuY29kZWRTaXplKSwKICAgICAgICAgIGNvZGVjLmtNZXNzYWdlRXhwZWN0c1Jlc3BvbnNlLCAwKTsKICAgICAgYnVpbGRlci5lbmNvZGVTdHJ1Y3QoTWVkaWFSb3V0ZXJfUmVnaXN0ZXJNZWRpYVJvdXRlUHJvdmlkZXJfUGFyYW1zLCBwYXJhbXMpOwogICAgICB2YXIgbWVzc2FnZSA9IGJ1aWxkZXIuZmluaXNoKCk7CiAgICAgIHRoaXMucmVjZWl2ZXJfLmFjY2VwdEFuZEV4cGVjdFJlc3BvbnNlKG1lc3NhZ2UpLnRoZW4oZnVuY3Rpb24obWVzc2FnZSkgewogICAgICAgIHZhciByZWFkZXIgPSBuZXcgY29kZWMuTWVzc2FnZVJlYWRlcihtZXNzYWdlKTsKICAgICAgICB2YXIgcmVzcG9uc2VQYXJhbXMgPQogICAgICAgICAgICByZWFkZXIuZGVjb2RlU3RydWN0KE1lZGlhUm91dGVyX1JlZ2lzdGVyTWVkaWFSb3V0ZVByb3ZpZGVyX1Jlc3BvbnNlUGFyYW1zKTsKICAgICAgICByZXNvbHZlKHJlc3BvbnNlUGFyYW1zKTsKICAgICAgfSkuY2F0Y2goZnVuY3Rpb24ocmVzdWx0KSB7CiAgICAgICAgcmVqZWN0KEVycm9yKCJDb25uZWN0aW9uIGVycm9yOiAiICsgcmVzdWx0KSk7CiAgICAgIH0pOwogICAgfS5iaW5kKHRoaXMpKTsKICB9OwogIE1lZGlhUm91dGVyUHRyLnByb3RvdHlwZS5vblNpbmtzUmVjZWl2ZWQgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBNZWRpYVJvdXRlclByb3h5LnByb3RvdHlwZS5vblNpbmtzUmVjZWl2ZWQKICAgICAgICAuYXBwbHkodGhpcy5wdHIuZ2V0UHJveHkoKSwgYXJndW1lbnRzKTsKICB9OwoKICBNZWRpYVJvdXRlclByb3h5LnByb3RvdHlwZS5vblNpbmtzUmVjZWl2ZWQgPSBmdW5jdGlvbihwcm92aWRlcklkLCBtZWRpYVNvdXJjZSwgc2lua3MsIG9yaWdpbnMpIHsKICAgIHZhciBwYXJhbXMgPSBuZXcgTWVkaWFSb3V0ZXJfT25TaW5rc1JlY2VpdmVkX1BhcmFtcygpOwogICAgcGFyYW1zLnByb3ZpZGVySWQgPSBwcm92aWRlcklkOwogICAgcGFyYW1zLm1lZGlhU291cmNlID0gbWVkaWFTb3VyY2U7CiAgICBwYXJhbXMuc2lua3MgPSBzaW5rczsKICAgIHBhcmFtcy5vcmlnaW5zID0gb3JpZ2luczsKICAgIHZhciBidWlsZGVyID0gbmV3IGNvZGVjLk1lc3NhZ2VWMEJ1aWxkZXIoCiAgICAgICAga01lZGlhUm91dGVyX09uU2lua3NSZWNlaXZlZF9OYW1lLAogICAgICAgIGNvZGVjLmFsaWduKE1lZGlhUm91dGVyX09uU2lua3NSZWNlaXZlZF9QYXJhbXMuZW5jb2RlZFNpemUpKTsKICAgIGJ1aWxkZXIuZW5jb2RlU3RydWN0KE1lZGlhUm91dGVyX09uU2lua3NSZWNlaXZlZF9QYXJhbXMsIHBhcmFtcyk7CiAgICB2YXIgbWVzc2FnZSA9IGJ1aWxkZXIuZmluaXNoKCk7CiAgICB0aGlzLnJlY2VpdmVyXy5hY2NlcHQobWVzc2FnZSk7CiAgfTsKICBNZWRpYVJvdXRlclB0ci5wcm90b3R5cGUub25Jc3N1ZSA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIE1lZGlhUm91dGVyUHJveHkucHJvdG90eXBlLm9uSXNzdWUKICAgICAgICAuYXBwbHkodGhpcy5wdHIuZ2V0UHJveHkoKSwgYXJndW1lbnRzKTsKICB9OwoKICBNZWRpYVJvdXRlclByb3h5LnByb3RvdHlwZS5vbklzc3VlID0gZnVuY3Rpb24oaXNzdWUpIHsKICAgIHZhciBwYXJhbXMgPSBuZXcgTWVkaWFSb3V0ZXJfT25Jc3N1ZV9QYXJhbXMoKTsKICAgIHBhcmFtcy5pc3N1ZSA9IGlzc3VlOwogICAgdmFyIGJ1aWxkZXIgPSBuZXcgY29kZWMuTWVzc2FnZVYwQnVpbGRlcigKICAgICAgICBrTWVkaWFSb3V0ZXJfT25Jc3N1ZV9OYW1lLAogICAgICAgIGNvZGVjLmFsaWduKE1lZGlhUm91dGVyX09uSXNzdWVfUGFyYW1zLmVuY29kZWRTaXplKSk7CiAgICBidWlsZGVyLmVuY29kZVN0cnVjdChNZWRpYVJvdXRlcl9Pbklzc3VlX1BhcmFtcywgcGFyYW1zKTsKICAgIHZhciBtZXNzYWdlID0gYnVpbGRlci5maW5pc2goKTsKICAgIHRoaXMucmVjZWl2ZXJfLmFjY2VwdChtZXNzYWdlKTsKICB9OwogIE1lZGlhUm91dGVyUHRyLnByb3RvdHlwZS5vblJvdXRlc1VwZGF0ZWQgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBNZWRpYVJvdXRlclByb3h5LnByb3RvdHlwZS5vblJvdXRlc1VwZGF0ZWQKICAgICAgICAuYXBwbHkodGhpcy5wdHIuZ2V0UHJveHkoKSwgYXJndW1lbnRzKTsKICB9OwoKICBNZWRpYVJvdXRlclByb3h5LnByb3RvdHlwZS5vblJvdXRlc1VwZGF0ZWQgPSBmdW5jdGlvbihwcm92aWRlcklkLCByb3V0ZXMsIG1lZGlhU291cmNlLCBqb2luYWJsZVJvdXRlSWRzKSB7CiAgICB2YXIgcGFyYW1zID0gbmV3IE1lZGlhUm91dGVyX09uUm91dGVzVXBkYXRlZF9QYXJhbXMoKTsKICAgIHBhcmFtcy5wcm92aWRlcklkID0gcHJvdmlkZXJJZDsKICAgIHBhcmFtcy5yb3V0ZXMgPSByb3V0ZXM7CiAgICBwYXJhbXMubWVkaWFTb3VyY2UgPSBtZWRpYVNvdXJjZTsKICAgIHBhcmFtcy5qb2luYWJsZVJvdXRlSWRzID0gam9pbmFibGVSb3V0ZUlkczsKICAgIHZhciBidWlsZGVyID0gbmV3IGNvZGVjLk1lc3NhZ2VWMEJ1aWxkZXIoCiAgICAgICAga01lZGlhUm91dGVyX09uUm91dGVzVXBkYXRlZF9OYW1lLAogICAgICAgIGNvZGVjLmFsaWduKE1lZGlhUm91dGVyX09uUm91dGVzVXBkYXRlZF9QYXJhbXMuZW5jb2RlZFNpemUpKTsKICAgIGJ1aWxkZXIuZW5jb2RlU3RydWN0KE1lZGlhUm91dGVyX09uUm91dGVzVXBkYXRlZF9QYXJhbXMsIHBhcmFtcyk7CiAgICB2YXIgbWVzc2FnZSA9IGJ1aWxkZXIuZmluaXNoKCk7CiAgICB0aGlzLnJlY2VpdmVyXy5hY2NlcHQobWVzc2FnZSk7CiAgfTsKICBNZWRpYVJvdXRlclB0ci5wcm90b3R5cGUub25TaW5rQXZhaWxhYmlsaXR5VXBkYXRlZCA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIE1lZGlhUm91dGVyUHJveHkucHJvdG90eXBlLm9uU2lua0F2YWlsYWJpbGl0eVVwZGF0ZWQKICAgICAgICAuYXBwbHkodGhpcy5wdHIuZ2V0UHJveHkoKSwgYXJndW1lbnRzKTsKICB9OwoKICBNZWRpYVJvdXRlclByb3h5LnByb3RvdHlwZS5vblNpbmtBdmFpbGFiaWxpdHlVcGRhdGVkID0gZnVuY3Rpb24ocHJvdmlkZXJJZCwgYXZhaWxhYmlsaXR5KSB7CiAgICB2YXIgcGFyYW1zID0gbmV3IE1lZGlhUm91dGVyX09uU2lua0F2YWlsYWJpbGl0eVVwZGF0ZWRfUGFyYW1zKCk7CiAgICBwYXJhbXMucHJvdmlkZXJJZCA9IHByb3ZpZGVySWQ7CiAgICBwYXJhbXMuYXZhaWxhYmlsaXR5ID0gYXZhaWxhYmlsaXR5OwogICAgdmFyIGJ1aWxkZXIgPSBuZXcgY29kZWMuTWVzc2FnZVYwQnVpbGRlcigKICAgICAgICBrTWVkaWFSb3V0ZXJfT25TaW5rQXZhaWxhYmlsaXR5VXBkYXRlZF9OYW1lLAogICAgICAgIGNvZGVjLmFsaWduKE1lZGlhUm91dGVyX09uU2lua0F2YWlsYWJpbGl0eVVwZGF0ZWRfUGFyYW1zLmVuY29kZWRTaXplKSk7CiAgICBidWlsZGVyLmVuY29kZVN0cnVjdChNZWRpYVJvdXRlcl9PblNpbmtBdmFpbGFiaWxpdHlVcGRhdGVkX1BhcmFtcywgcGFyYW1zKTsKICAgIHZhciBtZXNzYWdlID0gYnVpbGRlci5maW5pc2goKTsKICAgIHRoaXMucmVjZWl2ZXJfLmFjY2VwdChtZXNzYWdlKTsKICB9OwogIE1lZGlhUm91dGVyUHRyLnByb3RvdHlwZS5vblByZXNlbnRhdGlvbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZWQgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBNZWRpYVJvdXRlclByb3h5LnByb3RvdHlwZS5vblByZXNlbnRhdGlvbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZWQKICAgICAgICAuYXBwbHkodGhpcy5wdHIuZ2V0UHJveHkoKSwgYXJndW1lbnRzKTsKICB9OwoKICBNZWRpYVJvdXRlclByb3h5LnByb3RvdHlwZS5vblByZXNlbnRhdGlvbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZWQgPSBmdW5jdGlvbihyb3V0ZUlkLCBzdGF0ZSkgewogICAgdmFyIHBhcmFtcyA9IG5ldyBNZWRpYVJvdXRlcl9PblByZXNlbnRhdGlvbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZWRfUGFyYW1zKCk7CiAgICBwYXJhbXMucm91dGVJZCA9IHJvdXRlSWQ7CiAgICBwYXJhbXMuc3RhdGUgPSBzdGF0ZTsKICAgIHZhciBidWlsZGVyID0gbmV3IGNvZGVjLk1lc3NhZ2VWMEJ1aWxkZXIoCiAgICAgICAga01lZGlhUm91dGVyX09uUHJlc2VudGF0aW9uQ29ubmVjdGlvblN0YXRlQ2hhbmdlZF9OYW1lLAogICAgICAgIGNvZGVjLmFsaWduKE1lZGlhUm91dGVyX09uUHJlc2VudGF0aW9uQ29ubmVjdGlvblN0YXRlQ2hhbmdlZF9QYXJhbXMuZW5jb2RlZFNpemUpKTsKICAgIGJ1aWxkZXIuZW5jb2RlU3RydWN0KE1lZGlhUm91dGVyX09uUHJlc2VudGF0aW9uQ29ubmVjdGlvblN0YXRlQ2hhbmdlZF9QYXJhbXMsIHBhcmFtcyk7CiAgICB2YXIgbWVzc2FnZSA9IGJ1aWxkZXIuZmluaXNoKCk7CiAgICB0aGlzLnJlY2VpdmVyXy5hY2NlcHQobWVzc2FnZSk7CiAgfTsKICBNZWRpYVJvdXRlclB0ci5wcm90b3R5cGUub25QcmVzZW50YXRpb25Db25uZWN0aW9uQ2xvc2VkID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gTWVkaWFSb3V0ZXJQcm94eS5wcm90b3R5cGUub25QcmVzZW50YXRpb25Db25uZWN0aW9uQ2xvc2VkCiAgICAgICAgLmFwcGx5KHRoaXMucHRyLmdldFByb3h5KCksIGFyZ3VtZW50cyk7CiAgfTsKCiAgTWVkaWFSb3V0ZXJQcm94eS5wcm90b3R5cGUub25QcmVzZW50YXRpb25Db25uZWN0aW9uQ2xvc2VkID0gZnVuY3Rpb24ocm91dGVJZCwgcmVhc29uLCBtZXNzYWdlKSB7CiAgICB2YXIgcGFyYW1zID0gbmV3IE1lZGlhUm91dGVyX09uUHJlc2VudGF0aW9uQ29ubmVjdGlvbkNsb3NlZF9QYXJhbXMoKTsKICAgIHBhcmFtcy5yb3V0ZUlkID0gcm91dGVJZDsKICAgIHBhcmFtcy5yZWFzb24gPSByZWFzb247CiAgICBwYXJhbXMubWVzc2FnZSA9IG1lc3NhZ2U7CiAgICB2YXIgYnVpbGRlciA9IG5ldyBjb2RlYy5NZXNzYWdlVjBCdWlsZGVyKAogICAgICAgIGtNZWRpYVJvdXRlcl9PblByZXNlbnRhdGlvbkNvbm5lY3Rpb25DbG9zZWRfTmFtZSwKICAgICAgICBjb2RlYy5hbGlnbihNZWRpYVJvdXRlcl9PblByZXNlbnRhdGlvbkNvbm5lY3Rpb25DbG9zZWRfUGFyYW1zLmVuY29kZWRTaXplKSk7CiAgICBidWlsZGVyLmVuY29kZVN0cnVjdChNZWRpYVJvdXRlcl9PblByZXNlbnRhdGlvbkNvbm5lY3Rpb25DbG9zZWRfUGFyYW1zLCBwYXJhbXMpOwogICAgdmFyIG1lc3NhZ2UgPSBidWlsZGVyLmZpbmlzaCgpOwogICAgdGhpcy5yZWNlaXZlcl8uYWNjZXB0KG1lc3NhZ2UpOwogIH07CiAgTWVkaWFSb3V0ZXJQdHIucHJvdG90eXBlLm9uUm91dGVNZXNzYWdlc1JlY2VpdmVkID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gTWVkaWFSb3V0ZXJQcm94eS5wcm90b3R5cGUub25Sb3V0ZU1lc3NhZ2VzUmVjZWl2ZWQKICAgICAgICAuYXBwbHkodGhpcy5wdHIuZ2V0UHJveHkoKSwgYXJndW1lbnRzKTsKICB9OwoKICBNZWRpYVJvdXRlclByb3h5LnByb3RvdHlwZS5vblJvdXRlTWVzc2FnZXNSZWNlaXZlZCA9IGZ1bmN0aW9uKHJvdXRlSWQsIG1lc3NhZ2VzKSB7CiAgICB2YXIgcGFyYW1zID0gbmV3IE1lZGlhUm91dGVyX09uUm91dGVNZXNzYWdlc1JlY2VpdmVkX1BhcmFtcygpOwogICAgcGFyYW1zLnJvdXRlSWQgPSByb3V0ZUlkOwogICAgcGFyYW1zLm1lc3NhZ2VzID0gbWVzc2FnZXM7CiAgICB2YXIgYnVpbGRlciA9IG5ldyBjb2RlYy5NZXNzYWdlVjBCdWlsZGVyKAogICAgICAgIGtNZWRpYVJvdXRlcl9PblJvdXRlTWVzc2FnZXNSZWNlaXZlZF9OYW1lLAogICAgICAgIGNvZGVjLmFsaWduKE1lZGlhUm91dGVyX09uUm91dGVNZXNzYWdlc1JlY2VpdmVkX1BhcmFtcy5lbmNvZGVkU2l6ZSkpOwogICAgYnVpbGRlci5lbmNvZGVTdHJ1Y3QoTWVkaWFSb3V0ZXJfT25Sb3V0ZU1lc3NhZ2VzUmVjZWl2ZWRfUGFyYW1zLCBwYXJhbXMpOwogICAgdmFyIG1lc3NhZ2UgPSBidWlsZGVyLmZpbmlzaCgpOwogICAgdGhpcy5yZWNlaXZlcl8uYWNjZXB0KG1lc3NhZ2UpOwogIH07CiAgTWVkaWFSb3V0ZXJQdHIucHJvdG90eXBlLm9uTWVkaWFSZW1vdGVyQ3JlYXRlZCA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIE1lZGlhUm91dGVyUHJveHkucHJvdG90eXBlLm9uTWVkaWFSZW1vdGVyQ3JlYXRlZAogICAgICAgIC5hcHBseSh0aGlzLnB0ci5nZXRQcm94eSgpLCBhcmd1bWVudHMpOwogIH07CgogIE1lZGlhUm91dGVyUHJveHkucHJvdG90eXBlLm9uTWVkaWFSZW1vdGVyQ3JlYXRlZCA9IGZ1bmN0aW9uKHRhYklkLCByZW1vdGVyLCByZW1vdGluZ1NvdXJjZSkgewogICAgdmFyIHBhcmFtcyA9IG5ldyBNZWRpYVJvdXRlcl9Pbk1lZGlhUmVtb3RlckNyZWF0ZWRfUGFyYW1zKCk7CiAgICBwYXJhbXMudGFiSWQgPSB0YWJJZDsKICAgIHBhcmFtcy5yZW1vdGVyID0gcmVtb3RlcjsKICAgIHBhcmFtcy5yZW1vdGluZ1NvdXJjZSA9IHJlbW90aW5nU291cmNlOwogICAgdmFyIGJ1aWxkZXIgPSBuZXcgY29kZWMuTWVzc2FnZVYwQnVpbGRlcigKICAgICAgICBrTWVkaWFSb3V0ZXJfT25NZWRpYVJlbW90ZXJDcmVhdGVkX05hbWUsCiAgICAgICAgY29kZWMuYWxpZ24oTWVkaWFSb3V0ZXJfT25NZWRpYVJlbW90ZXJDcmVhdGVkX1BhcmFtcy5lbmNvZGVkU2l6ZSkpOwogICAgYnVpbGRlci5lbmNvZGVTdHJ1Y3QoTWVkaWFSb3V0ZXJfT25NZWRpYVJlbW90ZXJDcmVhdGVkX1BhcmFtcywgcGFyYW1zKTsKICAgIHZhciBtZXNzYWdlID0gYnVpbGRlci5maW5pc2goKTsKICAgIHRoaXMucmVjZWl2ZXJfLmFjY2VwdChtZXNzYWdlKTsKICB9OwoKICBmdW5jdGlvbiBNZWRpYVJvdXRlclN0dWIoZGVsZWdhdGUpIHsKICAgIHRoaXMuZGVsZWdhdGVfID0gZGVsZWdhdGU7CiAgfQogIE1lZGlhUm91dGVyU3R1Yi5wcm90b3R5cGUucmVnaXN0ZXJNZWRpYVJvdXRlUHJvdmlkZXIgPSBmdW5jdGlvbihwcm92aWRlcklkLCBtZWRpYVJvdXRlclByb3ZpZGVyKSB7CiAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZV8gJiYgdGhpcy5kZWxlZ2F0ZV8ucmVnaXN0ZXJNZWRpYVJvdXRlUHJvdmlkZXIgJiYgdGhpcy5kZWxlZ2F0ZV8ucmVnaXN0ZXJNZWRpYVJvdXRlUHJvdmlkZXIocHJvdmlkZXJJZCwgbWVkaWFSb3V0ZXJQcm92aWRlcik7CiAgfQogIE1lZGlhUm91dGVyU3R1Yi5wcm90b3R5cGUub25TaW5rc1JlY2VpdmVkID0gZnVuY3Rpb24ocHJvdmlkZXJJZCwgbWVkaWFTb3VyY2UsIHNpbmtzLCBvcmlnaW5zKSB7CiAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZV8gJiYgdGhpcy5kZWxlZ2F0ZV8ub25TaW5rc1JlY2VpdmVkICYmIHRoaXMuZGVsZWdhdGVfLm9uU2lua3NSZWNlaXZlZChwcm92aWRlcklkLCBtZWRpYVNvdXJjZSwgc2lua3MsIG9yaWdpbnMpOwogIH0KICBNZWRpYVJvdXRlclN0dWIucHJvdG90eXBlLm9uSXNzdWUgPSBmdW5jdGlvbihpc3N1ZSkgewogICAgcmV0dXJuIHRoaXMuZGVsZWdhdGVfICYmIHRoaXMuZGVsZWdhdGVfLm9uSXNzdWUgJiYgdGhpcy5kZWxlZ2F0ZV8ub25Jc3N1ZShpc3N1ZSk7CiAgfQogIE1lZGlhUm91dGVyU3R1Yi5wcm90b3R5cGUub25Sb3V0ZXNVcGRhdGVkID0gZnVuY3Rpb24ocHJvdmlkZXJJZCwgcm91dGVzLCBtZWRpYVNvdXJjZSwgam9pbmFibGVSb3V0ZUlkcykgewogICAgcmV0dXJuIHRoaXMuZGVsZWdhdGVfICYmIHRoaXMuZGVsZWdhdGVfLm9uUm91dGVzVXBkYXRlZCAmJiB0aGlzLmRlbGVnYXRlXy5vblJvdXRlc1VwZGF0ZWQocHJvdmlkZXJJZCwgcm91dGVzLCBtZWRpYVNvdXJjZSwgam9pbmFibGVSb3V0ZUlkcyk7CiAgfQogIE1lZGlhUm91dGVyU3R1Yi5wcm90b3R5cGUub25TaW5rQXZhaWxhYmlsaXR5VXBkYXRlZCA9IGZ1bmN0aW9uKHByb3ZpZGVySWQsIGF2YWlsYWJpbGl0eSkgewogICAgcmV0dXJuIHRoaXMuZGVsZWdhdGVfICYmIHRoaXMuZGVsZWdhdGVfLm9uU2lua0F2YWlsYWJpbGl0eVVwZGF0ZWQgJiYgdGhpcy5kZWxlZ2F0ZV8ub25TaW5rQXZhaWxhYmlsaXR5VXBkYXRlZChwcm92aWRlcklkLCBhdmFpbGFiaWxpdHkpOwogIH0KICBNZWRpYVJvdXRlclN0dWIucHJvdG90eXBlLm9uUHJlc2VudGF0aW9uQ29ubmVjdGlvblN0YXRlQ2hhbmdlZCA9IGZ1bmN0aW9uKHJvdXRlSWQsIHN0YXRlKSB7CiAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZV8gJiYgdGhpcy5kZWxlZ2F0ZV8ub25QcmVzZW50YXRpb25Db25uZWN0aW9uU3RhdGVDaGFuZ2VkICYmIHRoaXMuZGVsZWdhdGVfLm9uUHJlc2VudGF0aW9uQ29ubmVjdGlvblN0YXRlQ2hhbmdlZChyb3V0ZUlkLCBzdGF0ZSk7CiAgfQogIE1lZGlhUm91dGVyU3R1Yi5wcm90b3R5cGUub25QcmVzZW50YXRpb25Db25uZWN0aW9uQ2xvc2VkID0gZnVuY3Rpb24ocm91dGVJZCwgcmVhc29uLCBtZXNzYWdlKSB7CiAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZV8gJiYgdGhpcy5kZWxlZ2F0ZV8ub25QcmVzZW50YXRpb25Db25uZWN0aW9uQ2xvc2VkICYmIHRoaXMuZGVsZWdhdGVfLm9uUHJlc2VudGF0aW9uQ29ubmVjdGlvbkNsb3NlZChyb3V0ZUlkLCByZWFzb24sIG1lc3NhZ2UpOwogIH0KICBNZWRpYVJvdXRlclN0dWIucHJvdG90eXBlLm9uUm91dGVNZXNzYWdlc1JlY2VpdmVkID0gZnVuY3Rpb24ocm91dGVJZCwgbWVzc2FnZXMpIHsKICAgIHJldHVybiB0aGlzLmRlbGVnYXRlXyAmJiB0aGlzLmRlbGVnYXRlXy5vblJvdXRlTWVzc2FnZXNSZWNlaXZlZCAmJiB0aGlzLmRlbGVnYXRlXy5vblJvdXRlTWVzc2FnZXNSZWNlaXZlZChyb3V0ZUlkLCBtZXNzYWdlcyk7CiAgfQogIE1lZGlhUm91dGVyU3R1Yi5wcm90b3R5cGUub25NZWRpYVJlbW90ZXJDcmVhdGVkID0gZnVuY3Rpb24odGFiSWQsIHJlbW90ZXIsIHJlbW90aW5nU291cmNlKSB7CiAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZV8gJiYgdGhpcy5kZWxlZ2F0ZV8ub25NZWRpYVJlbW90ZXJDcmVhdGVkICYmIHRoaXMuZGVsZWdhdGVfLm9uTWVkaWFSZW1vdGVyQ3JlYXRlZCh0YWJJZCwgcmVtb3RlciwgcmVtb3RpbmdTb3VyY2UpOwogIH0KCiAgTWVkaWFSb3V0ZXJTdHViLnByb3RvdHlwZS5hY2NlcHQgPSBmdW5jdGlvbihtZXNzYWdlKSB7CiAgICB2YXIgcmVhZGVyID0gbmV3IGNvZGVjLk1lc3NhZ2VSZWFkZXIobWVzc2FnZSk7CiAgICBzd2l0Y2ggKHJlYWRlci5tZXNzYWdlTmFtZSkgewogICAgY2FzZSBrTWVkaWFSb3V0ZXJfT25TaW5rc1JlY2VpdmVkX05hbWU6CiAgICAgIHZhciBwYXJhbXMgPSByZWFkZXIuZGVjb2RlU3RydWN0KE1lZGlhUm91dGVyX09uU2lua3NSZWNlaXZlZF9QYXJhbXMpOwogICAgICB0aGlzLm9uU2lua3NSZWNlaXZlZChwYXJhbXMucHJvdmlkZXJJZCwgcGFyYW1zLm1lZGlhU291cmNlLCBwYXJhbXMuc2lua3MsIHBhcmFtcy5vcmlnaW5zKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICBjYXNlIGtNZWRpYVJvdXRlcl9Pbklzc3VlX05hbWU6CiAgICAgIHZhciBwYXJhbXMgPSByZWFkZXIuZGVjb2RlU3RydWN0KE1lZGlhUm91dGVyX09uSXNzdWVfUGFyYW1zKTsKICAgICAgdGhpcy5vbklzc3VlKHBhcmFtcy5pc3N1ZSk7CiAgICAgIHJldHVybiB0cnVlOwogICAgY2FzZSBrTWVkaWFSb3V0ZXJfT25Sb3V0ZXNVcGRhdGVkX05hbWU6CiAgICAgIHZhciBwYXJhbXMgPSByZWFkZXIuZGVjb2RlU3RydWN0KE1lZGlhUm91dGVyX09uUm91dGVzVXBkYXRlZF9QYXJhbXMpOwogICAgICB0aGlzLm9uUm91dGVzVXBkYXRlZChwYXJhbXMucHJvdmlkZXJJZCwgcGFyYW1zLnJvdXRlcywgcGFyYW1zLm1lZGlhU291cmNlLCBwYXJhbXMuam9pbmFibGVSb3V0ZUlkcyk7CiAgICAgIHJldHVybiB0cnVlOwogICAgY2FzZSBrTWVkaWFSb3V0ZXJfT25TaW5rQXZhaWxhYmlsaXR5VXBkYXRlZF9OYW1lOgogICAgICB2YXIgcGFyYW1zID0gcmVhZGVyLmRlY29kZVN0cnVjdChNZWRpYVJvdXRlcl9PblNpbmtBdmFpbGFiaWxpdHlVcGRhdGVkX1BhcmFtcyk7CiAgICAgIHRoaXMub25TaW5rQXZhaWxhYmlsaXR5VXBkYXRlZChwYXJhbXMucHJvdmlkZXJJZCwgcGFyYW1zLmF2YWlsYWJpbGl0eSk7CiAgICAgIHJldHVybiB0cnVlOwogICAgY2FzZSBrTWVkaWFSb3V0ZXJfT25QcmVzZW50YXRpb25Db25uZWN0aW9uU3RhdGVDaGFuZ2VkX05hbWU6CiAgICAgIHZhciBwYXJhbXMgPSByZWFkZXIuZGVjb2RlU3RydWN0KE1lZGlhUm91dGVyX09uUHJlc2VudGF0aW9uQ29ubmVjdGlvblN0YXRlQ2hhbmdlZF9QYXJhbXMpOwogICAgICB0aGlzLm9uUHJlc2VudGF0aW9uQ29ubmVjdGlvblN0YXRlQ2hhbmdlZChwYXJhbXMucm91dGVJZCwgcGFyYW1zLnN0YXRlKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICBjYXNlIGtNZWRpYVJvdXRlcl9PblByZXNlbnRhdGlvbkNvbm5lY3Rpb25DbG9zZWRfTmFtZToKICAgICAgdmFyIHBhcmFtcyA9IHJlYWRlci5kZWNvZGVTdHJ1Y3QoTWVkaWFSb3V0ZXJfT25QcmVzZW50YXRpb25Db25uZWN0aW9uQ2xvc2VkX1BhcmFtcyk7CiAgICAgIHRoaXMub25QcmVzZW50YXRpb25Db25uZWN0aW9uQ2xvc2VkKHBhcmFtcy5yb3V0ZUlkLCBwYXJhbXMucmVhc29uLCBwYXJhbXMubWVzc2FnZSk7CiAgICAgIHJldHVybiB0cnVlOwogICAgY2FzZSBrTWVkaWFSb3V0ZXJfT25Sb3V0ZU1lc3NhZ2VzUmVjZWl2ZWRfTmFtZToKICAgICAgdmFyIHBhcmFtcyA9IHJlYWRlci5kZWNvZGVTdHJ1Y3QoTWVkaWFSb3V0ZXJfT25Sb3V0ZU1lc3NhZ2VzUmVjZWl2ZWRfUGFyYW1zKTsKICAgICAgdGhpcy5vblJvdXRlTWVzc2FnZXNSZWNlaXZlZChwYXJhbXMucm91dGVJZCwgcGFyYW1zLm1lc3NhZ2VzKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICBjYXNlIGtNZWRpYVJvdXRlcl9Pbk1lZGlhUmVtb3RlckNyZWF0ZWRfTmFtZToKICAgICAgdmFyIHBhcmFtcyA9IHJlYWRlci5kZWNvZGVTdHJ1Y3QoTWVkaWFSb3V0ZXJfT25NZWRpYVJlbW90ZXJDcmVhdGVkX1BhcmFtcyk7CiAgICAgIHRoaXMub25NZWRpYVJlbW90ZXJDcmVhdGVkKHBhcmFtcy50YWJJZCwgcGFyYW1zLnJlbW90ZXIsIHBhcmFtcy5yZW1vdGluZ1NvdXJjZSk7CiAgICAgIHJldHVybiB0cnVlOwogICAgZGVmYXVsdDoKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH07CgogIE1lZGlhUm91dGVyU3R1Yi5wcm90b3R5cGUuYWNjZXB0V2l0aFJlc3BvbmRlciA9CiAgICAgIGZ1bmN0aW9uKG1lc3NhZ2UsIHJlc3BvbmRlcikgewogICAgdmFyIHJlYWRlciA9IG5ldyBjb2RlYy5NZXNzYWdlUmVhZGVyKG1lc3NhZ2UpOwogICAgc3dpdGNoIChyZWFkZXIubWVzc2FnZU5hbWUpIHsKICAgIGNhc2Uga01lZGlhUm91dGVyX1JlZ2lzdGVyTWVkaWFSb3V0ZVByb3ZpZGVyX05hbWU6CiAgICAgIHZhciBwYXJhbXMgPSByZWFkZXIuZGVjb2RlU3RydWN0KE1lZGlhUm91dGVyX1JlZ2lzdGVyTWVkaWFSb3V0ZVByb3ZpZGVyX1BhcmFtcyk7CiAgICAgIHRoaXMucmVnaXN0ZXJNZWRpYVJvdXRlUHJvdmlkZXIocGFyYW1zLnByb3ZpZGVySWQsIHBhcmFtcy5tZWRpYVJvdXRlclByb3ZpZGVyKS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgdmFyIHJlc3BvbnNlUGFyYW1zID0KICAgICAgICAgICAgbmV3IE1lZGlhUm91dGVyX1JlZ2lzdGVyTWVkaWFSb3V0ZVByb3ZpZGVyX1Jlc3BvbnNlUGFyYW1zKCk7CiAgICAgICAgcmVzcG9uc2VQYXJhbXMuaW5zdGFuY2VJZCA9IHJlc3BvbnNlLmluc3RhbmNlSWQ7CiAgICAgICAgcmVzcG9uc2VQYXJhbXMuY29uZmlnID0gcmVzcG9uc2UuY29uZmlnOwogICAgICAgIHZhciBidWlsZGVyID0gbmV3IGNvZGVjLk1lc3NhZ2VWMUJ1aWxkZXIoCiAgICAgICAgICAgIGtNZWRpYVJvdXRlcl9SZWdpc3Rlck1lZGlhUm91dGVQcm92aWRlcl9OYW1lLAogICAgICAgICAgICBjb2RlYy5hbGlnbihNZWRpYVJvdXRlcl9SZWdpc3Rlck1lZGlhUm91dGVQcm92aWRlcl9SZXNwb25zZVBhcmFtcy5lbmNvZGVkU2l6ZSksCiAgICAgICAgICAgIGNvZGVjLmtNZXNzYWdlSXNSZXNwb25zZSwgcmVhZGVyLnJlcXVlc3RJRCk7CiAgICAgICAgYnVpbGRlci5lbmNvZGVTdHJ1Y3QoTWVkaWFSb3V0ZXJfUmVnaXN0ZXJNZWRpYVJvdXRlUHJvdmlkZXJfUmVzcG9uc2VQYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VQYXJhbXMpOwogICAgICAgIHZhciBtZXNzYWdlID0gYnVpbGRlci5maW5pc2goKTsKICAgICAgICByZXNwb25kZXIuYWNjZXB0KG1lc3NhZ2UpOwogICAgICB9KTsKICAgICAgcmV0dXJuIHRydWU7CiAgICBkZWZhdWx0OgogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfTsKCiAgZnVuY3Rpb24gdmFsaWRhdGVNZWRpYVJvdXRlclJlcXVlc3QobWVzc2FnZVZhbGlkYXRvcikgewogICAgdmFyIG1lc3NhZ2UgPSBtZXNzYWdlVmFsaWRhdG9yLm1lc3NhZ2U7CiAgICB2YXIgcGFyYW1zQ2xhc3MgPSBudWxsOwogICAgc3dpdGNoIChtZXNzYWdlLmdldE5hbWUoKSkgewogICAgICBjYXNlIGtNZWRpYVJvdXRlcl9SZWdpc3Rlck1lZGlhUm91dGVQcm92aWRlcl9OYW1lOgogICAgICAgIGlmIChtZXNzYWdlLmV4cGVjdHNSZXNwb25zZSgpKQogICAgICAgICAgcGFyYW1zQ2xhc3MgPSBNZWRpYVJvdXRlcl9SZWdpc3Rlck1lZGlhUm91dGVQcm92aWRlcl9QYXJhbXM7CiAgICAgIGJyZWFrOwogICAgICBjYXNlIGtNZWRpYVJvdXRlcl9PblNpbmtzUmVjZWl2ZWRfTmFtZToKICAgICAgICBpZiAoIW1lc3NhZ2UuZXhwZWN0c1Jlc3BvbnNlKCkgJiYgIW1lc3NhZ2UuaXNSZXNwb25zZSgpKQogICAgICAgICAgcGFyYW1zQ2xhc3MgPSBNZWRpYVJvdXRlcl9PblNpbmtzUmVjZWl2ZWRfUGFyYW1zOwogICAgICBicmVhazsKICAgICAgY2FzZSBrTWVkaWFSb3V0ZXJfT25Jc3N1ZV9OYW1lOgogICAgICAgIGlmICghbWVzc2FnZS5leHBlY3RzUmVzcG9uc2UoKSAmJiAhbWVzc2FnZS5pc1Jlc3BvbnNlKCkpCiAgICAgICAgICBwYXJhbXNDbGFzcyA9IE1lZGlhUm91dGVyX09uSXNzdWVfUGFyYW1zOwogICAgICBicmVhazsKICAgICAgY2FzZSBrTWVkaWFSb3V0ZXJfT25Sb3V0ZXNVcGRhdGVkX05hbWU6CiAgICAgICAgaWYgKCFtZXNzYWdlLmV4cGVjdHNSZXNwb25zZSgpICYmICFtZXNzYWdlLmlzUmVzcG9uc2UoKSkKICAgICAgICAgIHBhcmFtc0NsYXNzID0gTWVkaWFSb3V0ZXJfT25Sb3V0ZXNVcGRhdGVkX1BhcmFtczsKICAgICAgYnJlYWs7CiAgICAgIGNhc2Uga01lZGlhUm91dGVyX09uU2lua0F2YWlsYWJpbGl0eVVwZGF0ZWRfTmFtZToKICAgICAgICBpZiAoIW1lc3NhZ2UuZXhwZWN0c1Jlc3BvbnNlKCkgJiYgIW1lc3NhZ2UuaXNSZXNwb25zZSgpKQogICAgICAgICAgcGFyYW1zQ2xhc3MgPSBNZWRpYVJvdXRlcl9PblNpbmtBdmFpbGFiaWxpdHlVcGRhdGVkX1BhcmFtczsKICAgICAgYnJlYWs7CiAgICAgIGNhc2Uga01lZGlhUm91dGVyX09uUHJlc2VudGF0aW9uQ29ubmVjdGlvblN0YXRlQ2hhbmdlZF9OYW1lOgogICAgICAgIGlmICghbWVzc2FnZS5leHBlY3RzUmVzcG9uc2UoKSAmJiAhbWVzc2FnZS5pc1Jlc3BvbnNlKCkpCiAgICAgICAgICBwYXJhbXNDbGFzcyA9IE1lZGlhUm91dGVyX09uUHJlc2VudGF0aW9uQ29ubmVjdGlvblN0YXRlQ2hhbmdlZF9QYXJhbXM7CiAgICAgIGJyZWFrOwogICAgICBjYXNlIGtNZWRpYVJvdXRlcl9PblByZXNlbnRhdGlvbkNvbm5lY3Rpb25DbG9zZWRfTmFtZToKICAgICAgICBpZiAoIW1lc3NhZ2UuZXhwZWN0c1Jlc3BvbnNlKCkgJiYgIW1lc3NhZ2UuaXNSZXNwb25zZSgpKQogICAgICAgICAgcGFyYW1zQ2xhc3MgPSBNZWRpYVJvdXRlcl9PblByZXNlbnRhdGlvbkNvbm5lY3Rpb25DbG9zZWRfUGFyYW1zOwogICAgICBicmVhazsKICAgICAgY2FzZSBrTWVkaWFSb3V0ZXJfT25Sb3V0ZU1lc3NhZ2VzUmVjZWl2ZWRfTmFtZToKICAgICAgICBpZiAoIW1lc3NhZ2UuZXhwZWN0c1Jlc3BvbnNlKCkgJiYgIW1lc3NhZ2UuaXNSZXNwb25zZSgpKQogICAgICAgICAgcGFyYW1zQ2xhc3MgPSBNZWRpYVJvdXRlcl9PblJvdXRlTWVzc2FnZXNSZWNlaXZlZF9QYXJhbXM7CiAgICAgIGJyZWFrOwogICAgICBjYXNlIGtNZWRpYVJvdXRlcl9Pbk1lZGlhUmVtb3RlckNyZWF0ZWRfTmFtZToKICAgICAgICBpZiAoIW1lc3NhZ2UuZXhwZWN0c1Jlc3BvbnNlKCkgJiYgIW1lc3NhZ2UuaXNSZXNwb25zZSgpKQogICAgICAgICAgcGFyYW1zQ2xhc3MgPSBNZWRpYVJvdXRlcl9Pbk1lZGlhUmVtb3RlckNyZWF0ZWRfUGFyYW1zOwogICAgICBicmVhazsKICAgIH0KICAgIGlmIChwYXJhbXNDbGFzcyA9PT0gbnVsbCkKICAgICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICAgIHJldHVybiBwYXJhbXNDbGFzcy52YWxpZGF0ZShtZXNzYWdlVmFsaWRhdG9yLCBtZXNzYWdlVmFsaWRhdG9yLm1lc3NhZ2UuZ2V0SGVhZGVyTnVtQnl0ZXMoKSk7CiAgfQoKICBmdW5jdGlvbiB2YWxpZGF0ZU1lZGlhUm91dGVyUmVzcG9uc2UobWVzc2FnZVZhbGlkYXRvcikgewogICB2YXIgbWVzc2FnZSA9IG1lc3NhZ2VWYWxpZGF0b3IubWVzc2FnZTsKICAgdmFyIHBhcmFtc0NsYXNzID0gbnVsbDsKICAgc3dpdGNoIChtZXNzYWdlLmdldE5hbWUoKSkgewogICAgICBjYXNlIGtNZWRpYVJvdXRlcl9SZWdpc3Rlck1lZGlhUm91dGVQcm92aWRlcl9OYW1lOgogICAgICAgIGlmIChtZXNzYWdlLmlzUmVzcG9uc2UoKSkKICAgICAgICAgIHBhcmFtc0NsYXNzID0gTWVkaWFSb3V0ZXJfUmVnaXN0ZXJNZWRpYVJvdXRlUHJvdmlkZXJfUmVzcG9uc2VQYXJhbXM7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICBpZiAocGFyYW1zQ2xhc3MgPT09IG51bGwpCiAgICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CiAgICByZXR1cm4gcGFyYW1zQ2xhc3MudmFsaWRhdGUobWVzc2FnZVZhbGlkYXRvciwgbWVzc2FnZVZhbGlkYXRvci5tZXNzYWdlLmdldEhlYWRlck51bUJ5dGVzKCkpOwogIH0KCiAgdmFyIE1lZGlhUm91dGVyID0gewogICAgbmFtZTogJ21lZGlhX3JvdXRlcjo6bW9qb206Ok1lZGlhUm91dGVyJywKICAgIGtWZXJzaW9uOiAwLAogICAgcHRyQ2xhc3M6IE1lZGlhUm91dGVyUHRyLAogICAgcHJveHlDbGFzczogTWVkaWFSb3V0ZXJQcm94eSwKICAgIHN0dWJDbGFzczogTWVkaWFSb3V0ZXJTdHViLAogICAgdmFsaWRhdGVSZXF1ZXN0OiB2YWxpZGF0ZU1lZGlhUm91dGVyUmVxdWVzdCwKICAgIHZhbGlkYXRlUmVzcG9uc2U6IHZhbGlkYXRlTWVkaWFSb3V0ZXJSZXNwb25zZSwKICB9OwogIE1lZGlhUm91dGVyLlNpbmtBdmFpbGFiaWxpdHkgPSB7fTsKICBNZWRpYVJvdXRlci5TaW5rQXZhaWxhYmlsaXR5LlVOQVZBSUxBQkxFID0gMDsKICBNZWRpYVJvdXRlci5TaW5rQXZhaWxhYmlsaXR5LlBFUl9TT1VSQ0UgPSBNZWRpYVJvdXRlci5TaW5rQXZhaWxhYmlsaXR5LlVOQVZBSUxBQkxFICsgMTsKICBNZWRpYVJvdXRlci5TaW5rQXZhaWxhYmlsaXR5LkFWQUlMQUJMRSA9IE1lZGlhUm91dGVyLlNpbmtBdmFpbGFiaWxpdHkuUEVSX1NPVVJDRSArIDE7CgogIE1lZGlhUm91dGVyLlNpbmtBdmFpbGFiaWxpdHkuaXNLbm93bkVudW1WYWx1ZSA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICBzd2l0Y2ggKHZhbHVlKSB7CiAgICBjYXNlIDA6CiAgICBjYXNlIDE6CiAgICBjYXNlIDI6CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH07CgogIE1lZGlhUm91dGVyLlNpbmtBdmFpbGFiaWxpdHkudmFsaWRhdGUgPSBmdW5jdGlvbihlbnVtVmFsdWUpIHsKICAgIHZhciBpc0V4dGVuc2libGUgPSBmYWxzZTsKICAgIGlmIChpc0V4dGVuc2libGUgfHwgdGhpcy5pc0tub3duRW51bVZhbHVlKGVudW1WYWx1ZSkpCiAgICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuVU5LTk9XTl9FTlVNX1ZBTFVFOwogIH07CiAgTWVkaWFSb3V0ZXIuUHJlc2VudGF0aW9uQ29ubmVjdGlvblN0YXRlID0ge307CiAgTWVkaWFSb3V0ZXIuUHJlc2VudGF0aW9uQ29ubmVjdGlvblN0YXRlLkNPTk5FQ1RJTkcgPSAwOwogIE1lZGlhUm91dGVyLlByZXNlbnRhdGlvbkNvbm5lY3Rpb25TdGF0ZS5DT05ORUNURUQgPSBNZWRpYVJvdXRlci5QcmVzZW50YXRpb25Db25uZWN0aW9uU3RhdGUuQ09OTkVDVElORyArIDE7CiAgTWVkaWFSb3V0ZXIuUHJlc2VudGF0aW9uQ29ubmVjdGlvblN0YXRlLkNMT1NFRCA9IE1lZGlhUm91dGVyLlByZXNlbnRhdGlvbkNvbm5lY3Rpb25TdGF0ZS5DT05ORUNURUQgKyAxOwogIE1lZGlhUm91dGVyLlByZXNlbnRhdGlvbkNvbm5lY3Rpb25TdGF0ZS5URVJNSU5BVEVEID0gTWVkaWFSb3V0ZXIuUHJlc2VudGF0aW9uQ29ubmVjdGlvblN0YXRlLkNMT1NFRCArIDE7CgogIE1lZGlhUm91dGVyLlByZXNlbnRhdGlvbkNvbm5lY3Rpb25TdGF0ZS5pc0tub3duRW51bVZhbHVlID0gZnVuY3Rpb24odmFsdWUpIHsKICAgIHN3aXRjaCAodmFsdWUpIHsKICAgIGNhc2UgMDoKICAgIGNhc2UgMToKICAgIGNhc2UgMjoKICAgIGNhc2UgMzoKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfTsKCiAgTWVkaWFSb3V0ZXIuUHJlc2VudGF0aW9uQ29ubmVjdGlvblN0YXRlLnZhbGlkYXRlID0gZnVuY3Rpb24oZW51bVZhbHVlKSB7CiAgICB2YXIgaXNFeHRlbnNpYmxlID0gZmFsc2U7CiAgICBpZiAoaXNFeHRlbnNpYmxlIHx8IHRoaXMuaXNLbm93bkVudW1WYWx1ZShlbnVtVmFsdWUpKQogICAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLlVOS05PV05fRU5VTV9WQUxVRTsKICB9OwogIE1lZGlhUm91dGVyLlByZXNlbnRhdGlvbkNvbm5lY3Rpb25DbG9zZVJlYXNvbiA9IHt9OwogIE1lZGlhUm91dGVyLlByZXNlbnRhdGlvbkNvbm5lY3Rpb25DbG9zZVJlYXNvbi5DT05ORUNUSU9OX0VSUk9SID0gMDsKICBNZWRpYVJvdXRlci5QcmVzZW50YXRpb25Db25uZWN0aW9uQ2xvc2VSZWFzb24uQ0xPU0VEID0gTWVkaWFSb3V0ZXIuUHJlc2VudGF0aW9uQ29ubmVjdGlvbkNsb3NlUmVhc29uLkNPTk5FQ1RJT05fRVJST1IgKyAxOwogIE1lZGlhUm91dGVyLlByZXNlbnRhdGlvbkNvbm5lY3Rpb25DbG9zZVJlYXNvbi5XRU5UX0FXQVkgPSBNZWRpYVJvdXRlci5QcmVzZW50YXRpb25Db25uZWN0aW9uQ2xvc2VSZWFzb24uQ0xPU0VEICsgMTsKCiAgTWVkaWFSb3V0ZXIuUHJlc2VudGF0aW9uQ29ubmVjdGlvbkNsb3NlUmVhc29uLmlzS25vd25FbnVtVmFsdWUgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgc3dpdGNoICh2YWx1ZSkgewogICAgY2FzZSAwOgogICAgY2FzZSAxOgogICAgY2FzZSAyOgogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9OwoKICBNZWRpYVJvdXRlci5QcmVzZW50YXRpb25Db25uZWN0aW9uQ2xvc2VSZWFzb24udmFsaWRhdGUgPSBmdW5jdGlvbihlbnVtVmFsdWUpIHsKICAgIHZhciBpc0V4dGVuc2libGUgPSBmYWxzZTsKICAgIGlmIChpc0V4dGVuc2libGUgfHwgdGhpcy5pc0tub3duRW51bVZhbHVlKGVudW1WYWx1ZSkpCiAgICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuVU5LTk9XTl9FTlVNX1ZBTFVFOwogIH07CiAgTWVkaWFSb3V0ZXJTdHViLnByb3RvdHlwZS52YWxpZGF0b3IgPSB2YWxpZGF0ZU1lZGlhUm91dGVyUmVxdWVzdDsKICBNZWRpYVJvdXRlclByb3h5LnByb3RvdHlwZS52YWxpZGF0b3IgPSB2YWxpZGF0ZU1lZGlhUm91dGVyUmVzcG9uc2U7CiAgZXhwb3J0cy5TaW5rSWNvblR5cGUgPSBTaW5rSWNvblR5cGU7CiAgZXhwb3J0cy5Sb3V0ZUNvbnRyb2xsZXJUeXBlID0gUm91dGVDb250cm9sbGVyVHlwZTsKICBleHBvcnRzLlJvdXRlUmVxdWVzdFJlc3VsdENvZGUgPSBSb3V0ZVJlcXVlc3RSZXN1bHRDb2RlOwogIGV4cG9ydHMuTWVkaWFTaW5rID0gTWVkaWFTaW5rOwogIGV4cG9ydHMuRGlhbE1lZGlhU2luayA9IERpYWxNZWRpYVNpbms7CiAgZXhwb3J0cy5DYXN0TWVkaWFTaW5rID0gQ2FzdE1lZGlhU2luazsKICBleHBvcnRzLk1lZGlhUm91dGUgPSBNZWRpYVJvdXRlOwogIGV4cG9ydHMuSXNzdWUgPSBJc3N1ZTsKICBleHBvcnRzLlJvdXRlTWVzc2FnZSA9IFJvdXRlTWVzc2FnZTsKICBleHBvcnRzLlNpbmtTZWFyY2hDcml0ZXJpYSA9IFNpbmtTZWFyY2hDcml0ZXJpYTsKICBleHBvcnRzLk1lZGlhUm91dGVQcm92aWRlckNvbmZpZyA9IE1lZGlhUm91dGVQcm92aWRlckNvbmZpZzsKICBleHBvcnRzLk1lZGlhU2lua0V4dHJhRGF0YSA9IE1lZGlhU2lua0V4dHJhRGF0YTsKICBleHBvcnRzLk1lZGlhUm91dGVQcm92aWRlciA9IE1lZGlhUm91dGVQcm92aWRlcjsKICBleHBvcnRzLk1lZGlhUm91dGVQcm92aWRlclB0ciA9IE1lZGlhUm91dGVQcm92aWRlclB0cjsKICBleHBvcnRzLk1lZGlhUm91dGVQcm92aWRlckFzc29jaWF0ZWRQdHIgPSBNZWRpYVJvdXRlUHJvdmlkZXJBc3NvY2lhdGVkUHRyOwogIGV4cG9ydHMuTWVkaWFSb3V0ZXIgPSBNZWRpYVJvdXRlcjsKICBleHBvcnRzLk1lZGlhUm91dGVyUHRyID0gTWVkaWFSb3V0ZXJQdHI7CiAgZXhwb3J0cy5NZWRpYVJvdXRlckFzc29jaWF0ZWRQdHIgPSBNZWRpYVJvdXRlckFzc29jaWF0ZWRQdHI7Cn0pKCk7Ly8gQ29weXJpZ2h0IDIwMTUgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCid1c2Ugc3RyaWN0JzsKCmlmICgodHlwZW9mIG1vam8gPT09ICd1bmRlZmluZWQnKSB8fCAhbW9qby5iaW5kaW5nc0xpYnJhcnlJbml0aWFsaXplZCkgewogIGxvYWRTY3JpcHQoJ21vam9fYmluZGluZ3MnKTsKfQptb2pvLmNvbmZpZy5hdXRvTG9hZE1vam9tRGVwcyA9IGZhbHNlOwoKbG9hZFNjcmlwdCgnY2hyb21lL2NvbW1vbi9tZWRpYV9yb3V0ZXIvbW9qby9tZWRpYV9jb250cm9sbGVyLm1vam9tJyk7CmxvYWRTY3JpcHQoJ2Nocm9tZS9jb21tb24vbWVkaWFfcm91dGVyL21vam8vbWVkaWFfcm91dGVyLm1vam9tJyk7CmxvYWRTY3JpcHQoJ2Nocm9tZS9jb21tb24vbWVkaWFfcm91dGVyL21vam8vbWVkaWFfc3RhdHVzLm1vam9tJyk7CmxvYWRTY3JpcHQoJ2V4dGVuc2lvbnMvY29tbW9uL21vam8va2VlcF9hbGl2ZS5tb2pvbScpOwpsb2FkU2NyaXB0KCdtZWRpYS9tb2pvL2ludGVyZmFjZXMvbWlycm9yX3NlcnZpY2VfcmVtb3RpbmcubW9qb20nKTsKbG9hZFNjcmlwdCgnbWVkaWEvbW9qby9pbnRlcmZhY2VzL3JlbW90aW5nX2NvbW1vbi5tb2pvbScpOwpsb2FkU2NyaXB0KCdtb2pvL2NvbW1vbi90aW1lLm1vam9tJyk7CmxvYWRTY3JpcHQoJ25ldC9pbnRlcmZhY2VzL2lwX2FkZHJlc3MubW9qb20nKTsKbG9hZFNjcmlwdCgnbmV0L2ludGVyZmFjZXMvaXBfZW5kcG9pbnQubW9qb20nKTsKbG9hZFNjcmlwdCgndXJsL21vam8vb3JpZ2luLm1vam9tJyk7CmxvYWRTY3JpcHQoJ3VybC9tb2pvL3VybC5tb2pvbScpOwoKLy8gVGhlIGZvbGxvd2luZyBhZGFwdGVyIGNsYXNzZXMgcHJlc2VydmUgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBmb3IgdGhlIG1lZGlhCi8vIHJvdXRlciBjb21wb25lbnQgZXh0ZW5zaW9uLgovLyBUT0RPKGNyYnVnLmNvbS83ODcxMjgpOiBSZW1vdmUgdGhlc2UgYWRhcHRlcnMuCgpmdW5jdGlvbiBhc3NpZ25GaWVsZHMob2JqZWN0LCBmaWVsZHMpIHsKICBmb3IodmFyIGZpZWxkIGluIGZpZWxkcykgewogICAgaWYgKG9iamVjdC5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpCiAgICAgIG9iamVjdFtmaWVsZF0gPSBmaWVsZHNbZmllbGRdOwogIH0KfQoKLyoqCiAqIEFkYXB0ZXIgZm9yIG1lZGlhUm91dGVyLm1vam9tLkRpYWxNZWRpYVNpbmsuCiAqIEBjb25zdHJ1Y3RvcgogKi8KZnVuY3Rpb24gRGlhbE1lZGlhU2lua0FkYXB0ZXIoZmllbGRzKSB7CiAgdGhpcy5pcF9hZGRyZXNzID0gbnVsbDsKICB0aGlzLm1vZGVsX25hbWUgPSBudWxsOwogIHRoaXMuYXBwX3VybCA9IG51bGw7CgogIGFzc2lnbkZpZWxkcyh0aGlzLCBmaWVsZHMpOwp9CgpEaWFsTWVkaWFTaW5rQWRhcHRlci5mcm9tTmV3VmVyc2lvbiA9IGZ1bmN0aW9uKG90aGVyKSB7CiAgcmV0dXJuIG5ldyBEaWFsTWVkaWFTaW5rQWRhcHRlcih7CiAgICAnaXBfYWRkcmVzcyc6IElQQWRkcmVzc0FkYXB0ZXIuZnJvbU5ld1ZlcnNpb24ob3RoZXIuaXBBZGRyZXNzKSwKICAgICdtb2RlbF9uYW1lJzogb3RoZXIubW9kZWxOYW1lLAogICAgJ2FwcF91cmwnOiBvdGhlci5hcHBVcmwsCiAgfSk7Cn07CgpEaWFsTWVkaWFTaW5rQWRhcHRlci5wcm90b3R5cGUudG9OZXdWZXJzaW9uID0gZnVuY3Rpb24oKSB7CiAgcmV0dXJuIG5ldyBtZWRpYVJvdXRlci5tb2pvbS5EaWFsTWVkaWFTaW5rKHsKICAgICdpcEFkZHJlc3MnIDogdGhpcy5pcF9hZGRyZXNzLnRvTmV3VmVyc2lvbigpLAogICAgJ21vZGVsTmFtZScgOiB0aGlzLm1vZGVsX25hbWUsCiAgICAnYXBwVXJsJyA6IHRoaXMuYXBwX3VybCwKICB9KTsKfTsKCi8qKgogKiBBZGFwdGVyIGZvciBtZWRpYVJvdXRlci5tb2pvbS5DYXN0TWVkaWFTaW5rLgogKiBAY29uc3RydWN0b3IKICovCmZ1bmN0aW9uIENhc3RNZWRpYVNpbmtBZGFwdGVyKGZpZWxkcykgewogIHRoaXMuaXBfZW5kcG9pbnQgPSBudWxsOwogIHRoaXMubW9kZWxfbmFtZSA9IG51bGw7CiAgdGhpcy5jYXBhYmlsaXRpZXMgPSAwOwogIHRoaXMuY2FzdF9jaGFubmVsX2lkID0gMDsKCiAgYXNzaWduRmllbGRzKHRoaXMsIGZpZWxkcyk7Cn0KCkNhc3RNZWRpYVNpbmtBZGFwdGVyLmZyb21OZXdWZXJzaW9uID0gZnVuY3Rpb24ob3RoZXIpIHsKICByZXR1cm4gbmV3IENhc3RNZWRpYVNpbmtBZGFwdGVyKHsKICAgICdpcF9lbmRwb2ludCc6IElQRW5kcG9pbnRBZGFwdGVyLmZyb21OZXdWZXJzaW9uKG90aGVyLmlwRW5kcG9pbnQpLAogICAgJ21vZGVsX25hbWUnOiBvdGhlci5tb2RlbE5hbWUsCiAgICAnY2FwYWJpbGl0aWVzJzogb3RoZXIuY2FwYWJpbGl0aWVzLAogICAgJ2Nhc3RfY2hhbm5lbF9pZCc6IG90aGVyLmNhc3RDaGFubmVsSWQsCiAgfSk7Cn07CgpDYXN0TWVkaWFTaW5rQWRhcHRlci5wcm90b3R5cGUudG9OZXdWZXJzaW9uID0gZnVuY3Rpb24oKSB7CiAgcmV0dXJuIG5ldyBtZWRpYVJvdXRlci5tb2pvbS5DYXN0TWVkaWFTaW5rKHsKICAgICdpcEVuZHBvaW50JzogdGhpcy5pcF9lbmRwb2ludC50b05ld1ZlcnNpb24oKSwKICAgICdtb2RlbE5hbWUnOiB0aGlzLm1vZGVsX25hbWUsCiAgICAnY2FwYWJpbGl0aWVzJzogdGhpcy5jYXBhYmlsaXRpZXMsCiAgICAnY2FzdENoYW5uZWxJZCc6IHRoaXMuY2FzdF9jaGFubmVsX2lkLAogIH0pOwp9OwoKLyoqCiAqIEFkYXB0ZXIgZm9yIG1lZGlhUm91dGVyLm1vam9tLkhhbmdvdXRzTWVkaWFTdGF0dXNFeHRyYURhdGEuCiAqIEBjb25zdHJ1Y3RvcgogKi8KZnVuY3Rpb24gSGFuZ291dHNNZWRpYVN0YXR1c0V4dHJhRGF0YUFkYXB0ZXIoZmllbGRzKSB7CiAgdGhpcy5sb2NhbF9wcmVzZW50ID0gZmFsc2U7CgogIGFzc2lnbkZpZWxkcyh0aGlzLCBmaWVsZHMpOwp9CgpIYW5nb3V0c01lZGlhU3RhdHVzRXh0cmFEYXRhQWRhcHRlci5wcm90b3R5cGUudG9OZXdWZXJzaW9uID0gZnVuY3Rpb24oKSB7CiAgcmV0dXJuIG5ldyBtZWRpYVJvdXRlci5tb2pvbS5IYW5nb3V0c01lZGlhU3RhdHVzRXh0cmFEYXRhKHsKICAgICdsb2NhbFByZXNlbnQnOiB0aGlzLmxvY2FsX3ByZXNlbnQsCiAgfSk7Cn07CgovKioKICogQWRhcHRlciBmb3IgbmV0LmludGVyZmFjZXMuSVBBZGRyZXNzLgogKiBAY29uc3RydWN0b3IKICovCmZ1bmN0aW9uIElQQWRkcmVzc0FkYXB0ZXIoZmllbGRzKSB7CiAgdGhpcy5hZGRyZXNzX2J5dGVzID0gbnVsbDsKCiAgYXNzaWduRmllbGRzKHRoaXMsIGZpZWxkcyk7Cn0KCklQQWRkcmVzc0FkYXB0ZXIuZnJvbU5ld1ZlcnNpb24gPSBmdW5jdGlvbihvdGhlcikgewogIHJldHVybiBuZXcgSVBBZGRyZXNzQWRhcHRlcih7CiAgICAnYWRkcmVzc19ieXRlcyc6IG90aGVyLmFkZHJlc3NCeXRlcywKICB9KTsKfTsKCklQQWRkcmVzc0FkYXB0ZXIucHJvdG90eXBlLnRvTmV3VmVyc2lvbiA9IGZ1bmN0aW9uKCkgewogIHJldHVybiBuZXcgbmV0LmludGVyZmFjZXMuSVBBZGRyZXNzKHsKICAgICdhZGRyZXNzQnl0ZXMnOiB0aGlzLmFkZHJlc3NfYnl0ZXMsCiAgfSk7Cn07CgovKioKICogQWRhcHRlciBmb3IgbmV0LmludGVyZmFjZXMuSVBFbmRwb2ludC4KICogQGNvbnN0cnVjdG9yCiAqLwpmdW5jdGlvbiBJUEVuZHBvaW50QWRhcHRlcihmaWVsZHMpIHsKICB0aGlzLmFkZHJlc3MgPSBudWxsOwogIHRoaXMucG9ydCA9IDA7CgogIGFzc2lnbkZpZWxkcyh0aGlzLCBmaWVsZHMpOwp9CgpJUEVuZHBvaW50QWRhcHRlci5mcm9tTmV3VmVyc2lvbiA9IGZ1bmN0aW9uKG90aGVyKSB7CiAgcmV0dXJuIG5ldyBJUEVuZHBvaW50QWRhcHRlcih7CiAgICAnYWRkcmVzcyc6IElQQWRkcmVzc0FkYXB0ZXIuZnJvbU5ld1ZlcnNpb24ob3RoZXIuYWRkcmVzcyksCiAgICAncG9ydCc6IG90aGVyLnBvcnQsCiAgfSk7Cn07CgpJUEVuZHBvaW50QWRhcHRlci5wcm90b3R5cGUudG9OZXdWZXJzaW9uID0gZnVuY3Rpb24oKSB7CiAgcmV0dXJuIG5ldyBuZXQuaW50ZXJmYWNlcy5JUEVuZHBvaW50KHsKICAgICdhZGRyZXNzJzogdGhpcy5hZGRyZXNzLnRvTmV3VmVyc2lvbigpLAogICAgJ3BvcnQnOiB0aGlzLnBvcnQsCiAgfSk7Cn07CgovKioKICogQWRhcHRlciBmb3IgbWVkaWFSb3V0ZXIubW9qb20uTWVkaWFTdGF0dXMuCiAqIEBjb25zdHJ1Y3RvcgogKi8KZnVuY3Rpb24gTWVkaWFTdGF0dXNBZGFwdGVyKGZpZWxkcykgewogIHRoaXMudGl0bGUgPSBudWxsOwogIHRoaXMuZGVzY3JpcHRpb24gPSBudWxsOwogIHRoaXMuY2FuX3BsYXlfcGF1c2UgPSBmYWxzZTsKICB0aGlzLmNhbl9tdXRlID0gZmFsc2U7CiAgdGhpcy5jYW5fc2V0X3ZvbHVtZSA9IGZhbHNlOwogIHRoaXMuY2FuX3NlZWsgPSBmYWxzZTsKICB0aGlzLmlzX211dGVkID0gZmFsc2U7CiAgdGhpcy5wbGF5X3N0YXRlID0gMDsKICB0aGlzLnZvbHVtZSA9IDA7CiAgdGhpcy5kdXJhdGlvbiA9IG51bGw7CiAgdGhpcy5jdXJyZW50X3RpbWUgPSBudWxsOwogIHRoaXMuaGFuZ291dHNfZXh0cmFfZGF0YSA9IG51bGw7CgogIGFzc2lnbkZpZWxkcyh0aGlzLCBmaWVsZHMpOwp9CgpNZWRpYVN0YXR1c0FkYXB0ZXIuUGxheVN0YXRlID0gbWVkaWFSb3V0ZXIubW9qb20uTWVkaWFTdGF0dXMuUGxheVN0YXRlOwoKTWVkaWFTdGF0dXNBZGFwdGVyLnByb3RvdHlwZS50b05ld1ZlcnNpb24gPSBmdW5jdGlvbigpIHsKICByZXR1cm4gbmV3IG1lZGlhUm91dGVyLm1vam9tLk1lZGlhU3RhdHVzKHsKICAgICd0aXRsZSc6IHRoaXMudGl0bGUsCiAgICAnZGVzY3JpcHRpb24nOiB0aGlzLmRlc2NyaXB0aW9uLAogICAgJ2NhblBsYXlQYXVzZSc6IHRoaXMuY2FuX3BsYXlfcGF1c2UsCiAgICAnY2FuTXV0ZSc6IHRoaXMuY2FuX211dGUsCiAgICAnY2FuU2V0Vm9sdW1lJzogdGhpcy5jYW5fc2V0X3ZvbHVtZSwKICAgICdjYW5TZWVrJzogdGhpcy5jYW5fc2VlaywKICAgICdpc011dGVkJzogdGhpcy5pc19tdXRlZCwKICAgICdwbGF5U3RhdGUnOiB0aGlzLnBsYXlfc3RhdGUsCiAgICAndm9sdW1lJzogdGhpcy52b2x1bWUsCiAgICAnZHVyYXRpb24nOiB0aGlzLmR1cmF0aW9uLAogICAgJ2N1cnJlbnRUaW1lJzogdGhpcy5jdXJyZW50X3RpbWUsCiAgICAnaGFuZ291dHNFeHRyYURhdGEnOgogICAgICAgIHRoaXMuaGFuZ291dHNfZXh0cmFfZGF0YSAmJiB0aGlzLmhhbmdvdXRzX2V4dHJhX2RhdGEudG9OZXdWZXJzaW9uKCksCiAgfSk7Cn07CgovKioKICogQWRhcHRlciBmb3IgbWVkaWEubW9qb20uUmVtb3RpbmdTaW5rTWV0YWRhdGEuCiAqIEBjb25zdHJ1Y3RvcgogKi8KZnVuY3Rpb24gUmVtb3RpbmdTaW5rTWV0YWRhdGFBZGFwdGVyKGZpZWxkcykgewogIHRoaXMuZmVhdHVyZXMgPSBudWxsOwogIHRoaXMuYXVkaW9fY2FwYWJpbGl0aWVzID0gbnVsbDsKICB0aGlzLnZpZGVvX2NhcGFiaWxpdGllcyA9IG51bGw7CiAgdGhpcy5mcmllbmRseV9uYW1lID0gbnVsbDsKCiAgYXNzaWduRmllbGRzKHRoaXMsIGZpZWxkcyk7Cn0KClJlbW90aW5nU2lua01ldGFkYXRhQWRhcHRlci5mcm9tTmV3VmVyc2lvbiA9IGZ1bmN0aW9uKG90aGVyKSB7CiAgcmV0dXJuIG5ldyBSZW1vdGluZ1NpbmtNZXRhZGF0YUFkYXB0ZXIoewogICAgJ2ZlYXR1cmVzJzogb3RoZXIuZmVhdHVyZXMsCiAgICAnYXVkaW9fY2FwYWJpbGl0aWVzJzogb3RoZXIuYXVkaW9DYXBhYmlsaXRpZXMsCiAgICAndmlkZW9fY2FwYWJpbGl0aWVzJzogb3RoZXIudmlkZW9DYXBhYmlsaXRpZXMsCiAgICAnZnJpZW5kbHlfbmFtZSc6IG90aGVyLmZyaWVuZGx5TmFtZSwKICB9KTsKfTsKClJlbW90aW5nU2lua01ldGFkYXRhQWRhcHRlci5wcm90b3R5cGUudG9OZXdWZXJzaW9uID0gZnVuY3Rpb24oKSB7CiAgcmV0dXJuIG5ldyBtZWRpYS5tb2pvbS5SZW1vdGluZ1NpbmtNZXRhZGF0YSh7CiAgICAnZmVhdHVyZXMnOiB0aGlzLmZlYXR1cmVzLAogICAgJ2F1ZGlvQ2FwYWJpbGl0aWVzJzogdGhpcy5hdWRpb19jYXBhYmlsaXRpZXMsCiAgICAndmlkZW9DYXBhYmlsaXRpZXMnOiB0aGlzLnZpZGVvX2NhcGFiaWxpdGllcywKICAgICdmcmllbmRseU5hbWUnOiB0aGlzLmZyaWVuZGx5X25hbWUsCiAgfSk7Cn07CgovKioKICogQWRhcHRlciBmb3IgbWVkaWFSb3V0ZXIubW9qb20uTWVkaWFTaW5rLgogKiBAY29uc3RydWN0b3IKICovCmZ1bmN0aW9uIE1lZGlhU2lua0FkYXB0ZXIoZmllbGRzKSB7CiAgdGhpcy5zaW5rX2lkID0gbnVsbDsKICB0aGlzLm5hbWUgPSBudWxsOwogIHRoaXMuZGVzY3JpcHRpb24gPSBudWxsOwogIHRoaXMuZG9tYWluID0gbnVsbDsKICB0aGlzLmljb25fdHlwZSA9IDA7CiAgdGhpcy5leHRyYV9kYXRhID0gbnVsbDsKCiAgYXNzaWduRmllbGRzKHRoaXMsIGZpZWxkcyk7Cn0KCk1lZGlhU2lua0FkYXB0ZXIuZnJvbU5ld1ZlcnNpb24gPSBmdW5jdGlvbihvdGhlcikgewogIHJldHVybiBuZXcgTWVkaWFTaW5rQWRhcHRlcih7CiAgICAnc2lua19pZCc6IG90aGVyLnNpbmtJZCwKICAgICduYW1lJzogb3RoZXIubmFtZSwKICAgICdkZXNjcmlwdGlvbic6IG90aGVyLmRlc2NyaXB0aW9uLAogICAgJ2RvbWFpbic6IG90aGVyLmRvbWFpbiwKICAgICdpY29uX3R5cGUnOiBvdGhlci5pY29uVHlwZSwKICAgICdleHRyYV9kYXRhJzogb3RoZXIuZXh0cmFEYXRhICYmCiAgICAgICAgTWVkaWFTaW5rRXh0cmFEYXRhQWRhcHRlci5mcm9tTmV3VmVyc2lvbihvdGhlci5leHRyYURhdGEpLAogIH0pOwp9OwoKTWVkaWFTaW5rQWRhcHRlci5wcm90b3R5cGUudG9OZXdWZXJzaW9uID0gZnVuY3Rpb24oKSB7CiAgcmV0dXJuIG5ldyBtZWRpYVJvdXRlci5tb2pvbS5NZWRpYVNpbmsoewogICAgJ3NpbmtJZCc6IHRoaXMuc2lua19pZCwKICAgICduYW1lJzogdGhpcy5uYW1lLAogICAgJ2Rlc2NyaXB0aW9uJzogdGhpcy5kZXNjcmlwdGlvbiwKICAgICdkb21haW4nOiB0aGlzLmRvbWFpbiwKICAgICdpY29uVHlwZSc6IHRoaXMuaWNvbl90eXBlLAogICAgJ2V4dHJhRGF0YSc6IHRoaXMuZXh0cmFfZGF0YSAmJiB0aGlzLmV4dHJhX2RhdGEudG9OZXdWZXJzaW9uKCksCiAgfSk7Cn07CgovKioKICogQWRhcHRlciBmb3IgbWVkaWFSb3V0ZXIubW9qb20uTWVkaWFTaW5rRXh0cmFEYXRhLgogKiBAY29uc3RydWN0b3IKICovCmZ1bmN0aW9uIE1lZGlhU2lua0V4dHJhRGF0YUFkYXB0ZXIodmFsdWUpIHsKICB0aGlzLiRkYXRhID0gbnVsbDsKICB0aGlzLiR0YWcgPSB1bmRlZmluZWQ7CgogIGlmICh2YWx1ZSA9PSB1bmRlZmluZWQpIHsKICAgIHJldHVybjsKICB9CgogIHZhciBrZXlzID0gT2JqZWN0LmtleXModmFsdWUpOwogIGlmIChrZXlzLmxlbmd0aCA9PSAwKSB7CiAgICByZXR1cm47CiAgfQoKICBpZiAoa2V5cy5sZW5ndGggPiAxKSB7CiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdZb3UgbWF5IHNldCBvbmx5IG9uZSBtZW1iZXIgb24gYSB1bmlvbi4nKTsKICB9CgogIHZhciBmaWVsZHMgPSBbCiAgICAnZGlhbF9tZWRpYV9zaW5rJywKICAgICdjYXN0X21lZGlhX3NpbmsnLAogIF07CgogIGlmIChmaWVsZHMuaW5kZXhPZihrZXlzWzBdKSA8IDApIHsKICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihrZXlzWzBdICsKICAgICAgICAnIGlzIG5vdCBhIE1lZGlhU2lua0V4dHJhRGF0YUFkYXB0ZXIgbWVtYmVyLicpOwogIH0KCiAgdGhpc1trZXlzWzBdXSA9IHZhbHVlW2tleXNbMF1dOwp9CgpNZWRpYVNpbmtFeHRyYURhdGFBZGFwdGVyLlRhZ3MgPSB7CiAgZGlhbF9tZWRpYV9zaW5rOiAwLAogIGNhc3RfbWVkaWFfc2luazogMSwKfTsKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShNZWRpYVNpbmtFeHRyYURhdGFBZGFwdGVyLnByb3RvdHlwZSwgJ2RpYWxfbWVkaWFfc2luaycsIHsKICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgaWYgKHRoaXMuJHRhZyAhPSBNZWRpYVNpbmtFeHRyYURhdGFBZGFwdGVyLlRhZ3MuZGlhbF9tZWRpYV9zaW5rKSB7CiAgICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigKICAgICAgICAgICdNZWRpYVNpbmtFeHRyYURhdGFBZGFwdGVyLmRpYWxfbWVkaWFfc2luayBpcyBub3QgY3VycmVudGx5IHNldC4nKTsKICAgIH0KICAgIHJldHVybiB0aGlzLiRkYXRhOwogIH0sCgogIHNldDogZnVuY3Rpb24odmFsdWUpIHsKICAgIHRoaXMuJHRhZyA9IE1lZGlhU2lua0V4dHJhRGF0YUFkYXB0ZXIuVGFncy5kaWFsX21lZGlhX3Npbms7CiAgICB0aGlzLiRkYXRhID0gdmFsdWU7CiAgfQp9KTsKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShNZWRpYVNpbmtFeHRyYURhdGFBZGFwdGVyLnByb3RvdHlwZSwgJ2Nhc3RfbWVkaWFfc2luaycsIHsKICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgaWYgKHRoaXMuJHRhZyAhPSBNZWRpYVNpbmtFeHRyYURhdGFBZGFwdGVyLlRhZ3MuY2FzdF9tZWRpYV9zaW5rKSB7CiAgICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigKICAgICAgICAgICdNZWRpYVNpbmtFeHRyYURhdGFBZGFwdGVyLmNhc3RfbWVkaWFfc2luayBpcyBub3QgY3VycmVudGx5IHNldC4nKTsKICAgIH0KICAgIHJldHVybiB0aGlzLiRkYXRhOwogIH0sCgogIHNldDogZnVuY3Rpb24odmFsdWUpIHsKICAgIHRoaXMuJHRhZyA9IE1lZGlhU2lua0V4dHJhRGF0YUFkYXB0ZXIuVGFncy5jYXN0X21lZGlhX3Npbms7CiAgICB0aGlzLiRkYXRhID0gdmFsdWU7CiAgfQp9KTsKCk1lZGlhU2lua0V4dHJhRGF0YUFkYXB0ZXIuZnJvbU5ld1ZlcnNpb24gPSBmdW5jdGlvbihvdGhlcikgewogIGlmIChvdGhlci4kdGFnID09IG1lZGlhUm91dGVyLm1vam9tLk1lZGlhU2lua0V4dHJhRGF0YS5UYWdzLmRpYWxNZWRpYVNpbmspIHsKICAgIHJldHVybiBuZXcgTWVkaWFTaW5rRXh0cmFEYXRhQWRhcHRlcih7CiAgICAgICdkaWFsX21lZGlhX3NpbmsnOgogICAgICAgICAgRGlhbE1lZGlhU2lua0FkYXB0ZXIuZnJvbU5ld1ZlcnNpb24ob3RoZXIuZGlhbE1lZGlhU2luayksCiAgICB9KTsKICB9IGVsc2UgewogICAgcmV0dXJuIG5ldyBNZWRpYVNpbmtFeHRyYURhdGFBZGFwdGVyKHsKICAgICAgJ2Nhc3RfbWVkaWFfc2luayc6CiAgICAgICAgICBDYXN0TWVkaWFTaW5rQWRhcHRlci5mcm9tTmV3VmVyc2lvbihvdGhlci5jYXN0TWVkaWFTaW5rKSwKICAgIH0pOwogIH0KfTsKCk1lZGlhU2lua0V4dHJhRGF0YUFkYXB0ZXIucHJvdG90eXBlLnRvTmV3VmVyc2lvbiA9IGZ1bmN0aW9uKCkgewogIGlmICh0aGlzLiR0YWcgPT0gTWVkaWFTaW5rRXh0cmFEYXRhQWRhcHRlci5UYWdzLmRpYWxfbWVkaWFfc2luaykgewogICAgcmV0dXJuIG5ldyBtZWRpYVJvdXRlci5tb2pvbS5NZWRpYVNpbmtFeHRyYURhdGEoewogICAgICAnZGlhbE1lZGlhU2luayc6IHRoaXMuZGlhbF9tZWRpYV9zaW5rLnRvTmV3VmVyc2lvbigpLAogICAgfSk7CiAgfSBlbHNlIHsKICAgIHJldHVybiBuZXcgbWVkaWFSb3V0ZXIubW9qb20uTWVkaWFTaW5rRXh0cmFEYXRhKHsKICAgICAgJ2Nhc3RNZWRpYVNpbmsnOiB0aGlzLmNhc3RfbWVkaWFfc2luay50b05ld1ZlcnNpb24oKSwKICAgIH0pOwogIH0KfTsKCi8qKgogKiBBZGFwdGVyIGZvciBtZWRpYS5tb2pvbS5NaXJyb3JTZXJ2aWNlUmVtb3RlclB0ci4KICogQGNvbnN0cnVjdG9yCiAqLwpmdW5jdGlvbiBNaXJyb3JTZXJ2aWNlUmVtb3RlclB0ckFkYXB0ZXIoaGFuZGxlT3JQdHJJbmZvKSB7CiAgdGhpcy5wdHIgPSBuZXcgbW9qby5JbnRlcmZhY2VQdHJDb250cm9sbGVyKE1pcnJvclNlcnZpY2VSZW1vdGVyQWRhcHRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlT3JQdHJJbmZvKTsKfQoKTWlycm9yU2VydmljZVJlbW90ZXJQdHJBZGFwdGVyLnByb3RvdHlwZSA9CiAgICBPYmplY3QuY3JlYXRlKG1lZGlhLm1vam9tLk1pcnJvclNlcnZpY2VSZW1vdGVyUHRyLnByb3RvdHlwZSk7Ck1pcnJvclNlcnZpY2VSZW1vdGVyUHRyQWRhcHRlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPQogICAgTWlycm9yU2VydmljZVJlbW90ZXJQdHJBZGFwdGVyOwoKTWlycm9yU2VydmljZVJlbW90ZXJQdHJBZGFwdGVyLnByb3RvdHlwZS5zdGFydERhdGFTdHJlYW1zID0gZnVuY3Rpb24oKSB7CiAgcmV0dXJuIE1pcnJvclNlcnZpY2VSZW1vdGVyUHJveHkucHJvdG90eXBlLnN0YXJ0RGF0YVN0cmVhbXMKICAgICAgLmFwcGx5KHRoaXMucHRyLmdldFByb3h5KCksIGFyZ3VtZW50cykudGhlbihmdW5jdGlvbihyZXNwb25zZSkgewogICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7CiAgICAgICdhdWRpb19zdHJlYW1faWQnOiByZXNwb25zZS5hdWRpb1N0cmVhbUlkLAogICAgICAndmlkZW9fc3RyZWFtX2lkJzogcmVzcG9uc2UudmlkZW9TdHJlYW1JZCwKICAgIH0pOwogIH0pOwp9OwoKLyoqCiAqIEFkYXB0ZXIgZm9yIG1lZGlhLm1vam9tLk1pcnJvclNlcnZpY2VSZW1vdGVyLnN0dWJjbGFzcy4KICogQGNvbnN0cnVjdG9yCiAqLwpmdW5jdGlvbiBNaXJyb3JTZXJ2aWNlUmVtb3RlclN0dWJBZGFwdGVyKGRlbGVnYXRlKSB7CiAgdGhpcy5kZWxlZ2F0ZV8gPSBkZWxlZ2F0ZTsKfQoKTWlycm9yU2VydmljZVJlbW90ZXJTdHViQWRhcHRlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKAogICAgbWVkaWEubW9qb20uTWlycm9yU2VydmljZVJlbW90ZXIuc3R1YkNsYXNzLnByb3RvdHlwZSk7Ck1pcnJvclNlcnZpY2VSZW1vdGVyU3R1YkFkYXB0ZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0KICAgIE1pcnJvclNlcnZpY2VSZW1vdGVyU3R1YkFkYXB0ZXI7CgpNaXJyb3JTZXJ2aWNlUmVtb3RlclN0dWJBZGFwdGVyLnByb3RvdHlwZS5zdGFydERhdGFTdHJlYW1zID0KICAgIGZ1bmN0aW9uKGhhc0F1ZGlvLCBoYXNWaWRlbykgewogIHJldHVybiB0aGlzLmRlbGVnYXRlXyAmJiB0aGlzLmRlbGVnYXRlXy5zdGFydERhdGFTdHJlYW1zICYmCiAgICAgIHRoaXMuZGVsZWdhdGVfLnN0YXJ0RGF0YVN0cmVhbXMoaGFzQXVkaW8sIGhhc1ZpZGVvKS50aGVuKAogICAgICAgICAgZnVuY3Rpb24ocmVzcG9uc2UpIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAnYXVkaW9TdHJlYW1JZCc6IHJlc3BvbnNlLmF1ZGlvX3N0cmVhbV9pZCwKICAgICAgICAgICAgICAndmlkZW9TdHJlYW1JZCc6IHJlc3BvbnNlLnZpZGVvX3N0cmVhbV9pZCwKICAgICAgICAgICAgfTsKICAgICAgICAgIH0pOwp9OwoKLyoqCiAqIEFkYXB0ZXIgZm9yIG1lZGlhLm1vam9tLk1pcnJvclNlcnZpY2VSZW1vdGVyLgogKi8KdmFyIE1pcnJvclNlcnZpY2VSZW1vdGVyQWRhcHRlciA9IHsKICAgIG5hbWU6ICdtZWRpYTo6bW9qb206Ok1pcnJvclNlcnZpY2VSZW1vdGVyJywKICAgIGtWZXJzaW9uOiAwLAogICAgcHRyQ2xhc3M6IE1pcnJvclNlcnZpY2VSZW1vdGVyUHRyQWRhcHRlciwKICAgIHByb3h5Q2xhc3M6IG1lZGlhLm1vam9tLk1pcnJvclNlcnZpY2VSZW1vdGVyLnByb3h5Q2xhc3MsCiAgICBzdHViQ2xhc3M6IE1pcnJvclNlcnZpY2VSZW1vdGVyU3R1YkFkYXB0ZXIsCiAgICB2YWxpZGF0ZVJlcXVlc3Q6IG1lZGlhLm1vam9tLk1pcnJvclNlcnZpY2VSZW1vdGVyLnZhbGlkYXRlUmVxdWVzdCwKICAgIHZhbGlkYXRlUmVzcG9uc2U6IG1lZGlhLm1vam9tLk1pcnJvclNlcnZpY2VSZW1vdGVyLnZhbGlkYXRlUmVzcG9uc2UsCn07CgovKioKICogQWRhcHRlciBmb3IgbWVkaWEubW9qb20uTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlUHRyLgogKiBAY29uc3RydWN0b3IKICovCmZ1bmN0aW9uIE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZVB0ckFkYXB0ZXIoaGFuZGxlT3JQdHJJbmZvKSB7CiAgdGhpcy5wdHIgPSBuZXcgbW9qby5JbnRlcmZhY2VQdHJDb250cm9sbGVyKE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZUFkYXB0ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZU9yUHRySW5mbyk7Cn0KCk1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZVB0ckFkYXB0ZXIucHJvdG90eXBlID0KICAgIE9iamVjdC5jcmVhdGUobWVkaWEubW9qb20uTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlUHRyLnByb3RvdHlwZSk7Ck1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZVB0ckFkYXB0ZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0KICAgIE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZVB0ckFkYXB0ZXI7CgpNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VQdHJBZGFwdGVyLnByb3RvdHlwZS5vblNpbmtBdmFpbGFibGUgPQogICAgZnVuY3Rpb24obWV0YWRhdGEpIHsKICByZXR1cm4gdGhpcy5wdHIuZ2V0UHJveHkoKS5vblNpbmtBdmFpbGFibGUobWV0YWRhdGEudG9OZXdWZXJzaW9uKCkpOwp9OwoKLyoqCiAqIEFkYXB0ZXIgZm9yIG1lZGlhLm1vam9tLk1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZS4KICovCnZhciBNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VBZGFwdGVyID0gewogICAgbmFtZTogJ21lZGlhOjptb2pvbTo6TWlycm9yU2VydmljZVJlbW90aW5nU291cmNlJywKICAgIGtWZXJzaW9uOiAwLAogICAgcHRyQ2xhc3M6IE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZVB0ckFkYXB0ZXIsCiAgICBwcm94eUNsYXNzOiBtZWRpYS5tb2pvbS5NaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2UucHJveHlDbGFzcywKICAgIHN0dWJDbGFzczogbnVsbCwKICAgIHZhbGlkYXRlUmVxdWVzdDogbWVkaWEubW9qb20uTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlLnZhbGlkYXRlUmVxdWVzdCwKICAgIHZhbGlkYXRlUmVzcG9uc2U6IG51bGwsCn07CgovKioKICogQWRhcHRlciBmb3IgbWVkaWFSb3V0ZXIubW9qb20uTWVkaWFTdGF0dXNPYnNlcnZlci4KICogQGNvbnN0cnVjdG9yCiAqLwpmdW5jdGlvbiBNZWRpYVN0YXR1c09ic2VydmVyUHRyQWRhcHRlcihoYW5kbGVPclB0ckluZm8pIHsKICB0aGlzLnB0ciA9IG5ldyBtb2pvLkludGVyZmFjZVB0ckNvbnRyb2xsZXIoTWVkaWFTdGF0dXNPYnNlcnZlckFkYXB0ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZU9yUHRySW5mbyk7Cn0KCk1lZGlhU3RhdHVzT2JzZXJ2ZXJQdHJBZGFwdGVyLnByb3RvdHlwZSA9CiAgICBPYmplY3QuY3JlYXRlKG1lZGlhUm91dGVyLm1vam9tLk1lZGlhU3RhdHVzT2JzZXJ2ZXJQdHIucHJvdG90eXBlKTsKTWVkaWFTdGF0dXNPYnNlcnZlclB0ckFkYXB0ZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0KICAgIE1lZGlhU3RhdHVzT2JzZXJ2ZXJQdHJBZGFwdGVyOwoKTWVkaWFTdGF0dXNPYnNlcnZlclB0ckFkYXB0ZXIucHJvdG90eXBlLm9uTWVkaWFTdGF0dXNVcGRhdGVkID0KICAgIGZ1bmN0aW9uKHN0YXR1cykgewogIHJldHVybiB0aGlzLnB0ci5nZXRQcm94eSgpLm9uTWVkaWFTdGF0dXNVcGRhdGVkKHN0YXR1cy50b05ld1ZlcnNpb24oKSk7Cn07CgovKioKICogQWRhcHRlciBmb3IgbWVkaWFSb3V0ZXIubW9qb20uTWVkaWFTdGF0dXNPYnNlcnZlci4KICovCnZhciBNZWRpYVN0YXR1c09ic2VydmVyQWRhcHRlciA9IHsKICBuYW1lOiAnbWVkaWFSb3V0ZXI6Om1vam9tOjpNZWRpYVN0YXR1c09ic2VydmVyJywKICBrVmVyc2lvbjogMCwKICBwdHJDbGFzczogTWVkaWFTdGF0dXNPYnNlcnZlclB0ckFkYXB0ZXIsCiAgcHJveHlDbGFzczogbWVkaWFSb3V0ZXIubW9qb20uTWVkaWFTdGF0dXNPYnNlcnZlci5wcm94eUNsYXNzLAogIHN0dWJDbGFzczogbnVsbCwKICB2YWxpZGF0ZVJlcXVlc3Q6IG1lZGlhUm91dGVyLm1vam9tLk1lZGlhU3RhdHVzT2JzZXJ2ZXIudmFsaWRhdGVSZXF1ZXN0LAogIHZhbGlkYXRlUmVzcG9uc2U6IG51bGwsCn07CgovKioKICogQ29udmVydHMgYSBtZWRpYSBzaW5rIHRvIGEgTWVkaWFTaW5rIE1vam8gb2JqZWN0LgogKiBAcGFyYW0geyFNZWRpYVNpbmt9IHNpbmsgQSBtZWRpYSBzaW5rLgogKiBAcmV0dXJuIHshbWVkaWFSb3V0ZXIubW9qb20uTWVkaWFTaW5rfSBBIE1vam8gTWVkaWFTaW5rIG9iamVjdC4KICovCmZ1bmN0aW9uIHNpbmtUb01vam9fKHNpbmspIHsKICByZXR1cm4gbmV3IG1lZGlhUm91dGVyLm1vam9tLk1lZGlhU2luayh7CiAgICAnbmFtZSc6IHNpbmsuZnJpZW5kbHlOYW1lLAogICAgJ2Rlc2NyaXB0aW9uJzogc2luay5kZXNjcmlwdGlvbiwKICAgICdkb21haW4nOiBzaW5rLmRvbWFpbiwKICAgICdzaW5rSWQnOiBzaW5rLmlkLAogICAgJ2ljb25UeXBlJzogc2lua0ljb25UeXBlVG9Nb2pvKHNpbmsuaWNvblR5cGUpLAogICAgJ3Byb3ZpZGVySWQnOiBtZWRpYVJvdXRlci5tb2pvbS5NZWRpYVJvdXRlUHJvdmlkZXIuSWQuRVhURU5TSU9OLAogIH0pOwp9CgovKioKICogQ29udmVydHMgYSBtZWRpYSBzaW5rJ3MgaWNvbiB0eXBlIHRvIGEgTWVkaWFTaW5rLkljb25UeXBlIE1vam8gb2JqZWN0LgogKiBAcGFyYW0geyFNZWRpYVNpbmsuSWNvblR5cGV9IHR5cGUgQSBtZWRpYSBzaW5rJ3MgaWNvbiB0eXBlLgogKiBAcmV0dXJuIHshbWVkaWFSb3V0ZXIubW9qb20uTWVkaWFTaW5rLkljb25UeXBlfSBBIE1vam8gTWVkaWFTaW5rLkljb25UeXBlCiAqICAgICBvYmplY3QuCiAqLwpmdW5jdGlvbiBzaW5rSWNvblR5cGVUb01vam8odHlwZSkgewogIHN3aXRjaCAodHlwZSkgewogICAgY2FzZSAnY2FzdCc6CiAgICAgIHJldHVybiBtZWRpYVJvdXRlci5tb2pvbS5TaW5rSWNvblR5cGUuQ0FTVDsKICAgIGNhc2UgJ2Nhc3RfYXVkaW9fZ3JvdXAnOgogICAgICByZXR1cm4gbWVkaWFSb3V0ZXIubW9qb20uU2lua0ljb25UeXBlLkNBU1RfQVVESU9fR1JPVVA7CiAgICBjYXNlICdjYXN0X2F1ZGlvJzoKICAgICAgcmV0dXJuIG1lZGlhUm91dGVyLm1vam9tLlNpbmtJY29uVHlwZS5DQVNUX0FVRElPOwogICAgY2FzZSAnbWVldGluZyc6CiAgICAgIHJldHVybiBtZWRpYVJvdXRlci5tb2pvbS5TaW5rSWNvblR5cGUuTUVFVElORzsKICAgIGNhc2UgJ2hhbmdvdXQnOgogICAgICByZXR1cm4gbWVkaWFSb3V0ZXIubW9qb20uU2lua0ljb25UeXBlLkhBTkdPVVQ7CiAgICBjYXNlICdlZHVjYXRpb24nOgogICAgICByZXR1cm4gbWVkaWFSb3V0ZXIubW9qb20uU2lua0ljb25UeXBlLkVEVUNBVElPTjsKICAgIGNhc2UgJ2dlbmVyaWMnOgogICAgICByZXR1cm4gbWVkaWFSb3V0ZXIubW9qb20uU2lua0ljb25UeXBlLkdFTkVSSUM7CiAgICBkZWZhdWx0OgogICAgICBjb25zb2xlLmVycm9yKCdVbmtub3duIHNpbmsgaWNvbiB0eXBlIDogJyArIHR5cGUpOwogICAgICByZXR1cm4gbWVkaWFSb3V0ZXIubW9qb20uU2lua0ljb25UeXBlLkdFTkVSSUM7CiAgfQp9CgovKioKICogUmV0dXJucyBhIE1vam8gTWVkaWFSb3V0ZSBvYmplY3QgZ2l2ZW4gYSBNZWRpYVJvdXRlIGFuZCBhCiAqIG1lZGlhIHNpbmsgbmFtZS4KICogQHBhcmFtIHshTWVkaWFSb3V0ZX0gcm91dGUKICogQHJldHVybiB7IW1lZGlhUm91dGVyLm1vam9tLk1lZGlhUm91dGV9CiAqLwpmdW5jdGlvbiByb3V0ZVRvTW9qb18ocm91dGUpIHsKICByZXR1cm4gbmV3IG1lZGlhUm91dGVyLm1vam9tLk1lZGlhUm91dGUoewogICAgJ21lZGlhUm91dGVJZCc6IHJvdXRlLmlkLAogICAgJ21lZGlhU291cmNlJzogcm91dGUubWVkaWFTb3VyY2UsCiAgICAnbWVkaWFTaW5rSWQnOiByb3V0ZS5zaW5rSWQsCiAgICAnZGVzY3JpcHRpb24nOiByb3V0ZS5kZXNjcmlwdGlvbiwKICAgICdpY29uVXJsJzogcm91dGUuaWNvblVybCwKICAgICdpc0xvY2FsJzogcm91dGUuaXNMb2NhbCwKICAgICdmb3JEaXNwbGF5Jzogcm91dGUuZm9yRGlzcGxheSwKICAgICdpc0luY29nbml0byc6IHJvdXRlLm9mZlRoZVJlY29yZCwKICAgICdpc0xvY2FsUHJlc2VudGF0aW9uJzogcm91dGUuaXNPZmZzY3JlZW5QcmVzZW50YXRpb24sCiAgICAnY29udHJvbGxlclR5cGUnOiByb3V0ZS5jb250cm9sbGVyVHlwZSwKICAgIC8vIEJlZ2luIG5ld2x5IGFkZGVkIHByb3BlcnRpZXMsIGZvbGxvd2VkIGJ5IHRoZSBtaWxlc3RvbmUgdGhleSB3ZXJlCiAgICAvLyBhZGRlZC4gIFRoZSBndWFyZCBzaG91bGQgYmUgc2FmZSB0byByZW1vdmUgTisyIG1pbGVzdG9uZXMgbGF0ZXIuCiAgICAncHJlc2VudGF0aW9uSWQnOiByb3V0ZS5wcmVzZW50YXRpb25JZCB8fCAnJyAgLy8gTTY0CiAgfSk7Cn0KCi8qKgogKiBDb252ZXJ0cyBhIHJvdXRlIG1lc3NhZ2UgdG8gYSBSb3V0ZU1lc3NhZ2UgTW9qbyBvYmplY3QuCiAqIEBwYXJhbSB7IVJvdXRlTWVzc2FnZX0gbWVzc2FnZQogKiBAcmV0dXJuIHshbWVkaWFSb3V0ZXIubW9qb20uUm91dGVNZXNzYWdlfSBBIE1vam8gUm91dGVNZXNzYWdlIG9iamVjdC4KICovCmZ1bmN0aW9uIG1lc3NhZ2VUb01vam9fKG1lc3NhZ2UpIHsKICBpZiAoInN0cmluZyIgPT0gdHlwZW9mIG1lc3NhZ2UubWVzc2FnZSkgewogICAgcmV0dXJuIG5ldyBtZWRpYVJvdXRlci5tb2pvbS5Sb3V0ZU1lc3NhZ2UoewogICAgICAndHlwZSc6IG1lZGlhUm91dGVyLm1vam9tLlJvdXRlTWVzc2FnZS5UeXBlLlRFWFQsCiAgICAgICdtZXNzYWdlJzogbWVzc2FnZS5tZXNzYWdlLAogICAgfSk7CiAgfSBlbHNlIHsKICAgIHJldHVybiBuZXcgbWVkaWFSb3V0ZXIubW9qb20uUm91dGVNZXNzYWdlKHsKICAgICAgJ3R5cGUnOiBtZWRpYVJvdXRlci5tb2pvbS5Sb3V0ZU1lc3NhZ2UuVHlwZS5CSU5BUlksCiAgICAgICdkYXRhJzogbWVzc2FnZS5tZXNzYWdlLAogICAgfSk7CiAgfQp9CgovKioKICogQ29udmVydHMgcHJlc2VudGF0aW9uIGNvbm5lY3Rpb24gc3RhdGUgdG8gTW9qbyBlbnVtIHZhbHVlLgogKiBAcGFyYW0geyFzdHJpbmd9IHN0YXRlCiAqIEByZXR1cm4geyFtZWRpYVJvdXRlci5tb2pvbS5NZWRpYVJvdXRlci5QcmVzZW50YXRpb25Db25uZWN0aW9uU3RhdGV9CiAqLwpmdW5jdGlvbiBwcmVzZW50YXRpb25Db25uZWN0aW9uU3RhdGVUb01vam9fKHN0YXRlKSB7CiAgdmFyIFByZXNlbnRhdGlvbkNvbm5lY3Rpb25TdGF0ZSA9CiAgICAgIG1lZGlhUm91dGVyLm1vam9tLk1lZGlhUm91dGVyLlByZXNlbnRhdGlvbkNvbm5lY3Rpb25TdGF0ZTsKICBzd2l0Y2ggKHN0YXRlKSB7CiAgICBjYXNlICdjb25uZWN0aW5nJzoKICAgICAgcmV0dXJuIFByZXNlbnRhdGlvbkNvbm5lY3Rpb25TdGF0ZS5DT05ORUNUSU5HOwogICAgY2FzZSAnY29ubmVjdGVkJzoKICAgICAgcmV0dXJuIFByZXNlbnRhdGlvbkNvbm5lY3Rpb25TdGF0ZS5DT05ORUNURUQ7CiAgICBjYXNlICdjbG9zZWQnOgogICAgICByZXR1cm4gUHJlc2VudGF0aW9uQ29ubmVjdGlvblN0YXRlLkNMT1NFRDsKICAgIGNhc2UgJ3Rlcm1pbmF0ZWQnOgogICAgICByZXR1cm4gUHJlc2VudGF0aW9uQ29ubmVjdGlvblN0YXRlLlRFUk1JTkFURUQ7CiAgICBkZWZhdWx0OgogICAgICBjb25zb2xlLmVycm9yKCdVbmtub3duIHByZXNlbnRhdGlvbiBjb25uZWN0aW9uIHN0YXRlOiAnICsgc3RhdGUpOwogICAgICByZXR1cm4gUHJlc2VudGF0aW9uQ29ubmVjdGlvblN0YXRlLlRFUk1JTkFURUQ7CiAgfQp9CgovKioKICogQ29udmVydHMgcHJlc2VudGF0aW9uIGNvbm5lY3Rpb24gY2xvc2UgcmVhc29uIHRvIE1vam8gZW51bSB2YWx1ZS4KICogQHBhcmFtIHshc3RyaW5nfSByZWFzb24KICogQHJldHVybiB7IW1lZGlhUm91dGVyLm1vam9tLk1lZGlhUm91dGVyLlByZXNlbnRhdGlvbkNvbm5lY3Rpb25DbG9zZVJlYXNvbn0KICovCmZ1bmN0aW9uIHByZXNlbnRhdGlvbkNvbm5lY3Rpb25DbG9zZVJlYXNvblRvTW9qb18ocmVhc29uKSB7CiAgdmFyIFByZXNlbnRhdGlvbkNvbm5lY3Rpb25DbG9zZVJlYXNvbiA9CiAgICAgIG1lZGlhUm91dGVyLm1vam9tLk1lZGlhUm91dGVyLlByZXNlbnRhdGlvbkNvbm5lY3Rpb25DbG9zZVJlYXNvbjsKICBzd2l0Y2ggKHJlYXNvbikgewogICAgY2FzZSAnZXJyb3InOgogICAgICByZXR1cm4gUHJlc2VudGF0aW9uQ29ubmVjdGlvbkNsb3NlUmVhc29uLkNPTk5FQ1RJT05fRVJST1I7CiAgICBjYXNlICdjbG9zZWQnOgogICAgICByZXR1cm4gUHJlc2VudGF0aW9uQ29ubmVjdGlvbkNsb3NlUmVhc29uLkNMT1NFRDsKICAgIGNhc2UgJ3dlbnRfYXdheSc6CiAgICAgIHJldHVybiBQcmVzZW50YXRpb25Db25uZWN0aW9uQ2xvc2VSZWFzb24uV0VOVF9BV0FZOwogICAgZGVmYXVsdDoKICAgICAgY29uc29sZS5lcnJvcignVW5rbm93biBwcmVzZW50YXRpb24gY29ubmVjdGlvbiBjbG9zZSByZWFzb24gOiAnICsKICAgICAgICAgIHJlYXNvbik7CiAgICAgIHJldHVybiBQcmVzZW50YXRpb25Db25uZWN0aW9uQ2xvc2VSZWFzb24uQ09OTkVDVElPTl9FUlJPUjsKICB9Cn0KCi8qKgogKiBDb252ZXJ0cyBzdHJpbmcgdG8gTW9qbyBvcmlnaW4uCiAqIEBwYXJhbSB7c3RyaW5nfCF1cmwubW9qb20uT3JpZ2lufSBvcmlnaW4KICogQHJldHVybiB7IXVybC5tb2pvbS5PcmlnaW59CiAqLwpmdW5jdGlvbiBzdHJpbmdUb01vam9PcmlnaW5fKG9yaWdpbikgewogIGlmIChvcmlnaW4gaW5zdGFuY2VvZiB1cmwubW9qb20uT3JpZ2luKSB7CiAgICByZXR1cm4gb3JpZ2luOwogIH0KICB2YXIgb3JpZ2luVXJsID0gbmV3IFVSTChvcmlnaW4pOwogIHZhciBtb2pvT3JpZ2luID0ge307CiAgbW9qb09yaWdpbi5zY2hlbWUgPSBvcmlnaW5VcmwucHJvdG9jb2wucmVwbGFjZSgnOicsICcnKTsKICBtb2pvT3JpZ2luLmhvc3QgPSBvcmlnaW5VcmwuaG9zdG5hbWU7CiAgdmFyIHBvcnQgPSBvcmlnaW5VcmwucG9ydCA/IE51bWJlci5wYXJzZUludChvcmlnaW5VcmwucG9ydCkgOiAwOwogIHN3aXRjaCAobW9qb09yaWdpbi5zY2hlbWUpIHsKICAgIGNhc2UgJ2h0dHAnOgogICAgICBtb2pvT3JpZ2luLnBvcnQgPSBwb3J0IHx8IDgwOwogICAgICBicmVhazsKICAgIGNhc2UgJ2h0dHBzJzoKICAgICAgbW9qb09yaWdpbi5wb3J0ID0gcG9ydCB8fCA0NDM7CiAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgdGhyb3cgbmV3IEVycm9yKCdTY2hlbWUgbXVzdCBiZSBodHRwIG9yIGh0dHBzJyk7CiAgfQogIG1vam9PcmlnaW4uc3Vib3JpZ2luID0gJyc7CiAgcmV0dXJuIG5ldyB1cmwubW9qb20uT3JpZ2luKG1vam9PcmlnaW4pOwp9CgovKioKICogUGFyc2VzIHRoZSBnaXZlbiByb3V0ZSByZXF1ZXN0IEVycm9yIG9iamVjdCBhbmQgY29udmVydHMgaXQgdG8gdGhlCiAqIGNvcnJlc3BvbmRpbmcgcmVzdWx0IGNvZGUuCiAqIEBwYXJhbSB7IUVycm9yfSBlcnJvcgogKiBAcmV0dXJuIHshbWVkaWFSb3V0ZXIubW9qb20uUm91dGVSZXF1ZXN0UmVzdWx0Q29kZX0KICovCmZ1bmN0aW9uIGdldFJvdXRlUmVxdWVzdFJlc3VsdENvZGVfKGVycm9yKSB7CiAgcmV0dXJuIGVycm9yLmVycm9yQ29kZSA/IGVycm9yLmVycm9yQ29kZSA6CiAgICBtZWRpYVJvdXRlci5tb2pvbS5Sb3V0ZVJlcXVlc3RSZXN1bHRDb2RlLlVOS05PV05fRVJST1I7Cn0KCi8qKgogKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgc3VjY2Vzc2Z1bCByb3V0ZSByZXNwb25zZSBmcm9tIGdpdmVuIHJvdXRlLgogKiBAcGFyYW0geyFNZWRpYVJvdXRlfSByb3V0ZQogKiBAcmV0dXJuIHshT2JqZWN0fQogKi8KZnVuY3Rpb24gdG9TdWNjZXNzUm91dGVSZXNwb25zZV8ocm91dGUpIHsKICByZXR1cm4gewogICAgICByb3V0ZTogcm91dGVUb01vam9fKHJvdXRlKSwKICAgICAgcmVzdWx0Q29kZTogbWVkaWFSb3V0ZXIubW9qb20uUm91dGVSZXF1ZXN0UmVzdWx0Q29kZS5PSwogIH07Cn0KCi8qKgogKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgZXJyb3Igcm91dGUgcmVzcG9uc2UgZnJvbSBnaXZlbiBFcnJvciBvYmplY3QuCiAqIEBwYXJhbSB7IUVycm9yfSBlcnJvcgogKiBAcmV0dXJuIHshT2JqZWN0fQogKi8KZnVuY3Rpb24gdG9FcnJvclJvdXRlUmVzcG9uc2VfKGVycm9yKSB7CiAgcmV0dXJuIHsKICAgICAgZXJyb3JUZXh0OiBlcnJvci5tZXNzYWdlLAogICAgICByZXN1bHRDb2RlOiBnZXRSb3V0ZVJlcXVlc3RSZXN1bHRDb2RlXyhlcnJvcikKICB9Owp9CgovKioKICogQ3JlYXRlcyBhIG5ldyBNZWRpYVJvdXRlci4KICogQ29udmVydHMgYSByb3V0ZSBzdHJ1Y3QgdG8gaXRzIE1vam8gZm9ybS4KICogQHBhcmFtIHshbWVkaWFSb3V0ZXIubW9qb20uTWVkaWFSb3V0ZXJQdHJ9IHNlcnZpY2UKICogQGNvbnN0cnVjdG9yCiAqLwpmdW5jdGlvbiBNZWRpYVJvdXRlcihzZXJ2aWNlKSB7CiAgLyoqCiAgICogVGhlIE1vam8gc2VydmljZSBwcm94eS4gQWxsb3dzIGV4dGVuc2lvbiBjb2RlIHRvIGNhbGwgbWV0aG9kcyB0aGF0IHJlc2lkZQogICAqIGluIHRoZSBicm93c2VyLgogICAqIEB0eXBlIHshbWVkaWFSb3V0ZXIubW9qb20uTWVkaWFSb3V0ZXJQdHJ9CiAgICovCiAgdGhpcy5zZXJ2aWNlXyA9IHNlcnZpY2U7CgogIC8qKgogICAqIFRoZSBwcm92aWRlciBtYW5hZ2VyIHNlcnZpY2UgZGVsZWdhdGUuIEl0cyBtZXRob2RzIGFyZSBjYWxsZWQgYnkgdGhlCiAgICogYnJvd3Nlci1yZXNpZGVudCBNb2pvIHNlcnZpY2UuCiAgICogQHR5cGUgeyFNZWRpYVJvdXRlcn0KICAgKi8KICB0aGlzLm1ycG1fID0gbmV3IE1lZGlhUm91dGVQcm92aWRlcih0aGlzKTsKCiAgLyoqCiAgICogSGFuZGxlIHRvIGEgS2VlcEFsaXZlIHNlcnZpY2Ugb2JqZWN0LCB3aGljaCBwcmV2ZW50cyB0aGUgZXh0ZW5zaW9uIGZyb20KICAgKiBiZWluZyBzdXNwZW5kZWQgYXMgbG9uZyBhcyBpdCByZW1haW5zIGluIHNjb3BlLgogICAqIEB0eXBlIHtib29sZWFufQogICAqLwogIHRoaXMua2VlcEFsaXZlXyA9IG51bGw7CgogIC8qKgogICAqIFRoZSBiaW5kaW5ncyB0byBiaW5kIHRoZSBzZXJ2aWNlIGRlbGVnYXRlIHRvIHRoZSBNb2pvIGludGVyZmFjZS4KICAgKiBPYmplY3QgbXVzdCByZW1haW4gaW4gc2NvcGUgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgY29ubmVjdGlvbiB0bwogICAqIHByZXZlbnQgdGhlIGNvbm5lY3Rpb24gZnJvbSBjbG9zaW5nIGF1dG9tYXRpY2FsbHkuCiAgICogQHR5cGUgeyFtb2pvLkJpbmRpbmd9CiAgICovCiAgdGhpcy5tZWRpYVJvdXRlUHJvdmlkZXJCaW5kaW5nXyA9IG5ldyBtb2pvLkJpbmRpbmcoCiAgICAgIG1lZGlhUm91dGVyLm1vam9tLk1lZGlhUm91dGVQcm92aWRlciwgdGhpcy5tcnBtXyk7Cn0KCi8qKgogKiBSZXR1cm5zIGRlZmluaXRpb25zIG9mIE1vam8gY29yZSBhbmQgZ2VuZXJhdGVkIE1vam9tIGNsYXNzZXMgdGhhdCBjYW4gYmUKICogdXNlZCBkaXJlY3RseSBieSB0aGUgY29tcG9uZW50LgogKiBAcmV0dXJuIHshT2JqZWN0fQogKiBUT0RPKGltY2hlbmcpOiBXZSBzaG91bGQgZXhwb3J0IHRoZXNlIGFsb25nIHdpdGggTWVkaWFSb3V0ZXIuIFRoaXMgcmVxdWlyZXMKICogdXMgdG8gbW9kaWZ5IHRoZSBjb21wb25lbnQgdG8gaGFuZGxlIG11bHRpcGxlIGV4cG9ydHMuIFdoZW4gdGhhdCBsb2dpYyBpcwogKiBiYWtlZCBpbiBmb3IgYSBjb3VwbGUgb2YgbWlsZXN0b25lcywgd2Ugc2hvdWxkIGJlIGFibGUgdG8gcmVtb3ZlIHRoaXMKICogbWV0aG9kLgogKiBUT0RPKGltY2hlbmcpOiBXZSBzaG91bGQgc3RvcCBleHBvcnRpbmcgbW9qbyBiaW5kaW5ncyBjbGFzc2VzIHRoYXQgdGhlCiAqIE1lZGlhIFJvdXRlciBleHRlbnNpb24gZG9lc24ndCBkaXJlY3RseSB1c2UsIHN1Y2ggYXMKICogbW9qby5Bc3NvY2lhdGVkSW50ZXJmYWNlUHRySW5mbywgbW9qby5JbnRlcmZhY2VQdHJDb250cm9sbGVyIGFuZAogKiBtb2pvLmludGVyZmFjZUNvbnRyb2wuCiAqLwpNZWRpYVJvdXRlci5wcm90b3R5cGUuZ2V0TW9qb0V4cG9ydHMgPSBmdW5jdGlvbigpIHsKICByZXR1cm4gewogICAgQXNzb2NpYXRlZEludGVyZmFjZVB0ckluZm86IG1vam8uQXNzb2NpYXRlZEludGVyZmFjZVB0ckluZm8sCiAgICBCaW5kaW5nOiBtb2pvLkJpbmRpbmcsCiAgICBEaWFsTWVkaWFTaW5rOiBEaWFsTWVkaWFTaW5rQWRhcHRlciwKICAgIENhc3RNZWRpYVNpbms6IENhc3RNZWRpYVNpbmtBZGFwdGVyLAogICAgSGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlcjoKICAgICAgICBtZWRpYVJvdXRlci5tb2pvbS5IYW5nb3V0c01lZGlhUm91dGVDb250cm9sbGVyLAogICAgSGFuZ291dHNNZWRpYVN0YXR1c0V4dHJhRGF0YTogSGFuZ291dHNNZWRpYVN0YXR1c0V4dHJhRGF0YUFkYXB0ZXIsCiAgICBJUEFkZHJlc3M6IElQQWRkcmVzc0FkYXB0ZXIsCiAgICBJUEVuZHBvaW50OiBJUEVuZHBvaW50QWRhcHRlciwKICAgIEludGVyZmFjZVB0ckNvbnRyb2xsZXI6IG1vam8uSW50ZXJmYWNlUHRyQ29udHJvbGxlciwKICAgIEludGVyZmFjZVB0ckluZm86IG1vam8uSW50ZXJmYWNlUHRySW5mbywKICAgIEludGVyZmFjZVJlcXVlc3Q6IG1vam8uSW50ZXJmYWNlUmVxdWVzdCwKICAgIE1lZGlhQ29udHJvbGxlcjogbWVkaWFSb3V0ZXIubW9qb20uTWVkaWFDb250cm9sbGVyLAogICAgTWVkaWFTdGF0dXM6IE1lZGlhU3RhdHVzQWRhcHRlciwKICAgIE1lZGlhU3RhdHVzT2JzZXJ2ZXJQdHI6IG1lZGlhUm91dGVyLm1vam9tLk1lZGlhU3RhdHVzT2JzZXJ2ZXJQdHIsCiAgICBNaXJyb3JTZXJ2aWNlUmVtb3RlcjogTWlycm9yU2VydmljZVJlbW90ZXJBZGFwdGVyLAogICAgTWlycm9yU2VydmljZVJlbW90ZXJQdHI6IE1pcnJvclNlcnZpY2VSZW1vdGVyUHRyQWRhcHRlciwKICAgIE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZVB0cjogTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlUHRyQWRhcHRlciwKICAgIFJlbW90aW5nU3RvcFJlYXNvbjogbWVkaWEubW9qb20uUmVtb3RpbmdTdG9wUmVhc29uLAogICAgUmVtb3RpbmdTdGFydEZhaWxSZWFzb246IG1lZGlhLm1vam9tLlJlbW90aW5nU3RhcnRGYWlsUmVhc29uLAogICAgUmVtb3RpbmdTaW5rRmVhdHVyZTogbWVkaWEubW9qb20uUmVtb3RpbmdTaW5rRmVhdHVyZSwKICAgIFJlbW90aW5nU2lua0F1ZGlvQ2FwYWJpbGl0eToKICAgICAgICBtZWRpYS5tb2pvbS5SZW1vdGluZ1NpbmtBdWRpb0NhcGFiaWxpdHksCiAgICBSZW1vdGluZ1NpbmtWaWRlb0NhcGFiaWxpdHk6CiAgICAgICAgbWVkaWEubW9qb20uUmVtb3RpbmdTaW5rVmlkZW9DYXBhYmlsaXR5LAogICAgUmVtb3RpbmdTaW5rTWV0YWRhdGE6IFJlbW90aW5nU2lua01ldGFkYXRhQWRhcHRlciwKICAgIFJvdXRlQ29udHJvbGxlclR5cGU6IG1lZGlhUm91dGVyLm1vam9tLlJvdXRlQ29udHJvbGxlclR5cGUsCiAgICBPcmlnaW46IHVybC5tb2pvbS5PcmlnaW4sCiAgICBTaW5rOiBNZWRpYVNpbmtBZGFwdGVyLAogICAgU2lua0V4dHJhRGF0YTogTWVkaWFTaW5rRXh0cmFEYXRhQWRhcHRlciwKICAgIFRpbWVEZWx0YTogbW9qby5jb21tb24ubW9qb20uVGltZURlbHRhLAogICAgVXJsOiB1cmwubW9qb20uVXJsLAogICAgaW50ZXJmYWNlQ29udHJvbDogbW9qby5pbnRlcmZhY2VDb250cm9sLAogICAgbWFrZVJlcXVlc3Q6IG1vam8ubWFrZVJlcXVlc3QsCiAgfTsKfTsKCi8qKgogKiBSZWdpc3RlcnMgdGhlIE1lZGlhIFJvdXRlciBQcm92aWRlciBNYW5hZ2VyIHdpdGggdGhlIE1lZGlhIFJvdXRlci4KICogQHJldHVybiB7IVByb21pc2U8T2JqZWN0Pn0gSW5zdGFuY2UgSUQgYW5kIGNvbmZpZyBmb3IgdGhlIE1lZGlhIFJvdXRlci4KICovCk1lZGlhUm91dGVyLnByb3RvdHlwZS5zdGFydCA9IGZ1bmN0aW9uKCkgewogIHJldHVybiB0aGlzLnNlcnZpY2VfLnJlZ2lzdGVyTWVkaWFSb3V0ZVByb3ZpZGVyKAogICAgICBtZWRpYVJvdXRlci5tb2pvbS5NZWRpYVJvdXRlUHJvdmlkZXIuSWQuRVhURU5TSU9OLAogICAgICB0aGlzLm1lZGlhUm91dGVQcm92aWRlckJpbmRpbmdfLmNyZWF0ZUludGVyZmFjZVB0ckFuZEJpbmQoKSkudGhlbigKICAgICAgICAgIGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgJ2luc3RhbmNlX2lkJzogcmVzcG9uc2UuaW5zdGFuY2VJZCwKICAgICAgICAgICAgICAnY29uZmlnJzogewogICAgICAgICAgICAgICAgJ2VuYWJsZV9kaWFsX2Rpc2NvdmVyeSc6IHJlc3BvbnNlLmNvbmZpZy5lbmFibGVEaWFsRGlzY292ZXJ5LAogICAgICAgICAgICAgICAgJ2VuYWJsZV9jYXN0X2Rpc2NvdmVyeSc6IHJlc3BvbnNlLmNvbmZpZy5lbmFibGVDYXN0RGlzY292ZXJ5LAogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgIH0pOwp9CgovKioKICogU2V0cyB0aGUgc2VydmljZSBkZWxlZ2F0ZSBtZXRob2RzLgogKiBAcGFyYW0ge09iamVjdH0gaGFuZGxlcnMKICovCk1lZGlhUm91dGVyLnByb3RvdHlwZS5zZXRIYW5kbGVycyA9IGZ1bmN0aW9uKGhhbmRsZXJzKSB7CiAgdGhpcy5tcnBtXy5zZXRIYW5kbGVycyhoYW5kbGVycyk7Cn0KCi8qKgogKiBUaGUga2VlcCBhbGl2ZSBzdGF0dXMuCiAqIEByZXR1cm4ge2Jvb2xlYW59CiAqLwpNZWRpYVJvdXRlci5wcm90b3R5cGUuZ2V0S2VlcEFsaXZlID0gZnVuY3Rpb24oKSB7CiAgcmV0dXJuIHRoaXMua2VlcEFsaXZlXyAhPSBudWxsOwp9OwoKLyoqCiAqIENhbGxlZCBieSB0aGUgcHJvdmlkZXIgbWFuYWdlciB3aGVuIGEgc2luayBsaXN0IGZvciBhIGdpdmVuIHNvdXJjZSBpcwogKiB1cGRhdGVkLgogKiBAcGFyYW0geyFzdHJpbmd9IHNvdXJjZVVybgogKiBAcGFyYW0geyFBcnJheTwhTWVkaWFTaW5rPn0gc2lua3MKICogQHBhcmFtIHshQXJyYXk8c3RyaW5nfCF1cmwubW9qb20uT3JpZ2luPn0gb3JpZ2lucwogKi8KTWVkaWFSb3V0ZXIucHJvdG90eXBlLm9uU2lua3NSZWNlaXZlZCA9IGZ1bmN0aW9uKHNvdXJjZVVybiwgc2lua3MsIG9yaWdpbnMpIHsKICAvLyB8b3JpZ2luc3wgaXMgYSBzdHJpbmcgYXJyYXkgaWYgdGhlIE1lZGlhIFJvdXRlciBjb21wb25lbnQgZXh0ZW5zaW9uIHZlcnNpb24KICAvLyBpcyA1OSBvciBvbGRlci4gV2l0aG91dCB0aGUgc3RyaW5nVG9Nb2pvT3JpZ2luXygpIGNvbnZlcnNpb24sIGNsaWVudHMgdXNpbmcKICAvLyB0aG9zZSBleHRlbnNpb24gdmVyc2lvbnMgd291bGQgc2VlIGEgY3Jhc2ggc2hvd24gaW4KICAvLyBodHRwczovL2NyYnVnLmNvbS83ODc0MjcuCiAgdGhpcy5zZXJ2aWNlXy5vblNpbmtzUmVjZWl2ZWQoCiAgICAgIG1lZGlhUm91dGVyLm1vam9tLk1lZGlhUm91dGVQcm92aWRlci5JZC5FWFRFTlNJT04sIHNvdXJjZVVybiwKICAgICAgc2lua3MubWFwKHNpbmtUb01vam9fKSwgb3JpZ2lucy5tYXAoc3RyaW5nVG9Nb2pvT3JpZ2luXykpOwp9OwoKLyoqCiAqIENhbGxlZCBieSB0aGUgcHJvdmlkZXIgbWFuYWdlciB3aGVuIGEgc2luayBpcyBmb3VuZCB0byBub3RpZnkgdGhlIE1SIG9mIHRoZQogKiBzaW5rJ3MgSUQuIFRoZSBhY3R1YWwgc2luayB3aWxsIGJlIHJldHVybmVkIHRocm91Z2ggdGhlIG5vcm1hbCBzaW5rIGxpc3QKICogdXBkYXRlIHByb2Nlc3MsIHNvIHRoaXMgaGVscHMgdGhlIE1SIGlkZW50aWZ5IHRoZSBzZWFyY2ggcmVzdWx0IGluIHRoZQogKiBsaXN0LgogKiBAcGFyYW0ge3N0cmluZ30gcHNldWRvU2lua0lkICBJRCBvZiB0aGUgcHNldWRvIHNpbmsgdGhhdCBzdGFydGVkIHRoZQogKiAgICAgc2VhcmNoLgogKiBAcGFyYW0ge3N0cmluZ30gc2lua0lkIElEIG9mIHRoZSBuZXdseS1mb3VuZCBzaW5rLgogKi8KTWVkaWFSb3V0ZXIucHJvdG90eXBlLm9uU2VhcmNoU2lua0lkUmVjZWl2ZWQgPSBmdW5jdGlvbigKICAgIHBzZXVkb1NpbmtJZCwgc2lua0lkKSB7CiAgdGhpcy5zZXJ2aWNlXy5vblNlYXJjaFNpbmtJZFJlY2VpdmVkKHBzZXVkb1NpbmtJZCwgc2lua0lkKTsKfTsKCi8qKgogKiBDYWxsZWQgYnkgdGhlIHByb3ZpZGVyIG1hbmFnZXIgdG8ga2VlcCB0aGUgZXh0ZW5zaW9uIGZyb20gc3VzcGVuZGluZwogKiBpZiBpdCBlbnRlcnMgYSBzdGF0ZSB3aGVyZSBzdXNwZW5zaW9uIGlzIHVuZGVzaXJhYmxlIChlLmcuIHRoZXJlIGlzIGFuCiAqIGFjdGl2ZSBNZWRpYVJvdXRlLikKICogSWYga2VlcEFsaXZlIGlzIHRydWUsIHRoZSBleHRlbnNpb24gaXMga2VwdCBhbGl2ZS4KICogSWYga2VlcEFsaXZlIGlzIGZhbHNlLCB0aGUgZXh0ZW5zaW9uIGlzIGFsbG93ZWQgdG8gc3VzcGVuZC4KICogQHBhcmFtIHtib29sZWFufSBrZWVwQWxpdmUKICovCk1lZGlhUm91dGVyLnByb3RvdHlwZS5zZXRLZWVwQWxpdmUgPSBmdW5jdGlvbihrZWVwQWxpdmUpIHsKICBpZiAoa2VlcEFsaXZlID09PSBmYWxzZSAmJiB0aGlzLmtlZXBBbGl2ZV8pIHsKICAgIHRoaXMua2VlcEFsaXZlXy5wdHIucmVzZXQoKTsKICAgIHRoaXMua2VlcEFsaXZlXyA9IG51bGw7CiAgfSBlbHNlIGlmIChrZWVwQWxpdmUgPT09IHRydWUgJiYgIXRoaXMua2VlcEFsaXZlXykgewogICAgdGhpcy5rZWVwQWxpdmVfID0gbmV3IGV4dGVuc2lvbnMuS2VlcEFsaXZlUHRyOwogICAgTW9qby5iaW5kSW50ZXJmYWNlKGV4dGVuc2lvbnMuS2VlcEFsaXZlLm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgbW9qby5tYWtlUmVxdWVzdCh0aGlzLmtlZXBBbGl2ZV8pLmhhbmRsZSk7CiAgfQp9OwoKLyoqCiAqIENhbGxlZCBieSB0aGUgcHJvdmlkZXIgbWFuYWdlciB0byBzZW5kIGFuIGlzc3VlIGZyb20gYSBtZWRpYSByb3V0ZQogKiBwcm92aWRlciB0byB0aGUgTWVkaWEgUm91dGVyLCB0byBzaG93IHRoZSB1c2VyLgogKiBAcGFyYW0geyFPYmplY3R9IGlzc3VlIFRoZSBpc3N1ZSBvYmplY3QuCiAqLwpNZWRpYVJvdXRlci5wcm90b3R5cGUub25Jc3N1ZSA9IGZ1bmN0aW9uKGlzc3VlKSB7CiAgZnVuY3Rpb24gaXNzdWVTZXZlcml0eVRvTW9qb18oc2V2ZXJpdHkpIHsKICAgIHN3aXRjaCAoc2V2ZXJpdHkpIHsKICAgICAgY2FzZSAnZmF0YWwnOgogICAgICAgIHJldHVybiBtZWRpYVJvdXRlci5tb2pvbS5Jc3N1ZS5TZXZlcml0eS5GQVRBTDsKICAgICAgY2FzZSAnd2FybmluZyc6CiAgICAgICAgcmV0dXJuIG1lZGlhUm91dGVyLm1vam9tLklzc3VlLlNldmVyaXR5LldBUk5JTkc7CiAgICAgIGNhc2UgJ25vdGlmaWNhdGlvbic6CiAgICAgICAgcmV0dXJuIG1lZGlhUm91dGVyLm1vam9tLklzc3VlLlNldmVyaXR5Lk5PVElGSUNBVElPTjsKICAgICAgZGVmYXVsdDoKICAgICAgICBjb25zb2xlLmVycm9yKCdVbmtub3duIGlzc3VlIHNldmVyaXR5OiAnICsgc2V2ZXJpdHkpOwogICAgICAgIHJldHVybiBtZWRpYVJvdXRlci5tb2pvbS5Jc3N1ZS5TZXZlcml0eS5OT1RJRklDQVRJT047CiAgICB9CiAgfQoKICBmdW5jdGlvbiBpc3N1ZUFjdGlvblRvTW9qb18oYWN0aW9uKSB7CiAgICBzd2l0Y2ggKGFjdGlvbikgewogICAgICBjYXNlICdkaXNtaXNzJzoKICAgICAgICByZXR1cm4gbWVkaWFSb3V0ZXIubW9qb20uSXNzdWUuQWN0aW9uVHlwZS5ESVNNSVNTOwogICAgICBjYXNlICdsZWFybl9tb3JlJzoKICAgICAgICByZXR1cm4gbWVkaWFSb3V0ZXIubW9qb20uSXNzdWUuQWN0aW9uVHlwZS5MRUFSTl9NT1JFOwogICAgICBkZWZhdWx0OgogICAgICAgIGNvbnNvbGUuZXJyb3IoJ1Vua25vd24gaXNzdWUgYWN0aW9uIHR5cGUgOiAnICsgYWN0aW9uKTsKICAgICAgICByZXR1cm4gbWVkaWFSb3V0ZXIubW9qb20uSXNzdWUuQWN0aW9uVHlwZS5PSzsKICAgIH0KICB9CgogIHZhciBzZWNvbmRhcnlBY3Rpb25zID0gKGlzc3VlLnNlY29uZGFyeUFjdGlvbnMgfHwgW10pLm1hcChpc3N1ZUFjdGlvblRvTW9qb18pOwogIHRoaXMuc2VydmljZV8ub25Jc3N1ZShuZXcgbWVkaWFSb3V0ZXIubW9qb20uSXNzdWUoewogICAgJ3JvdXRlSWQnOiBpc3N1ZS5yb3V0ZUlkIHx8ICcnLAogICAgJ3NldmVyaXR5JzogaXNzdWVTZXZlcml0eVRvTW9qb18oaXNzdWUuc2V2ZXJpdHkpLAogICAgJ3RpdGxlJzogaXNzdWUudGl0bGUsCiAgICAnbWVzc2FnZSc6IGlzc3VlLm1lc3NhZ2UgfHwgJycsCiAgICAnZGVmYXVsdEFjdGlvbic6IGlzc3VlQWN0aW9uVG9Nb2pvXyhpc3N1ZS5kZWZhdWx0QWN0aW9uKSwKICAgICdzZWNvbmRhcnlBY3Rpb25zJzogc2Vjb25kYXJ5QWN0aW9ucywKICAgICdoZWxwUGFnZUlkJzogaXNzdWUuaGVscFBhZ2VJZCwKICAgICdpc0Jsb2NraW5nJzogaXNzdWUuaXNCbG9ja2luZwogIH0pKTsKfTsKCi8qKgogKiBDYWxsZWQgYnkgdGhlIHByb3ZpZGVyIG1hbmFnZXIgd2hlbiB0aGUgc2V0IG9mIGFjdGl2ZSByb3V0ZXMKICogaGFzIGJlZW4gdXBkYXRlZC4KICogQHBhcmFtIHshQXJyYXk8TWVkaWFSb3V0ZT59IHJvdXRlcyBUaGUgYWN0aXZlIHNldCBvZiBtZWRpYSByb3V0ZXMuCiAqIEBwYXJhbSB7c3RyaW5nPX0gc291cmNlVXJuIFRoZSBzb3VyY2VVcm4gYXNzb2NpYXRlZCB3aXRoIHRoaXMgcm91dGUKICogICAgIHF1ZXJ5LgogKiBAcGFyYW0ge0FycmF5PHN0cmluZz49fSBqb2luYWJsZVJvdXRlSWRzIFRoZSBhY3RpdmUgc2V0IG9mIGpvaW5hYmxlCiAqICAgICBtZWRpYSByb3V0ZXMuCiAqLwpNZWRpYVJvdXRlci5wcm90b3R5cGUub25Sb3V0ZXNVcGRhdGVkID0gZnVuY3Rpb24oCiAgICByb3V0ZXMsIHNvdXJjZVVybiA9ICcnLCBqb2luYWJsZVJvdXRlSWRzID0gW10pIHsKICB0aGlzLnNlcnZpY2VfLm9uUm91dGVzVXBkYXRlZCgKICAgICAgbWVkaWFSb3V0ZXIubW9qb20uTWVkaWFSb3V0ZVByb3ZpZGVyLklkLkVYVEVOU0lPTiwKICAgICAgcm91dGVzLm1hcChyb3V0ZVRvTW9qb18pLCBzb3VyY2VVcm4sIGpvaW5hYmxlUm91dGVJZHMpOwp9OwoKLyoqCiAqIENhbGxlZCBieSB0aGUgcHJvdmlkZXIgbWFuYWdlciB3aGVuIHNpbmsgYXZhaWxhYmlsaXR5IGhhcyBiZWVuIHVwZGF0ZWQuCiAqIEBwYXJhbSB7IW1lZGlhUm91dGVyLm1vam9tLk1lZGlhUm91dGVyLlNpbmtBdmFpbGFiaWxpdHl9IGF2YWlsYWJpbGl0eQogKiAgICAgVGhlIG5ldyBzaW5rIGF2YWlsYWJpbGl0eS4KICovCk1lZGlhUm91dGVyLnByb3RvdHlwZS5vblNpbmtBdmFpbGFiaWxpdHlVcGRhdGVkID0gZnVuY3Rpb24oYXZhaWxhYmlsaXR5KSB7CiAgdGhpcy5zZXJ2aWNlXy5vblNpbmtBdmFpbGFiaWxpdHlVcGRhdGVkKAogICAgICBtZWRpYVJvdXRlci5tb2pvbS5NZWRpYVJvdXRlUHJvdmlkZXIuSWQuRVhURU5TSU9OLCBhdmFpbGFiaWxpdHkpOwp9OwoKLyoqCiAqIENhbGxlZCBieSB0aGUgcHJvdmlkZXIgbWFuYWdlciB3aGVuIHRoZSBzdGF0ZSBvZiBhIHByZXNlbnRhdGlvbiBjb25uZWN0ZWQKICogdG8gYSByb3V0ZSBoYXMgY2hhbmdlZC4KICogQHBhcmFtIHtzdHJpbmd9IHJvdXRlSWQKICogQHBhcmFtIHtzdHJpbmd9IHN0YXRlCiAqLwpNZWRpYVJvdXRlci5wcm90b3R5cGUub25QcmVzZW50YXRpb25Db25uZWN0aW9uU3RhdGVDaGFuZ2VkID0KICAgIGZ1bmN0aW9uKHJvdXRlSWQsIHN0YXRlKSB7CiAgdGhpcy5zZXJ2aWNlXy5vblByZXNlbnRhdGlvbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZWQoCiAgICAgIHJvdXRlSWQsIHByZXNlbnRhdGlvbkNvbm5lY3Rpb25TdGF0ZVRvTW9qb18oc3RhdGUpKTsKfTsKCi8qKgogKiBDYWxsZWQgYnkgdGhlIHByb3ZpZGVyIG1hbmFnZXIgd2hlbiB0aGUgc3RhdGUgb2YgYSBwcmVzZW50YXRpb24gY29ubmVjdGVkCiAqIHRvIGEgcm91dGUgaGFzIGNsb3NlZC4KICogQHBhcmFtIHtzdHJpbmd9IHJvdXRlSWQKICogQHBhcmFtIHtzdHJpbmd9IHJlYXNvbgogKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZQogKi8KTWVkaWFSb3V0ZXIucHJvdG90eXBlLm9uUHJlc2VudGF0aW9uQ29ubmVjdGlvbkNsb3NlZCA9CiAgICBmdW5jdGlvbihyb3V0ZUlkLCByZWFzb24sIG1lc3NhZ2UpIHsKICB0aGlzLnNlcnZpY2VfLm9uUHJlc2VudGF0aW9uQ29ubmVjdGlvbkNsb3NlZCgKICAgICAgcm91dGVJZCwgcHJlc2VudGF0aW9uQ29ubmVjdGlvbkNsb3NlUmVhc29uVG9Nb2pvXyhyZWFzb24pLCBtZXNzYWdlKTsKfTsKCi8qKgogKiBAcGFyYW0ge3N0cmluZ30gcm91dGVJZAogKiBAcGFyYW0geyFBcnJheTwhUm91dGVNZXNzYWdlPn0gbWVzYWdlcwogKi8KTWVkaWFSb3V0ZXIucHJvdG90eXBlLm9uUm91dGVNZXNzYWdlc1JlY2VpdmVkID0gZnVuY3Rpb24ocm91dGVJZCwgbWVzc2FnZXMpIHsKICB0aGlzLnNlcnZpY2VfLm9uUm91dGVNZXNzYWdlc1JlY2VpdmVkKAogICAgICByb3V0ZUlkLCBtZXNzYWdlcy5tYXAobWVzc2FnZVRvTW9qb18pKTsKfTsKCi8qKgogKiBAcGFyYW0ge251bWJlcn0gdGFiSWQKICogQHBhcmFtIHshbWVkaWEubW9qb20uTWlycm9yU2VydmljZVJlbW90ZXJQdHJ9IHJlbW90ZXIKICogQHBhcmFtIHshbW9qby5JbnRlcmZhY2VSZXF1ZXN0fSByZW1vdGluZ1NvdXJjZQogKi8KTWVkaWFSb3V0ZXIucHJvdG90eXBlLm9uTWVkaWFSZW1vdGVyQ3JlYXRlZCA9IGZ1bmN0aW9uKHRhYklkLCByZW1vdGVyLAogICAgcmVtb3RpbmdTb3VyY2UpIHsKICB0aGlzLnNlcnZpY2VfLm9uTWVkaWFSZW1vdGVyQ3JlYXRlZCgKICAgICAgdGFiSWQsCiAgICAgIG5ldyBtZWRpYS5tb2pvbS5NaXJyb3JTZXJ2aWNlUmVtb3RlclB0cihyZW1vdGVyLnB0ci5wYXNzSW50ZXJmYWNlKCkpLAogICAgICByZW1vdGluZ1NvdXJjZSk7Cn0KCi8qKgogKiBPYmplY3QgY29udGFpbmluZyBjYWxsYmFja3Mgc2V0IGJ5IHRoZSBwcm92aWRlciBtYW5hZ2VyLgogKgogKiBAY29uc3RydWN0b3IKICogQHN0cnVjdAogKi8KZnVuY3Rpb24gTWVkaWFSb3V0ZXJIYW5kbGVycygpIHsKICAvKioKICAgKiBAdHlwZSB7ZnVuY3Rpb24oIXN0cmluZywgIXN0cmluZywgIXN0cmluZywgIXN0cmluZywgIW51bWJlcil9CiAgICovCiAgdGhpcy5jcmVhdGVSb3V0ZSA9IG51bGw7CgogIC8qKgogICAqIEB0eXBlIHtmdW5jdGlvbighc3RyaW5nLCAhc3RyaW5nLCAhc3RyaW5nLCAhbnVtYmVyKX0KICAgKi8KICB0aGlzLmpvaW5Sb3V0ZSA9IG51bGw7CgogIC8qKgogICAqIEB0eXBlIHtmdW5jdGlvbihzdHJpbmcpOiBQcm9taXNlfQogICAqLwogIHRoaXMudGVybWluYXRlUm91dGUgPSBudWxsOwoKICAvKioKICAgKiBAdHlwZSB7ZnVuY3Rpb24oc3RyaW5nKX0KICAgKi8KICB0aGlzLnN0YXJ0T2JzZXJ2aW5nTWVkaWFTaW5rcyA9IG51bGw7CgogIC8qKgogICAqIEB0eXBlIHtmdW5jdGlvbihzdHJpbmcpfQogICAqLwogIHRoaXMuc3RvcE9ic2VydmluZ01lZGlhU2lua3MgPSBudWxsOwoKICAvKioKICAgKiBAdHlwZSB7ZnVuY3Rpb24oc3RyaW5nLCBzdHJpbmcpOiBQcm9taXNlfQogICAqLwogIHRoaXMuc2VuZFJvdXRlTWVzc2FnZSA9IG51bGw7CgogIC8qKgogICAqIEB0eXBlIHtmdW5jdGlvbihzdHJpbmcsIFVpbnQ4QXJyYXkpOiBQcm9taXNlfQogICAqLwogIHRoaXMuc2VuZFJvdXRlQmluYXJ5TWVzc2FnZSA9IG51bGw7CgogIC8qKgogICAqIEB0eXBlIHtmdW5jdGlvbihzdHJpbmcpfQogICAqLwogIHRoaXMuc3RhcnRMaXN0ZW5pbmdGb3JSb3V0ZU1lc3NhZ2VzID0gbnVsbDsKCiAgLyoqCiAgICogQHR5cGUge2Z1bmN0aW9uKHN0cmluZyl9CiAgICovCiAgdGhpcy5zdG9wTGlzdGVuaW5nRm9yUm91dGVNZXNzYWdlcyA9IG51bGw7CgogIC8qKgogICAqIEB0eXBlIHtmdW5jdGlvbihzdHJpbmcpfQogICAqLwogIHRoaXMuZGV0YWNoUm91dGUgPSBudWxsOwoKICAvKioKICAgKiBAdHlwZSB7ZnVuY3Rpb24oKX0KICAgKi8KICB0aGlzLnN0YXJ0T2JzZXJ2aW5nTWVkaWFSb3V0ZXMgPSBudWxsOwoKICAvKioKICAgKiBAdHlwZSB7ZnVuY3Rpb24oKX0KICAgKi8KICB0aGlzLnN0b3BPYnNlcnZpbmdNZWRpYVJvdXRlcyA9IG51bGw7CgogIC8qKgogICAqIEB0eXBlIHtmdW5jdGlvbigpfQogICAqLwogIHRoaXMuY29ubmVjdFJvdXRlQnlSb3V0ZUlkID0gbnVsbDsKCiAgLyoqCiAgICogQHR5cGUge2Z1bmN0aW9uKCl9CiAgICovCiAgdGhpcy5lbmFibGVNZG5zRGlzY292ZXJ5ID0gbnVsbDsKCiAgLyoqCiAgICogQHR5cGUge2Z1bmN0aW9uKCl9CiAgICovCiAgdGhpcy51cGRhdGVNZWRpYVNpbmtzID0gbnVsbDsKCiAgLyoqCiAgICogQHR5cGUge2Z1bmN0aW9uKHN0cmluZywgc3RyaW5nLCAhU2lua1NlYXJjaENyaXRlcmlhKTogc3RyaW5nfQogICAqLwogIHRoaXMuc2VhcmNoU2lua3MgPSBudWxsOwoKICAvKioKICAgKiBAdHlwZSB7ZnVuY3Rpb24oKX0KICAgKi8KICB0aGlzLnByb3ZpZGVTaW5rcyA9IG51bGw7CgogIC8qKgogICAqIEB0eXBlIHtmdW5jdGlvbihzdHJpbmcsICFtb2pvLkludGVyZmFjZVJlcXVlc3QsCiAgICogICAgICAgICAgICAhbWVkaWFSb3V0ZXIubW9qb20uTWVkaWFTdGF0dXNPYnNlcnZlclB0cik6ICFQcm9taXNlPHZvaWQ+fQogICAqLwogIHRoaXMuY3JlYXRlTWVkaWFSb3V0ZUNvbnRyb2xsZXIgPSBudWxsOwp9OwoKLyoqCiAqIFJvdXRlcyBjYWxscyBmcm9tIE1lZGlhIFJvdXRlciB0byB0aGUgcHJvdmlkZXIgbWFuYWdlciBleHRlbnNpb24uCiAqIFJlZ2lzdGVyZWQgd2l0aCB0aGUgTWVkaWFSb3V0ZXIgc3R1Yi4KICogQHBhcmFtIHshTWVkaWFSb3V0ZXJ9IE1lZGlhUm91dGVyIHByb3h5IHRvIGNhbGwgaW50byB0aGUKICogTWVkaWEgUm91dGVyIG1vam8gaW50ZXJmYWNlLgogKiBAY29uc3RydWN0b3IKICovCmZ1bmN0aW9uIE1lZGlhUm91dGVQcm92aWRlcihtZWRpYVJvdXRlcikgewogIC8qKgogICAqIE9iamVjdCBjb250YWluaW5nIEpTIGNhbGxiYWNrcyBpbnRvIFByb3ZpZGVyIE1hbmFnZXIgY29kZS4KICAgKiBAdHlwZSB7IU1lZGlhUm91dGVySGFuZGxlcnN9CiAgICovCiAgdGhpcy5oYW5kbGVyc18gPSBuZXcgTWVkaWFSb3V0ZXJIYW5kbGVycygpOwoKICAvKioKICAgKiBQcm94eSBjbGFzcyB0byB0aGUgYnJvd3NlcidzIE1lZGlhIFJvdXRlciBNb2pvIHNlcnZpY2UuCiAgICogQHR5cGUgeyFNZWRpYVJvdXRlcn0KICAgKi8KICB0aGlzLm1lZGlhUm91dGVyXyA9IG1lZGlhUm91dGVyOwp9CgovKgogKiBTZXRzIHRoZSBjYWxsYmFjayBoYW5kbGVyIHVzZWQgdG8gaW52b2tlIG1ldGhvZHMgaW4gdGhlIHByb3ZpZGVyIG1hbmFnZXIuCiAqCiAqIEBwYXJhbSB7IU1lZGlhUm91dGVySGFuZGxlcnN9IGhhbmRsZXJzCiAqLwpNZWRpYVJvdXRlUHJvdmlkZXIucHJvdG90eXBlLnNldEhhbmRsZXJzID0gZnVuY3Rpb24oaGFuZGxlcnMpIHsKICB0aGlzLmhhbmRsZXJzXyA9IGhhbmRsZXJzOwogIHZhciByZXF1aXJlZEhhbmRsZXJzID0gWwogICAgJ3N0b3BPYnNlcnZpbmdNZWRpYVJvdXRlcycsCiAgICAnc3RhcnRPYnNlcnZpbmdNZWRpYVJvdXRlcycsCiAgICAnc2VuZFJvdXRlTWVzc2FnZScsCiAgICAnc2VuZFJvdXRlQmluYXJ5TWVzc2FnZScsCiAgICAnc3RhcnRMaXN0ZW5pbmdGb3JSb3V0ZU1lc3NhZ2VzJywKICAgICdzdG9wTGlzdGVuaW5nRm9yUm91dGVNZXNzYWdlcycsCiAgICAnZGV0YWNoUm91dGUnLAogICAgJ3Rlcm1pbmF0ZVJvdXRlJywKICAgICdqb2luUm91dGUnLAogICAgJ2NyZWF0ZVJvdXRlJywKICAgICdzdG9wT2JzZXJ2aW5nTWVkaWFTaW5rcycsCiAgICAnc3RhcnRPYnNlcnZpbmdNZWRpYVJvdXRlcycsCiAgICAnY29ubmVjdFJvdXRlQnlSb3V0ZUlkJywKICAgICdlbmFibGVNZG5zRGlzY292ZXJ5JywKICAgICd1cGRhdGVNZWRpYVNpbmtzJywKICAgICdzZWFyY2hTaW5rcycsCiAgICAncHJvdmlkZVNpbmtzJywKICAgICdjcmVhdGVNZWRpYVJvdXRlQ29udHJvbGxlcicsCiAgICAnb25CZWZvcmVJbnZva2VIYW5kbGVyJwogIF07CiAgcmVxdWlyZWRIYW5kbGVycy5mb3JFYWNoKGZ1bmN0aW9uKG5leHRIYW5kbGVyKSB7CiAgICBpZiAoaGFuZGxlcnNbbmV4dEhhbmRsZXJdID09PSB1bmRlZmluZWQpIHsKICAgICAgY29uc29sZS5lcnJvcihuZXh0SGFuZGxlciArICcgaGFuZGxlciBub3QgcmVnaXN0ZXJlZC4nKTsKICAgIH0KICB9KTsKfQoKLyoqCiAqIFN0YXJ0cyBxdWVyeWluZyBmb3Igc2lua3MgY2FwYWJsZSBvZiBkaXNwbGF5aW5nIHRoZSBtZWRpYSBzb3VyY2UKICogZGVzaWduYXRlZCBieSB8c291cmNlVXJufC4gIFJlc3VsdHMgYXJlIHJldHVybmVkIGJ5IGNhbGxpbmcKICogT25TaW5rc1JlY2VpdmVkLgogKiBAcGFyYW0geyFzdHJpbmd9IHNvdXJjZVVybgogKi8KTWVkaWFSb3V0ZVByb3ZpZGVyLnByb3RvdHlwZS5zdGFydE9ic2VydmluZ01lZGlhU2lua3MgPQogICAgZnVuY3Rpb24oc291cmNlVXJuKSB7CiAgdGhpcy5oYW5kbGVyc18ub25CZWZvcmVJbnZva2VIYW5kbGVyKCk7CiAgdGhpcy5oYW5kbGVyc18uc3RhcnRPYnNlcnZpbmdNZWRpYVNpbmtzKHNvdXJjZVVybik7Cn07CgovKioKICogU3RvcHMgcXVlcnlpbmcgZm9yIHNpbmtzIGNhcGFibGUgb2YgZGlzcGxheWluZyB8c291cmNlVXJufC4KICogQHBhcmFtIHshc3RyaW5nfSBzb3VyY2VVcm4KICovCk1lZGlhUm91dGVQcm92aWRlci5wcm90b3R5cGUuc3RvcE9ic2VydmluZ01lZGlhU2lua3MgPQogICAgZnVuY3Rpb24oc291cmNlVXJuKSB7CiAgdGhpcy5oYW5kbGVyc18ub25CZWZvcmVJbnZva2VIYW5kbGVyKCk7CiAgdGhpcy5oYW5kbGVyc18uc3RvcE9ic2VydmluZ01lZGlhU2lua3Moc291cmNlVXJuKTsKfTsKCi8qKgogKiBSZXF1ZXN0cyB0aGF0IHxzaW5rSWR8IHJlbmRlciB0aGUgbWVkaWEgcmVmZXJlbmNlZCBieSB8c291cmNlVXJufC4gSWYgdGhlCiAqIHJlcXVlc3QgaXMgZnJvbSB0aGUgUHJlc2VudGF0aW9uIEFQSSwgdGhlbiBvcmlnaW4gYW5kIHRhYklkIHdpbGwKICogYmUgcG9wdWxhdGVkLgogKiBAcGFyYW0geyFzdHJpbmd9IHNvdXJjZVVybiBNZWRpYSBzb3VyY2UgdG8gcmVuZGVyLgogKiBAcGFyYW0geyFzdHJpbmd9IHNpbmtJZCBNZWRpYSBzaW5rIElELgogKiBAcGFyYW0geyFzdHJpbmd9IHByZXNlbnRhdGlvbklkIFByZXNlbnRhdGlvbiBJRCBmcm9tIHRoZSBzaXRlCiAqICAgICByZXF1ZXN0aW5nIHByZXNlbnRhdGlvbi4gVE9ETyhtZm9sdHopOiBSZW1vdmUuCiAqIEBwYXJhbSB7IXVybC5tb2pvbS5PcmlnaW59IG9yaWdpbiBPcmlnaW4gb2Ygc2l0ZSByZXF1ZXN0aW5nIHByZXNlbnRhdGlvbi4KICogQHBhcmFtIHshbnVtYmVyfSB0YWJJZCBJRCBvZiB0YWIgcmVxdWVzdGluZyBwcmVzZW50YXRpb24uCiAqIEBwYXJhbSB7IW1vam8uY29tbW9uLm1vam9tLlRpbWVEZWx0YX0gdGltZW91dCBJZiBwb3NpdGl2ZSwgdGhlIHRpbWVvdXQKICogICAgIGR1cmF0aW9uIGZvciB0aGUgcmVxdWVzdC4gT3RoZXJ3aXNlLCB0aGUgZGVmYXVsdCBkdXJhdGlvbiB3aWxsIGJlIHVzZWQuCiAqIEBwYXJhbSB7IWJvb2xlYW59IGluY29nbml0byBJZiB0cnVlLCB0aGUgcm91dGUgaXMgYmVpbmcgcmVxdWVzdGVkIGJ5CiAqICAgICBhbiBpbmNvZ25pdG8gcHJvZmlsZS4KICogQHJldHVybiB7IVByb21pc2UuPCFPYmplY3Q+fSBBIFByb21pc2UgcmVzb2x2aW5nIHRvIGFuIG9iamVjdCBkZXNjcmliaW5nCiAqICAgICB0aGUgbmV3bHkgY3JlYXRlZCBtZWRpYSByb3V0ZSwgb3IgcmVqZWN0aW5nIHdpdGggYW4gZXJyb3IgbWVzc2FnZSBvbgogKiAgICAgZmFpbHVyZS4KICovCk1lZGlhUm91dGVQcm92aWRlci5wcm90b3R5cGUuY3JlYXRlUm91dGUgPQogICAgZnVuY3Rpb24oc291cmNlVXJuLCBzaW5rSWQsIHByZXNlbnRhdGlvbklkLCBvcmlnaW4sIHRhYklkLAogICAgICAgICAgICAgdGltZW91dCwgaW5jb2duaXRvKSB7CiAgdGhpcy5oYW5kbGVyc18ub25CZWZvcmVJbnZva2VIYW5kbGVyKCk7CiAgcmV0dXJuIHRoaXMuaGFuZGxlcnNfLmNyZWF0ZVJvdXRlKAogICAgICBzb3VyY2VVcm4sIHNpbmtJZCwgcHJlc2VudGF0aW9uSWQsIG9yaWdpbiwgdGFiSWQsCiAgICAgIE1hdGguZmxvb3IodGltZW91dC5taWNyb3NlY29uZHMgLyAxMDAwKSwgaW5jb2duaXRvKQogICAgICAudGhlbihmdW5jdGlvbihyb3V0ZSkgewogICAgICAgIHJldHVybiB0b1N1Y2Nlc3NSb3V0ZVJlc3BvbnNlXyhyb3V0ZSk7CiAgICAgIH0sCiAgICAgIGZ1bmN0aW9uKGVycikgewogICAgICAgIHJldHVybiB0b0Vycm9yUm91dGVSZXNwb25zZV8oZXJyKTsKICAgICAgfSk7Cn07CgovKioKICogSGFuZGxlcyBhIHJlcXVlc3QgdmlhIHRoZSBQcmVzZW50YXRpb24gQVBJIHRvIGpvaW4gYW4gZXhpc3Rpbmcgcm91dGUgZ2l2ZW4KICogYnkgfHNvdXJjZVVybnwgYW5kIHxwcmVzZW50YXRpb25JZHwuIHxvcmlnaW58IGFuZCB8dGFiSWR8IGFyZSB1c2VkIGZvcgogKiB2YWxpZGF0aW5nIHNhbWUtb3JpZ2luL3RhYiBzY29wZS4KICogQHBhcmFtIHshc3RyaW5nfSBzb3VyY2VVcm4gTWVkaWEgc291cmNlIHRvIHJlbmRlci4KICogQHBhcmFtIHshc3RyaW5nfSBwcmVzZW50YXRpb25JZCBQcmVzZW50YXRpb24gSUQgdG8gam9pbi4KICogQHBhcmFtIHshdXJsLm1vam9tLk9yaWdpbn0gb3JpZ2luIE9yaWdpbiBvZiBzaXRlIHJlcXVlc3Rpbmcgam9pbi4KICogQHBhcmFtIHshbnVtYmVyfSB0YWJJZCBJRCBvZiB0YWIgcmVxdWVzdGluZyBqb2luLgogKiBAcGFyYW0geyFtb2pvLmNvbW1vbi5tb2pvbS5UaW1lRGVsdGF9IHRpbWVvdXQgSWYgcG9zaXRpdmUsIHRoZSB0aW1lb3V0CiAqICAgICBkdXJhdGlvbiBmb3IgdGhlIHJlcXVlc3QuIE90aGVyd2lzZSwgdGhlIGRlZmF1bHQgZHVyYXRpb24gd2lsbCBiZSB1c2VkLgogKiBAcGFyYW0geyFib29sZWFufSBpbmNvZ25pdG8gSWYgdHJ1ZSwgdGhlIHJvdXRlIGlzIGJlaW5nIHJlcXVlc3RlZCBieQogKiAgICAgYW4gaW5jb2duaXRvIHByb2ZpbGUuCiAqIEByZXR1cm4geyFQcm9taXNlLjwhT2JqZWN0Pn0gQSBQcm9taXNlIHJlc29sdmluZyB0byBhbiBvYmplY3QgZGVzY3JpYmluZwogKiAgICAgdGhlIG5ld2x5IGNyZWF0ZWQgbWVkaWEgcm91dGUsIG9yIHJlamVjdGluZyB3aXRoIGFuIGVycm9yIG1lc3NhZ2Ugb24KICogICAgIGZhaWx1cmUuCiAqLwpNZWRpYVJvdXRlUHJvdmlkZXIucHJvdG90eXBlLmpvaW5Sb3V0ZSA9CiAgICBmdW5jdGlvbihzb3VyY2VVcm4sIHByZXNlbnRhdGlvbklkLCBvcmlnaW4sIHRhYklkLCB0aW1lb3V0LAogICAgICAgICAgICAgaW5jb2duaXRvKSB7CiAgdGhpcy5oYW5kbGVyc18ub25CZWZvcmVJbnZva2VIYW5kbGVyKCk7CiAgcmV0dXJuIHRoaXMuaGFuZGxlcnNfLmpvaW5Sb3V0ZSgKICAgICAgc291cmNlVXJuLCBwcmVzZW50YXRpb25JZCwgb3JpZ2luLCB0YWJJZCwKICAgICAgTWF0aC5mbG9vcih0aW1lb3V0Lm1pY3Jvc2Vjb25kcyAvIDEwMDApLCBpbmNvZ25pdG8pCiAgICAgIC50aGVuKGZ1bmN0aW9uKHJvdXRlKSB7CiAgICAgICAgcmV0dXJuIHRvU3VjY2Vzc1JvdXRlUmVzcG9uc2VfKHJvdXRlKTsKICAgICAgfSwKICAgICAgZnVuY3Rpb24oZXJyKSB7CiAgICAgICAgcmV0dXJuIHRvRXJyb3JSb3V0ZVJlc3BvbnNlXyhlcnIpOwogICAgICB9KTsKfTsKCi8qKgogKiBIYW5kbGVzIGEgcmVxdWVzdCB2aWEgdGhlIFByZXNlbnRhdGlvbiBBUEkgdG8gam9pbiBhbiBleGlzdGluZyByb3V0ZSBnaXZlbgogKiBieSB8c291cmNlVXJufCBhbmQgfHJvdXRlSWR8LiB8b3JpZ2lufCBhbmQgfHRhYklkfCBhcmUgdXNlZCBmb3IKICogdmFsaWRhdGluZyBzYW1lLW9yaWdpbi90YWIgc2NvcGUuCiAqIEBwYXJhbSB7IXN0cmluZ30gc291cmNlVXJuIE1lZGlhIHNvdXJjZSB0byByZW5kZXIuCiAqIEBwYXJhbSB7IXN0cmluZ30gcm91dGVJZCBSb3V0ZSBJRCB0byBqb2luLgogKiBAcGFyYW0geyFzdHJpbmd9IHByZXNlbnRhdGlvbklkIFByZXNlbnRhdGlvbiBJRCB0byBqb2luLgogKiBAcGFyYW0geyF1cmwubW9qb20uT3JpZ2lufSBvcmlnaW4gT3JpZ2luIG9mIHNpdGUgcmVxdWVzdGluZyBqb2luLgogKiBAcGFyYW0geyFudW1iZXJ9IHRhYklkIElEIG9mIHRhYiByZXF1ZXN0aW5nIGpvaW4uCiAqIEBwYXJhbSB7IW1vam8uY29tbW9uLm1vam9tLlRpbWVEZWx0YX0gdGltZW91dCBJZiBwb3NpdGl2ZSwgdGhlIHRpbWVvdXQKICogICAgIGR1cmF0aW9uIGZvciB0aGUgcmVxdWVzdC4gT3RoZXJ3aXNlLCB0aGUgZGVmYXVsdCBkdXJhdGlvbiB3aWxsIGJlIHVzZWQuCiAqIEBwYXJhbSB7IWJvb2xlYW59IGluY29nbml0byBJZiB0cnVlLCB0aGUgcm91dGUgaXMgYmVpbmcgcmVxdWVzdGVkIGJ5CiAqICAgICBhbiBpbmNvZ25pdG8gcHJvZmlsZS4KICogQHJldHVybiB7IVByb21pc2UuPCFPYmplY3Q+fSBBIFByb21pc2UgcmVzb2x2aW5nIHRvIGFuIG9iamVjdCBkZXNjcmliaW5nCiAqICAgICB0aGUgbmV3bHkgY3JlYXRlZCBtZWRpYSByb3V0ZSwgb3IgcmVqZWN0aW5nIHdpdGggYW4gZXJyb3IgbWVzc2FnZSBvbgogKiAgICAgZmFpbHVyZS4KICovCk1lZGlhUm91dGVQcm92aWRlci5wcm90b3R5cGUuY29ubmVjdFJvdXRlQnlSb3V0ZUlkID0KICAgIGZ1bmN0aW9uKHNvdXJjZVVybiwgcm91dGVJZCwgcHJlc2VudGF0aW9uSWQsIG9yaWdpbiwgdGFiSWQsCiAgICAgICAgICAgICB0aW1lb3V0LCBpbmNvZ25pdG8pIHsKICB0aGlzLmhhbmRsZXJzXy5vbkJlZm9yZUludm9rZUhhbmRsZXIoKTsKICByZXR1cm4gdGhpcy5oYW5kbGVyc18uY29ubmVjdFJvdXRlQnlSb3V0ZUlkKAogICAgICBzb3VyY2VVcm4sIHJvdXRlSWQsIHByZXNlbnRhdGlvbklkLCBvcmlnaW4sIHRhYklkLAogICAgICBNYXRoLmZsb29yKHRpbWVvdXQubWljcm9zZWNvbmRzIC8gMTAwMCksIGluY29nbml0bykKICAgICAgLnRoZW4oZnVuY3Rpb24ocm91dGUpIHsKICAgICAgICByZXR1cm4gdG9TdWNjZXNzUm91dGVSZXNwb25zZV8ocm91dGUpOwogICAgICB9LAogICAgICBmdW5jdGlvbihlcnIpIHsKICAgICAgICByZXR1cm4gdG9FcnJvclJvdXRlUmVzcG9uc2VfKGVycik7CiAgICAgIH0pOwp9OwoKLyoqCiAqIFRlcm1pbmF0ZXMgdGhlIHJvdXRlIHNwZWNpZmllZCBieSB8cm91dGVJZHwuCiAqIEBwYXJhbSB7IXN0cmluZ30gcm91dGVJZAogKiBAcmV0dXJuIHshUHJvbWlzZTwhT2JqZWN0Pn0gQSBQcm9taXNlIHJlc29sdmluZyB0byBhbiBvYmplY3QgZGVzY3JpYmluZwogKiAgICB0aGUgcmVzdWx0IG9mIHRoZSB0ZXJtaW5hdGUgb3BlcmF0aW9uLCBvciByZWplY3Rpbmcgd2l0aCBhbiBlcnJvcgogKiAgICBtZXNzYWdlIGFuZCBjb2RlIGlmIHRoZSBvcGVyYXRpb24gZmFpbGVkLgogKi8KTWVkaWFSb3V0ZVByb3ZpZGVyLnByb3RvdHlwZS50ZXJtaW5hdGVSb3V0ZSA9IGZ1bmN0aW9uKHJvdXRlSWQpIHsKICB0aGlzLmhhbmRsZXJzXy5vbkJlZm9yZUludm9rZUhhbmRsZXIoKTsKICByZXR1cm4gdGhpcy5oYW5kbGVyc18udGVybWluYXRlUm91dGUocm91dGVJZCkudGhlbigKICAgICAgKCkgPT4gKHtyZXN1bHRDb2RlOiBtZWRpYVJvdXRlci5tb2pvbS5Sb3V0ZVJlcXVlc3RSZXN1bHRDb2RlLk9LfSksCiAgICAgIChlcnIpID0+IHRvRXJyb3JSb3V0ZVJlc3BvbnNlXyhlcnIpKTsKfTsKCi8qKgogKiBQb3N0cyBhIG1lc3NhZ2UgdG8gdGhlIHJvdXRlIGRlc2lnbmF0ZWQgYnkgfHJvdXRlSWR8LgogKiBAcGFyYW0geyFzdHJpbmd9IHJvdXRlSWQKICogQHBhcmFtIHshc3RyaW5nfSBtZXNzYWdlCiAqIEByZXR1cm4geyFQcm9taXNlLjxib29sZWFuPn0gUmVzb2x2ZWQgd2l0aCB0cnVlIGlmIHRoZSBtZXNzYWdlIHdhcyBzZW50LAogKiAgICBvciBmYWxzZSBvbiBmYWlsdXJlLgogKi8KTWVkaWFSb3V0ZVByb3ZpZGVyLnByb3RvdHlwZS5zZW5kUm91dGVNZXNzYWdlID0gZnVuY3Rpb24oCiAgcm91dGVJZCwgbWVzc2FnZSkgewogIHRoaXMuaGFuZGxlcnNfLm9uQmVmb3JlSW52b2tlSGFuZGxlcigpOwogIHJldHVybiB0aGlzLmhhbmRsZXJzXy5zZW5kUm91dGVNZXNzYWdlKHJvdXRlSWQsIG1lc3NhZ2UpCiAgICAgIC50aGVuKGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB7J3NlbnQnOiB0cnVlfTsKICAgICAgfSwgZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHsnc2VudCc6IGZhbHNlfTsKICAgICAgfSk7Cn07CgovKioKICogU2VuZHMgYSBiaW5hcnkgbWVzc2FnZSB0byB0aGUgcm91dGUgZGVzaWduYXRlZCBieSB8cm91dGVJZHwuCiAqIEBwYXJhbSB7IXN0cmluZ30gcm91dGVJZAogKiBAcGFyYW0geyFBcnJheTxudW1iZXI+fSBkYXRhCiAqIEByZXR1cm4geyFQcm9taXNlLjxib29sZWFuPn0gUmVzb2x2ZWQgd2l0aCB0cnVlIGlmIHRoZSBkYXRhIHdhcyBzZW50LAogKiAgICBvciBmYWxzZSBvbiBmYWlsdXJlLgogKi8KTWVkaWFSb3V0ZVByb3ZpZGVyLnByb3RvdHlwZS5zZW5kUm91dGVCaW5hcnlNZXNzYWdlID0gZnVuY3Rpb24oCiAgcm91dGVJZCwgZGF0YSkgewogIHRoaXMuaGFuZGxlcnNfLm9uQmVmb3JlSW52b2tlSGFuZGxlcigpOwogIHJldHVybiB0aGlzLmhhbmRsZXJzXy5zZW5kUm91dGVCaW5hcnlNZXNzYWdlKHJvdXRlSWQsIG5ldyBVaW50OEFycmF5KGRhdGEpKQogICAgICAudGhlbihmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4geydzZW50JzogdHJ1ZX07CiAgICAgIH0sIGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB7J3NlbnQnOiBmYWxzZX07CiAgICAgIH0pOwp9OwoKLyoqCiAqIExpc3RlbiBmb3IgbWVzc2FnZXMgZnJvbSBhIHJvdXRlLgogKiBAcGFyYW0geyFzdHJpbmd9IHJvdXRlSWQKICovCk1lZGlhUm91dGVQcm92aWRlci5wcm90b3R5cGUuc3RhcnRMaXN0ZW5pbmdGb3JSb3V0ZU1lc3NhZ2VzID0gZnVuY3Rpb24oCiAgICByb3V0ZUlkKSB7CiAgdGhpcy5oYW5kbGVyc18ub25CZWZvcmVJbnZva2VIYW5kbGVyKCk7CiAgdGhpcy5oYW5kbGVyc18uc3RhcnRMaXN0ZW5pbmdGb3JSb3V0ZU1lc3NhZ2VzKHJvdXRlSWQpOwp9OwoKLyoqCiAqIEBwYXJhbSB7IXN0cmluZ30gcm91dGVJZAogKi8KTWVkaWFSb3V0ZVByb3ZpZGVyLnByb3RvdHlwZS5zdG9wTGlzdGVuaW5nRm9yUm91dGVNZXNzYWdlcyA9IGZ1bmN0aW9uKAogICAgcm91dGVJZCkgewogIHRoaXMuaGFuZGxlcnNfLm9uQmVmb3JlSW52b2tlSGFuZGxlcigpOwogIHRoaXMuaGFuZGxlcnNfLnN0b3BMaXN0ZW5pbmdGb3JSb3V0ZU1lc3NhZ2VzKHJvdXRlSWQpOwp9OwoKLyoqCiAqIEluZGljYXRlcyB0aGF0IHRoZSBwcmVzZW50YXRpb24gY29ubmVjdGlvbiB0aGF0IHdhcyBjb25uZWN0ZWQgdG8gfHJvdXRlSWR8CiAqIGlzIG5vIGxvbmdlciBjb25uZWN0ZWQgdG8gaXQuCiAqIEBwYXJhbSB7IXN0cmluZ30gcm91dGVJZAogKi8KTWVkaWFSb3V0ZVByb3ZpZGVyLnByb3RvdHlwZS5kZXRhY2hSb3V0ZSA9IGZ1bmN0aW9uKAogICAgcm91dGVJZCkgewogIHRoaXMuaGFuZGxlcnNfLmRldGFjaFJvdXRlKHJvdXRlSWQpOwp9OwoKLyoqCiAqIFJlcXVlc3RzIHRoYXQgdGhlIHByb3ZpZGVyIG1hbmFnZXIgc3RhcnQgc2VuZGluZyBpbmZvcm1hdGlvbiBhYm91dCBhY3RpdmUKICogbWVkaWEgcm91dGVzIHRvIHRoZSBNZWRpYSBSb3V0ZXIuCiAqIEBwYXJhbSB7IXN0cmluZ30gc291cmNlVXJuCiAqLwpNZWRpYVJvdXRlUHJvdmlkZXIucHJvdG90eXBlLnN0YXJ0T2JzZXJ2aW5nTWVkaWFSb3V0ZXMgPSBmdW5jdGlvbihzb3VyY2VVcm4pIHsKICB0aGlzLmhhbmRsZXJzXy5vbkJlZm9yZUludm9rZUhhbmRsZXIoKTsKICB0aGlzLmhhbmRsZXJzXy5zdGFydE9ic2VydmluZ01lZGlhUm91dGVzKHNvdXJjZVVybik7Cn07CgovKioKICogUmVxdWVzdHMgdGhhdCB0aGUgcHJvdmlkZXIgbWFuYWdlciBzdG9wIHNlbmRpbmcgaW5mb3JtYXRpb24gYWJvdXQgYWN0aXZlCiAqIG1lZGlhIHJvdXRlcyB0byB0aGUgTWVkaWEgUm91dGVyLgogKiBAcGFyYW0geyFzdHJpbmd9IHNvdXJjZVVybgogKi8KTWVkaWFSb3V0ZVByb3ZpZGVyLnByb3RvdHlwZS5zdG9wT2JzZXJ2aW5nTWVkaWFSb3V0ZXMgPSBmdW5jdGlvbihzb3VyY2VVcm4pIHsKICB0aGlzLmhhbmRsZXJzXy5vbkJlZm9yZUludm9rZUhhbmRsZXIoKTsKICB0aGlzLmhhbmRsZXJzXy5zdG9wT2JzZXJ2aW5nTWVkaWFSb3V0ZXMoc291cmNlVXJuKTsKfTsKCi8qKgogKiBFbmFibGVzIG1ETlMgZGV2aWNlIGRpc2NvdmVyeS4KICovCk1lZGlhUm91dGVQcm92aWRlci5wcm90b3R5cGUuZW5hYmxlTWRuc0Rpc2NvdmVyeSA9IGZ1bmN0aW9uKCkgewogIHRoaXMuaGFuZGxlcnNfLm9uQmVmb3JlSW52b2tlSGFuZGxlcigpOwogIHRoaXMuaGFuZGxlcnNfLmVuYWJsZU1kbnNEaXNjb3ZlcnkoKTsKfTsKCi8qKgogKiBSZXF1ZXN0cyB0aGF0IHRoZSBwcm92aWRlciBtYW5hZ2VyIHVwZGF0ZSBtZWRpYSBzaW5rcy4KICogQHBhcmFtIHshc3RyaW5nfSBzb3VyY2VVcm4KICovCk1lZGlhUm91dGVQcm92aWRlci5wcm90b3R5cGUudXBkYXRlTWVkaWFTaW5rcyA9IGZ1bmN0aW9uKHNvdXJjZVVybikgewogIHRoaXMuaGFuZGxlcnNfLm9uQmVmb3JlSW52b2tlSGFuZGxlcigpOwogIHRoaXMuaGFuZGxlcnNfLnVwZGF0ZU1lZGlhU2lua3Moc291cmNlVXJuKTsKfTsKCi8qKgogKiBSZXF1ZXN0cyB0aGF0IHRoZSBwcm92aWRlciBtYW5hZ2VyIHNlYXJjaCBpdHMgcHJvdmlkZXJzIGZvciBhIHNpbmsgbWF0Y2hpbmcKICogfHNlYXJjaENyaXRlcmlhfCB0aGF0IGlzIGNvbXBhdGlibGUgd2l0aCB8c291cmNlVXJufC4gSWYgYSBzaW5rIGlzIGZvdW5kCiAqIHRoYXQgY2FuIGJlIHVzZWQgaW1tZWRpYXRlbHkgZm9yIHJvdXRlIGNyZWF0aW9uLCBpdHMgSUQgaXMgcmV0dXJuZWQuCiAqIE90aGVyd2lzZSB0aGUgZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkLgogKgogKiBAcGFyYW0ge3N0cmluZ30gc2lua0lkIFNpbmsgSUQgb2YgdGhlIHBzZXVkbyBzaW5rIGdlbmVyYXRpbmcgdGhlIHJlcXVlc3QuCiAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2VVcm4gTWVkaWEgc291cmNlIHRvIGJlIHVzZWQgd2l0aCB0aGUgc2luay4KICogQHBhcmFtIHshU2lua1NlYXJjaENyaXRlcmlhfSBzZWFyY2hDcml0ZXJpYSBTZWFyY2ggY3JpdGVyaWEgZm9yIHRoZSByb3V0ZQogKiAgICAgcHJvdmlkZXJzLgogKiBAcmV0dXJuIHshUHJvbWlzZS48IXtzaW5rX2lkOiAhc3RyaW5nfT59IEEgUHJvbWlzZSByZXNvbHZpbmcgdG8gZWl0aGVyIHRoZQogKiAgICAgc2luayBJRCBvZiB0aGUgc2luayBmb3VuZCBieSB0aGUgc2VhcmNoIHRoYXQgY2FuIGJlIHVzZWQgZm9yIHJvdXRlCiAqICAgICBjcmVhdGlvbiwgb3IgdGhlIGVtcHR5IHN0cmluZyBpZiBubyByb3V0ZSBjYW4gYmUgaW1tZWRpYXRlbHkgY3JlYXRlZC4KICovCk1lZGlhUm91dGVQcm92aWRlci5wcm90b3R5cGUuc2VhcmNoU2lua3MgPSBmdW5jdGlvbigKICAgIHNpbmtJZCwgc291cmNlVXJuLCBzZWFyY2hDcml0ZXJpYSkgewogIHRoaXMuaGFuZGxlcnNfLm9uQmVmb3JlSW52b2tlSGFuZGxlcigpOwogcmV0dXJuIHRoaXMuaGFuZGxlcnNfLnNlYXJjaFNpbmtzKHNpbmtJZCwgc291cmNlVXJuLCBzZWFyY2hDcml0ZXJpYSkudGhlbigKICAgICAgc2lua0lkID0+IHsKICAgICAgICByZXR1cm4geyAnc2lua0lkJzogc2lua0lkIH07CiAgICAgIH0sCiAgICAgICgpID0+IHsKICAgICAgICByZXR1cm4geyAnc2lua0lkJzogJycgfTsKICAgICAgfSk7Cn07CgovKioKICogTm90aWZpZXMgdGhlIHByb3ZpZGVyIG1hbmFnZXIgdGhhdCBNZWRpYVJvdXRlciBoYXMgZGlzY292ZXJlZCBhIGxpc3Qgb2YKICogc2lua3MuCiAqIEBwYXJhbSB7c3RyaW5nfSBwcm92aWRlck5hbWUKICogQHBhcmFtIHshQXJyYXk8IW1lZGlhUm91dGVyLm1vam9tLk1lZGlhU2luaz59IHNpbmtzCiAqLwpNZWRpYVJvdXRlUHJvdmlkZXIucHJvdG90eXBlLnByb3ZpZGVTaW5rcyA9IGZ1bmN0aW9uKHByb3ZpZGVyTmFtZSwgc2lua3MpIHsKICB0aGlzLmhhbmRsZXJzXy5vbkJlZm9yZUludm9rZUhhbmRsZXIoKTsKICB0aGlzLmhhbmRsZXJzXy5wcm92aWRlU2lua3MocHJvdmlkZXJOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5rcy5tYXAoTWVkaWFTaW5rQWRhcHRlci5mcm9tTmV3VmVyc2lvbikpOwp9OwoKLyoqCiAqIENyZWF0ZXMgYSBjb250cm9sbGVyIGZvciB0aGUgZ2l2ZW4gcm91dGUgYW5kIGJpbmRzIHRoZSBnaXZlbgogKiBJbnRlcmZhY2VSZXF1ZXN0IHRvIGl0LCBhbmQgcmVnaXN0ZXJzIGFuIG9ic2VydmVyIGZvciBtZWRpYSBzdGF0dXMgdXBkYXRlcwogKiBmb3IgdGhlIHJvdXRlLgogKiBAcGFyYW0ge3N0cmluZ30gcm91dGVJZAogKiBAcGFyYW0geyFtb2pvLkludGVyZmFjZVJlcXVlc3R9IGNvbnRyb2xsZXJSZXF1ZXN0CiAqIEBwYXJhbSB7IW1lZGlhUm91dGVyLm1vam9tLk1lZGlhU3RhdHVzT2JzZXJ2ZXJQdHJ9IG9ic2VydmVyCiAqIEByZXR1cm4geyFQcm9taXNlPCF7c3VjY2VzczogYm9vbGVhbn0+fSBSZXNvbHZlcyB0byB0cnVlIGlmIGEgY29udHJvbGxlcgogKiAgICAgaXMgY3JlYXRlZC4gUmVzb2x2ZXMgdG8gZmFsc2UgaWYgYSBjb250cm9sbGVyIGNhbm5vdCBiZSBjcmVhdGVkLCBvciBpZgogKiAgICAgdGhlIGNvbnRyb2xsZXIgaXMgYWxyZWFkeSBib3VuZC4KICovCk1lZGlhUm91dGVQcm92aWRlci5wcm90b3R5cGUuY3JlYXRlTWVkaWFSb3V0ZUNvbnRyb2xsZXIgPSBmdW5jdGlvbigKICAgIHJvdXRlSWQsIGNvbnRyb2xsZXJSZXF1ZXN0LCBvYnNlcnZlcikgewogIHRoaXMuaGFuZGxlcnNfLm9uQmVmb3JlSW52b2tlSGFuZGxlcigpOwogIHJldHVybiB0aGlzLmhhbmRsZXJzXy5jcmVhdGVNZWRpYVJvdXRlQ29udHJvbGxlcigKICAgICAgcm91dGVJZCwgY29udHJvbGxlclJlcXVlc3QsCiAgICAgIG5ldyBNZWRpYVN0YXR1c09ic2VydmVyUHRyQWRhcHRlcihvYnNlcnZlci5wdHIucGFzc0ludGVyZmFjZSgpKSkudGhlbigKICAgICAgICAgICgpID0+ICh7c3VjY2VzczogdHJ1ZX0pLCBlID0+ICh7c3VjY2VzczogZmFsc2V9KSk7Cn07Cgp2YXIgcHRyID0gbmV3IG1lZGlhUm91dGVyLm1vam9tLk1lZGlhUm91dGVyUHRyOwpNb2pvLmJpbmRJbnRlcmZhY2UobWVkaWFSb3V0ZXIubW9qb20uTWVkaWFSb3V0ZXIubmFtZSwKICAgICAgICAgICAgICAgICAgIG1vam8ubWFrZVJlcXVlc3QocHRyKS5oYW5kbGUpOwpleHBvcnRzLiRzZXQoJ3JldHVyblZhbHVlJywgbmV3IE1lZGlhUm91dGVyKHB0cikpOwovLyBDb3B5cmlnaHQgMjAxNCBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQovLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKJ3VzZSBzdHJpY3QnOwoKKGZ1bmN0aW9uKCkgewogIHZhciBtb2pvbUlkID0gJ2Nocm9tZS9jb21tb24vbWVkaWFfcm91dGVyL21vam8vbWVkaWFfc3RhdHVzLm1vam9tJzsKICBpZiAobW9qby5pbnRlcm5hbC5pc01vam9tTG9hZGVkKG1vam9tSWQpKSB7CiAgICBjb25zb2xlLndhcm4oJ1RoZSBmb2xsb3dpbmcgbW9qb20gaXMgbG9hZGVkIG11bHRpcGxlIHRpbWVzOiAnICsgbW9qb21JZCk7CiAgICByZXR1cm47CiAgfQogIG1vam8uaW50ZXJuYWwubWFya01vam9tTG9hZGVkKG1vam9tSWQpOwogIHZhciBiaW5kaW5ncyA9IG1vam87CiAgdmFyIGFzc29jaWF0ZWRCaW5kaW5ncyA9IG1vam87CiAgdmFyIGNvZGVjID0gbW9qby5pbnRlcm5hbDsKICB2YXIgdmFsaWRhdG9yID0gbW9qby5pbnRlcm5hbDsKCiAgdmFyIGV4cG9ydHMgPSBtb2pvLmludGVybmFsLmV4cG9zZU5hbWVzcGFjZSgnbWVkaWFSb3V0ZXIubW9qb20nKTsKICB2YXIgdGltZSQgPQogICAgICBtb2pvLmludGVybmFsLmV4cG9zZU5hbWVzcGFjZSgnbW9qby5jb21tb24ubW9qb20nKTsKICBpZiAobW9qby5jb25maWcuYXV0b0xvYWRNb2pvbURlcHMpIHsKICAgIG1vam8uaW50ZXJuYWwubG9hZE1vam9tSWZOZWNlc3NhcnkoCiAgICAgICAgJ21vam8vY29tbW9uL3RpbWUubW9qb20nLCAnLi4vLi4vLi4vLi4vbW9qby9jb21tb24vdGltZS5tb2pvbS5qcycpOwogIH0KCgoKICBmdW5jdGlvbiBNZWRpYVN0YXR1cyh2YWx1ZXMpIHsKICAgIHRoaXMuaW5pdERlZmF1bHRzXygpOwogICAgdGhpcy5pbml0RmllbGRzXyh2YWx1ZXMpOwogIH0KCiAgTWVkaWFTdGF0dXMuUGxheVN0YXRlID0ge307CiAgTWVkaWFTdGF0dXMuUGxheVN0YXRlLlBMQVlJTkcgPSAwOwogIE1lZGlhU3RhdHVzLlBsYXlTdGF0ZS5QQVVTRUQgPSBNZWRpYVN0YXR1cy5QbGF5U3RhdGUuUExBWUlORyArIDE7CiAgTWVkaWFTdGF0dXMuUGxheVN0YXRlLkJVRkZFUklORyA9IE1lZGlhU3RhdHVzLlBsYXlTdGF0ZS5QQVVTRUQgKyAxOwoKICBNZWRpYVN0YXR1cy5QbGF5U3RhdGUuaXNLbm93bkVudW1WYWx1ZSA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICBzd2l0Y2ggKHZhbHVlKSB7CiAgICBjYXNlIDA6CiAgICBjYXNlIDE6CiAgICBjYXNlIDI6CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH07CgogIE1lZGlhU3RhdHVzLlBsYXlTdGF0ZS52YWxpZGF0ZSA9IGZ1bmN0aW9uKGVudW1WYWx1ZSkgewogICAgdmFyIGlzRXh0ZW5zaWJsZSA9IGZhbHNlOwogICAgaWYgKGlzRXh0ZW5zaWJsZSB8fCB0aGlzLmlzS25vd25FbnVtVmFsdWUoZW51bVZhbHVlKSkKICAgICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKCiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5VTktOT1dOX0VOVU1fVkFMVUU7CiAgfTsKCiAgTWVkaWFTdGF0dXMucHJvdG90eXBlLmluaXREZWZhdWx0c18gPSBmdW5jdGlvbigpIHsKICAgIHRoaXMudGl0bGUgPSBudWxsOwogICAgdGhpcy5kZXNjcmlwdGlvbiA9IG51bGw7CiAgICB0aGlzLmNhblBsYXlQYXVzZSA9IGZhbHNlOwogICAgdGhpcy5jYW5NdXRlID0gZmFsc2U7CiAgICB0aGlzLmNhblNldFZvbHVtZSA9IGZhbHNlOwogICAgdGhpcy5jYW5TZWVrID0gZmFsc2U7CiAgICB0aGlzLmlzTXV0ZWQgPSBmYWxzZTsKICAgIHRoaXMucGxheVN0YXRlID0gMDsKICAgIHRoaXMudm9sdW1lID0gMDsKICAgIHRoaXMuZHVyYXRpb24gPSBudWxsOwogICAgdGhpcy5jdXJyZW50VGltZSA9IG51bGw7CiAgICB0aGlzLmhhbmdvdXRzRXh0cmFEYXRhID0gbnVsbDsKICB9OwogIE1lZGlhU3RhdHVzLnByb3RvdHlwZS5pbml0RmllbGRzXyA9IGZ1bmN0aW9uKGZpZWxkcykgewogICAgZm9yKHZhciBmaWVsZCBpbiBmaWVsZHMpIHsKICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpCiAgICAgICAgICB0aGlzW2ZpZWxkXSA9IGZpZWxkc1tmaWVsZF07CiAgICB9CiAgfTsKCiAgTWVkaWFTdGF0dXMudmFsaWRhdGUgPSBmdW5jdGlvbihtZXNzYWdlVmFsaWRhdG9yLCBvZmZzZXQpIHsKICAgIHZhciBlcnI7CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0SGVhZGVyKG9mZnNldCwgY29kZWMua1N0cnVjdEhlYWRlclNpemUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgdmFyIGtWZXJzaW9uU2l6ZXMgPSBbCiAgICAgIHt2ZXJzaW9uOiAwLCBudW1CeXRlczogNjR9CiAgICBdOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFZlcnNpb24ob2Zmc2V0LCBrVmVyc2lvblNpemVzKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVN0YXR1cy50aXRsZQogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cmluZ1BvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAwLCBmYWxzZSkKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVN0YXR1cy5kZXNjcmlwdGlvbgogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cmluZ1BvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA4LCBmYWxzZSkKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCgoKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFTdGF0dXMucGxheVN0YXRlCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlRW51bShvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDIwLCBNZWRpYVN0YXR1cy5QbGF5U3RhdGUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFTdGF0dXMuZHVyYXRpb24KICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RQb2ludGVyKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMzIsIHRpbWUkLlRpbWVEZWx0YSwgZmFsc2UpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhU3RhdHVzLmN1cnJlbnRUaW1lCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0UG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDQwLCB0aW1lJC5UaW1lRGVsdGEsIGZhbHNlKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVN0YXR1cy5oYW5nb3V0c0V4dHJhRGF0YQogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFBvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA0OCwgSGFuZ291dHNNZWRpYVN0YXR1c0V4dHJhRGF0YSwgdHJ1ZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwogIH07CgogIE1lZGlhU3RhdHVzLmVuY29kZWRTaXplID0gY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA1NjsKCiAgTWVkaWFTdGF0dXMuZGVjb2RlID0gZnVuY3Rpb24oZGVjb2RlcikgewogICAgdmFyIHBhY2tlZDsKICAgIHZhciB2YWwgPSBuZXcgTWVkaWFTdGF0dXMoKTsKICAgIHZhciBudW1iZXJPZkJ5dGVzID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YXIgdmVyc2lvbiA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFsLnRpdGxlID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nKTsKICAgIHZhbC5kZXNjcmlwdGlvbiA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLlN0cmluZyk7CiAgICBwYWNrZWQgPSBkZWNvZGVyLnJlYWRVaW50OCgpOwogICAgdmFsLmNhblBsYXlQYXVzZSA9IChwYWNrZWQgPj4gMCkgJiAxID8gdHJ1ZSA6IGZhbHNlOwogICAgdmFsLmNhbk11dGUgPSAocGFja2VkID4+IDEpICYgMSA/IHRydWUgOiBmYWxzZTsKICAgIHZhbC5jYW5TZXRWb2x1bWUgPSAocGFja2VkID4+IDIpICYgMSA/IHRydWUgOiBmYWxzZTsKICAgIHZhbC5jYW5TZWVrID0gKHBhY2tlZCA+PiAzKSAmIDEgPyB0cnVlIDogZmFsc2U7CiAgICB2YWwuaXNNdXRlZCA9IChwYWNrZWQgPj4gNCkgJiAxID8gdHJ1ZSA6IGZhbHNlOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgdmFsLnBsYXlTdGF0ZSA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLkludDMyKTsKICAgIHZhbC52b2x1bWUgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5GbG9hdCk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICB2YWwuZHVyYXRpb24gPSBkZWNvZGVyLmRlY29kZVN0cnVjdFBvaW50ZXIodGltZSQuVGltZURlbHRhKTsKICAgIHZhbC5jdXJyZW50VGltZSA9IGRlY29kZXIuZGVjb2RlU3RydWN0UG9pbnRlcih0aW1lJC5UaW1lRGVsdGEpOwogICAgdmFsLmhhbmdvdXRzRXh0cmFEYXRhID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3RQb2ludGVyKEhhbmdvdXRzTWVkaWFTdGF0dXNFeHRyYURhdGEpOwogICAgcmV0dXJuIHZhbDsKICB9OwoKICBNZWRpYVN0YXR1cy5lbmNvZGUgPSBmdW5jdGlvbihlbmNvZGVyLCB2YWwpIHsKICAgIHZhciBwYWNrZWQ7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKE1lZGlhU3RhdHVzLmVuY29kZWRTaXplKTsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoMCk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5TdHJpbmcsIHZhbC50aXRsZSk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5TdHJpbmcsIHZhbC5kZXNjcmlwdGlvbik7CiAgICBwYWNrZWQgPSAwOwogICAgcGFja2VkIHw9ICh2YWwuY2FuUGxheVBhdXNlICYgMSkgPDwgMAogICAgcGFja2VkIHw9ICh2YWwuY2FuTXV0ZSAmIDEpIDw8IDEKICAgIHBhY2tlZCB8PSAodmFsLmNhblNldFZvbHVtZSAmIDEpIDw8IDIKICAgIHBhY2tlZCB8PSAodmFsLmNhblNlZWsgJiAxKSA8PCAzCiAgICBwYWNrZWQgfD0gKHZhbC5pc011dGVkICYgMSkgPDwgNAogICAgZW5jb2Rlci53cml0ZVVpbnQ4KHBhY2tlZCk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5JbnQzMiwgdmFsLnBsYXlTdGF0ZSk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5GbG9hdCwgdmFsLnZvbHVtZSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdFBvaW50ZXIodGltZSQuVGltZURlbHRhLCB2YWwuZHVyYXRpb24pOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3RQb2ludGVyKHRpbWUkLlRpbWVEZWx0YSwgdmFsLmN1cnJlbnRUaW1lKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0UG9pbnRlcihIYW5nb3V0c01lZGlhU3RhdHVzRXh0cmFEYXRhLCB2YWwuaGFuZ291dHNFeHRyYURhdGEpOwogIH07CiAgZnVuY3Rpb24gSGFuZ291dHNNZWRpYVN0YXR1c0V4dHJhRGF0YSh2YWx1ZXMpIHsKICAgIHRoaXMuaW5pdERlZmF1bHRzXygpOwogICAgdGhpcy5pbml0RmllbGRzXyh2YWx1ZXMpOwogIH0KCgogIEhhbmdvdXRzTWVkaWFTdGF0dXNFeHRyYURhdGEucHJvdG90eXBlLmluaXREZWZhdWx0c18gPSBmdW5jdGlvbigpIHsKICAgIHRoaXMubG9jYWxQcmVzZW50ID0gZmFsc2U7CiAgfTsKICBIYW5nb3V0c01lZGlhU3RhdHVzRXh0cmFEYXRhLnByb3RvdHlwZS5pbml0RmllbGRzXyA9IGZ1bmN0aW9uKGZpZWxkcykgewogICAgZm9yKHZhciBmaWVsZCBpbiBmaWVsZHMpIHsKICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpCiAgICAgICAgICB0aGlzW2ZpZWxkXSA9IGZpZWxkc1tmaWVsZF07CiAgICB9CiAgfTsKCiAgSGFuZ291dHNNZWRpYVN0YXR1c0V4dHJhRGF0YS52YWxpZGF0ZSA9IGZ1bmN0aW9uKG1lc3NhZ2VWYWxpZGF0b3IsIG9mZnNldCkgewogICAgdmFyIGVycjsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RIZWFkZXIob2Zmc2V0LCBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICB2YXIga1ZlcnNpb25TaXplcyA9IFsKICAgICAge3ZlcnNpb246IDAsIG51bUJ5dGVzOiAxNn0KICAgIF07CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0VmVyc2lvbihvZmZzZXQsIGtWZXJzaW9uU2l6ZXMpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CiAgfTsKCiAgSGFuZ291dHNNZWRpYVN0YXR1c0V4dHJhRGF0YS5lbmNvZGVkU2l6ZSA9IGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgODsKCiAgSGFuZ291dHNNZWRpYVN0YXR1c0V4dHJhRGF0YS5kZWNvZGUgPSBmdW5jdGlvbihkZWNvZGVyKSB7CiAgICB2YXIgcGFja2VkOwogICAgdmFyIHZhbCA9IG5ldyBIYW5nb3V0c01lZGlhU3RhdHVzRXh0cmFEYXRhKCk7CiAgICB2YXIgbnVtYmVyT2ZCeXRlcyA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFyIHZlcnNpb24gPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHBhY2tlZCA9IGRlY29kZXIucmVhZFVpbnQ4KCk7CiAgICB2YWwubG9jYWxQcmVzZW50ID0gKHBhY2tlZCA+PiAwKSAmIDEgPyB0cnVlIDogZmFsc2U7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICByZXR1cm4gdmFsOwogIH07CgogIEhhbmdvdXRzTWVkaWFTdGF0dXNFeHRyYURhdGEuZW5jb2RlID0gZnVuY3Rpb24oZW5jb2RlciwgdmFsKSB7CiAgICB2YXIgcGFja2VkOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMihIYW5nb3V0c01lZGlhU3RhdHVzRXh0cmFEYXRhLmVuY29kZWRTaXplKTsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoMCk7CiAgICBwYWNrZWQgPSAwOwogICAgcGFja2VkIHw9ICh2YWwubG9jYWxQcmVzZW50ICYgMSkgPDwgMAogICAgZW5jb2Rlci53cml0ZVVpbnQ4KHBhY2tlZCk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgfTsKICBmdW5jdGlvbiBNZWRpYVN0YXR1c09ic2VydmVyX09uTWVkaWFTdGF0dXNVcGRhdGVkX1BhcmFtcyh2YWx1ZXMpIHsKICAgIHRoaXMuaW5pdERlZmF1bHRzXygpOwogICAgdGhpcy5pbml0RmllbGRzXyh2YWx1ZXMpOwogIH0KCgogIE1lZGlhU3RhdHVzT2JzZXJ2ZXJfT25NZWRpYVN0YXR1c1VwZGF0ZWRfUGFyYW1zLnByb3RvdHlwZS5pbml0RGVmYXVsdHNfID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLnN0YXR1cyA9IG51bGw7CiAgfTsKICBNZWRpYVN0YXR1c09ic2VydmVyX09uTWVkaWFTdGF0dXNVcGRhdGVkX1BhcmFtcy5wcm90b3R5cGUuaW5pdEZpZWxkc18gPSBmdW5jdGlvbihmaWVsZHMpIHsKICAgIGZvcih2YXIgZmllbGQgaW4gZmllbGRzKSB7CiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoZmllbGQpKQogICAgICAgICAgdGhpc1tmaWVsZF0gPSBmaWVsZHNbZmllbGRdOwogICAgfQogIH07CgogIE1lZGlhU3RhdHVzT2JzZXJ2ZXJfT25NZWRpYVN0YXR1c1VwZGF0ZWRfUGFyYW1zLnZhbGlkYXRlID0gZnVuY3Rpb24obWVzc2FnZVZhbGlkYXRvciwgb2Zmc2V0KSB7CiAgICB2YXIgZXJyOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdEhlYWRlcihvZmZzZXQsIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHZhciBrVmVyc2lvblNpemVzID0gWwogICAgICB7dmVyc2lvbjogMCwgbnVtQnl0ZXM6IDE2fQogICAgXTsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RWZXJzaW9uKG9mZnNldCwga1ZlcnNpb25TaXplcyk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFTdGF0dXNPYnNlcnZlcl9Pbk1lZGlhU3RhdHVzVXBkYXRlZF9QYXJhbXMuc3RhdHVzCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0UG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDAsIE1lZGlhU3RhdHVzLCBmYWxzZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwogIH07CgogIE1lZGlhU3RhdHVzT2JzZXJ2ZXJfT25NZWRpYVN0YXR1c1VwZGF0ZWRfUGFyYW1zLmVuY29kZWRTaXplID0gY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA4OwoKICBNZWRpYVN0YXR1c09ic2VydmVyX09uTWVkaWFTdGF0dXNVcGRhdGVkX1BhcmFtcy5kZWNvZGUgPSBmdW5jdGlvbihkZWNvZGVyKSB7CiAgICB2YXIgcGFja2VkOwogICAgdmFyIHZhbCA9IG5ldyBNZWRpYVN0YXR1c09ic2VydmVyX09uTWVkaWFTdGF0dXNVcGRhdGVkX1BhcmFtcygpOwogICAgdmFyIG51bWJlck9mQnl0ZXMgPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhciB2ZXJzaW9uID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YWwuc3RhdHVzID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3RQb2ludGVyKE1lZGlhU3RhdHVzKTsKICAgIHJldHVybiB2YWw7CiAgfTsKCiAgTWVkaWFTdGF0dXNPYnNlcnZlcl9Pbk1lZGlhU3RhdHVzVXBkYXRlZF9QYXJhbXMuZW5jb2RlID0gZnVuY3Rpb24oZW5jb2RlciwgdmFsKSB7CiAgICB2YXIgcGFja2VkOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMihNZWRpYVN0YXR1c09ic2VydmVyX09uTWVkaWFTdGF0dXNVcGRhdGVkX1BhcmFtcy5lbmNvZGVkU2l6ZSk7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKDApOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3RQb2ludGVyKE1lZGlhU3RhdHVzLCB2YWwuc3RhdHVzKTsKICB9OwogIHZhciBrTWVkaWFTdGF0dXNPYnNlcnZlcl9Pbk1lZGlhU3RhdHVzVXBkYXRlZF9OYW1lID0gMTI1MzAyMDcyOTsKCiAgZnVuY3Rpb24gTWVkaWFTdGF0dXNPYnNlcnZlclB0cihoYW5kbGVPclB0ckluZm8pIHsKICAgIHRoaXMucHRyID0gbmV3IGJpbmRpbmdzLkludGVyZmFjZVB0ckNvbnRyb2xsZXIoTWVkaWFTdGF0dXNPYnNlcnZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlT3JQdHJJbmZvKTsKICB9CgogIGZ1bmN0aW9uIE1lZGlhU3RhdHVzT2JzZXJ2ZXJBc3NvY2lhdGVkUHRyKGFzc29jaWF0ZWRJbnRlcmZhY2VQdHJJbmZvKSB7CiAgICB0aGlzLnB0ciA9IG5ldyBhc3NvY2lhdGVkQmluZGluZ3MuQXNzb2NpYXRlZEludGVyZmFjZVB0ckNvbnRyb2xsZXIoCiAgICAgICAgTWVkaWFTdGF0dXNPYnNlcnZlciwgYXNzb2NpYXRlZEludGVyZmFjZVB0ckluZm8pOwogIH0KCiAgTWVkaWFTdGF0dXNPYnNlcnZlckFzc29jaWF0ZWRQdHIucHJvdG90eXBlID0KICAgICAgT2JqZWN0LmNyZWF0ZShNZWRpYVN0YXR1c09ic2VydmVyUHRyLnByb3RvdHlwZSk7CiAgTWVkaWFTdGF0dXNPYnNlcnZlckFzc29jaWF0ZWRQdHIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0KICAgICAgTWVkaWFTdGF0dXNPYnNlcnZlckFzc29jaWF0ZWRQdHI7CgogIGZ1bmN0aW9uIE1lZGlhU3RhdHVzT2JzZXJ2ZXJQcm94eShyZWNlaXZlcikgewogICAgdGhpcy5yZWNlaXZlcl8gPSByZWNlaXZlcjsKICB9CiAgTWVkaWFTdGF0dXNPYnNlcnZlclB0ci5wcm90b3R5cGUub25NZWRpYVN0YXR1c1VwZGF0ZWQgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBNZWRpYVN0YXR1c09ic2VydmVyUHJveHkucHJvdG90eXBlLm9uTWVkaWFTdGF0dXNVcGRhdGVkCiAgICAgICAgLmFwcGx5KHRoaXMucHRyLmdldFByb3h5KCksIGFyZ3VtZW50cyk7CiAgfTsKCiAgTWVkaWFTdGF0dXNPYnNlcnZlclByb3h5LnByb3RvdHlwZS5vbk1lZGlhU3RhdHVzVXBkYXRlZCA9IGZ1bmN0aW9uKHN0YXR1cykgewogICAgdmFyIHBhcmFtcyA9IG5ldyBNZWRpYVN0YXR1c09ic2VydmVyX09uTWVkaWFTdGF0dXNVcGRhdGVkX1BhcmFtcygpOwogICAgcGFyYW1zLnN0YXR1cyA9IHN0YXR1czsKICAgIHZhciBidWlsZGVyID0gbmV3IGNvZGVjLk1lc3NhZ2VWMEJ1aWxkZXIoCiAgICAgICAga01lZGlhU3RhdHVzT2JzZXJ2ZXJfT25NZWRpYVN0YXR1c1VwZGF0ZWRfTmFtZSwKICAgICAgICBjb2RlYy5hbGlnbihNZWRpYVN0YXR1c09ic2VydmVyX09uTWVkaWFTdGF0dXNVcGRhdGVkX1BhcmFtcy5lbmNvZGVkU2l6ZSkpOwogICAgYnVpbGRlci5lbmNvZGVTdHJ1Y3QoTWVkaWFTdGF0dXNPYnNlcnZlcl9Pbk1lZGlhU3RhdHVzVXBkYXRlZF9QYXJhbXMsIHBhcmFtcyk7CiAgICB2YXIgbWVzc2FnZSA9IGJ1aWxkZXIuZmluaXNoKCk7CiAgICB0aGlzLnJlY2VpdmVyXy5hY2NlcHQobWVzc2FnZSk7CiAgfTsKCiAgZnVuY3Rpb24gTWVkaWFTdGF0dXNPYnNlcnZlclN0dWIoZGVsZWdhdGUpIHsKICAgIHRoaXMuZGVsZWdhdGVfID0gZGVsZWdhdGU7CiAgfQogIE1lZGlhU3RhdHVzT2JzZXJ2ZXJTdHViLnByb3RvdHlwZS5vbk1lZGlhU3RhdHVzVXBkYXRlZCA9IGZ1bmN0aW9uKHN0YXR1cykgewogICAgcmV0dXJuIHRoaXMuZGVsZWdhdGVfICYmIHRoaXMuZGVsZWdhdGVfLm9uTWVkaWFTdGF0dXNVcGRhdGVkICYmIHRoaXMuZGVsZWdhdGVfLm9uTWVkaWFTdGF0dXNVcGRhdGVkKHN0YXR1cyk7CiAgfQoKICBNZWRpYVN0YXR1c09ic2VydmVyU3R1Yi5wcm90b3R5cGUuYWNjZXB0ID0gZnVuY3Rpb24obWVzc2FnZSkgewogICAgdmFyIHJlYWRlciA9IG5ldyBjb2RlYy5NZXNzYWdlUmVhZGVyKG1lc3NhZ2UpOwogICAgc3dpdGNoIChyZWFkZXIubWVzc2FnZU5hbWUpIHsKICAgIGNhc2Uga01lZGlhU3RhdHVzT2JzZXJ2ZXJfT25NZWRpYVN0YXR1c1VwZGF0ZWRfTmFtZToKICAgICAgdmFyIHBhcmFtcyA9IHJlYWRlci5kZWNvZGVTdHJ1Y3QoTWVkaWFTdGF0dXNPYnNlcnZlcl9Pbk1lZGlhU3RhdHVzVXBkYXRlZF9QYXJhbXMpOwogICAgICB0aGlzLm9uTWVkaWFTdGF0dXNVcGRhdGVkKHBhcmFtcy5zdGF0dXMpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIGRlZmF1bHQ6CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9OwoKICBNZWRpYVN0YXR1c09ic2VydmVyU3R1Yi5wcm90b3R5cGUuYWNjZXB0V2l0aFJlc3BvbmRlciA9CiAgICAgIGZ1bmN0aW9uKG1lc3NhZ2UsIHJlc3BvbmRlcikgewogICAgdmFyIHJlYWRlciA9IG5ldyBjb2RlYy5NZXNzYWdlUmVhZGVyKG1lc3NhZ2UpOwogICAgc3dpdGNoIChyZWFkZXIubWVzc2FnZU5hbWUpIHsKICAgIGRlZmF1bHQ6CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9OwoKICBmdW5jdGlvbiB2YWxpZGF0ZU1lZGlhU3RhdHVzT2JzZXJ2ZXJSZXF1ZXN0KG1lc3NhZ2VWYWxpZGF0b3IpIHsKICAgIHZhciBtZXNzYWdlID0gbWVzc2FnZVZhbGlkYXRvci5tZXNzYWdlOwogICAgdmFyIHBhcmFtc0NsYXNzID0gbnVsbDsKICAgIHN3aXRjaCAobWVzc2FnZS5nZXROYW1lKCkpIHsKICAgICAgY2FzZSBrTWVkaWFTdGF0dXNPYnNlcnZlcl9Pbk1lZGlhU3RhdHVzVXBkYXRlZF9OYW1lOgogICAgICAgIGlmICghbWVzc2FnZS5leHBlY3RzUmVzcG9uc2UoKSAmJiAhbWVzc2FnZS5pc1Jlc3BvbnNlKCkpCiAgICAgICAgICBwYXJhbXNDbGFzcyA9IE1lZGlhU3RhdHVzT2JzZXJ2ZXJfT25NZWRpYVN0YXR1c1VwZGF0ZWRfUGFyYW1zOwogICAgICBicmVhazsKICAgIH0KICAgIGlmIChwYXJhbXNDbGFzcyA9PT0gbnVsbCkKICAgICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICAgIHJldHVybiBwYXJhbXNDbGFzcy52YWxpZGF0ZShtZXNzYWdlVmFsaWRhdG9yLCBtZXNzYWdlVmFsaWRhdG9yLm1lc3NhZ2UuZ2V0SGVhZGVyTnVtQnl0ZXMoKSk7CiAgfQoKICBmdW5jdGlvbiB2YWxpZGF0ZU1lZGlhU3RhdHVzT2JzZXJ2ZXJSZXNwb25zZShtZXNzYWdlVmFsaWRhdG9yKSB7CiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwogIH0KCiAgdmFyIE1lZGlhU3RhdHVzT2JzZXJ2ZXIgPSB7CiAgICBuYW1lOiAnbWVkaWFfcm91dGVyOjptb2pvbTo6TWVkaWFTdGF0dXNPYnNlcnZlcicsCiAgICBrVmVyc2lvbjogMCwKICAgIHB0ckNsYXNzOiBNZWRpYVN0YXR1c09ic2VydmVyUHRyLAogICAgcHJveHlDbGFzczogTWVkaWFTdGF0dXNPYnNlcnZlclByb3h5LAogICAgc3R1YkNsYXNzOiBNZWRpYVN0YXR1c09ic2VydmVyU3R1YiwKICAgIHZhbGlkYXRlUmVxdWVzdDogdmFsaWRhdGVNZWRpYVN0YXR1c09ic2VydmVyUmVxdWVzdCwKICAgIHZhbGlkYXRlUmVzcG9uc2U6IG51bGwsCiAgfTsKICBNZWRpYVN0YXR1c09ic2VydmVyU3R1Yi5wcm90b3R5cGUudmFsaWRhdG9yID0gdmFsaWRhdGVNZWRpYVN0YXR1c09ic2VydmVyUmVxdWVzdDsKICBNZWRpYVN0YXR1c09ic2VydmVyUHJveHkucHJvdG90eXBlLnZhbGlkYXRvciA9IG51bGw7CiAgZXhwb3J0cy5NZWRpYVN0YXR1cyA9IE1lZGlhU3RhdHVzOwogIGV4cG9ydHMuSGFuZ291dHNNZWRpYVN0YXR1c0V4dHJhRGF0YSA9IEhhbmdvdXRzTWVkaWFTdGF0dXNFeHRyYURhdGE7CiAgZXhwb3J0cy5NZWRpYVN0YXR1c09ic2VydmVyID0gTWVkaWFTdGF0dXNPYnNlcnZlcjsKICBleHBvcnRzLk1lZGlhU3RhdHVzT2JzZXJ2ZXJQdHIgPSBNZWRpYVN0YXR1c09ic2VydmVyUHRyOwogIGV4cG9ydHMuTWVkaWFTdGF0dXNPYnNlcnZlckFzc29jaWF0ZWRQdHIgPSBNZWRpYVN0YXR1c09ic2VydmVyQXNzb2NpYXRlZFB0cjsKfSkoKTsvLyBDb3B5cmlnaHQgMjAxNCBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQovLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKJ3VzZSBzdHJpY3QnOwoKKGZ1bmN0aW9uKCkgewogIHZhciBtb2pvbUlkID0gJ21vam8vY29tbW9uL3RpbWUubW9qb20nOwogIGlmIChtb2pvLmludGVybmFsLmlzTW9qb21Mb2FkZWQobW9qb21JZCkpIHsKICAgIGNvbnNvbGUud2FybignVGhlIGZvbGxvd2luZyBtb2pvbSBpcyBsb2FkZWQgbXVsdGlwbGUgdGltZXM6ICcgKyBtb2pvbUlkKTsKICAgIHJldHVybjsKICB9CiAgbW9qby5pbnRlcm5hbC5tYXJrTW9qb21Mb2FkZWQobW9qb21JZCk7CiAgdmFyIGJpbmRpbmdzID0gbW9qbzsKICB2YXIgYXNzb2NpYXRlZEJpbmRpbmdzID0gbW9qbzsKICB2YXIgY29kZWMgPSBtb2pvLmludGVybmFsOwogIHZhciB2YWxpZGF0b3IgPSBtb2pvLmludGVybmFsOwoKICB2YXIgZXhwb3J0cyA9IG1vam8uaW50ZXJuYWwuZXhwb3NlTmFtZXNwYWNlKCdtb2pvLmNvbW1vbi5tb2pvbScpOwoKCgogIGZ1bmN0aW9uIFRpbWUodmFsdWVzKSB7CiAgICB0aGlzLmluaXREZWZhdWx0c18oKTsKICAgIHRoaXMuaW5pdEZpZWxkc18odmFsdWVzKTsKICB9CgoKICBUaW1lLnByb3RvdHlwZS5pbml0RGVmYXVsdHNfID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLmludGVybmFsVmFsdWUgPSAwOwogIH07CiAgVGltZS5wcm90b3R5cGUuaW5pdEZpZWxkc18gPSBmdW5jdGlvbihmaWVsZHMpIHsKICAgIGZvcih2YXIgZmllbGQgaW4gZmllbGRzKSB7CiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoZmllbGQpKQogICAgICAgICAgdGhpc1tmaWVsZF0gPSBmaWVsZHNbZmllbGRdOwogICAgfQogIH07CgogIFRpbWUudmFsaWRhdGUgPSBmdW5jdGlvbihtZXNzYWdlVmFsaWRhdG9yLCBvZmZzZXQpIHsKICAgIHZhciBlcnI7CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0SGVhZGVyKG9mZnNldCwgY29kZWMua1N0cnVjdEhlYWRlclNpemUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgdmFyIGtWZXJzaW9uU2l6ZXMgPSBbCiAgICAgIHt2ZXJzaW9uOiAwLCBudW1CeXRlczogMTZ9CiAgICBdOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFZlcnNpb24ob2Zmc2V0LCBrVmVyc2lvblNpemVzKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwogIH07CgogIFRpbWUuZW5jb2RlZFNpemUgPSBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDg7CgogIFRpbWUuZGVjb2RlID0gZnVuY3Rpb24oZGVjb2RlcikgewogICAgdmFyIHBhY2tlZDsKICAgIHZhciB2YWwgPSBuZXcgVGltZSgpOwogICAgdmFyIG51bWJlck9mQnl0ZXMgPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhciB2ZXJzaW9uID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YWwuaW50ZXJuYWxWYWx1ZSA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLkludDY0KTsKICAgIHJldHVybiB2YWw7CiAgfTsKCiAgVGltZS5lbmNvZGUgPSBmdW5jdGlvbihlbmNvZGVyLCB2YWwpIHsKICAgIHZhciBwYWNrZWQ7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKFRpbWUuZW5jb2RlZFNpemUpOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMigwKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLkludDY0LCB2YWwuaW50ZXJuYWxWYWx1ZSk7CiAgfTsKICBmdW5jdGlvbiBUaW1lRGVsdGEodmFsdWVzKSB7CiAgICB0aGlzLmluaXREZWZhdWx0c18oKTsKICAgIHRoaXMuaW5pdEZpZWxkc18odmFsdWVzKTsKICB9CgoKICBUaW1lRGVsdGEucHJvdG90eXBlLmluaXREZWZhdWx0c18gPSBmdW5jdGlvbigpIHsKICAgIHRoaXMubWljcm9zZWNvbmRzID0gMDsKICB9OwogIFRpbWVEZWx0YS5wcm90b3R5cGUuaW5pdEZpZWxkc18gPSBmdW5jdGlvbihmaWVsZHMpIHsKICAgIGZvcih2YXIgZmllbGQgaW4gZmllbGRzKSB7CiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoZmllbGQpKQogICAgICAgICAgdGhpc1tmaWVsZF0gPSBmaWVsZHNbZmllbGRdOwogICAgfQogIH07CgogIFRpbWVEZWx0YS52YWxpZGF0ZSA9IGZ1bmN0aW9uKG1lc3NhZ2VWYWxpZGF0b3IsIG9mZnNldCkgewogICAgdmFyIGVycjsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RIZWFkZXIob2Zmc2V0LCBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICB2YXIga1ZlcnNpb25TaXplcyA9IFsKICAgICAge3ZlcnNpb246IDAsIG51bUJ5dGVzOiAxNn0KICAgIF07CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0VmVyc2lvbihvZmZzZXQsIGtWZXJzaW9uU2l6ZXMpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CiAgfTsKCiAgVGltZURlbHRhLmVuY29kZWRTaXplID0gY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA4OwoKICBUaW1lRGVsdGEuZGVjb2RlID0gZnVuY3Rpb24oZGVjb2RlcikgewogICAgdmFyIHBhY2tlZDsKICAgIHZhciB2YWwgPSBuZXcgVGltZURlbHRhKCk7CiAgICB2YXIgbnVtYmVyT2ZCeXRlcyA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFyIHZlcnNpb24gPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhbC5taWNyb3NlY29uZHMgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5JbnQ2NCk7CiAgICByZXR1cm4gdmFsOwogIH07CgogIFRpbWVEZWx0YS5lbmNvZGUgPSBmdW5jdGlvbihlbmNvZGVyLCB2YWwpIHsKICAgIHZhciBwYWNrZWQ7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKFRpbWVEZWx0YS5lbmNvZGVkU2l6ZSk7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKDApOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuSW50NjQsIHZhbC5taWNyb3NlY29uZHMpOwogIH07CiAgZnVuY3Rpb24gVGltZVRpY2tzKHZhbHVlcykgewogICAgdGhpcy5pbml0RGVmYXVsdHNfKCk7CiAgICB0aGlzLmluaXRGaWVsZHNfKHZhbHVlcyk7CiAgfQoKCiAgVGltZVRpY2tzLnByb3RvdHlwZS5pbml0RGVmYXVsdHNfID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLmludGVybmFsVmFsdWUgPSAwOwogIH07CiAgVGltZVRpY2tzLnByb3RvdHlwZS5pbml0RmllbGRzXyA9IGZ1bmN0aW9uKGZpZWxkcykgewogICAgZm9yKHZhciBmaWVsZCBpbiBmaWVsZHMpIHsKICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpCiAgICAgICAgICB0aGlzW2ZpZWxkXSA9IGZpZWxkc1tmaWVsZF07CiAgICB9CiAgfTsKCiAgVGltZVRpY2tzLnZhbGlkYXRlID0gZnVuY3Rpb24obWVzc2FnZVZhbGlkYXRvciwgb2Zmc2V0KSB7CiAgICB2YXIgZXJyOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdEhlYWRlcihvZmZzZXQsIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHZhciBrVmVyc2lvblNpemVzID0gWwogICAgICB7dmVyc2lvbjogMCwgbnVtQnl0ZXM6IDE2fQogICAgXTsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RWZXJzaW9uKG9mZnNldCwga1ZlcnNpb25TaXplcyk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICB9OwoKICBUaW1lVGlja3MuZW5jb2RlZFNpemUgPSBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDg7CgogIFRpbWVUaWNrcy5kZWNvZGUgPSBmdW5jdGlvbihkZWNvZGVyKSB7CiAgICB2YXIgcGFja2VkOwogICAgdmFyIHZhbCA9IG5ldyBUaW1lVGlja3MoKTsKICAgIHZhciBudW1iZXJPZkJ5dGVzID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YXIgdmVyc2lvbiA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFsLmludGVybmFsVmFsdWUgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5JbnQ2NCk7CiAgICByZXR1cm4gdmFsOwogIH07CgogIFRpbWVUaWNrcy5lbmNvZGUgPSBmdW5jdGlvbihlbmNvZGVyLCB2YWwpIHsKICAgIHZhciBwYWNrZWQ7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKFRpbWVUaWNrcy5lbmNvZGVkU2l6ZSk7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKDApOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuSW50NjQsIHZhbC5pbnRlcm5hbFZhbHVlKTsKICB9OwogIGV4cG9ydHMuVGltZSA9IFRpbWU7CiAgZXhwb3J0cy5UaW1lRGVsdGEgPSBUaW1lRGVsdGE7CiAgZXhwb3J0cy5UaW1lVGlja3MgPSBUaW1lVGlja3M7Cn0pKCk7Ly8gQ29weXJpZ2h0IDIwMTQgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCid1c2Ugc3RyaWN0JzsKCihmdW5jdGlvbigpIHsKICB2YXIgbW9qb21JZCA9ICduZXQvaW50ZXJmYWNlcy9pcF9hZGRyZXNzLm1vam9tJzsKICBpZiAobW9qby5pbnRlcm5hbC5pc01vam9tTG9hZGVkKG1vam9tSWQpKSB7CiAgICBjb25zb2xlLndhcm4oJ1RoZSBmb2xsb3dpbmcgbW9qb20gaXMgbG9hZGVkIG11bHRpcGxlIHRpbWVzOiAnICsgbW9qb21JZCk7CiAgICByZXR1cm47CiAgfQogIG1vam8uaW50ZXJuYWwubWFya01vam9tTG9hZGVkKG1vam9tSWQpOwogIHZhciBiaW5kaW5ncyA9IG1vam87CiAgdmFyIGFzc29jaWF0ZWRCaW5kaW5ncyA9IG1vam87CiAgdmFyIGNvZGVjID0gbW9qby5pbnRlcm5hbDsKICB2YXIgdmFsaWRhdG9yID0gbW9qby5pbnRlcm5hbDsKCiAgdmFyIGV4cG9ydHMgPSBtb2pvLmludGVybmFsLmV4cG9zZU5hbWVzcGFjZSgnbmV0LmludGVyZmFjZXMnKTsKCgoKICBmdW5jdGlvbiBJUEFkZHJlc3ModmFsdWVzKSB7CiAgICB0aGlzLmluaXREZWZhdWx0c18oKTsKICAgIHRoaXMuaW5pdEZpZWxkc18odmFsdWVzKTsKICB9CgoKICBJUEFkZHJlc3MucHJvdG90eXBlLmluaXREZWZhdWx0c18gPSBmdW5jdGlvbigpIHsKICAgIHRoaXMuYWRkcmVzc0J5dGVzID0gbnVsbDsKICB9OwogIElQQWRkcmVzcy5wcm90b3R5cGUuaW5pdEZpZWxkc18gPSBmdW5jdGlvbihmaWVsZHMpIHsKICAgIGZvcih2YXIgZmllbGQgaW4gZmllbGRzKSB7CiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoZmllbGQpKQogICAgICAgICAgdGhpc1tmaWVsZF0gPSBmaWVsZHNbZmllbGRdOwogICAgfQogIH07CgogIElQQWRkcmVzcy52YWxpZGF0ZSA9IGZ1bmN0aW9uKG1lc3NhZ2VWYWxpZGF0b3IsIG9mZnNldCkgewogICAgdmFyIGVycjsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RIZWFkZXIob2Zmc2V0LCBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICB2YXIga1ZlcnNpb25TaXplcyA9IFsKICAgICAge3ZlcnNpb246IDAsIG51bUJ5dGVzOiAxNn0KICAgIF07CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0VmVyc2lvbihvZmZzZXQsIGtWZXJzaW9uU2l6ZXMpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIElQQWRkcmVzcy5hZGRyZXNzQnl0ZXMKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVBcnJheVBvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAwLCAxLCBjb2RlYy5VaW50OCwgZmFsc2UsIFswXSwgMCk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwogIH07CgogIElQQWRkcmVzcy5lbmNvZGVkU2l6ZSA9IGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgODsKCiAgSVBBZGRyZXNzLmRlY29kZSA9IGZ1bmN0aW9uKGRlY29kZXIpIHsKICAgIHZhciBwYWNrZWQ7CiAgICB2YXIgdmFsID0gbmV3IElQQWRkcmVzcygpOwogICAgdmFyIG51bWJlck9mQnl0ZXMgPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhciB2ZXJzaW9uID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YWwuYWRkcmVzc0J5dGVzID0gZGVjb2Rlci5kZWNvZGVBcnJheVBvaW50ZXIoY29kZWMuVWludDgpOwogICAgcmV0dXJuIHZhbDsKICB9OwoKICBJUEFkZHJlc3MuZW5jb2RlID0gZnVuY3Rpb24oZW5jb2RlciwgdmFsKSB7CiAgICB2YXIgcGFja2VkOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMihJUEFkZHJlc3MuZW5jb2RlZFNpemUpOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMigwKTsKICAgIGVuY29kZXIuZW5jb2RlQXJyYXlQb2ludGVyKGNvZGVjLlVpbnQ4LCB2YWwuYWRkcmVzc0J5dGVzKTsKICB9OwogIGV4cG9ydHMuSVBBZGRyZXNzID0gSVBBZGRyZXNzOwp9KSgpOy8vIENvcHlyaWdodCAyMDE0IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgovLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgondXNlIHN0cmljdCc7CgooZnVuY3Rpb24oKSB7CiAgdmFyIG1vam9tSWQgPSAnbmV0L2ludGVyZmFjZXMvaXBfZW5kcG9pbnQubW9qb20nOwogIGlmIChtb2pvLmludGVybmFsLmlzTW9qb21Mb2FkZWQobW9qb21JZCkpIHsKICAgIGNvbnNvbGUud2FybignVGhlIGZvbGxvd2luZyBtb2pvbSBpcyBsb2FkZWQgbXVsdGlwbGUgdGltZXM6ICcgKyBtb2pvbUlkKTsKICAgIHJldHVybjsKICB9CiAgbW9qby5pbnRlcm5hbC5tYXJrTW9qb21Mb2FkZWQobW9qb21JZCk7CiAgdmFyIGJpbmRpbmdzID0gbW9qbzsKICB2YXIgYXNzb2NpYXRlZEJpbmRpbmdzID0gbW9qbzsKICB2YXIgY29kZWMgPSBtb2pvLmludGVybmFsOwogIHZhciB2YWxpZGF0b3IgPSBtb2pvLmludGVybmFsOwoKICB2YXIgZXhwb3J0cyA9IG1vam8uaW50ZXJuYWwuZXhwb3NlTmFtZXNwYWNlKCduZXQuaW50ZXJmYWNlcycpOwogIHZhciBpcF9hZGRyZXNzJCA9CiAgICAgIG1vam8uaW50ZXJuYWwuZXhwb3NlTmFtZXNwYWNlKCduZXQuaW50ZXJmYWNlcycpOwogIGlmIChtb2pvLmNvbmZpZy5hdXRvTG9hZE1vam9tRGVwcykgewogICAgbW9qby5pbnRlcm5hbC5sb2FkTW9qb21JZk5lY2Vzc2FyeSgKICAgICAgICAnbmV0L2ludGVyZmFjZXMvaXBfYWRkcmVzcy5tb2pvbScsICdpcF9hZGRyZXNzLm1vam9tLmpzJyk7CiAgfQoKCgogIGZ1bmN0aW9uIElQRW5kUG9pbnQodmFsdWVzKSB7CiAgICB0aGlzLmluaXREZWZhdWx0c18oKTsKICAgIHRoaXMuaW5pdEZpZWxkc18odmFsdWVzKTsKICB9CgoKICBJUEVuZFBvaW50LnByb3RvdHlwZS5pbml0RGVmYXVsdHNfID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLmFkZHJlc3MgPSBudWxsOwogICAgdGhpcy5wb3J0ID0gMDsKICB9OwogIElQRW5kUG9pbnQucHJvdG90eXBlLmluaXRGaWVsZHNfID0gZnVuY3Rpb24oZmllbGRzKSB7CiAgICBmb3IodmFyIGZpZWxkIGluIGZpZWxkcykgewogICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGZpZWxkKSkKICAgICAgICAgIHRoaXNbZmllbGRdID0gZmllbGRzW2ZpZWxkXTsKICAgIH0KICB9OwoKICBJUEVuZFBvaW50LnZhbGlkYXRlID0gZnVuY3Rpb24obWVzc2FnZVZhbGlkYXRvciwgb2Zmc2V0KSB7CiAgICB2YXIgZXJyOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdEhlYWRlcihvZmZzZXQsIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHZhciBrVmVyc2lvblNpemVzID0gWwogICAgICB7dmVyc2lvbjogMCwgbnVtQnl0ZXM6IDI0fQogICAgXTsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RWZXJzaW9uKG9mZnNldCwga1ZlcnNpb25TaXplcyk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgSVBFbmRQb2ludC5hZGRyZXNzCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0UG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDAsIGlwX2FkZHJlc3MkLklQQWRkcmVzcywgZmFsc2UpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CiAgfTsKCiAgSVBFbmRQb2ludC5lbmNvZGVkU2l6ZSA9IGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMTY7CgogIElQRW5kUG9pbnQuZGVjb2RlID0gZnVuY3Rpb24oZGVjb2RlcikgewogICAgdmFyIHBhY2tlZDsKICAgIHZhciB2YWwgPSBuZXcgSVBFbmRQb2ludCgpOwogICAgdmFyIG51bWJlck9mQnl0ZXMgPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhciB2ZXJzaW9uID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YWwuYWRkcmVzcyA9IGRlY29kZXIuZGVjb2RlU3RydWN0UG9pbnRlcihpcF9hZGRyZXNzJC5JUEFkZHJlc3MpOwogICAgdmFsLnBvcnQgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5VaW50MTYpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgcmV0dXJuIHZhbDsKICB9OwoKICBJUEVuZFBvaW50LmVuY29kZSA9IGZ1bmN0aW9uKGVuY29kZXIsIHZhbCkgewogICAgdmFyIHBhY2tlZDsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoSVBFbmRQb2ludC5lbmNvZGVkU2l6ZSk7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKDApOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3RQb2ludGVyKGlwX2FkZHJlc3MkLklQQWRkcmVzcywgdmFsLmFkZHJlc3MpOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuVWludDE2LCB2YWwucG9ydCk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgfTsKICBleHBvcnRzLklQRW5kUG9pbnQgPSBJUEVuZFBvaW50Owp9KSgpOy8vIENvcHlyaWdodCAyMDE0IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgovLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgondXNlIHN0cmljdCc7CgooZnVuY3Rpb24oKSB7CiAgdmFyIG1vam9tSWQgPSAndXJsL21vam8vb3JpZ2luLm1vam9tJzsKICBpZiAobW9qby5pbnRlcm5hbC5pc01vam9tTG9hZGVkKG1vam9tSWQpKSB7CiAgICBjb25zb2xlLndhcm4oJ1RoZSBmb2xsb3dpbmcgbW9qb20gaXMgbG9hZGVkIG11bHRpcGxlIHRpbWVzOiAnICsgbW9qb21JZCk7CiAgICByZXR1cm47CiAgfQogIG1vam8uaW50ZXJuYWwubWFya01vam9tTG9hZGVkKG1vam9tSWQpOwogIHZhciBiaW5kaW5ncyA9IG1vam87CiAgdmFyIGFzc29jaWF0ZWRCaW5kaW5ncyA9IG1vam87CiAgdmFyIGNvZGVjID0gbW9qby5pbnRlcm5hbDsKICB2YXIgdmFsaWRhdG9yID0gbW9qby5pbnRlcm5hbDsKCiAgdmFyIGV4cG9ydHMgPSBtb2pvLmludGVybmFsLmV4cG9zZU5hbWVzcGFjZSgndXJsLm1vam9tJyk7CgoKCiAgZnVuY3Rpb24gT3JpZ2luKHZhbHVlcykgewogICAgdGhpcy5pbml0RGVmYXVsdHNfKCk7CiAgICB0aGlzLmluaXRGaWVsZHNfKHZhbHVlcyk7CiAgfQoKCiAgT3JpZ2luLnByb3RvdHlwZS5pbml0RGVmYXVsdHNfID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLnNjaGVtZSA9IG51bGw7CiAgICB0aGlzLmhvc3QgPSBudWxsOwogICAgdGhpcy5wb3J0ID0gMDsKICAgIHRoaXMudW5pcXVlID0gZmFsc2U7CiAgICB0aGlzLnN1Ym9yaWdpbiA9IG51bGw7CiAgfTsKICBPcmlnaW4ucHJvdG90eXBlLmluaXRGaWVsZHNfID0gZnVuY3Rpb24oZmllbGRzKSB7CiAgICBmb3IodmFyIGZpZWxkIGluIGZpZWxkcykgewogICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGZpZWxkKSkKICAgICAgICAgIHRoaXNbZmllbGRdID0gZmllbGRzW2ZpZWxkXTsKICAgIH0KICB9OwoKICBPcmlnaW4udmFsaWRhdGUgPSBmdW5jdGlvbihtZXNzYWdlVmFsaWRhdG9yLCBvZmZzZXQpIHsKICAgIHZhciBlcnI7CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0SGVhZGVyKG9mZnNldCwgY29kZWMua1N0cnVjdEhlYWRlclNpemUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgdmFyIGtWZXJzaW9uU2l6ZXMgPSBbCiAgICAgIHt2ZXJzaW9uOiAwLCBudW1CeXRlczogNDB9CiAgICBdOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFZlcnNpb24ob2Zmc2V0LCBrVmVyc2lvblNpemVzKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBPcmlnaW4uc2NoZW1lCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nUG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDAsIGZhbHNlKQogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE9yaWdpbi5ob3N0CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nUG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDgsIGZhbHNlKQogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKCiAgICAvLyB2YWxpZGF0ZSBPcmlnaW4uc3Vib3JpZ2luCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nUG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDI0LCBmYWxzZSkKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwogIH07CgogIE9yaWdpbi5lbmNvZGVkU2l6ZSA9IGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMzI7CgogIE9yaWdpbi5kZWNvZGUgPSBmdW5jdGlvbihkZWNvZGVyKSB7CiAgICB2YXIgcGFja2VkOwogICAgdmFyIHZhbCA9IG5ldyBPcmlnaW4oKTsKICAgIHZhciBudW1iZXJPZkJ5dGVzID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YXIgdmVyc2lvbiA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFsLnNjaGVtZSA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLlN0cmluZyk7CiAgICB2YWwuaG9zdCA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLlN0cmluZyk7CiAgICB2YWwucG9ydCA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLlVpbnQxNik7CiAgICBwYWNrZWQgPSBkZWNvZGVyLnJlYWRVaW50OCgpOwogICAgdmFsLnVuaXF1ZSA9IChwYWNrZWQgPj4gMCkgJiAxID8gdHJ1ZSA6IGZhbHNlOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgdmFsLnN1Ym9yaWdpbiA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLlN0cmluZyk7CiAgICByZXR1cm4gdmFsOwogIH07CgogIE9yaWdpbi5lbmNvZGUgPSBmdW5jdGlvbihlbmNvZGVyLCB2YWwpIHsKICAgIHZhciBwYWNrZWQ7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKE9yaWdpbi5lbmNvZGVkU2l6ZSk7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKDApOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nLCB2YWwuc2NoZW1lKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLlN0cmluZywgdmFsLmhvc3QpOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuVWludDE2LCB2YWwucG9ydCk7CiAgICBwYWNrZWQgPSAwOwogICAgcGFja2VkIHw9ICh2YWwudW5pcXVlICYgMSkgPDwgMAogICAgZW5jb2Rlci53cml0ZVVpbnQ4KHBhY2tlZCk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5TdHJpbmcsIHZhbC5zdWJvcmlnaW4pOwogIH07CiAgZXhwb3J0cy5PcmlnaW4gPSBPcmlnaW47Cn0pKCk7Ly8gQ29weXJpZ2h0IDIwMTQgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCid1c2Ugc3RyaWN0JzsKCihmdW5jdGlvbigpIHsKICB2YXIgbW9qb21JZCA9ICd1cmwvbW9qby91cmwubW9qb20nOwogIGlmIChtb2pvLmludGVybmFsLmlzTW9qb21Mb2FkZWQobW9qb21JZCkpIHsKICAgIGNvbnNvbGUud2FybignVGhlIGZvbGxvd2luZyBtb2pvbSBpcyBsb2FkZWQgbXVsdGlwbGUgdGltZXM6ICcgKyBtb2pvbUlkKTsKICAgIHJldHVybjsKICB9CiAgbW9qby5pbnRlcm5hbC5tYXJrTW9qb21Mb2FkZWQobW9qb21JZCk7CiAgdmFyIGJpbmRpbmdzID0gbW9qbzsKICB2YXIgYXNzb2NpYXRlZEJpbmRpbmdzID0gbW9qbzsKICB2YXIgY29kZWMgPSBtb2pvLmludGVybmFsOwogIHZhciB2YWxpZGF0b3IgPSBtb2pvLmludGVybmFsOwoKICB2YXIgZXhwb3J0cyA9IG1vam8uaW50ZXJuYWwuZXhwb3NlTmFtZXNwYWNlKCd1cmwubW9qb20nKTsKCgoKICBmdW5jdGlvbiBVcmwodmFsdWVzKSB7CiAgICB0aGlzLmluaXREZWZhdWx0c18oKTsKICAgIHRoaXMuaW5pdEZpZWxkc18odmFsdWVzKTsKICB9CgoKICBVcmwucHJvdG90eXBlLmluaXREZWZhdWx0c18gPSBmdW5jdGlvbigpIHsKICAgIHRoaXMudXJsID0gbnVsbDsKICB9OwogIFVybC5wcm90b3R5cGUuaW5pdEZpZWxkc18gPSBmdW5jdGlvbihmaWVsZHMpIHsKICAgIGZvcih2YXIgZmllbGQgaW4gZmllbGRzKSB7CiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoZmllbGQpKQogICAgICAgICAgdGhpc1tmaWVsZF0gPSBmaWVsZHNbZmllbGRdOwogICAgfQogIH07CgogIFVybC52YWxpZGF0ZSA9IGZ1bmN0aW9uKG1lc3NhZ2VWYWxpZGF0b3IsIG9mZnNldCkgewogICAgdmFyIGVycjsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RIZWFkZXIob2Zmc2V0LCBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICB2YXIga1ZlcnNpb25TaXplcyA9IFsKICAgICAge3ZlcnNpb246IDAsIG51bUJ5dGVzOiAxNn0KICAgIF07CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0VmVyc2lvbihvZmZzZXQsIGtWZXJzaW9uU2l6ZXMpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIFVybC51cmwKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJpbmdQb2ludGVyKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMCwgZmFsc2UpCiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwogIH07CgogIFVybC5lbmNvZGVkU2l6ZSA9IGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgODsKCiAgVXJsLmRlY29kZSA9IGZ1bmN0aW9uKGRlY29kZXIpIHsKICAgIHZhciBwYWNrZWQ7CiAgICB2YXIgdmFsID0gbmV3IFVybCgpOwogICAgdmFyIG51bWJlck9mQnl0ZXMgPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhciB2ZXJzaW9uID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YWwudXJsID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nKTsKICAgIHJldHVybiB2YWw7CiAgfTsKCiAgVXJsLmVuY29kZSA9IGZ1bmN0aW9uKGVuY29kZXIsIHZhbCkgewogICAgdmFyIHBhY2tlZDsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoVXJsLmVuY29kZWRTaXplKTsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoMCk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5TdHJpbmcsIHZhbC51cmwpOwogIH07CiAgZXhwb3J0cy5VcmwgPSBVcmw7Cn0pKCk7Ly8gQ29weXJpZ2h0IDIwMTQgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCid1c2Ugc3RyaWN0JzsKCihmdW5jdGlvbigpIHsKICB2YXIgbW9qb21JZCA9ICdtZWRpYS9tb2pvL2ludGVyZmFjZXMvbWlycm9yX3NlcnZpY2VfcmVtb3RpbmcubW9qb20nOwogIGlmIChtb2pvLmludGVybmFsLmlzTW9qb21Mb2FkZWQobW9qb21JZCkpIHsKICAgIGNvbnNvbGUud2FybignVGhlIGZvbGxvd2luZyBtb2pvbSBpcyBsb2FkZWQgbXVsdGlwbGUgdGltZXM6ICcgKyBtb2pvbUlkKTsKICAgIHJldHVybjsKICB9CiAgbW9qby5pbnRlcm5hbC5tYXJrTW9qb21Mb2FkZWQobW9qb21JZCk7CiAgdmFyIGJpbmRpbmdzID0gbW9qbzsKICB2YXIgYXNzb2NpYXRlZEJpbmRpbmdzID0gbW9qbzsKICB2YXIgY29kZWMgPSBtb2pvLmludGVybmFsOwogIHZhciB2YWxpZGF0b3IgPSBtb2pvLmludGVybmFsOwoKICB2YXIgZXhwb3J0cyA9IG1vam8uaW50ZXJuYWwuZXhwb3NlTmFtZXNwYWNlKCdtZWRpYS5tb2pvbScpOwogIHZhciByZW1vdGluZ19jb21tb24kID0KICAgICAgbW9qby5pbnRlcm5hbC5leHBvc2VOYW1lc3BhY2UoJ21lZGlhLm1vam9tJyk7CiAgaWYgKG1vam8uY29uZmlnLmF1dG9Mb2FkTW9qb21EZXBzKSB7CiAgICBtb2pvLmludGVybmFsLmxvYWRNb2pvbUlmTmVjZXNzYXJ5KAogICAgICAgICdtZWRpYS9tb2pvL2ludGVyZmFjZXMvcmVtb3RpbmdfY29tbW9uLm1vam9tJywgJ3JlbW90aW5nX2NvbW1vbi5tb2pvbS5qcycpOwogIH0KCgoKICBmdW5jdGlvbiBNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TdGFydF9QYXJhbXModmFsdWVzKSB7CiAgICB0aGlzLmluaXREZWZhdWx0c18oKTsKICAgIHRoaXMuaW5pdEZpZWxkc18odmFsdWVzKTsKICB9CgoKICBNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TdGFydF9QYXJhbXMucHJvdG90eXBlLmluaXREZWZhdWx0c18gPSBmdW5jdGlvbigpIHsKICB9OwogIE1pcnJvclNlcnZpY2VSZW1vdGVyX1N0YXJ0X1BhcmFtcy5wcm90b3R5cGUuaW5pdEZpZWxkc18gPSBmdW5jdGlvbihmaWVsZHMpIHsKICAgIGZvcih2YXIgZmllbGQgaW4gZmllbGRzKSB7CiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoZmllbGQpKQogICAgICAgICAgdGhpc1tmaWVsZF0gPSBmaWVsZHNbZmllbGRdOwogICAgfQogIH07CgogIE1pcnJvclNlcnZpY2VSZW1vdGVyX1N0YXJ0X1BhcmFtcy52YWxpZGF0ZSA9IGZ1bmN0aW9uKG1lc3NhZ2VWYWxpZGF0b3IsIG9mZnNldCkgewogICAgdmFyIGVycjsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RIZWFkZXIob2Zmc2V0LCBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICB2YXIga1ZlcnNpb25TaXplcyA9IFsKICAgICAge3ZlcnNpb246IDAsIG51bUJ5dGVzOiA4fQogICAgXTsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RWZXJzaW9uKG9mZnNldCwga1ZlcnNpb25TaXplcyk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwogIH07CgogIE1pcnJvclNlcnZpY2VSZW1vdGVyX1N0YXJ0X1BhcmFtcy5lbmNvZGVkU2l6ZSA9IGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMDsKCiAgTWlycm9yU2VydmljZVJlbW90ZXJfU3RhcnRfUGFyYW1zLmRlY29kZSA9IGZ1bmN0aW9uKGRlY29kZXIpIHsKICAgIHZhciBwYWNrZWQ7CiAgICB2YXIgdmFsID0gbmV3IE1pcnJvclNlcnZpY2VSZW1vdGVyX1N0YXJ0X1BhcmFtcygpOwogICAgdmFyIG51bWJlck9mQnl0ZXMgPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhciB2ZXJzaW9uID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICByZXR1cm4gdmFsOwogIH07CgogIE1pcnJvclNlcnZpY2VSZW1vdGVyX1N0YXJ0X1BhcmFtcy5lbmNvZGUgPSBmdW5jdGlvbihlbmNvZGVyLCB2YWwpIHsKICAgIHZhciBwYWNrZWQ7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKE1pcnJvclNlcnZpY2VSZW1vdGVyX1N0YXJ0X1BhcmFtcy5lbmNvZGVkU2l6ZSk7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKDApOwogIH07CiAgZnVuY3Rpb24gTWlycm9yU2VydmljZVJlbW90ZXJfU3RhcnREYXRhU3RyZWFtc19QYXJhbXModmFsdWVzKSB7CiAgICB0aGlzLmluaXREZWZhdWx0c18oKTsKICAgIHRoaXMuaW5pdEZpZWxkc18odmFsdWVzKTsKICB9CgoKICBNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TdGFydERhdGFTdHJlYW1zX1BhcmFtcy5wcm90b3R5cGUuaW5pdERlZmF1bHRzXyA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy5oYXNBdWRpbyA9IGZhbHNlOwogICAgdGhpcy5oYXNWaWRlbyA9IGZhbHNlOwogIH07CiAgTWlycm9yU2VydmljZVJlbW90ZXJfU3RhcnREYXRhU3RyZWFtc19QYXJhbXMucHJvdG90eXBlLmluaXRGaWVsZHNfID0gZnVuY3Rpb24oZmllbGRzKSB7CiAgICBmb3IodmFyIGZpZWxkIGluIGZpZWxkcykgewogICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGZpZWxkKSkKICAgICAgICAgIHRoaXNbZmllbGRdID0gZmllbGRzW2ZpZWxkXTsKICAgIH0KICB9OwoKICBNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TdGFydERhdGFTdHJlYW1zX1BhcmFtcy52YWxpZGF0ZSA9IGZ1bmN0aW9uKG1lc3NhZ2VWYWxpZGF0b3IsIG9mZnNldCkgewogICAgdmFyIGVycjsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RIZWFkZXIob2Zmc2V0LCBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICB2YXIga1ZlcnNpb25TaXplcyA9IFsKICAgICAge3ZlcnNpb246IDAsIG51bUJ5dGVzOiAxNn0KICAgIF07CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0VmVyc2lvbihvZmZzZXQsIGtWZXJzaW9uU2l6ZXMpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKCiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwogIH07CgogIE1pcnJvclNlcnZpY2VSZW1vdGVyX1N0YXJ0RGF0YVN0cmVhbXNfUGFyYW1zLmVuY29kZWRTaXplID0gY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA4OwoKICBNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TdGFydERhdGFTdHJlYW1zX1BhcmFtcy5kZWNvZGUgPSBmdW5jdGlvbihkZWNvZGVyKSB7CiAgICB2YXIgcGFja2VkOwogICAgdmFyIHZhbCA9IG5ldyBNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TdGFydERhdGFTdHJlYW1zX1BhcmFtcygpOwogICAgdmFyIG51bWJlck9mQnl0ZXMgPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhciB2ZXJzaW9uID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICBwYWNrZWQgPSBkZWNvZGVyLnJlYWRVaW50OCgpOwogICAgdmFsLmhhc0F1ZGlvID0gKHBhY2tlZCA+PiAwKSAmIDEgPyB0cnVlIDogZmFsc2U7CiAgICB2YWwuaGFzVmlkZW8gPSAocGFja2VkID4+IDEpICYgMSA/IHRydWUgOiBmYWxzZTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIHJldHVybiB2YWw7CiAgfTsKCiAgTWlycm9yU2VydmljZVJlbW90ZXJfU3RhcnREYXRhU3RyZWFtc19QYXJhbXMuZW5jb2RlID0gZnVuY3Rpb24oZW5jb2RlciwgdmFsKSB7CiAgICB2YXIgcGFja2VkOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMihNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TdGFydERhdGFTdHJlYW1zX1BhcmFtcy5lbmNvZGVkU2l6ZSk7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKDApOwogICAgcGFja2VkID0gMDsKICAgIHBhY2tlZCB8PSAodmFsLmhhc0F1ZGlvICYgMSkgPDwgMAogICAgcGFja2VkIHw9ICh2YWwuaGFzVmlkZW8gJiAxKSA8PCAxCiAgICBlbmNvZGVyLndyaXRlVWludDgocGFja2VkKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICB9OwogIGZ1bmN0aW9uIE1pcnJvclNlcnZpY2VSZW1vdGVyX1N0YXJ0RGF0YVN0cmVhbXNfUmVzcG9uc2VQYXJhbXModmFsdWVzKSB7CiAgICB0aGlzLmluaXREZWZhdWx0c18oKTsKICAgIHRoaXMuaW5pdEZpZWxkc18odmFsdWVzKTsKICB9CgoKICBNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TdGFydERhdGFTdHJlYW1zX1Jlc3BvbnNlUGFyYW1zLnByb3RvdHlwZS5pbml0RGVmYXVsdHNfID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLmF1ZGlvU3RyZWFtSWQgPSAwOwogICAgdGhpcy52aWRlb1N0cmVhbUlkID0gMDsKICB9OwogIE1pcnJvclNlcnZpY2VSZW1vdGVyX1N0YXJ0RGF0YVN0cmVhbXNfUmVzcG9uc2VQYXJhbXMucHJvdG90eXBlLmluaXRGaWVsZHNfID0gZnVuY3Rpb24oZmllbGRzKSB7CiAgICBmb3IodmFyIGZpZWxkIGluIGZpZWxkcykgewogICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGZpZWxkKSkKICAgICAgICAgIHRoaXNbZmllbGRdID0gZmllbGRzW2ZpZWxkXTsKICAgIH0KICB9OwoKICBNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TdGFydERhdGFTdHJlYW1zX1Jlc3BvbnNlUGFyYW1zLnZhbGlkYXRlID0gZnVuY3Rpb24obWVzc2FnZVZhbGlkYXRvciwgb2Zmc2V0KSB7CiAgICB2YXIgZXJyOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdEhlYWRlcihvZmZzZXQsIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHZhciBrVmVyc2lvblNpemVzID0gWwogICAgICB7dmVyc2lvbjogMCwgbnVtQnl0ZXM6IDE2fQogICAgXTsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RWZXJzaW9uKG9mZnNldCwga1ZlcnNpb25TaXplcyk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CiAgfTsKCiAgTWlycm9yU2VydmljZVJlbW90ZXJfU3RhcnREYXRhU3RyZWFtc19SZXNwb25zZVBhcmFtcy5lbmNvZGVkU2l6ZSA9IGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgODsKCiAgTWlycm9yU2VydmljZVJlbW90ZXJfU3RhcnREYXRhU3RyZWFtc19SZXNwb25zZVBhcmFtcy5kZWNvZGUgPSBmdW5jdGlvbihkZWNvZGVyKSB7CiAgICB2YXIgcGFja2VkOwogICAgdmFyIHZhbCA9IG5ldyBNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TdGFydERhdGFTdHJlYW1zX1Jlc3BvbnNlUGFyYW1zKCk7CiAgICB2YXIgbnVtYmVyT2ZCeXRlcyA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFyIHZlcnNpb24gPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhbC5hdWRpb1N0cmVhbUlkID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuSW50MzIpOwogICAgdmFsLnZpZGVvU3RyZWFtSWQgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5JbnQzMik7CiAgICByZXR1cm4gdmFsOwogIH07CgogIE1pcnJvclNlcnZpY2VSZW1vdGVyX1N0YXJ0RGF0YVN0cmVhbXNfUmVzcG9uc2VQYXJhbXMuZW5jb2RlID0gZnVuY3Rpb24oZW5jb2RlciwgdmFsKSB7CiAgICB2YXIgcGFja2VkOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMihNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TdGFydERhdGFTdHJlYW1zX1Jlc3BvbnNlUGFyYW1zLmVuY29kZWRTaXplKTsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoMCk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5JbnQzMiwgdmFsLmF1ZGlvU3RyZWFtSWQpOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuSW50MzIsIHZhbC52aWRlb1N0cmVhbUlkKTsKICB9OwogIGZ1bmN0aW9uIE1pcnJvclNlcnZpY2VSZW1vdGVyX1N0b3BfUGFyYW1zKHZhbHVlcykgewogICAgdGhpcy5pbml0RGVmYXVsdHNfKCk7CiAgICB0aGlzLmluaXRGaWVsZHNfKHZhbHVlcyk7CiAgfQoKCiAgTWlycm9yU2VydmljZVJlbW90ZXJfU3RvcF9QYXJhbXMucHJvdG90eXBlLmluaXREZWZhdWx0c18gPSBmdW5jdGlvbigpIHsKICAgIHRoaXMucmVhc29uID0gMDsKICB9OwogIE1pcnJvclNlcnZpY2VSZW1vdGVyX1N0b3BfUGFyYW1zLnByb3RvdHlwZS5pbml0RmllbGRzXyA9IGZ1bmN0aW9uKGZpZWxkcykgewogICAgZm9yKHZhciBmaWVsZCBpbiBmaWVsZHMpIHsKICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpCiAgICAgICAgICB0aGlzW2ZpZWxkXSA9IGZpZWxkc1tmaWVsZF07CiAgICB9CiAgfTsKCiAgTWlycm9yU2VydmljZVJlbW90ZXJfU3RvcF9QYXJhbXMudmFsaWRhdGUgPSBmdW5jdGlvbihtZXNzYWdlVmFsaWRhdG9yLCBvZmZzZXQpIHsKICAgIHZhciBlcnI7CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0SGVhZGVyKG9mZnNldCwgY29kZWMua1N0cnVjdEhlYWRlclNpemUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgdmFyIGtWZXJzaW9uU2l6ZXMgPSBbCiAgICAgIHt2ZXJzaW9uOiAwLCBudW1CeXRlczogMTZ9CiAgICBdOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFZlcnNpb24ob2Zmc2V0LCBrVmVyc2lvblNpemVzKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TdG9wX1BhcmFtcy5yZWFzb24KICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVFbnVtKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMCwgcmVtb3RpbmdfY29tbW9uJC5SZW1vdGluZ1N0b3BSZWFzb24pOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICB9OwoKICBNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TdG9wX1BhcmFtcy5lbmNvZGVkU2l6ZSA9IGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgODsKCiAgTWlycm9yU2VydmljZVJlbW90ZXJfU3RvcF9QYXJhbXMuZGVjb2RlID0gZnVuY3Rpb24oZGVjb2RlcikgewogICAgdmFyIHBhY2tlZDsKICAgIHZhciB2YWwgPSBuZXcgTWlycm9yU2VydmljZVJlbW90ZXJfU3RvcF9QYXJhbXMoKTsKICAgIHZhciBudW1iZXJPZkJ5dGVzID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YXIgdmVyc2lvbiA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFsLnJlYXNvbiA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLkludDMyKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIHJldHVybiB2YWw7CiAgfTsKCiAgTWlycm9yU2VydmljZVJlbW90ZXJfU3RvcF9QYXJhbXMuZW5jb2RlID0gZnVuY3Rpb24oZW5jb2RlciwgdmFsKSB7CiAgICB2YXIgcGFja2VkOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMihNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TdG9wX1BhcmFtcy5lbmNvZGVkU2l6ZSk7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKDApOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuSW50MzIsIHZhbC5yZWFzb24pOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogIH07CiAgZnVuY3Rpb24gTWlycm9yU2VydmljZVJlbW90ZXJfU2VuZE1lc3NhZ2VUb1NpbmtfUGFyYW1zKHZhbHVlcykgewogICAgdGhpcy5pbml0RGVmYXVsdHNfKCk7CiAgICB0aGlzLmluaXRGaWVsZHNfKHZhbHVlcyk7CiAgfQoKCiAgTWlycm9yU2VydmljZVJlbW90ZXJfU2VuZE1lc3NhZ2VUb1NpbmtfUGFyYW1zLnByb3RvdHlwZS5pbml0RGVmYXVsdHNfID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLm1lc3NhZ2UgPSBudWxsOwogIH07CiAgTWlycm9yU2VydmljZVJlbW90ZXJfU2VuZE1lc3NhZ2VUb1NpbmtfUGFyYW1zLnByb3RvdHlwZS5pbml0RmllbGRzXyA9IGZ1bmN0aW9uKGZpZWxkcykgewogICAgZm9yKHZhciBmaWVsZCBpbiBmaWVsZHMpIHsKICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpCiAgICAgICAgICB0aGlzW2ZpZWxkXSA9IGZpZWxkc1tmaWVsZF07CiAgICB9CiAgfTsKCiAgTWlycm9yU2VydmljZVJlbW90ZXJfU2VuZE1lc3NhZ2VUb1NpbmtfUGFyYW1zLnZhbGlkYXRlID0gZnVuY3Rpb24obWVzc2FnZVZhbGlkYXRvciwgb2Zmc2V0KSB7CiAgICB2YXIgZXJyOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdEhlYWRlcihvZmZzZXQsIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHZhciBrVmVyc2lvblNpemVzID0gWwogICAgICB7dmVyc2lvbjogMCwgbnVtQnl0ZXM6IDE2fQogICAgXTsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RWZXJzaW9uKG9mZnNldCwga1ZlcnNpb25TaXplcyk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgTWlycm9yU2VydmljZVJlbW90ZXJfU2VuZE1lc3NhZ2VUb1NpbmtfUGFyYW1zLm1lc3NhZ2UKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVBcnJheVBvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAwLCAxLCBjb2RlYy5VaW50OCwgZmFsc2UsIFswXSwgMCk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwogIH07CgogIE1pcnJvclNlcnZpY2VSZW1vdGVyX1NlbmRNZXNzYWdlVG9TaW5rX1BhcmFtcy5lbmNvZGVkU2l6ZSA9IGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgODsKCiAgTWlycm9yU2VydmljZVJlbW90ZXJfU2VuZE1lc3NhZ2VUb1NpbmtfUGFyYW1zLmRlY29kZSA9IGZ1bmN0aW9uKGRlY29kZXIpIHsKICAgIHZhciBwYWNrZWQ7CiAgICB2YXIgdmFsID0gbmV3IE1pcnJvclNlcnZpY2VSZW1vdGVyX1NlbmRNZXNzYWdlVG9TaW5rX1BhcmFtcygpOwogICAgdmFyIG51bWJlck9mQnl0ZXMgPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhciB2ZXJzaW9uID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YWwubWVzc2FnZSA9IGRlY29kZXIuZGVjb2RlQXJyYXlQb2ludGVyKGNvZGVjLlVpbnQ4KTsKICAgIHJldHVybiB2YWw7CiAgfTsKCiAgTWlycm9yU2VydmljZVJlbW90ZXJfU2VuZE1lc3NhZ2VUb1NpbmtfUGFyYW1zLmVuY29kZSA9IGZ1bmN0aW9uKGVuY29kZXIsIHZhbCkgewogICAgdmFyIHBhY2tlZDsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoTWlycm9yU2VydmljZVJlbW90ZXJfU2VuZE1lc3NhZ2VUb1NpbmtfUGFyYW1zLmVuY29kZWRTaXplKTsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoMCk7CiAgICBlbmNvZGVyLmVuY29kZUFycmF5UG9pbnRlcihjb2RlYy5VaW50OCwgdmFsLm1lc3NhZ2UpOwogIH07CiAgZnVuY3Rpb24gTWlycm9yU2VydmljZVJlbW90ZXJfRXN0aW1hdGVUcmFuc21pc3Npb25DYXBhY2l0eV9QYXJhbXModmFsdWVzKSB7CiAgICB0aGlzLmluaXREZWZhdWx0c18oKTsKICAgIHRoaXMuaW5pdEZpZWxkc18odmFsdWVzKTsKICB9CgoKICBNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9Fc3RpbWF0ZVRyYW5zbWlzc2lvbkNhcGFjaXR5X1BhcmFtcy5wcm90b3R5cGUuaW5pdERlZmF1bHRzXyA9IGZ1bmN0aW9uKCkgewogIH07CiAgTWlycm9yU2VydmljZVJlbW90ZXJfRXN0aW1hdGVUcmFuc21pc3Npb25DYXBhY2l0eV9QYXJhbXMucHJvdG90eXBlLmluaXRGaWVsZHNfID0gZnVuY3Rpb24oZmllbGRzKSB7CiAgICBmb3IodmFyIGZpZWxkIGluIGZpZWxkcykgewogICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGZpZWxkKSkKICAgICAgICAgIHRoaXNbZmllbGRdID0gZmllbGRzW2ZpZWxkXTsKICAgIH0KICB9OwoKICBNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9Fc3RpbWF0ZVRyYW5zbWlzc2lvbkNhcGFjaXR5X1BhcmFtcy52YWxpZGF0ZSA9IGZ1bmN0aW9uKG1lc3NhZ2VWYWxpZGF0b3IsIG9mZnNldCkgewogICAgdmFyIGVycjsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RIZWFkZXIob2Zmc2V0LCBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICB2YXIga1ZlcnNpb25TaXplcyA9IFsKICAgICAge3ZlcnNpb246IDAsIG51bUJ5dGVzOiA4fQogICAgXTsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RWZXJzaW9uKG9mZnNldCwga1ZlcnNpb25TaXplcyk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwogIH07CgogIE1pcnJvclNlcnZpY2VSZW1vdGVyX0VzdGltYXRlVHJhbnNtaXNzaW9uQ2FwYWNpdHlfUGFyYW1zLmVuY29kZWRTaXplID0gY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAwOwoKICBNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9Fc3RpbWF0ZVRyYW5zbWlzc2lvbkNhcGFjaXR5X1BhcmFtcy5kZWNvZGUgPSBmdW5jdGlvbihkZWNvZGVyKSB7CiAgICB2YXIgcGFja2VkOwogICAgdmFyIHZhbCA9IG5ldyBNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9Fc3RpbWF0ZVRyYW5zbWlzc2lvbkNhcGFjaXR5X1BhcmFtcygpOwogICAgdmFyIG51bWJlck9mQnl0ZXMgPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhciB2ZXJzaW9uID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICByZXR1cm4gdmFsOwogIH07CgogIE1pcnJvclNlcnZpY2VSZW1vdGVyX0VzdGltYXRlVHJhbnNtaXNzaW9uQ2FwYWNpdHlfUGFyYW1zLmVuY29kZSA9IGZ1bmN0aW9uKGVuY29kZXIsIHZhbCkgewogICAgdmFyIHBhY2tlZDsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoTWlycm9yU2VydmljZVJlbW90ZXJfRXN0aW1hdGVUcmFuc21pc3Npb25DYXBhY2l0eV9QYXJhbXMuZW5jb2RlZFNpemUpOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMigwKTsKICB9OwogIGZ1bmN0aW9uIE1pcnJvclNlcnZpY2VSZW1vdGVyX0VzdGltYXRlVHJhbnNtaXNzaW9uQ2FwYWNpdHlfUmVzcG9uc2VQYXJhbXModmFsdWVzKSB7CiAgICB0aGlzLmluaXREZWZhdWx0c18oKTsKICAgIHRoaXMuaW5pdEZpZWxkc18odmFsdWVzKTsKICB9CgoKICBNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9Fc3RpbWF0ZVRyYW5zbWlzc2lvbkNhcGFjaXR5X1Jlc3BvbnNlUGFyYW1zLnByb3RvdHlwZS5pbml0RGVmYXVsdHNfID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLnJhdGUgPSAwOwogIH07CiAgTWlycm9yU2VydmljZVJlbW90ZXJfRXN0aW1hdGVUcmFuc21pc3Npb25DYXBhY2l0eV9SZXNwb25zZVBhcmFtcy5wcm90b3R5cGUuaW5pdEZpZWxkc18gPSBmdW5jdGlvbihmaWVsZHMpIHsKICAgIGZvcih2YXIgZmllbGQgaW4gZmllbGRzKSB7CiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoZmllbGQpKQogICAgICAgICAgdGhpc1tmaWVsZF0gPSBmaWVsZHNbZmllbGRdOwogICAgfQogIH07CgogIE1pcnJvclNlcnZpY2VSZW1vdGVyX0VzdGltYXRlVHJhbnNtaXNzaW9uQ2FwYWNpdHlfUmVzcG9uc2VQYXJhbXMudmFsaWRhdGUgPSBmdW5jdGlvbihtZXNzYWdlVmFsaWRhdG9yLCBvZmZzZXQpIHsKICAgIHZhciBlcnI7CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0SGVhZGVyKG9mZnNldCwgY29kZWMua1N0cnVjdEhlYWRlclNpemUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgdmFyIGtWZXJzaW9uU2l6ZXMgPSBbCiAgICAgIHt2ZXJzaW9uOiAwLCBudW1CeXRlczogMTZ9CiAgICBdOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFZlcnNpb24ob2Zmc2V0LCBrVmVyc2lvblNpemVzKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwogIH07CgogIE1pcnJvclNlcnZpY2VSZW1vdGVyX0VzdGltYXRlVHJhbnNtaXNzaW9uQ2FwYWNpdHlfUmVzcG9uc2VQYXJhbXMuZW5jb2RlZFNpemUgPSBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDg7CgogIE1pcnJvclNlcnZpY2VSZW1vdGVyX0VzdGltYXRlVHJhbnNtaXNzaW9uQ2FwYWNpdHlfUmVzcG9uc2VQYXJhbXMuZGVjb2RlID0gZnVuY3Rpb24oZGVjb2RlcikgewogICAgdmFyIHBhY2tlZDsKICAgIHZhciB2YWwgPSBuZXcgTWlycm9yU2VydmljZVJlbW90ZXJfRXN0aW1hdGVUcmFuc21pc3Npb25DYXBhY2l0eV9SZXNwb25zZVBhcmFtcygpOwogICAgdmFyIG51bWJlck9mQnl0ZXMgPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhciB2ZXJzaW9uID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YWwucmF0ZSA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLkRvdWJsZSk7CiAgICByZXR1cm4gdmFsOwogIH07CgogIE1pcnJvclNlcnZpY2VSZW1vdGVyX0VzdGltYXRlVHJhbnNtaXNzaW9uQ2FwYWNpdHlfUmVzcG9uc2VQYXJhbXMuZW5jb2RlID0gZnVuY3Rpb24oZW5jb2RlciwgdmFsKSB7CiAgICB2YXIgcGFja2VkOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMihNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9Fc3RpbWF0ZVRyYW5zbWlzc2lvbkNhcGFjaXR5X1Jlc3BvbnNlUGFyYW1zLmVuY29kZWRTaXplKTsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoMCk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5Eb3VibGUsIHZhbC5yYXRlKTsKICB9OwogIGZ1bmN0aW9uIE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZV9PblNpbmtBdmFpbGFibGVfUGFyYW1zKHZhbHVlcykgewogICAgdGhpcy5pbml0RGVmYXVsdHNfKCk7CiAgICB0aGlzLmluaXRGaWVsZHNfKHZhbHVlcyk7CiAgfQoKCiAgTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlX09uU2lua0F2YWlsYWJsZV9QYXJhbXMucHJvdG90eXBlLmluaXREZWZhdWx0c18gPSBmdW5jdGlvbigpIHsKICAgIHRoaXMubWV0YWRhdGEgPSBudWxsOwogIH07CiAgTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlX09uU2lua0F2YWlsYWJsZV9QYXJhbXMucHJvdG90eXBlLmluaXRGaWVsZHNfID0gZnVuY3Rpb24oZmllbGRzKSB7CiAgICBmb3IodmFyIGZpZWxkIGluIGZpZWxkcykgewogICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGZpZWxkKSkKICAgICAgICAgIHRoaXNbZmllbGRdID0gZmllbGRzW2ZpZWxkXTsKICAgIH0KICB9OwoKICBNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VfT25TaW5rQXZhaWxhYmxlX1BhcmFtcy52YWxpZGF0ZSA9IGZ1bmN0aW9uKG1lc3NhZ2VWYWxpZGF0b3IsIG9mZnNldCkgewogICAgdmFyIGVycjsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RIZWFkZXIob2Zmc2V0LCBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICB2YXIga1ZlcnNpb25TaXplcyA9IFsKICAgICAge3ZlcnNpb246IDAsIG51bUJ5dGVzOiAxNn0KICAgIF07CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0VmVyc2lvbihvZmZzZXQsIGtWZXJzaW9uU2l6ZXMpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZV9PblNpbmtBdmFpbGFibGVfUGFyYW1zLm1ldGFkYXRhCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0UG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDAsIHJlbW90aW5nX2NvbW1vbiQuUmVtb3RpbmdTaW5rTWV0YWRhdGEsIGZhbHNlKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CiAgfTsKCiAgTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlX09uU2lua0F2YWlsYWJsZV9QYXJhbXMuZW5jb2RlZFNpemUgPSBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDg7CgogIE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZV9PblNpbmtBdmFpbGFibGVfUGFyYW1zLmRlY29kZSA9IGZ1bmN0aW9uKGRlY29kZXIpIHsKICAgIHZhciBwYWNrZWQ7CiAgICB2YXIgdmFsID0gbmV3IE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZV9PblNpbmtBdmFpbGFibGVfUGFyYW1zKCk7CiAgICB2YXIgbnVtYmVyT2ZCeXRlcyA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFyIHZlcnNpb24gPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhbC5tZXRhZGF0YSA9IGRlY29kZXIuZGVjb2RlU3RydWN0UG9pbnRlcihyZW1vdGluZ19jb21tb24kLlJlbW90aW5nU2lua01ldGFkYXRhKTsKICAgIHJldHVybiB2YWw7CiAgfTsKCiAgTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlX09uU2lua0F2YWlsYWJsZV9QYXJhbXMuZW5jb2RlID0gZnVuY3Rpb24oZW5jb2RlciwgdmFsKSB7CiAgICB2YXIgcGFja2VkOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMihNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VfT25TaW5rQXZhaWxhYmxlX1BhcmFtcy5lbmNvZGVkU2l6ZSk7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKDApOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3RQb2ludGVyKHJlbW90aW5nX2NvbW1vbiQuUmVtb3RpbmdTaW5rTWV0YWRhdGEsIHZhbC5tZXRhZGF0YSk7CiAgfTsKICBmdW5jdGlvbiBNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VfT25NZXNzYWdlRnJvbVNpbmtfUGFyYW1zKHZhbHVlcykgewogICAgdGhpcy5pbml0RGVmYXVsdHNfKCk7CiAgICB0aGlzLmluaXRGaWVsZHNfKHZhbHVlcyk7CiAgfQoKCiAgTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlX09uTWVzc2FnZUZyb21TaW5rX1BhcmFtcy5wcm90b3R5cGUuaW5pdERlZmF1bHRzXyA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy5tZXNzYWdlID0gbnVsbDsKICB9OwogIE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZV9Pbk1lc3NhZ2VGcm9tU2lua19QYXJhbXMucHJvdG90eXBlLmluaXRGaWVsZHNfID0gZnVuY3Rpb24oZmllbGRzKSB7CiAgICBmb3IodmFyIGZpZWxkIGluIGZpZWxkcykgewogICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGZpZWxkKSkKICAgICAgICAgIHRoaXNbZmllbGRdID0gZmllbGRzW2ZpZWxkXTsKICAgIH0KICB9OwoKICBNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VfT25NZXNzYWdlRnJvbVNpbmtfUGFyYW1zLnZhbGlkYXRlID0gZnVuY3Rpb24obWVzc2FnZVZhbGlkYXRvciwgb2Zmc2V0KSB7CiAgICB2YXIgZXJyOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdEhlYWRlcihvZmZzZXQsIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHZhciBrVmVyc2lvblNpemVzID0gWwogICAgICB7dmVyc2lvbjogMCwgbnVtQnl0ZXM6IDE2fQogICAgXTsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RWZXJzaW9uKG9mZnNldCwga1ZlcnNpb25TaXplcyk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlX09uTWVzc2FnZUZyb21TaW5rX1BhcmFtcy5tZXNzYWdlCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlQXJyYXlQb2ludGVyKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMCwgMSwgY29kZWMuVWludDgsIGZhbHNlLCBbMF0sIDApOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICB9OwoKICBNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VfT25NZXNzYWdlRnJvbVNpbmtfUGFyYW1zLmVuY29kZWRTaXplID0gY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA4OwoKICBNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VfT25NZXNzYWdlRnJvbVNpbmtfUGFyYW1zLmRlY29kZSA9IGZ1bmN0aW9uKGRlY29kZXIpIHsKICAgIHZhciBwYWNrZWQ7CiAgICB2YXIgdmFsID0gbmV3IE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZV9Pbk1lc3NhZ2VGcm9tU2lua19QYXJhbXMoKTsKICAgIHZhciBudW1iZXJPZkJ5dGVzID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YXIgdmVyc2lvbiA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFsLm1lc3NhZ2UgPSBkZWNvZGVyLmRlY29kZUFycmF5UG9pbnRlcihjb2RlYy5VaW50OCk7CiAgICByZXR1cm4gdmFsOwogIH07CgogIE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZV9Pbk1lc3NhZ2VGcm9tU2lua19QYXJhbXMuZW5jb2RlID0gZnVuY3Rpb24oZW5jb2RlciwgdmFsKSB7CiAgICB2YXIgcGFja2VkOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMihNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VfT25NZXNzYWdlRnJvbVNpbmtfUGFyYW1zLmVuY29kZWRTaXplKTsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoMCk7CiAgICBlbmNvZGVyLmVuY29kZUFycmF5UG9pbnRlcihjb2RlYy5VaW50OCwgdmFsLm1lc3NhZ2UpOwogIH07CiAgZnVuY3Rpb24gTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlX09uU3RvcHBlZF9QYXJhbXModmFsdWVzKSB7CiAgICB0aGlzLmluaXREZWZhdWx0c18oKTsKICAgIHRoaXMuaW5pdEZpZWxkc18odmFsdWVzKTsKICB9CgoKICBNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VfT25TdG9wcGVkX1BhcmFtcy5wcm90b3R5cGUuaW5pdERlZmF1bHRzXyA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy5yZWFzb24gPSAwOwogIH07CiAgTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlX09uU3RvcHBlZF9QYXJhbXMucHJvdG90eXBlLmluaXRGaWVsZHNfID0gZnVuY3Rpb24oZmllbGRzKSB7CiAgICBmb3IodmFyIGZpZWxkIGluIGZpZWxkcykgewogICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGZpZWxkKSkKICAgICAgICAgIHRoaXNbZmllbGRdID0gZmllbGRzW2ZpZWxkXTsKICAgIH0KICB9OwoKICBNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VfT25TdG9wcGVkX1BhcmFtcy52YWxpZGF0ZSA9IGZ1bmN0aW9uKG1lc3NhZ2VWYWxpZGF0b3IsIG9mZnNldCkgewogICAgdmFyIGVycjsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RIZWFkZXIob2Zmc2V0LCBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICB2YXIga1ZlcnNpb25TaXplcyA9IFsKICAgICAge3ZlcnNpb246IDAsIG51bUJ5dGVzOiAxNn0KICAgIF07CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0VmVyc2lvbihvZmZzZXQsIGtWZXJzaW9uU2l6ZXMpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZV9PblN0b3BwZWRfUGFyYW1zLnJlYXNvbgogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZUVudW0ob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAwLCByZW1vdGluZ19jb21tb24kLlJlbW90aW5nU3RvcFJlYXNvbik7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwogIH07CgogIE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZV9PblN0b3BwZWRfUGFyYW1zLmVuY29kZWRTaXplID0gY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA4OwoKICBNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VfT25TdG9wcGVkX1BhcmFtcy5kZWNvZGUgPSBmdW5jdGlvbihkZWNvZGVyKSB7CiAgICB2YXIgcGFja2VkOwogICAgdmFyIHZhbCA9IG5ldyBNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VfT25TdG9wcGVkX1BhcmFtcygpOwogICAgdmFyIG51bWJlck9mQnl0ZXMgPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhciB2ZXJzaW9uID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YWwucmVhc29uID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuSW50MzIpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgcmV0dXJuIHZhbDsKICB9OwoKICBNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VfT25TdG9wcGVkX1BhcmFtcy5lbmNvZGUgPSBmdW5jdGlvbihlbmNvZGVyLCB2YWwpIHsKICAgIHZhciBwYWNrZWQ7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZV9PblN0b3BwZWRfUGFyYW1zLmVuY29kZWRTaXplKTsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoMCk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5JbnQzMiwgdmFsLnJlYXNvbik7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgfTsKICBmdW5jdGlvbiBNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VfT25FcnJvcl9QYXJhbXModmFsdWVzKSB7CiAgICB0aGlzLmluaXREZWZhdWx0c18oKTsKICAgIHRoaXMuaW5pdEZpZWxkc18odmFsdWVzKTsKICB9CgoKICBNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VfT25FcnJvcl9QYXJhbXMucHJvdG90eXBlLmluaXREZWZhdWx0c18gPSBmdW5jdGlvbigpIHsKICB9OwogIE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZV9PbkVycm9yX1BhcmFtcy5wcm90b3R5cGUuaW5pdEZpZWxkc18gPSBmdW5jdGlvbihmaWVsZHMpIHsKICAgIGZvcih2YXIgZmllbGQgaW4gZmllbGRzKSB7CiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoZmllbGQpKQogICAgICAgICAgdGhpc1tmaWVsZF0gPSBmaWVsZHNbZmllbGRdOwogICAgfQogIH07CgogIE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZV9PbkVycm9yX1BhcmFtcy52YWxpZGF0ZSA9IGZ1bmN0aW9uKG1lc3NhZ2VWYWxpZGF0b3IsIG9mZnNldCkgewogICAgdmFyIGVycjsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RIZWFkZXIob2Zmc2V0LCBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICB2YXIga1ZlcnNpb25TaXplcyA9IFsKICAgICAge3ZlcnNpb246IDAsIG51bUJ5dGVzOiA4fQogICAgXTsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RWZXJzaW9uKG9mZnNldCwga1ZlcnNpb25TaXplcyk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwogIH07CgogIE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZV9PbkVycm9yX1BhcmFtcy5lbmNvZGVkU2l6ZSA9IGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMDsKCiAgTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlX09uRXJyb3JfUGFyYW1zLmRlY29kZSA9IGZ1bmN0aW9uKGRlY29kZXIpIHsKICAgIHZhciBwYWNrZWQ7CiAgICB2YXIgdmFsID0gbmV3IE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZV9PbkVycm9yX1BhcmFtcygpOwogICAgdmFyIG51bWJlck9mQnl0ZXMgPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhciB2ZXJzaW9uID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICByZXR1cm4gdmFsOwogIH07CgogIE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZV9PbkVycm9yX1BhcmFtcy5lbmNvZGUgPSBmdW5jdGlvbihlbmNvZGVyLCB2YWwpIHsKICAgIHZhciBwYWNrZWQ7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZV9PbkVycm9yX1BhcmFtcy5lbmNvZGVkU2l6ZSk7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKDApOwogIH07CiAgdmFyIGtNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TdGFydF9OYW1lID0gMTU5NzI0NTQwMTsKICB2YXIga01pcnJvclNlcnZpY2VSZW1vdGVyX1N0YXJ0RGF0YVN0cmVhbXNfTmFtZSA9IDE0NzQ0OTc3OTY7CiAgdmFyIGtNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TdG9wX05hbWUgPSAyNDc1MDY1OTY7CiAgdmFyIGtNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TZW5kTWVzc2FnZVRvU2lua19OYW1lID0gMTY1MTI1NjA1NTsKICB2YXIga01pcnJvclNlcnZpY2VSZW1vdGVyX0VzdGltYXRlVHJhbnNtaXNzaW9uQ2FwYWNpdHlfTmFtZSA9IDI1NTU4Mjg0MjsKCiAgZnVuY3Rpb24gTWlycm9yU2VydmljZVJlbW90ZXJQdHIoaGFuZGxlT3JQdHJJbmZvKSB7CiAgICB0aGlzLnB0ciA9IG5ldyBiaW5kaW5ncy5JbnRlcmZhY2VQdHJDb250cm9sbGVyKE1pcnJvclNlcnZpY2VSZW1vdGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVPclB0ckluZm8pOwogIH0KCiAgZnVuY3Rpb24gTWlycm9yU2VydmljZVJlbW90ZXJBc3NvY2lhdGVkUHRyKGFzc29jaWF0ZWRJbnRlcmZhY2VQdHJJbmZvKSB7CiAgICB0aGlzLnB0ciA9IG5ldyBhc3NvY2lhdGVkQmluZGluZ3MuQXNzb2NpYXRlZEludGVyZmFjZVB0ckNvbnRyb2xsZXIoCiAgICAgICAgTWlycm9yU2VydmljZVJlbW90ZXIsIGFzc29jaWF0ZWRJbnRlcmZhY2VQdHJJbmZvKTsKICB9CgogIE1pcnJvclNlcnZpY2VSZW1vdGVyQXNzb2NpYXRlZFB0ci5wcm90b3R5cGUgPQogICAgICBPYmplY3QuY3JlYXRlKE1pcnJvclNlcnZpY2VSZW1vdGVyUHRyLnByb3RvdHlwZSk7CiAgTWlycm9yU2VydmljZVJlbW90ZXJBc3NvY2lhdGVkUHRyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9CiAgICAgIE1pcnJvclNlcnZpY2VSZW1vdGVyQXNzb2NpYXRlZFB0cjsKCiAgZnVuY3Rpb24gTWlycm9yU2VydmljZVJlbW90ZXJQcm94eShyZWNlaXZlcikgewogICAgdGhpcy5yZWNlaXZlcl8gPSByZWNlaXZlcjsKICB9CiAgTWlycm9yU2VydmljZVJlbW90ZXJQdHIucHJvdG90eXBlLnN0YXJ0ID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gTWlycm9yU2VydmljZVJlbW90ZXJQcm94eS5wcm90b3R5cGUuc3RhcnQKICAgICAgICAuYXBwbHkodGhpcy5wdHIuZ2V0UHJveHkoKSwgYXJndW1lbnRzKTsKICB9OwoKICBNaXJyb3JTZXJ2aWNlUmVtb3RlclByb3h5LnByb3RvdHlwZS5zdGFydCA9IGZ1bmN0aW9uKCkgewogICAgdmFyIHBhcmFtcyA9IG5ldyBNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TdGFydF9QYXJhbXMoKTsKICAgIHZhciBidWlsZGVyID0gbmV3IGNvZGVjLk1lc3NhZ2VWMEJ1aWxkZXIoCiAgICAgICAga01pcnJvclNlcnZpY2VSZW1vdGVyX1N0YXJ0X05hbWUsCiAgICAgICAgY29kZWMuYWxpZ24oTWlycm9yU2VydmljZVJlbW90ZXJfU3RhcnRfUGFyYW1zLmVuY29kZWRTaXplKSk7CiAgICBidWlsZGVyLmVuY29kZVN0cnVjdChNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TdGFydF9QYXJhbXMsIHBhcmFtcyk7CiAgICB2YXIgbWVzc2FnZSA9IGJ1aWxkZXIuZmluaXNoKCk7CiAgICB0aGlzLnJlY2VpdmVyXy5hY2NlcHQobWVzc2FnZSk7CiAgfTsKICBNaXJyb3JTZXJ2aWNlUmVtb3RlclB0ci5wcm90b3R5cGUuc3RhcnREYXRhU3RyZWFtcyA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIE1pcnJvclNlcnZpY2VSZW1vdGVyUHJveHkucHJvdG90eXBlLnN0YXJ0RGF0YVN0cmVhbXMKICAgICAgICAuYXBwbHkodGhpcy5wdHIuZ2V0UHJveHkoKSwgYXJndW1lbnRzKTsKICB9OwoKICBNaXJyb3JTZXJ2aWNlUmVtb3RlclByb3h5LnByb3RvdHlwZS5zdGFydERhdGFTdHJlYW1zID0gZnVuY3Rpb24oaGFzQXVkaW8sIGhhc1ZpZGVvKSB7CiAgICB2YXIgcGFyYW1zID0gbmV3IE1pcnJvclNlcnZpY2VSZW1vdGVyX1N0YXJ0RGF0YVN0cmVhbXNfUGFyYW1zKCk7CiAgICBwYXJhbXMuaGFzQXVkaW8gPSBoYXNBdWRpbzsKICAgIHBhcmFtcy5oYXNWaWRlbyA9IGhhc1ZpZGVvOwogICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkgewogICAgICB2YXIgYnVpbGRlciA9IG5ldyBjb2RlYy5NZXNzYWdlVjFCdWlsZGVyKAogICAgICAgICAga01pcnJvclNlcnZpY2VSZW1vdGVyX1N0YXJ0RGF0YVN0cmVhbXNfTmFtZSwKICAgICAgICAgIGNvZGVjLmFsaWduKE1pcnJvclNlcnZpY2VSZW1vdGVyX1N0YXJ0RGF0YVN0cmVhbXNfUGFyYW1zLmVuY29kZWRTaXplKSwKICAgICAgICAgIGNvZGVjLmtNZXNzYWdlRXhwZWN0c1Jlc3BvbnNlLCAwKTsKICAgICAgYnVpbGRlci5lbmNvZGVTdHJ1Y3QoTWlycm9yU2VydmljZVJlbW90ZXJfU3RhcnREYXRhU3RyZWFtc19QYXJhbXMsIHBhcmFtcyk7CiAgICAgIHZhciBtZXNzYWdlID0gYnVpbGRlci5maW5pc2goKTsKICAgICAgdGhpcy5yZWNlaXZlcl8uYWNjZXB0QW5kRXhwZWN0UmVzcG9uc2UobWVzc2FnZSkudGhlbihmdW5jdGlvbihtZXNzYWdlKSB7CiAgICAgICAgdmFyIHJlYWRlciA9IG5ldyBjb2RlYy5NZXNzYWdlUmVhZGVyKG1lc3NhZ2UpOwogICAgICAgIHZhciByZXNwb25zZVBhcmFtcyA9CiAgICAgICAgICAgIHJlYWRlci5kZWNvZGVTdHJ1Y3QoTWlycm9yU2VydmljZVJlbW90ZXJfU3RhcnREYXRhU3RyZWFtc19SZXNwb25zZVBhcmFtcyk7CiAgICAgICAgcmVzb2x2ZShyZXNwb25zZVBhcmFtcyk7CiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKHJlc3VsdCkgewogICAgICAgIHJlamVjdChFcnJvcigiQ29ubmVjdGlvbiBlcnJvcjogIiArIHJlc3VsdCkpOwogICAgICB9KTsKICAgIH0uYmluZCh0aGlzKSk7CiAgfTsKICBNaXJyb3JTZXJ2aWNlUmVtb3RlclB0ci5wcm90b3R5cGUuc3RvcCA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIE1pcnJvclNlcnZpY2VSZW1vdGVyUHJveHkucHJvdG90eXBlLnN0b3AKICAgICAgICAuYXBwbHkodGhpcy5wdHIuZ2V0UHJveHkoKSwgYXJndW1lbnRzKTsKICB9OwoKICBNaXJyb3JTZXJ2aWNlUmVtb3RlclByb3h5LnByb3RvdHlwZS5zdG9wID0gZnVuY3Rpb24ocmVhc29uKSB7CiAgICB2YXIgcGFyYW1zID0gbmV3IE1pcnJvclNlcnZpY2VSZW1vdGVyX1N0b3BfUGFyYW1zKCk7CiAgICBwYXJhbXMucmVhc29uID0gcmVhc29uOwogICAgdmFyIGJ1aWxkZXIgPSBuZXcgY29kZWMuTWVzc2FnZVYwQnVpbGRlcigKICAgICAgICBrTWlycm9yU2VydmljZVJlbW90ZXJfU3RvcF9OYW1lLAogICAgICAgIGNvZGVjLmFsaWduKE1pcnJvclNlcnZpY2VSZW1vdGVyX1N0b3BfUGFyYW1zLmVuY29kZWRTaXplKSk7CiAgICBidWlsZGVyLmVuY29kZVN0cnVjdChNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TdG9wX1BhcmFtcywgcGFyYW1zKTsKICAgIHZhciBtZXNzYWdlID0gYnVpbGRlci5maW5pc2goKTsKICAgIHRoaXMucmVjZWl2ZXJfLmFjY2VwdChtZXNzYWdlKTsKICB9OwogIE1pcnJvclNlcnZpY2VSZW1vdGVyUHRyLnByb3RvdHlwZS5zZW5kTWVzc2FnZVRvU2luayA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIE1pcnJvclNlcnZpY2VSZW1vdGVyUHJveHkucHJvdG90eXBlLnNlbmRNZXNzYWdlVG9TaW5rCiAgICAgICAgLmFwcGx5KHRoaXMucHRyLmdldFByb3h5KCksIGFyZ3VtZW50cyk7CiAgfTsKCiAgTWlycm9yU2VydmljZVJlbW90ZXJQcm94eS5wcm90b3R5cGUuc2VuZE1lc3NhZ2VUb1NpbmsgPSBmdW5jdGlvbihtZXNzYWdlKSB7CiAgICB2YXIgcGFyYW1zID0gbmV3IE1pcnJvclNlcnZpY2VSZW1vdGVyX1NlbmRNZXNzYWdlVG9TaW5rX1BhcmFtcygpOwogICAgcGFyYW1zLm1lc3NhZ2UgPSBtZXNzYWdlOwogICAgdmFyIGJ1aWxkZXIgPSBuZXcgY29kZWMuTWVzc2FnZVYwQnVpbGRlcigKICAgICAgICBrTWlycm9yU2VydmljZVJlbW90ZXJfU2VuZE1lc3NhZ2VUb1NpbmtfTmFtZSwKICAgICAgICBjb2RlYy5hbGlnbihNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TZW5kTWVzc2FnZVRvU2lua19QYXJhbXMuZW5jb2RlZFNpemUpKTsKICAgIGJ1aWxkZXIuZW5jb2RlU3RydWN0KE1pcnJvclNlcnZpY2VSZW1vdGVyX1NlbmRNZXNzYWdlVG9TaW5rX1BhcmFtcywgcGFyYW1zKTsKICAgIHZhciBtZXNzYWdlID0gYnVpbGRlci5maW5pc2goKTsKICAgIHRoaXMucmVjZWl2ZXJfLmFjY2VwdChtZXNzYWdlKTsKICB9OwogIE1pcnJvclNlcnZpY2VSZW1vdGVyUHRyLnByb3RvdHlwZS5lc3RpbWF0ZVRyYW5zbWlzc2lvbkNhcGFjaXR5ID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gTWlycm9yU2VydmljZVJlbW90ZXJQcm94eS5wcm90b3R5cGUuZXN0aW1hdGVUcmFuc21pc3Npb25DYXBhY2l0eQogICAgICAgIC5hcHBseSh0aGlzLnB0ci5nZXRQcm94eSgpLCBhcmd1bWVudHMpOwogIH07CgogIE1pcnJvclNlcnZpY2VSZW1vdGVyUHJveHkucHJvdG90eXBlLmVzdGltYXRlVHJhbnNtaXNzaW9uQ2FwYWNpdHkgPSBmdW5jdGlvbigpIHsKICAgIHZhciBwYXJhbXMgPSBuZXcgTWlycm9yU2VydmljZVJlbW90ZXJfRXN0aW1hdGVUcmFuc21pc3Npb25DYXBhY2l0eV9QYXJhbXMoKTsKICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHsKICAgICAgdmFyIGJ1aWxkZXIgPSBuZXcgY29kZWMuTWVzc2FnZVYxQnVpbGRlcigKICAgICAgICAgIGtNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9Fc3RpbWF0ZVRyYW5zbWlzc2lvbkNhcGFjaXR5X05hbWUsCiAgICAgICAgICBjb2RlYy5hbGlnbihNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9Fc3RpbWF0ZVRyYW5zbWlzc2lvbkNhcGFjaXR5X1BhcmFtcy5lbmNvZGVkU2l6ZSksCiAgICAgICAgICBjb2RlYy5rTWVzc2FnZUV4cGVjdHNSZXNwb25zZSwgMCk7CiAgICAgIGJ1aWxkZXIuZW5jb2RlU3RydWN0KE1pcnJvclNlcnZpY2VSZW1vdGVyX0VzdGltYXRlVHJhbnNtaXNzaW9uQ2FwYWNpdHlfUGFyYW1zLCBwYXJhbXMpOwogICAgICB2YXIgbWVzc2FnZSA9IGJ1aWxkZXIuZmluaXNoKCk7CiAgICAgIHRoaXMucmVjZWl2ZXJfLmFjY2VwdEFuZEV4cGVjdFJlc3BvbnNlKG1lc3NhZ2UpLnRoZW4oZnVuY3Rpb24obWVzc2FnZSkgewogICAgICAgIHZhciByZWFkZXIgPSBuZXcgY29kZWMuTWVzc2FnZVJlYWRlcihtZXNzYWdlKTsKICAgICAgICB2YXIgcmVzcG9uc2VQYXJhbXMgPQogICAgICAgICAgICByZWFkZXIuZGVjb2RlU3RydWN0KE1pcnJvclNlcnZpY2VSZW1vdGVyX0VzdGltYXRlVHJhbnNtaXNzaW9uQ2FwYWNpdHlfUmVzcG9uc2VQYXJhbXMpOwogICAgICAgIHJlc29sdmUocmVzcG9uc2VQYXJhbXMpOwogICAgICB9KS5jYXRjaChmdW5jdGlvbihyZXN1bHQpIHsKICAgICAgICByZWplY3QoRXJyb3IoIkNvbm5lY3Rpb24gZXJyb3I6ICIgKyByZXN1bHQpKTsKICAgICAgfSk7CiAgICB9LmJpbmQodGhpcykpOwogIH07CgogIGZ1bmN0aW9uIE1pcnJvclNlcnZpY2VSZW1vdGVyU3R1YihkZWxlZ2F0ZSkgewogICAgdGhpcy5kZWxlZ2F0ZV8gPSBkZWxlZ2F0ZTsKICB9CiAgTWlycm9yU2VydmljZVJlbW90ZXJTdHViLnByb3RvdHlwZS5zdGFydCA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXMuZGVsZWdhdGVfICYmIHRoaXMuZGVsZWdhdGVfLnN0YXJ0ICYmIHRoaXMuZGVsZWdhdGVfLnN0YXJ0KCk7CiAgfQogIE1pcnJvclNlcnZpY2VSZW1vdGVyU3R1Yi5wcm90b3R5cGUuc3RhcnREYXRhU3RyZWFtcyA9IGZ1bmN0aW9uKGhhc0F1ZGlvLCBoYXNWaWRlbykgewogICAgcmV0dXJuIHRoaXMuZGVsZWdhdGVfICYmIHRoaXMuZGVsZWdhdGVfLnN0YXJ0RGF0YVN0cmVhbXMgJiYgdGhpcy5kZWxlZ2F0ZV8uc3RhcnREYXRhU3RyZWFtcyhoYXNBdWRpbywgaGFzVmlkZW8pOwogIH0KICBNaXJyb3JTZXJ2aWNlUmVtb3RlclN0dWIucHJvdG90eXBlLnN0b3AgPSBmdW5jdGlvbihyZWFzb24pIHsKICAgIHJldHVybiB0aGlzLmRlbGVnYXRlXyAmJiB0aGlzLmRlbGVnYXRlXy5zdG9wICYmIHRoaXMuZGVsZWdhdGVfLnN0b3AocmVhc29uKTsKICB9CiAgTWlycm9yU2VydmljZVJlbW90ZXJTdHViLnByb3RvdHlwZS5zZW5kTWVzc2FnZVRvU2luayA9IGZ1bmN0aW9uKG1lc3NhZ2UpIHsKICAgIHJldHVybiB0aGlzLmRlbGVnYXRlXyAmJiB0aGlzLmRlbGVnYXRlXy5zZW5kTWVzc2FnZVRvU2luayAmJiB0aGlzLmRlbGVnYXRlXy5zZW5kTWVzc2FnZVRvU2luayhtZXNzYWdlKTsKICB9CiAgTWlycm9yU2VydmljZVJlbW90ZXJTdHViLnByb3RvdHlwZS5lc3RpbWF0ZVRyYW5zbWlzc2lvbkNhcGFjaXR5ID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZV8gJiYgdGhpcy5kZWxlZ2F0ZV8uZXN0aW1hdGVUcmFuc21pc3Npb25DYXBhY2l0eSAmJiB0aGlzLmRlbGVnYXRlXy5lc3RpbWF0ZVRyYW5zbWlzc2lvbkNhcGFjaXR5KCk7CiAgfQoKICBNaXJyb3JTZXJ2aWNlUmVtb3RlclN0dWIucHJvdG90eXBlLmFjY2VwdCA9IGZ1bmN0aW9uKG1lc3NhZ2UpIHsKICAgIHZhciByZWFkZXIgPSBuZXcgY29kZWMuTWVzc2FnZVJlYWRlcihtZXNzYWdlKTsKICAgIHN3aXRjaCAocmVhZGVyLm1lc3NhZ2VOYW1lKSB7CiAgICBjYXNlIGtNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TdGFydF9OYW1lOgogICAgICB2YXIgcGFyYW1zID0gcmVhZGVyLmRlY29kZVN0cnVjdChNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TdGFydF9QYXJhbXMpOwogICAgICB0aGlzLnN0YXJ0KCk7CiAgICAgIHJldHVybiB0cnVlOwogICAgY2FzZSBrTWlycm9yU2VydmljZVJlbW90ZXJfU3RvcF9OYW1lOgogICAgICB2YXIgcGFyYW1zID0gcmVhZGVyLmRlY29kZVN0cnVjdChNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TdG9wX1BhcmFtcyk7CiAgICAgIHRoaXMuc3RvcChwYXJhbXMucmVhc29uKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICBjYXNlIGtNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TZW5kTWVzc2FnZVRvU2lua19OYW1lOgogICAgICB2YXIgcGFyYW1zID0gcmVhZGVyLmRlY29kZVN0cnVjdChNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TZW5kTWVzc2FnZVRvU2lua19QYXJhbXMpOwogICAgICB0aGlzLnNlbmRNZXNzYWdlVG9TaW5rKHBhcmFtcy5tZXNzYWdlKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICBkZWZhdWx0OgogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfTsKCiAgTWlycm9yU2VydmljZVJlbW90ZXJTdHViLnByb3RvdHlwZS5hY2NlcHRXaXRoUmVzcG9uZGVyID0KICAgICAgZnVuY3Rpb24obWVzc2FnZSwgcmVzcG9uZGVyKSB7CiAgICB2YXIgcmVhZGVyID0gbmV3IGNvZGVjLk1lc3NhZ2VSZWFkZXIobWVzc2FnZSk7CiAgICBzd2l0Y2ggKHJlYWRlci5tZXNzYWdlTmFtZSkgewogICAgY2FzZSBrTWlycm9yU2VydmljZVJlbW90ZXJfU3RhcnREYXRhU3RyZWFtc19OYW1lOgogICAgICB2YXIgcGFyYW1zID0gcmVhZGVyLmRlY29kZVN0cnVjdChNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TdGFydERhdGFTdHJlYW1zX1BhcmFtcyk7CiAgICAgIHRoaXMuc3RhcnREYXRhU3RyZWFtcyhwYXJhbXMuaGFzQXVkaW8sIHBhcmFtcy5oYXNWaWRlbykudGhlbihmdW5jdGlvbihyZXNwb25zZSkgewogICAgICAgIHZhciByZXNwb25zZVBhcmFtcyA9CiAgICAgICAgICAgIG5ldyBNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TdGFydERhdGFTdHJlYW1zX1Jlc3BvbnNlUGFyYW1zKCk7CiAgICAgICAgcmVzcG9uc2VQYXJhbXMuYXVkaW9TdHJlYW1JZCA9IHJlc3BvbnNlLmF1ZGlvU3RyZWFtSWQ7CiAgICAgICAgcmVzcG9uc2VQYXJhbXMudmlkZW9TdHJlYW1JZCA9IHJlc3BvbnNlLnZpZGVvU3RyZWFtSWQ7CiAgICAgICAgdmFyIGJ1aWxkZXIgPSBuZXcgY29kZWMuTWVzc2FnZVYxQnVpbGRlcigKICAgICAgICAgICAga01pcnJvclNlcnZpY2VSZW1vdGVyX1N0YXJ0RGF0YVN0cmVhbXNfTmFtZSwKICAgICAgICAgICAgY29kZWMuYWxpZ24oTWlycm9yU2VydmljZVJlbW90ZXJfU3RhcnREYXRhU3RyZWFtc19SZXNwb25zZVBhcmFtcy5lbmNvZGVkU2l6ZSksCiAgICAgICAgICAgIGNvZGVjLmtNZXNzYWdlSXNSZXNwb25zZSwgcmVhZGVyLnJlcXVlc3RJRCk7CiAgICAgICAgYnVpbGRlci5lbmNvZGVTdHJ1Y3QoTWlycm9yU2VydmljZVJlbW90ZXJfU3RhcnREYXRhU3RyZWFtc19SZXNwb25zZVBhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZVBhcmFtcyk7CiAgICAgICAgdmFyIG1lc3NhZ2UgPSBidWlsZGVyLmZpbmlzaCgpOwogICAgICAgIHJlc3BvbmRlci5hY2NlcHQobWVzc2FnZSk7CiAgICAgIH0pOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIGNhc2Uga01pcnJvclNlcnZpY2VSZW1vdGVyX0VzdGltYXRlVHJhbnNtaXNzaW9uQ2FwYWNpdHlfTmFtZToKICAgICAgdmFyIHBhcmFtcyA9IHJlYWRlci5kZWNvZGVTdHJ1Y3QoTWlycm9yU2VydmljZVJlbW90ZXJfRXN0aW1hdGVUcmFuc21pc3Npb25DYXBhY2l0eV9QYXJhbXMpOwogICAgICB0aGlzLmVzdGltYXRlVHJhbnNtaXNzaW9uQ2FwYWNpdHkoKS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgdmFyIHJlc3BvbnNlUGFyYW1zID0KICAgICAgICAgICAgbmV3IE1pcnJvclNlcnZpY2VSZW1vdGVyX0VzdGltYXRlVHJhbnNtaXNzaW9uQ2FwYWNpdHlfUmVzcG9uc2VQYXJhbXMoKTsKICAgICAgICByZXNwb25zZVBhcmFtcy5yYXRlID0gcmVzcG9uc2UucmF0ZTsKICAgICAgICB2YXIgYnVpbGRlciA9IG5ldyBjb2RlYy5NZXNzYWdlVjFCdWlsZGVyKAogICAgICAgICAgICBrTWlycm9yU2VydmljZVJlbW90ZXJfRXN0aW1hdGVUcmFuc21pc3Npb25DYXBhY2l0eV9OYW1lLAogICAgICAgICAgICBjb2RlYy5hbGlnbihNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9Fc3RpbWF0ZVRyYW5zbWlzc2lvbkNhcGFjaXR5X1Jlc3BvbnNlUGFyYW1zLmVuY29kZWRTaXplKSwKICAgICAgICAgICAgY29kZWMua01lc3NhZ2VJc1Jlc3BvbnNlLCByZWFkZXIucmVxdWVzdElEKTsKICAgICAgICBidWlsZGVyLmVuY29kZVN0cnVjdChNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9Fc3RpbWF0ZVRyYW5zbWlzc2lvbkNhcGFjaXR5X1Jlc3BvbnNlUGFyYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlUGFyYW1zKTsKICAgICAgICB2YXIgbWVzc2FnZSA9IGJ1aWxkZXIuZmluaXNoKCk7CiAgICAgICAgcmVzcG9uZGVyLmFjY2VwdChtZXNzYWdlKTsKICAgICAgfSk7CiAgICAgIHJldHVybiB0cnVlOwogICAgZGVmYXVsdDoKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH07CgogIGZ1bmN0aW9uIHZhbGlkYXRlTWlycm9yU2VydmljZVJlbW90ZXJSZXF1ZXN0KG1lc3NhZ2VWYWxpZGF0b3IpIHsKICAgIHZhciBtZXNzYWdlID0gbWVzc2FnZVZhbGlkYXRvci5tZXNzYWdlOwogICAgdmFyIHBhcmFtc0NsYXNzID0gbnVsbDsKICAgIHN3aXRjaCAobWVzc2FnZS5nZXROYW1lKCkpIHsKICAgICAgY2FzZSBrTWlycm9yU2VydmljZVJlbW90ZXJfU3RhcnRfTmFtZToKICAgICAgICBpZiAoIW1lc3NhZ2UuZXhwZWN0c1Jlc3BvbnNlKCkgJiYgIW1lc3NhZ2UuaXNSZXNwb25zZSgpKQogICAgICAgICAgcGFyYW1zQ2xhc3MgPSBNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TdGFydF9QYXJhbXM7CiAgICAgIGJyZWFrOwogICAgICBjYXNlIGtNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TdGFydERhdGFTdHJlYW1zX05hbWU6CiAgICAgICAgaWYgKG1lc3NhZ2UuZXhwZWN0c1Jlc3BvbnNlKCkpCiAgICAgICAgICBwYXJhbXNDbGFzcyA9IE1pcnJvclNlcnZpY2VSZW1vdGVyX1N0YXJ0RGF0YVN0cmVhbXNfUGFyYW1zOwogICAgICBicmVhazsKICAgICAgY2FzZSBrTWlycm9yU2VydmljZVJlbW90ZXJfU3RvcF9OYW1lOgogICAgICAgIGlmICghbWVzc2FnZS5leHBlY3RzUmVzcG9uc2UoKSAmJiAhbWVzc2FnZS5pc1Jlc3BvbnNlKCkpCiAgICAgICAgICBwYXJhbXNDbGFzcyA9IE1pcnJvclNlcnZpY2VSZW1vdGVyX1N0b3BfUGFyYW1zOwogICAgICBicmVhazsKICAgICAgY2FzZSBrTWlycm9yU2VydmljZVJlbW90ZXJfU2VuZE1lc3NhZ2VUb1NpbmtfTmFtZToKICAgICAgICBpZiAoIW1lc3NhZ2UuZXhwZWN0c1Jlc3BvbnNlKCkgJiYgIW1lc3NhZ2UuaXNSZXNwb25zZSgpKQogICAgICAgICAgcGFyYW1zQ2xhc3MgPSBNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TZW5kTWVzc2FnZVRvU2lua19QYXJhbXM7CiAgICAgIGJyZWFrOwogICAgICBjYXNlIGtNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9Fc3RpbWF0ZVRyYW5zbWlzc2lvbkNhcGFjaXR5X05hbWU6CiAgICAgICAgaWYgKG1lc3NhZ2UuZXhwZWN0c1Jlc3BvbnNlKCkpCiAgICAgICAgICBwYXJhbXNDbGFzcyA9IE1pcnJvclNlcnZpY2VSZW1vdGVyX0VzdGltYXRlVHJhbnNtaXNzaW9uQ2FwYWNpdHlfUGFyYW1zOwogICAgICBicmVhazsKICAgIH0KICAgIGlmIChwYXJhbXNDbGFzcyA9PT0gbnVsbCkKICAgICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICAgIHJldHVybiBwYXJhbXNDbGFzcy52YWxpZGF0ZShtZXNzYWdlVmFsaWRhdG9yLCBtZXNzYWdlVmFsaWRhdG9yLm1lc3NhZ2UuZ2V0SGVhZGVyTnVtQnl0ZXMoKSk7CiAgfQoKICBmdW5jdGlvbiB2YWxpZGF0ZU1pcnJvclNlcnZpY2VSZW1vdGVyUmVzcG9uc2UobWVzc2FnZVZhbGlkYXRvcikgewogICB2YXIgbWVzc2FnZSA9IG1lc3NhZ2VWYWxpZGF0b3IubWVzc2FnZTsKICAgdmFyIHBhcmFtc0NsYXNzID0gbnVsbDsKICAgc3dpdGNoIChtZXNzYWdlLmdldE5hbWUoKSkgewogICAgICBjYXNlIGtNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TdGFydERhdGFTdHJlYW1zX05hbWU6CiAgICAgICAgaWYgKG1lc3NhZ2UuaXNSZXNwb25zZSgpKQogICAgICAgICAgcGFyYW1zQ2xhc3MgPSBNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TdGFydERhdGFTdHJlYW1zX1Jlc3BvbnNlUGFyYW1zOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIGtNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9Fc3RpbWF0ZVRyYW5zbWlzc2lvbkNhcGFjaXR5X05hbWU6CiAgICAgICAgaWYgKG1lc3NhZ2UuaXNSZXNwb25zZSgpKQogICAgICAgICAgcGFyYW1zQ2xhc3MgPSBNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9Fc3RpbWF0ZVRyYW5zbWlzc2lvbkNhcGFjaXR5X1Jlc3BvbnNlUGFyYW1zOwogICAgICAgIGJyZWFrOwogICAgfQogICAgaWYgKHBhcmFtc0NsYXNzID09PSBudWxsKQogICAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwogICAgcmV0dXJuIHBhcmFtc0NsYXNzLnZhbGlkYXRlKG1lc3NhZ2VWYWxpZGF0b3IsIG1lc3NhZ2VWYWxpZGF0b3IubWVzc2FnZS5nZXRIZWFkZXJOdW1CeXRlcygpKTsKICB9CgogIHZhciBNaXJyb3JTZXJ2aWNlUmVtb3RlciA9IHsKICAgIG5hbWU6ICdtZWRpYTo6bW9qb206Ok1pcnJvclNlcnZpY2VSZW1vdGVyJywKICAgIGtWZXJzaW9uOiAwLAogICAgcHRyQ2xhc3M6IE1pcnJvclNlcnZpY2VSZW1vdGVyUHRyLAogICAgcHJveHlDbGFzczogTWlycm9yU2VydmljZVJlbW90ZXJQcm94eSwKICAgIHN0dWJDbGFzczogTWlycm9yU2VydmljZVJlbW90ZXJTdHViLAogICAgdmFsaWRhdGVSZXF1ZXN0OiB2YWxpZGF0ZU1pcnJvclNlcnZpY2VSZW1vdGVyUmVxdWVzdCwKICAgIHZhbGlkYXRlUmVzcG9uc2U6IHZhbGlkYXRlTWlycm9yU2VydmljZVJlbW90ZXJSZXNwb25zZSwKICB9OwogIE1pcnJvclNlcnZpY2VSZW1vdGVyU3R1Yi5wcm90b3R5cGUudmFsaWRhdG9yID0gdmFsaWRhdGVNaXJyb3JTZXJ2aWNlUmVtb3RlclJlcXVlc3Q7CiAgTWlycm9yU2VydmljZVJlbW90ZXJQcm94eS5wcm90b3R5cGUudmFsaWRhdG9yID0gdmFsaWRhdGVNaXJyb3JTZXJ2aWNlUmVtb3RlclJlc3BvbnNlOwogIHZhciBrTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlX09uU2lua0F2YWlsYWJsZV9OYW1lID0gMTAwMDM0OTExNzsKICB2YXIga01pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZV9Pbk1lc3NhZ2VGcm9tU2lua19OYW1lID0gMTE2NzgwNzI3NjsKICB2YXIga01pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZV9PblN0b3BwZWRfTmFtZSA9IDE1MTkxMDU2Mzk7CiAgdmFyIGtNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VfT25FcnJvcl9OYW1lID0gMTI2NjY3MjM4NTsKCiAgZnVuY3Rpb24gTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlUHRyKGhhbmRsZU9yUHRySW5mbykgewogICAgdGhpcy5wdHIgPSBuZXcgYmluZGluZ3MuSW50ZXJmYWNlUHRyQ29udHJvbGxlcihNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZU9yUHRySW5mbyk7CiAgfQoKICBmdW5jdGlvbiBNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VBc3NvY2lhdGVkUHRyKGFzc29jaWF0ZWRJbnRlcmZhY2VQdHJJbmZvKSB7CiAgICB0aGlzLnB0ciA9IG5ldyBhc3NvY2lhdGVkQmluZGluZ3MuQXNzb2NpYXRlZEludGVyZmFjZVB0ckNvbnRyb2xsZXIoCiAgICAgICAgTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlLCBhc3NvY2lhdGVkSW50ZXJmYWNlUHRySW5mbyk7CiAgfQoKICBNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VBc3NvY2lhdGVkUHRyLnByb3RvdHlwZSA9CiAgICAgIE9iamVjdC5jcmVhdGUoTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlUHRyLnByb3RvdHlwZSk7CiAgTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlQXNzb2NpYXRlZFB0ci5wcm90b3R5cGUuY29uc3RydWN0b3IgPQogICAgICBNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VBc3NvY2lhdGVkUHRyOwoKICBmdW5jdGlvbiBNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VQcm94eShyZWNlaXZlcikgewogICAgdGhpcy5yZWNlaXZlcl8gPSByZWNlaXZlcjsKICB9CiAgTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlUHRyLnByb3RvdHlwZS5vblNpbmtBdmFpbGFibGUgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VQcm94eS5wcm90b3R5cGUub25TaW5rQXZhaWxhYmxlCiAgICAgICAgLmFwcGx5KHRoaXMucHRyLmdldFByb3h5KCksIGFyZ3VtZW50cyk7CiAgfTsKCiAgTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlUHJveHkucHJvdG90eXBlLm9uU2lua0F2YWlsYWJsZSA9IGZ1bmN0aW9uKG1ldGFkYXRhKSB7CiAgICB2YXIgcGFyYW1zID0gbmV3IE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZV9PblNpbmtBdmFpbGFibGVfUGFyYW1zKCk7CiAgICBwYXJhbXMubWV0YWRhdGEgPSBtZXRhZGF0YTsKICAgIHZhciBidWlsZGVyID0gbmV3IGNvZGVjLk1lc3NhZ2VWMEJ1aWxkZXIoCiAgICAgICAga01pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZV9PblNpbmtBdmFpbGFibGVfTmFtZSwKICAgICAgICBjb2RlYy5hbGlnbihNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VfT25TaW5rQXZhaWxhYmxlX1BhcmFtcy5lbmNvZGVkU2l6ZSkpOwogICAgYnVpbGRlci5lbmNvZGVTdHJ1Y3QoTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlX09uU2lua0F2YWlsYWJsZV9QYXJhbXMsIHBhcmFtcyk7CiAgICB2YXIgbWVzc2FnZSA9IGJ1aWxkZXIuZmluaXNoKCk7CiAgICB0aGlzLnJlY2VpdmVyXy5hY2NlcHQobWVzc2FnZSk7CiAgfTsKICBNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VQdHIucHJvdG90eXBlLm9uTWVzc2FnZUZyb21TaW5rID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlUHJveHkucHJvdG90eXBlLm9uTWVzc2FnZUZyb21TaW5rCiAgICAgICAgLmFwcGx5KHRoaXMucHRyLmdldFByb3h5KCksIGFyZ3VtZW50cyk7CiAgfTsKCiAgTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlUHJveHkucHJvdG90eXBlLm9uTWVzc2FnZUZyb21TaW5rID0gZnVuY3Rpb24obWVzc2FnZSkgewogICAgdmFyIHBhcmFtcyA9IG5ldyBNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VfT25NZXNzYWdlRnJvbVNpbmtfUGFyYW1zKCk7CiAgICBwYXJhbXMubWVzc2FnZSA9IG1lc3NhZ2U7CiAgICB2YXIgYnVpbGRlciA9IG5ldyBjb2RlYy5NZXNzYWdlVjBCdWlsZGVyKAogICAgICAgIGtNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VfT25NZXNzYWdlRnJvbVNpbmtfTmFtZSwKICAgICAgICBjb2RlYy5hbGlnbihNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VfT25NZXNzYWdlRnJvbVNpbmtfUGFyYW1zLmVuY29kZWRTaXplKSk7CiAgICBidWlsZGVyLmVuY29kZVN0cnVjdChNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VfT25NZXNzYWdlRnJvbVNpbmtfUGFyYW1zLCBwYXJhbXMpOwogICAgdmFyIG1lc3NhZ2UgPSBidWlsZGVyLmZpbmlzaCgpOwogICAgdGhpcy5yZWNlaXZlcl8uYWNjZXB0KG1lc3NhZ2UpOwogIH07CiAgTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlUHRyLnByb3RvdHlwZS5vblN0b3BwZWQgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VQcm94eS5wcm90b3R5cGUub25TdG9wcGVkCiAgICAgICAgLmFwcGx5KHRoaXMucHRyLmdldFByb3h5KCksIGFyZ3VtZW50cyk7CiAgfTsKCiAgTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlUHJveHkucHJvdG90eXBlLm9uU3RvcHBlZCA9IGZ1bmN0aW9uKHJlYXNvbikgewogICAgdmFyIHBhcmFtcyA9IG5ldyBNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VfT25TdG9wcGVkX1BhcmFtcygpOwogICAgcGFyYW1zLnJlYXNvbiA9IHJlYXNvbjsKICAgIHZhciBidWlsZGVyID0gbmV3IGNvZGVjLk1lc3NhZ2VWMEJ1aWxkZXIoCiAgICAgICAga01pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZV9PblN0b3BwZWRfTmFtZSwKICAgICAgICBjb2RlYy5hbGlnbihNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VfT25TdG9wcGVkX1BhcmFtcy5lbmNvZGVkU2l6ZSkpOwogICAgYnVpbGRlci5lbmNvZGVTdHJ1Y3QoTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlX09uU3RvcHBlZF9QYXJhbXMsIHBhcmFtcyk7CiAgICB2YXIgbWVzc2FnZSA9IGJ1aWxkZXIuZmluaXNoKCk7CiAgICB0aGlzLnJlY2VpdmVyXy5hY2NlcHQobWVzc2FnZSk7CiAgfTsKICBNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VQdHIucHJvdG90eXBlLm9uRXJyb3IgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VQcm94eS5wcm90b3R5cGUub25FcnJvcgogICAgICAgIC5hcHBseSh0aGlzLnB0ci5nZXRQcm94eSgpLCBhcmd1bWVudHMpOwogIH07CgogIE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZVByb3h5LnByb3RvdHlwZS5vbkVycm9yID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgcGFyYW1zID0gbmV3IE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZV9PbkVycm9yX1BhcmFtcygpOwogICAgdmFyIGJ1aWxkZXIgPSBuZXcgY29kZWMuTWVzc2FnZVYwQnVpbGRlcigKICAgICAgICBrTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlX09uRXJyb3JfTmFtZSwKICAgICAgICBjb2RlYy5hbGlnbihNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VfT25FcnJvcl9QYXJhbXMuZW5jb2RlZFNpemUpKTsKICAgIGJ1aWxkZXIuZW5jb2RlU3RydWN0KE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZV9PbkVycm9yX1BhcmFtcywgcGFyYW1zKTsKICAgIHZhciBtZXNzYWdlID0gYnVpbGRlci5maW5pc2goKTsKICAgIHRoaXMucmVjZWl2ZXJfLmFjY2VwdChtZXNzYWdlKTsKICB9OwoKICBmdW5jdGlvbiBNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VTdHViKGRlbGVnYXRlKSB7CiAgICB0aGlzLmRlbGVnYXRlXyA9IGRlbGVnYXRlOwogIH0KICBNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VTdHViLnByb3RvdHlwZS5vblNpbmtBdmFpbGFibGUgPSBmdW5jdGlvbihtZXRhZGF0YSkgewogICAgcmV0dXJuIHRoaXMuZGVsZWdhdGVfICYmIHRoaXMuZGVsZWdhdGVfLm9uU2lua0F2YWlsYWJsZSAmJiB0aGlzLmRlbGVnYXRlXy5vblNpbmtBdmFpbGFibGUobWV0YWRhdGEpOwogIH0KICBNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VTdHViLnByb3RvdHlwZS5vbk1lc3NhZ2VGcm9tU2luayA9IGZ1bmN0aW9uKG1lc3NhZ2UpIHsKICAgIHJldHVybiB0aGlzLmRlbGVnYXRlXyAmJiB0aGlzLmRlbGVnYXRlXy5vbk1lc3NhZ2VGcm9tU2luayAmJiB0aGlzLmRlbGVnYXRlXy5vbk1lc3NhZ2VGcm9tU2luayhtZXNzYWdlKTsKICB9CiAgTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlU3R1Yi5wcm90b3R5cGUub25TdG9wcGVkID0gZnVuY3Rpb24ocmVhc29uKSB7CiAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZV8gJiYgdGhpcy5kZWxlZ2F0ZV8ub25TdG9wcGVkICYmIHRoaXMuZGVsZWdhdGVfLm9uU3RvcHBlZChyZWFzb24pOwogIH0KICBNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VTdHViLnByb3RvdHlwZS5vbkVycm9yID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZV8gJiYgdGhpcy5kZWxlZ2F0ZV8ub25FcnJvciAmJiB0aGlzLmRlbGVnYXRlXy5vbkVycm9yKCk7CiAgfQoKICBNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VTdHViLnByb3RvdHlwZS5hY2NlcHQgPSBmdW5jdGlvbihtZXNzYWdlKSB7CiAgICB2YXIgcmVhZGVyID0gbmV3IGNvZGVjLk1lc3NhZ2VSZWFkZXIobWVzc2FnZSk7CiAgICBzd2l0Y2ggKHJlYWRlci5tZXNzYWdlTmFtZSkgewogICAgY2FzZSBrTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlX09uU2lua0F2YWlsYWJsZV9OYW1lOgogICAgICB2YXIgcGFyYW1zID0gcmVhZGVyLmRlY29kZVN0cnVjdChNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VfT25TaW5rQXZhaWxhYmxlX1BhcmFtcyk7CiAgICAgIHRoaXMub25TaW5rQXZhaWxhYmxlKHBhcmFtcy5tZXRhZGF0YSk7CiAgICAgIHJldHVybiB0cnVlOwogICAgY2FzZSBrTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlX09uTWVzc2FnZUZyb21TaW5rX05hbWU6CiAgICAgIHZhciBwYXJhbXMgPSByZWFkZXIuZGVjb2RlU3RydWN0KE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZV9Pbk1lc3NhZ2VGcm9tU2lua19QYXJhbXMpOwogICAgICB0aGlzLm9uTWVzc2FnZUZyb21TaW5rKHBhcmFtcy5tZXNzYWdlKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICBjYXNlIGtNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VfT25TdG9wcGVkX05hbWU6CiAgICAgIHZhciBwYXJhbXMgPSByZWFkZXIuZGVjb2RlU3RydWN0KE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZV9PblN0b3BwZWRfUGFyYW1zKTsKICAgICAgdGhpcy5vblN0b3BwZWQocGFyYW1zLnJlYXNvbik7CiAgICAgIHJldHVybiB0cnVlOwogICAgY2FzZSBrTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlX09uRXJyb3JfTmFtZToKICAgICAgdmFyIHBhcmFtcyA9IHJlYWRlci5kZWNvZGVTdHJ1Y3QoTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlX09uRXJyb3JfUGFyYW1zKTsKICAgICAgdGhpcy5vbkVycm9yKCk7CiAgICAgIHJldHVybiB0cnVlOwogICAgZGVmYXVsdDoKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH07CgogIE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZVN0dWIucHJvdG90eXBlLmFjY2VwdFdpdGhSZXNwb25kZXIgPQogICAgICBmdW5jdGlvbihtZXNzYWdlLCByZXNwb25kZXIpIHsKICAgIHZhciByZWFkZXIgPSBuZXcgY29kZWMuTWVzc2FnZVJlYWRlcihtZXNzYWdlKTsKICAgIHN3aXRjaCAocmVhZGVyLm1lc3NhZ2VOYW1lKSB7CiAgICBkZWZhdWx0OgogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfTsKCiAgZnVuY3Rpb24gdmFsaWRhdGVNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VSZXF1ZXN0KG1lc3NhZ2VWYWxpZGF0b3IpIHsKICAgIHZhciBtZXNzYWdlID0gbWVzc2FnZVZhbGlkYXRvci5tZXNzYWdlOwogICAgdmFyIHBhcmFtc0NsYXNzID0gbnVsbDsKICAgIHN3aXRjaCAobWVzc2FnZS5nZXROYW1lKCkpIHsKICAgICAgY2FzZSBrTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlX09uU2lua0F2YWlsYWJsZV9OYW1lOgogICAgICAgIGlmICghbWVzc2FnZS5leHBlY3RzUmVzcG9uc2UoKSAmJiAhbWVzc2FnZS5pc1Jlc3BvbnNlKCkpCiAgICAgICAgICBwYXJhbXNDbGFzcyA9IE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZV9PblNpbmtBdmFpbGFibGVfUGFyYW1zOwogICAgICBicmVhazsKICAgICAgY2FzZSBrTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlX09uTWVzc2FnZUZyb21TaW5rX05hbWU6CiAgICAgICAgaWYgKCFtZXNzYWdlLmV4cGVjdHNSZXNwb25zZSgpICYmICFtZXNzYWdlLmlzUmVzcG9uc2UoKSkKICAgICAgICAgIHBhcmFtc0NsYXNzID0gTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlX09uTWVzc2FnZUZyb21TaW5rX1BhcmFtczsKICAgICAgYnJlYWs7CiAgICAgIGNhc2Uga01pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZV9PblN0b3BwZWRfTmFtZToKICAgICAgICBpZiAoIW1lc3NhZ2UuZXhwZWN0c1Jlc3BvbnNlKCkgJiYgIW1lc3NhZ2UuaXNSZXNwb25zZSgpKQogICAgICAgICAgcGFyYW1zQ2xhc3MgPSBNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VfT25TdG9wcGVkX1BhcmFtczsKICAgICAgYnJlYWs7CiAgICAgIGNhc2Uga01pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZV9PbkVycm9yX05hbWU6CiAgICAgICAgaWYgKCFtZXNzYWdlLmV4cGVjdHNSZXNwb25zZSgpICYmICFtZXNzYWdlLmlzUmVzcG9uc2UoKSkKICAgICAgICAgIHBhcmFtc0NsYXNzID0gTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlX09uRXJyb3JfUGFyYW1zOwogICAgICBicmVhazsKICAgIH0KICAgIGlmIChwYXJhbXNDbGFzcyA9PT0gbnVsbCkKICAgICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICAgIHJldHVybiBwYXJhbXNDbGFzcy52YWxpZGF0ZShtZXNzYWdlVmFsaWRhdG9yLCBtZXNzYWdlVmFsaWRhdG9yLm1lc3NhZ2UuZ2V0SGVhZGVyTnVtQnl0ZXMoKSk7CiAgfQoKICBmdW5jdGlvbiB2YWxpZGF0ZU1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZVJlc3BvbnNlKG1lc3NhZ2VWYWxpZGF0b3IpIHsKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CiAgfQoKICB2YXIgTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlID0gewogICAgbmFtZTogJ21lZGlhOjptb2pvbTo6TWlycm9yU2VydmljZVJlbW90aW5nU291cmNlJywKICAgIGtWZXJzaW9uOiAwLAogICAgcHRyQ2xhc3M6IE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZVB0ciwKICAgIHByb3h5Q2xhc3M6IE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZVByb3h5LAogICAgc3R1YkNsYXNzOiBNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VTdHViLAogICAgdmFsaWRhdGVSZXF1ZXN0OiB2YWxpZGF0ZU1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZVJlcXVlc3QsCiAgICB2YWxpZGF0ZVJlc3BvbnNlOiBudWxsLAogIH07CiAgTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlU3R1Yi5wcm90b3R5cGUudmFsaWRhdG9yID0gdmFsaWRhdGVNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VSZXF1ZXN0OwogIE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZVByb3h5LnByb3RvdHlwZS52YWxpZGF0b3IgPSBudWxsOwogIGV4cG9ydHMuTWlycm9yU2VydmljZVJlbW90ZXIgPSBNaXJyb3JTZXJ2aWNlUmVtb3RlcjsKICBleHBvcnRzLk1pcnJvclNlcnZpY2VSZW1vdGVyUHRyID0gTWlycm9yU2VydmljZVJlbW90ZXJQdHI7CiAgZXhwb3J0cy5NaXJyb3JTZXJ2aWNlUmVtb3RlckFzc29jaWF0ZWRQdHIgPSBNaXJyb3JTZXJ2aWNlUmVtb3RlckFzc29jaWF0ZWRQdHI7CiAgZXhwb3J0cy5NaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2UgPSBNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2U7CiAgZXhwb3J0cy5NaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VQdHIgPSBNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VQdHI7CiAgZXhwb3J0cy5NaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VBc3NvY2lhdGVkUHRyID0gTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlQXNzb2NpYXRlZFB0cjsKfSkoKTsvLyBDb3B5cmlnaHQgMjAxNCBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQovLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKJ3VzZSBzdHJpY3QnOwoKKGZ1bmN0aW9uKCkgewogIHZhciBtb2pvbUlkID0gJ21lZGlhL21vam8vaW50ZXJmYWNlcy9yZW1vdGluZ19jb21tb24ubW9qb20nOwogIGlmIChtb2pvLmludGVybmFsLmlzTW9qb21Mb2FkZWQobW9qb21JZCkpIHsKICAgIGNvbnNvbGUud2FybignVGhlIGZvbGxvd2luZyBtb2pvbSBpcyBsb2FkZWQgbXVsdGlwbGUgdGltZXM6ICcgKyBtb2pvbUlkKTsKICAgIHJldHVybjsKICB9CiAgbW9qby5pbnRlcm5hbC5tYXJrTW9qb21Mb2FkZWQobW9qb21JZCk7CiAgdmFyIGJpbmRpbmdzID0gbW9qbzsKICB2YXIgYXNzb2NpYXRlZEJpbmRpbmdzID0gbW9qbzsKICB2YXIgY29kZWMgPSBtb2pvLmludGVybmFsOwogIHZhciB2YWxpZGF0b3IgPSBtb2pvLmludGVybmFsOwoKICB2YXIgZXhwb3J0cyA9IG1vam8uaW50ZXJuYWwuZXhwb3NlTmFtZXNwYWNlKCdtZWRpYS5tb2pvbScpOwoKCiAgdmFyIFJlbW90aW5nU3RvcFJlYXNvbiA9IHt9OwogIFJlbW90aW5nU3RvcFJlYXNvbi5ST1VURV9URVJNSU5BVEVEID0gMDsKICBSZW1vdGluZ1N0b3BSZWFzb24uTE9DQUxfUExBWUJBQ0sgPSBSZW1vdGluZ1N0b3BSZWFzb24uUk9VVEVfVEVSTUlOQVRFRCArIDE7CiAgUmVtb3RpbmdTdG9wUmVhc29uLlNPVVJDRV9HT05FID0gUmVtb3RpbmdTdG9wUmVhc29uLkxPQ0FMX1BMQVlCQUNLICsgMTsKICBSZW1vdGluZ1N0b3BSZWFzb24uTUVTU0FHRV9TRU5EX0ZBSUxFRCA9IFJlbW90aW5nU3RvcFJlYXNvbi5TT1VSQ0VfR09ORSArIDE7CiAgUmVtb3RpbmdTdG9wUmVhc29uLkRBVEFfU0VORF9GQUlMRUQgPSBSZW1vdGluZ1N0b3BSZWFzb24uTUVTU0FHRV9TRU5EX0ZBSUxFRCArIDE7CiAgUmVtb3RpbmdTdG9wUmVhc29uLlVORVhQRUNURURfRkFJTFVSRSA9IFJlbW90aW5nU3RvcFJlYXNvbi5EQVRBX1NFTkRfRkFJTEVEICsgMTsKICBSZW1vdGluZ1N0b3BSZWFzb24uU0VSVklDRV9HT05FID0gUmVtb3RpbmdTdG9wUmVhc29uLlVORVhQRUNURURfRkFJTFVSRSArIDE7CiAgUmVtb3RpbmdTdG9wUmVhc29uLlVTRVJfRElTQUJMRUQgPSBSZW1vdGluZ1N0b3BSZWFzb24uU0VSVklDRV9HT05FICsgMTsKCiAgUmVtb3RpbmdTdG9wUmVhc29uLmlzS25vd25FbnVtVmFsdWUgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgc3dpdGNoICh2YWx1ZSkgewogICAgY2FzZSAwOgogICAgY2FzZSAxOgogICAgY2FzZSAyOgogICAgY2FzZSAzOgogICAgY2FzZSA0OgogICAgY2FzZSA1OgogICAgY2FzZSA2OgogICAgY2FzZSA3OgogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9OwoKICBSZW1vdGluZ1N0b3BSZWFzb24udmFsaWRhdGUgPSBmdW5jdGlvbihlbnVtVmFsdWUpIHsKICAgIHZhciBpc0V4dGVuc2libGUgPSBmYWxzZTsKICAgIGlmIChpc0V4dGVuc2libGUgfHwgdGhpcy5pc0tub3duRW51bVZhbHVlKGVudW1WYWx1ZSkpCiAgICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuVU5LTk9XTl9FTlVNX1ZBTFVFOwogIH07CiAgdmFyIFJlbW90aW5nU3RhcnRGYWlsUmVhc29uID0ge307CiAgUmVtb3RpbmdTdGFydEZhaWxSZWFzb24uQ0FOTk9UX1NUQVJUX01VTFRJUExFID0gMDsKICBSZW1vdGluZ1N0YXJ0RmFpbFJlYXNvbi5ST1VURV9URVJNSU5BVEVEID0gUmVtb3RpbmdTdGFydEZhaWxSZWFzb24uQ0FOTk9UX1NUQVJUX01VTFRJUExFICsgMTsKICBSZW1vdGluZ1N0YXJ0RmFpbFJlYXNvbi5TRVJWSUNFX05PVF9DT05ORUNURUQgPSBSZW1vdGluZ1N0YXJ0RmFpbFJlYXNvbi5ST1VURV9URVJNSU5BVEVEICsgMTsKCiAgUmVtb3RpbmdTdGFydEZhaWxSZWFzb24uaXNLbm93bkVudW1WYWx1ZSA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICBzd2l0Y2ggKHZhbHVlKSB7CiAgICBjYXNlIDA6CiAgICBjYXNlIDE6CiAgICBjYXNlIDI6CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH07CgogIFJlbW90aW5nU3RhcnRGYWlsUmVhc29uLnZhbGlkYXRlID0gZnVuY3Rpb24oZW51bVZhbHVlKSB7CiAgICB2YXIgaXNFeHRlbnNpYmxlID0gZmFsc2U7CiAgICBpZiAoaXNFeHRlbnNpYmxlIHx8IHRoaXMuaXNLbm93bkVudW1WYWx1ZShlbnVtVmFsdWUpKQogICAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLlVOS05PV05fRU5VTV9WQUxVRTsKICB9OwogIHZhciBSZW1vdGluZ1NpbmtGZWF0dXJlID0ge307CiAgUmVtb3RpbmdTaW5rRmVhdHVyZS5SRU5ERVJJTkcgPSAwOwogIFJlbW90aW5nU2lua0ZlYXR1cmUuQ09OVEVOVF9ERUNSWVBUSU9OID0gUmVtb3RpbmdTaW5rRmVhdHVyZS5SRU5ERVJJTkcgKyAxOwoKICBSZW1vdGluZ1NpbmtGZWF0dXJlLmlzS25vd25FbnVtVmFsdWUgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgc3dpdGNoICh2YWx1ZSkgewogICAgY2FzZSAwOgogICAgY2FzZSAxOgogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9OwoKICBSZW1vdGluZ1NpbmtGZWF0dXJlLnZhbGlkYXRlID0gZnVuY3Rpb24oZW51bVZhbHVlKSB7CiAgICB2YXIgaXNFeHRlbnNpYmxlID0gZmFsc2U7CiAgICBpZiAoaXNFeHRlbnNpYmxlIHx8IHRoaXMuaXNLbm93bkVudW1WYWx1ZShlbnVtVmFsdWUpKQogICAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLlVOS05PV05fRU5VTV9WQUxVRTsKICB9OwogIHZhciBSZW1vdGluZ1NpbmtBdWRpb0NhcGFiaWxpdHkgPSB7fTsKICBSZW1vdGluZ1NpbmtBdWRpb0NhcGFiaWxpdHkuQ09ERUNfQkFTRUxJTkVfU0VUID0gMDsKICBSZW1vdGluZ1NpbmtBdWRpb0NhcGFiaWxpdHkuQ09ERUNfQUFDID0gUmVtb3RpbmdTaW5rQXVkaW9DYXBhYmlsaXR5LkNPREVDX0JBU0VMSU5FX1NFVCArIDE7CiAgUmVtb3RpbmdTaW5rQXVkaW9DYXBhYmlsaXR5LkNPREVDX09QVVMgPSBSZW1vdGluZ1NpbmtBdWRpb0NhcGFiaWxpdHkuQ09ERUNfQUFDICsgMTsKCiAgUmVtb3RpbmdTaW5rQXVkaW9DYXBhYmlsaXR5LmlzS25vd25FbnVtVmFsdWUgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgc3dpdGNoICh2YWx1ZSkgewogICAgY2FzZSAwOgogICAgY2FzZSAxOgogICAgY2FzZSAyOgogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9OwoKICBSZW1vdGluZ1NpbmtBdWRpb0NhcGFiaWxpdHkudmFsaWRhdGUgPSBmdW5jdGlvbihlbnVtVmFsdWUpIHsKICAgIHZhciBpc0V4dGVuc2libGUgPSBmYWxzZTsKICAgIGlmIChpc0V4dGVuc2libGUgfHwgdGhpcy5pc0tub3duRW51bVZhbHVlKGVudW1WYWx1ZSkpCiAgICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuVU5LTk9XTl9FTlVNX1ZBTFVFOwogIH07CiAgdmFyIFJlbW90aW5nU2lua1ZpZGVvQ2FwYWJpbGl0eSA9IHt9OwogIFJlbW90aW5nU2lua1ZpZGVvQ2FwYWJpbGl0eS5TVVBQT1JUXzRLID0gMDsKICBSZW1vdGluZ1NpbmtWaWRlb0NhcGFiaWxpdHkuQ09ERUNfQkFTRUxJTkVfU0VUID0gUmVtb3RpbmdTaW5rVmlkZW9DYXBhYmlsaXR5LlNVUFBPUlRfNEsgKyAxOwogIFJlbW90aW5nU2lua1ZpZGVvQ2FwYWJpbGl0eS5DT0RFQ19IMjY0ID0gUmVtb3RpbmdTaW5rVmlkZW9DYXBhYmlsaXR5LkNPREVDX0JBU0VMSU5FX1NFVCArIDE7CiAgUmVtb3RpbmdTaW5rVmlkZW9DYXBhYmlsaXR5LkNPREVDX1ZQOCA9IFJlbW90aW5nU2lua1ZpZGVvQ2FwYWJpbGl0eS5DT0RFQ19IMjY0ICsgMTsKICBSZW1vdGluZ1NpbmtWaWRlb0NhcGFiaWxpdHkuQ09ERUNfVlA5ID0gUmVtb3RpbmdTaW5rVmlkZW9DYXBhYmlsaXR5LkNPREVDX1ZQOCArIDE7CiAgUmVtb3RpbmdTaW5rVmlkZW9DYXBhYmlsaXR5LkNPREVDX0hFVkMgPSBSZW1vdGluZ1NpbmtWaWRlb0NhcGFiaWxpdHkuQ09ERUNfVlA5ICsgMTsKCiAgUmVtb3RpbmdTaW5rVmlkZW9DYXBhYmlsaXR5LmlzS25vd25FbnVtVmFsdWUgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgc3dpdGNoICh2YWx1ZSkgewogICAgY2FzZSAwOgogICAgY2FzZSAxOgogICAgY2FzZSAyOgogICAgY2FzZSAzOgogICAgY2FzZSA0OgogICAgY2FzZSA1OgogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9OwoKICBSZW1vdGluZ1NpbmtWaWRlb0NhcGFiaWxpdHkudmFsaWRhdGUgPSBmdW5jdGlvbihlbnVtVmFsdWUpIHsKICAgIHZhciBpc0V4dGVuc2libGUgPSBmYWxzZTsKICAgIGlmIChpc0V4dGVuc2libGUgfHwgdGhpcy5pc0tub3duRW51bVZhbHVlKGVudW1WYWx1ZSkpCiAgICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuVU5LTk9XTl9FTlVNX1ZBTFVFOwogIH07CgogIGZ1bmN0aW9uIFJlbW90aW5nU2lua01ldGFkYXRhKHZhbHVlcykgewogICAgdGhpcy5pbml0RGVmYXVsdHNfKCk7CiAgICB0aGlzLmluaXRGaWVsZHNfKHZhbHVlcyk7CiAgfQoKCiAgUmVtb3RpbmdTaW5rTWV0YWRhdGEucHJvdG90eXBlLmluaXREZWZhdWx0c18gPSBmdW5jdGlvbigpIHsKICAgIHRoaXMuZmVhdHVyZXMgPSBudWxsOwogICAgdGhpcy5hdWRpb0NhcGFiaWxpdGllcyA9IG51bGw7CiAgICB0aGlzLnZpZGVvQ2FwYWJpbGl0aWVzID0gbnVsbDsKICAgIHRoaXMuZnJpZW5kbHlOYW1lID0gbnVsbDsKICB9OwogIFJlbW90aW5nU2lua01ldGFkYXRhLnByb3RvdHlwZS5pbml0RmllbGRzXyA9IGZ1bmN0aW9uKGZpZWxkcykgewogICAgZm9yKHZhciBmaWVsZCBpbiBmaWVsZHMpIHsKICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpCiAgICAgICAgICB0aGlzW2ZpZWxkXSA9IGZpZWxkc1tmaWVsZF07CiAgICB9CiAgfTsKCiAgUmVtb3RpbmdTaW5rTWV0YWRhdGEudmFsaWRhdGUgPSBmdW5jdGlvbihtZXNzYWdlVmFsaWRhdG9yLCBvZmZzZXQpIHsKICAgIHZhciBlcnI7CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0SGVhZGVyKG9mZnNldCwgY29kZWMua1N0cnVjdEhlYWRlclNpemUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgdmFyIGtWZXJzaW9uU2l6ZXMgPSBbCiAgICAgIHt2ZXJzaW9uOiAwLCBudW1CeXRlczogNDB9CiAgICBdOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFZlcnNpb24ob2Zmc2V0LCBrVmVyc2lvblNpemVzKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBSZW1vdGluZ1NpbmtNZXRhZGF0YS5mZWF0dXJlcwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZUFycmF5UG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDAsIDQsIG5ldyBjb2RlYy5FbnVtKFJlbW90aW5nU2lua0ZlYXR1cmUpLCBmYWxzZSwgWzBdLCAwKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBSZW1vdGluZ1NpbmtNZXRhZGF0YS5hdWRpb0NhcGFiaWxpdGllcwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZUFycmF5UG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDgsIDQsIG5ldyBjb2RlYy5FbnVtKFJlbW90aW5nU2lua0F1ZGlvQ2FwYWJpbGl0eSksIGZhbHNlLCBbMF0sIDApOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIFJlbW90aW5nU2lua01ldGFkYXRhLnZpZGVvQ2FwYWJpbGl0aWVzCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlQXJyYXlQb2ludGVyKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMTYsIDQsIG5ldyBjb2RlYy5FbnVtKFJlbW90aW5nU2lua1ZpZGVvQ2FwYWJpbGl0eSksIGZhbHNlLCBbMF0sIDApOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIFJlbW90aW5nU2lua01ldGFkYXRhLmZyaWVuZGx5TmFtZQogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cmluZ1BvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAyNCwgZmFsc2UpCiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwogIH07CgogIFJlbW90aW5nU2lua01ldGFkYXRhLmVuY29kZWRTaXplID0gY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAzMjsKCiAgUmVtb3RpbmdTaW5rTWV0YWRhdGEuZGVjb2RlID0gZnVuY3Rpb24oZGVjb2RlcikgewogICAgdmFyIHBhY2tlZDsKICAgIHZhciB2YWwgPSBuZXcgUmVtb3RpbmdTaW5rTWV0YWRhdGEoKTsKICAgIHZhciBudW1iZXJPZkJ5dGVzID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YXIgdmVyc2lvbiA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFsLmZlYXR1cmVzID0gZGVjb2Rlci5kZWNvZGVBcnJheVBvaW50ZXIobmV3IGNvZGVjLkVudW0oUmVtb3RpbmdTaW5rRmVhdHVyZSkpOwogICAgdmFsLmF1ZGlvQ2FwYWJpbGl0aWVzID0gZGVjb2Rlci5kZWNvZGVBcnJheVBvaW50ZXIobmV3IGNvZGVjLkVudW0oUmVtb3RpbmdTaW5rQXVkaW9DYXBhYmlsaXR5KSk7CiAgICB2YWwudmlkZW9DYXBhYmlsaXRpZXMgPSBkZWNvZGVyLmRlY29kZUFycmF5UG9pbnRlcihuZXcgY29kZWMuRW51bShSZW1vdGluZ1NpbmtWaWRlb0NhcGFiaWxpdHkpKTsKICAgIHZhbC5mcmllbmRseU5hbWUgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5TdHJpbmcpOwogICAgcmV0dXJuIHZhbDsKICB9OwoKICBSZW1vdGluZ1NpbmtNZXRhZGF0YS5lbmNvZGUgPSBmdW5jdGlvbihlbmNvZGVyLCB2YWwpIHsKICAgIHZhciBwYWNrZWQ7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKFJlbW90aW5nU2lua01ldGFkYXRhLmVuY29kZWRTaXplKTsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoMCk7CiAgICBlbmNvZGVyLmVuY29kZUFycmF5UG9pbnRlcihuZXcgY29kZWMuRW51bShSZW1vdGluZ1NpbmtGZWF0dXJlKSwgdmFsLmZlYXR1cmVzKTsKICAgIGVuY29kZXIuZW5jb2RlQXJyYXlQb2ludGVyKG5ldyBjb2RlYy5FbnVtKFJlbW90aW5nU2lua0F1ZGlvQ2FwYWJpbGl0eSksIHZhbC5hdWRpb0NhcGFiaWxpdGllcyk7CiAgICBlbmNvZGVyLmVuY29kZUFycmF5UG9pbnRlcihuZXcgY29kZWMuRW51bShSZW1vdGluZ1NpbmtW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