ZGlmZiAtLWdpdCBhL2F1dG9tYXRpb25fdGVzdHMvc3JjL01pbmltYWxUZXN0c1N1aXRlLmFzIGIvYXV0b21hdGlvbl90ZXN0cy9zcmMvTWluaW1hbFRlc3RzU3VpdGUuYXMKaW5kZXggN2Y0YjU1OC4uNWY0MTNjZSAxMDA2NDQKLS0tIGEvYXV0b21hdGlvbl90ZXN0cy9zcmMvTWluaW1hbFRlc3RzU3VpdGUuYXMKKysrIGIvYXV0b21hdGlvbl90ZXN0cy9zcmMvTWluaW1hbFRlc3RzU3VpdGUuYXMKQEAgLTE5LDEzICsxOSwxMyBAQAogcGFja2FnZQogewogCi0gICAgaW1wb3J0IFVuaXRUZXN0LlRlc3RzLkNvbnRhaW5lclR5cGVUZXN0OworICAgIGltcG9ydCBVbml0VGVzdC5UZXN0cy5GbG9hdFRlc3Q7CiAKICAgICBbU3VpdGVdCiAgICAgW1J1bldpdGgoIm9yZy5mbGV4dW5pdC5ydW5uZXJzLlN1aXRlIildCiAgICAgcHVibGljIGR5bmFtaWMgY2xhc3MgTWluaW1hbFRlc3RzU3VpdGUKICAgICB7Ci0gICAgICAgIHB1YmxpYyB2YXIgY29udGFpbmVyVHlwZVRlc3Q6Q29udGFpbmVyVHlwZVRlc3Q7CisgICAgICAgIHB1YmxpYyB2YXIgZmxvYXRUZXN0OkZsb2F0VGVzdDsKICAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL2J1aWxkLnByb3BlcnRpZXMgYi9idWlsZC5wcm9wZXJ0aWVzCmluZGV4IDkyNWQ3NzkuLmZiM2I2ZjcgMTAwNjQ0Ci0tLSBhL2J1aWxkLnByb3BlcnRpZXMKKysrIGIvYnVpbGQucHJvcGVydGllcwpAQCAtMjcsNyArMjcsOCBAQAogc3JjLmRlYnVnID0gb24KIAogZm9ya1ZhbHVlID0gdHJ1ZQotbWluaW1hbFRlc3RzID0gZmFsc2UKK21pbmltYWxUZXN0cyA9IHRydWUKK2ZsZXhkZWJ1ZyA9IGZhbHNlCiAKICMgSlZNIG9wdGlvbnMgZm9yIDxjb21wYz4gYW5kIDxteG1sYz4gdGFza3MKIGp2bS5hcmdzID0gJHtsb2NhbC5kMzJ9IC1YbXM2NG0gLVhteDEwMjRtIC1YWDpNYXhQZXJtU2l6ZT0xMDI0bSAtWFg6K0NNU0NsYXNzVW5sb2FkaW5nRW5hYmxlZCAtWFg6K0NNU1Blcm1HZW5Td2VlcGluZ0VuYWJsZWQgLWVhIC1EYXBwbGUuYXd0LlVJRWxlbWVudD10cnVlCmRpZmYgLS1naXQgYS9idWlsZC54bWwgYi9idWlsZC54bWwKaW5kZXggYTdjNWJiNS4uNmE3YjhmMiAxMDA2NDQKLS0tIGEvYnVpbGQueG1sCisrKyBiL2J1aWxkLnhtbApAQCAtNTAsNiArNTAsNyBAQAogCiAJPHByb3BlcnR5IG5hbWU9ImRiZyIgdmFsdWU9ImZhbHNlIi8+CiAJPHByb3BlcnR5IG5hbWU9InJlbCIgdmFsdWU9InRydWUiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZmxleGRlYnVnIiB2YWx1ZT0iJHtmbGV4ZGVidWd9Ii8+CiAKIAk8Y29uZGl0aW9uIHByb3BlcnR5PSJkaWdlc3QiIHZhbHVlPSJmYWxzZSIgZWxzZT0idHJ1ZSI+CiAJCTxpc3RydWUgdmFsdWU9IiR7ZGVidWd9Ii8+CkBAIC05Nyw2ICs5OCw3IEBACiAJCQk8c3RhdGljLWxpbmstcnVudGltZS1zaGFyZWQtbGlicmFyaWVzLz4KIAkJCTxkZWZpbmUgbmFtZT0iQ09ORklHOjpkZWJ1ZyIgdmFsdWU9IiR7ZGJnfSIvPgogCQkJPGRlZmluZSBuYW1lPSJDT05GSUc6OnJlbGVhc2UiIHZhbHVlPSIke3JlbH0iLz4KKyAgICAgICAgICAgIDxjb21waWxlci5kZWJ1Zz4ke2ZsZXhkZWJ1Z308L2NvbXBpbGVyLmRlYnVnPgogCQk8L2NvbXBjPgogICAgICA8L3RhcmdldD4KIApAQCAtMTEwLDYgKzExMiw3IEBACiAgICAgICAgICAgICA8YXJnIHZhbHVlPSIrc291cmNlLmRpcj10ZXh0TGF5b3V0IiAvPgogCQkJPGRlZmluZSBuYW1lPSJDT05GSUc6OmRlYnVnIiB2YWx1ZT0iJHtkYmd9Ii8+CiAJCQk8ZGVmaW5lIG5hbWU9IkNPTkZJRzo6cmVsZWFzZSIgdmFsdWU9IiR7cmVsfSIvPgorICAgICAgICAgICAgPGNvbXBpbGVyLmRlYnVnPiR7ZmxleGRlYnVnfTwvY29tcGlsZXIuZGVidWc+CiAJCTwvY29tcGM+CiAgICAgIDwvdGFyZ2V0PgogCkBAIC0xNjksMTMgKzE3MiwxNCBAQAogCiAJCQk8ZGVmaW5lIG5hbWU9IkNPTkZJRzo6ZGVidWciIAkJCXZhbHVlPSIke2RiZ30iLz4KIAkJCTxkZWZpbmUgbmFtZT0iQ09ORklHOjpyZWxlYXNlIiAJCQl2YWx1ZT0iJHtyZWx9Ii8+CisgICAgICAgICAgICA8Y29tcGlsZXIuZGVidWc+JHtmbGV4ZGVidWd9PC9jb21waWxlci5kZWJ1Zz4KIAkJPC9jb21wYz4KICAgICAgPC90YXJnZXQ+CiAKIAk8dGFyZ2V0IG5hbWU9InRleHRMYXlvdXRfdWkiIGRlc2NyaXB0aW9uPSJCdWlsZHMgdGV4dExheW91dF91aS5zd2MiPgkJCiAJCTxjb21wYyBmb3JrPSIke2ZvcmtWYWx1ZX0iIG91dHB1dD0iJHtvdXRwdXQuZGlyfS9hcHBzL3Rlc3RBcHBzL2Jpbi90ZXh0TGF5b3V0X3VpLnN3YyIgCiAJCQlpbmNsdWRlLWNsYXNzZXM9IiR7dGV4dExheW91dC5uYW1lc3BhY2V9LlVpQ2xhc3NlcyxieGYuQnhmQ2xhc3NlcyIgY29tcHV0ZS1kaWdlc3Q9IiR7ZGlnZXN0fSI+Ci0JCQk8c291cmNlLXBhdGggcGF0aC1lbGVtZW50PSIke3RleHRMYXlvdXRfdWkuZGlyfS9zcmMiLz4JCisJCQk8c291cmNlLXBhdGggcGF0aC1lbGVtZW50PSIke3RleHRMYXlvdXRfdWkuZGlyfS9zcmMiLz4KIAkJCTxqdm1hcmcgbGluZT0iJHtqdm0uYXJnc30iLz4KIAkJCTxsaWJyYXJ5LXBhdGgvPgogCQkJCkBAIC0xOTAsMTIgKzE5NCwxMyBAQAogCiAJCQk8ZGVmaW5lIG5hbWU9IkNPTkZJRzo6ZGVidWciIAkJCXZhbHVlPSIke2RiZ30iLz4KIAkJCTxkZWZpbmUgbmFtZT0iQ09ORklHOjpyZWxlYXNlIiAJCQl2YWx1ZT0iJHtyZWx9Ii8+CisgICAgICAgICAgICA8Y29tcGlsZXIuZGVidWc+JHtmbGV4ZGVidWd9PC9jb21waWxlci5kZWJ1Zz4KIAkJPC9jb21wYz4KICAgICAgPC90YXJnZXQ+CiAKIAk8dGFyZ2V0IG5hbWU9InRlc3RBcHBzIiBkZXNjcmlwdGlvbj0iQnVpbGRzIFRMRiB0ZXN0IGFwcGxpY2F0aW9uIj4KIAkJPG14bWxjIGZvcms9IiR7Zm9ya1ZhbHVlfSIgCWZpbGU9IiR7dGVzdEFwcHMuZGlyfS9zcmMvRmxvdy5teG1sIiAKLQkJCQlrZWVwLWdlbmVyYXRlZC1hY3Rpb25zY3JpcHQ9ImZhbHNlIgorCQkJCWtlZXAtZ2VuZXJhdGVkLWFjdGlvbnNjcmlwdD0iZmFsc2UiIGRlYnVnPSIke2ZsZXhkZWJ1Z30iCiAJCQkJb3V0cHV0PSIke291dHB1dC5kaXJ9L2FwcHMvYXV0b21hdGlvbl9hcHBzL2Jpbi9GbG93LnN3ZiI+CiAJCQkKIAkJCTxkZWZhdWx0LXNpemUgd2lkdGg9IjExMDAiIGhlaWdodD0iNTUwIiAvPgpAQCAtMjI1LDcgKzIzMCw3IEBACiAKIAk8dGFyZ2V0IG5hbWU9ImFzVGVzdEFwcCIgZGVzY3JpcHRpb249ImJ1aWxkIGEgc2luZ2xlIGFwcGxpY2F0aW9uIGluIGFzVGVzdEFwcCIgaWY9Im91dHB1dCI+CiAJCTxteG1sYyBmb3JrPSIke2ZvcmtWYWx1ZX0iCi0JCQlmaWxlPSIke2FzVGVzdEFwcHMuZGlyfS9zcmMvJHtvdXRwdXR9LmFzIgorCQkJZmlsZT0iJHthc1Rlc3RBcHBzLmRpcn0vc3JjLyR7b3V0cHV0fS5hcyIgZGVidWc9IiR7ZmxleGRlYnVnfSIKIAkJCW91dHB1dD0iJHtvdXRwdXQuZGlyfS9hcHBzL2FzVGVzdEFwcHMvYmluLyR7b3V0cHV0fS5zd2YiPgogCQkJPHNvdXJjZS1wYXRoIHBhdGgtZWxlbWVudD0iJHthc1Rlc3RBcHBzLmRpcn0vc3JjIi8+CiAJCQk8anZtYXJnIGxpbmU9IiR7anZtLmFyZ3N9Ii8+CkBAIC0zMTksNyArMzI0LDggQEAKIAk8L3RhcmdldD4KIAogCTx0YXJnZXQgbmFtZT0iYXV0b21hdGlvbl9hcHBzIiBkZXNjcmlwdGlvbj0iQnVpbGRzIHRoZSBhdXRvbWF0aW9uIHRlc3QgYXBwbGljYXRpb24iPgotCQk8bXhtbGMgZm9yaz0iJHtmb3JrVmFsdWV9IiAJZmlsZT0iJHthdXRvbWF0aW9uX2FwcHMuZGlyfS9zcmMvVmVsbHVtVW5pdC5teG1sIiAKKwkJPG14bWxjIGZvcms9IiR7Zm9ya1ZhbHVlfSIgCWZpbGU9IiR7YXV0b21hdGlvbl9hcHBzLmRpcn0vc3JjL1ZlbGx1bVVuaXQubXhtbCIKKyAgICAgICAgICAgICAgIGRlYnVnPSIke2ZsZXhkZWJ1Z30iCiAJCQkJb3V0cHV0PSIke291dHB1dC5kaXJ9L2FwcHMvYXV0b21hdGlvbl9hcHBzL2Jpbi9WZWxsdW1Vbml0LnN3ZiI+CiAJCQk8anZtYXJnIGxpbmU9IiR7anZtLmFyZ3N9Ii8+CiAJCQk8bGlicmFyeS1wYXRoLz4KZGlmZiAtLWdpdCBhL3RleHRMYXlvdXQvc3JjL2ZsYXNoeC90ZXh0TGF5b3V0L0NvcmVDbGFzc2VzLmFzIGIvdGV4dExheW91dC9zcmMvZmxhc2h4L3RleHRMYXlvdXQvQ29yZUNsYXNzZXMuYXMKaW5kZXggNDJlYWE4Ny4uYzEwMmYwMCAxMDA2NDQKLS0tIGEvdGV4dExheW91dC9zcmMvZmxhc2h4L3RleHRMYXlvdXQvQ29yZUNsYXNzZXMuYXMKKysrIGIvdGV4dExheW91dC9zcmMvZmxhc2h4L3RleHRMYXlvdXQvQ29yZUNsYXNzZXMuYXMKQEAgLTU3LDYgKzU3LDcgQEAKIAkJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmVkaXQuSVNlbGVjdGlvbk1hbmFnZXI7IElTZWxlY3Rpb25NYW5hZ2VyOwogCQlpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQuZWRpdC5TZWxlY3Rpb25Gb3JtYXQ7IFNlbGVjdGlvbkZvcm1hdDsKIAkJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmVkaXQuU2VsZWN0aW9uU3RhdGU7IFNlbGVjdGlvblN0YXRlOworCQlpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQuZWRpdC5TZWxlY3Rpb25UeXBlOyBTZWxlY3Rpb25UeXBlOwogCQkKIAkJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmVsZW1lbnRzLlN1YlBhcmFncmFwaEdyb3VwRWxlbWVudEJhc2U7IFN1YlBhcmFncmFwaEdyb3VwRWxlbWVudEJhc2U7CiAJCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5lbGVtZW50cy5CcmVha0VsZW1lbnQ7IEJyZWFrRWxlbWVudDsKQEAgLTg3LDcgKzg4LDcgQEAKIAkJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmVsZW1lbnRzLlRhYmxlQm9keUVsZW1lbnQ7IFRhYmxlQm9keUVsZW1lbnQ7CiAJCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5lbGVtZW50cy5UYWJsZUNvbEVsZW1lbnQ7IFRhYmxlQ29sRWxlbWVudDsKIAkJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmVsZW1lbnRzLlRhYmxlQ29sR3JvdXBFbGVtZW50OyBUYWJsZUNvbEdyb3VwRWxlbWVudDsKLQkJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmVsZW1lbnRzLlRhYmxlRGF0YUNlbGxFbGVtZW50OyBUYWJsZURhdGFDZWxsRWxlbWVudDsKKwkJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmVsZW1lbnRzLlRhYmxlQ2VsbEVsZW1lbnQ7IFRhYmxlQ2VsbEVsZW1lbnQ7CiAJCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5lbGVtZW50cy5UYWJsZVJvd0VsZW1lbnQ7IFRhYmxlUm93RWxlbWVudDsKIAkJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmVsZW1lbnRzLlRDWUVsZW1lbnQ7IFRDWUVsZW1lbnQ7CiAJCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5lbGVtZW50cy5UZXh0RmxvdzsgVGV4dEZsb3c7CmRpZmYgLS1naXQgYS90ZXh0TGF5b3V0L3NyYy9mbGFzaHgvdGV4dExheW91dC9jb21wb3NlL0Jhc2VDb21wb3NlLmFzIGIvdGV4dExheW91dC9zcmMvZmxhc2h4L3RleHRMYXlvdXQvY29tcG9zZS9CYXNlQ29tcG9zZS5hcwppbmRleCBiN2M0YjAyLi4zZWQ4MzUyIDEwMDY0NAotLS0gYS90ZXh0TGF5b3V0L3NyYy9mbGFzaHgvdGV4dExheW91dC9jb21wb3NlL0Jhc2VDb21wb3NlLmFzCisrKyBiL3RleHRMYXlvdXQvc3JjL2ZsYXNoeC90ZXh0TGF5b3V0L2NvbXBvc2UvQmFzZUNvbXBvc2UuYXMKQEAgLTMwLDcgKzMwLDYgQEAKIAlpbXBvcnQgZmxhc2gudGV4dC5lbmdpbmUuVGV4dExpbmVWYWxpZGl0eTsKIAlpbXBvcnQgZmxhc2gudXRpbHMuRGljdGlvbmFyeTsKIAkKLQlpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQudGxmX2ludGVybmFsOwogCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5jb250YWluZXIuQ29udGFpbmVyQ29udHJvbGxlcjsKIAlpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQuZGVidWcuRGVidWdnaW5nOwogCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5kZWJ1Zy5hc3NlcnQ7CkBAIC01MCw4ICs0OSw4IEBACiAJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmVsZW1lbnRzLlNwYW5FbGVtZW50OwogCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5lbGVtZW50cy5UQ1lFbGVtZW50OwogCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5lbGVtZW50cy5UYWJsZUJvZHlFbGVtZW50OworCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5lbGVtZW50cy5UYWJsZUNlbGxFbGVtZW50OwogCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5lbGVtZW50cy5UYWJsZUNvbEVsZW1lbnQ7Ci0JaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmVsZW1lbnRzLlRhYmxlRGF0YUNlbGxFbGVtZW50OwogCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5lbGVtZW50cy5UYWJsZUVsZW1lbnQ7CiAJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmVsZW1lbnRzLlRhYmxlRm9ybWF0dGVkRWxlbWVudDsKIAlpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQuZWxlbWVudHMuVGFibGVSb3dFbGVtZW50OwpAQCAtNzAsMTQgKzY5LDE2IEBACiAJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmZvcm1hdHMuVGV4dExheW91dEZvcm1hdDsKIAlpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQuZm9ybWF0cy5WZXJ0aWNhbEFsaWduOwogCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5wcm9wZXJ0eS5Qcm9wZXJ0eTsKKwlpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQudGxmX2ludGVybmFsOwogCWltcG9ydCBmbGFzaHgudGV4dExheW91dC51dGlscy5Mb2NhbGVVdGlsOwogCWltcG9ydCBmbGFzaHgudGV4dExheW91dC51dGlscy5Ud2lwczsKIAogCXVzZSBuYW1lc3BhY2UgdGxmX2ludGVybmFsOwogCQogCQotCVtFeGNsdWRlQ2xhc3NdCi0JLyoqIEBwcml2YXRlIENvbW1vbiBjb21wb3NlciBiYXNlIGNsYXNzICovCisJLyoqIAorCSAqIENvbW1vbiBjb21wb3NlciBiYXNlIGNsYXNzIAorCSAqICovCiAJcHVibGljIGNsYXNzIEJhc2VDb21wb3NlCiAJewogCQkKQEAgLTEyNSw2ICsxMjYsOCBAQAogCQlwcm90ZWN0ZWQgdmFyIF9jdXJQYXJhRm9ybWF0OklUZXh0TGF5b3V0Rm9ybWF0OwogCQkvKiogQWJzb2x1dGUgc3RhcnQgcG9zaXRpb24gb2YgX2N1clBhcmFFbGVtZW50ICovCiAJCXByb3RlY3RlZCB2YXIgX2N1clBhcmFTdGFydDppbnQ7CisJCS8qKiBBYnNvbHV0ZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgY3VycmVudCBsaW5lICovCisJCXByb3RlY3RlZCB2YXIgX2N1ckxpbmVTdGFydDppbnQ7CiAJCS8qKiBsZWFkaW5nIG1vZGVsIGZvciB0aGUgY3VycmVudCBsaW5lJ3MgcGFyYSAoc2V0IHdoZW4gbGluZSBpcyBiZWluZyBjb21wb3NlZCBhbmQgY29tbWl0dGVkIHRvIF9sYXN0TGluZUxlYWRpbmdNb2RlbCB3aGVuIGxpbmUgaXMgZmluYWxpemVkKSAqLwogCQlwcml2YXRlIHZhciBfY3VyTGluZUxlYWRpbmdNb2RlbDpTdHJpbmcgPSAiIjsKIAkJLyoqIGxlYWRpbmcgZmFjdG9yIGNhbGN1bGF0ZWQgd2hlbiBjb21wb3NpbmcgdGhlIGN1cnJlbnQgbGluZSAoY29tbWl0dGVkIHRvIF9sYXN0TGluZUxlYWRpbmcgd2hlbiBsaW5lIGlzIGZpbmFsaXplZCkKQEAgLTMwNyw3ICszMTAsNyBAQAogCQkJaWYgKGNvbnRyb2xsZXJTdGFydEluZGV4IDwgMCkKIAkJCQljb250cm9sbGVyU3RhcnRJbmRleCA9IDA7CiAJCQkKLQkJCS8vIHRoaXMgY2hhaW5zIHRocm91Z2ggdGhlIGxpc3QgLSB0ZWxsIGl0IGlmIGEgImNhcmUgYWJvdXQiIGNvbW9wc2VUb1Bvc2l0aW9uIHdhcyBzcGVjaWZpZWQKKwkJCS8vIHRoaXMgY2hhaW5zIHRocm91Z2ggdGhlIGxpc3QgLSB0ZWxsIGl0IGlmIGEgImNhcmUgYWJvdXQiIGNvbXBvc2VUb1Bvc2l0aW9uIHdhcyBzcGVjaWZpZWQKIAkJCV9wYXJjZWxMaXN0LmJlZ2luQ29tcG9zZShjb21wb3NlciwgY29udHJvbGxlclN0YXJ0SW5kZXgsIGNvbnRyb2xsZXJFbmRJbmRleCwgY29tcG9zZVRvUG9zaXRpb24gPiAwKTsJCiAJCQkKIAkJCV9jb250ZW50TG9naWNhbEV4dGVudCA9IDA7CkBAIC0zMjQsNzQgKzMyNyw1MyBAQAogCQkJX2xpc3RJdGVtRWxlbWVudCA9IG51bGw7CiAJCX0KIAkJCi0JCXByaXZhdGUgZnVuY3Rpb24gY29tcG9zZUJsb2NrRWxlbWVudChlbGVtOkZsb3dHcm91cEVsZW1lbnQsYWJzU3RhcnQ6aW50LGlzSW5UYWJsZTpCb29sZWFuPWZhbHNlLCBzdGFydENoaWxkSWR4OmludCA9IC0xKTpCb29sZWFuCisJCXByaXZhdGUgZnVuY3Rpb24gY29tcG9zZUJsb2NrRWxlbWVudChlbGVtOkZsb3dHcm91cEVsZW1lbnQsIGFic1N0YXJ0OmludCwgaXNJblRhYmxlOkJvb2xlYW49ZmFsc2UsIHN0YXJ0Q2hpbGRJZHg6aW50ID0gLTEpOkJvb2xlYW4KIAkJewkKIAkJCXZhciBjaGlsZDpGbG93RWxlbWVudDsKIAkJCXZhciByc2x0OkJvb2xlYW47CS8vIHNjcmF0Y2gKKwkJCXZhciBpc0luVGFibGVDZWxsOkJvb2xlYW4gPSBlbGVtIGlzIFRleHRGbG93ICYmIFRleHRGbG93KGVsZW0pLnBhcmVudEVsZW1lbnQgaXMgVGFibGVDZWxsRWxlbWVudCA/IHRydWUgOiBmYWxzZTsKKwkJCXZhciBjZWxsU3BhY2luZzpOdW1iZXIgPSAwOworCQkJCisJCQlpZiAoaXNJblRhYmxlQ2VsbCkgeworCQkJCXZhciB0YWJsZUNlbGw6VGFibGVDZWxsRWxlbWVudCA9IFRleHRGbG93KGVsZW0pLnBhcmVudEVsZW1lbnQgYXMgVGFibGVDZWxsRWxlbWVudDsKKwkJCQl2YXIgdGFibGU6VGFibGVFbGVtZW50ID0gdGFibGVDZWxsLnRhYmxlOworCQkJCWNlbGxTcGFjaW5nID0gdGFibGUuY2VsbFNwYWNpbmchPXVuZGVmaW5lZCA/IHRhYmxlLmNlbGxTcGFjaW5nIDogMDsKKwkJCX0KIAkJCQogCQkJLy8gSXRlcmF0ZSB0aHJvdWdoIHRoZSBjaGlsZHJlbiwgY29tcG9zaW5nIHRoZW0uIElmIHdlJ3JlIHN0YXJ0aW5nIGluIHRoZSBtaWRkbGUgb2YgdGhlIGVsZW1lbnQsCiAJCQkvLyBtYWtlIHN1cmUgd2UgYWR2YW5jZSB0byB0aGUgc3RhcnRpbmcgY2hpbGQuCiAJCQl2YXIgaWR4OmludCA9IDA7CiAJCQlpZiAoIHN0YXJ0Q2hpbGRJZHggIT0gLTEgKQogCQkJCWlkeCA9IHN0YXJ0Q2hpbGRJZHg7Ci0JCQlpZighaXNJblRhYmxlKQorCQkJCisJCQlpZiAoYWJzU3RhcnQgIT0gX2N1ckVsZW1lbnRTdGFydCArIF9jdXJFbGVtZW50T2Zmc2V0KSAJLy8gc3RhcnRpbmcgcGFydHdheSBpbgogCQkJewotCQkJCWlmIChhYnNTdGFydCAhPSBfY3VyRWxlbWVudFN0YXJ0ICsgX2N1ckVsZW1lbnRPZmZzZXQpIAkvLyBzdGFydGluZyBwYXJ0d2F5IGluCisJCQkJaWR4ID0gZWxlbS5maW5kQ2hpbGRJbmRleEF0UG9zaXRpb24oKF9jdXJFbGVtZW50U3RhcnQgKyBfY3VyRWxlbWVudE9mZnNldCkgLSBhYnNTdGFydCk7CisJCQkJY2hpbGQgPSBlbGVtLmdldENoaWxkQXQoaWR4KTsKKwkJCQlhYnNTdGFydCArPSBjaGlsZC5wYXJlbnRSZWxhdGl2ZVN0YXJ0OworCQkJCQorCQkJCS8vIEZpeCBidWcjMjkwNzY5MSBXaGVuIGNvbXBvc2l0aW9uIHN0YXJ0cyBpbiBtaWRkbGUgb2YgdGhlIGNvbnRhaW5lciwgcGFkZGluZ0JvdHRvbSBmb3IgdGhlIHByZXZpb3VzIHBhcmFncmFwaCBpcyBpZ25vcmVkCisJCQkJLy8gYWRkIHByZXZvdXMgcGFyYWdyYXBoJ3MgcGFkZGluZ0JvdHRvbSB2YWx1ZXMgdG8gdG90YWxEZXB0aAorCQkJCXZhciBwcmV2aW91c0VsZW1lbnQ6Rmxvd0xlYWZFbGVtZW50ID0gX3RleHRGbG93LmZpbmRMZWFmKF9zdGFydENvbXBvc2VQb3NpdGlvbiAtIDEpOworCQkJCWlmIChwcmV2aW91c0VsZW1lbnQpCiAJCQkJewotCQkJCQlpZHggPSBlbGVtLmZpbmRDaGlsZEluZGV4QXRQb3NpdGlvbigoX2N1ckVsZW1lbnRTdGFydCArIF9jdXJFbGVtZW50T2Zmc2V0KSAtIGFic1N0YXJ0KTsKLQkJCQkJY2hpbGQgPSBlbGVtLmdldENoaWxkQXQoaWR4KTsKLQkJCQkJYWJzU3RhcnQgKz0gY2hpbGQucGFyZW50UmVsYXRpdmVTdGFydDsKLQkJCQkJCi0JCQkJCS8vIEZpeCBidWcjMjkwNzY5MSBXaGVuIGNvbXBvc2l0aW9uIHN0YXJ0cyBpbiBtaWRkbGUgb2YgdGhlIGNvbnRhaW5lciwgcGFkZGluZ0JvdHRvbSBmb3IgdGhlIHByZXZpb3VzIHBhcmFncmFwaCBpcyBpZ25vcmVkCi0JCQkJCS8vIGFkZCBwcmV2b3VzIHBhcmFncmFwaCdzIHBhZGRpbmdCb3R0b20gdmFsdWVzIHRvIHRvdGFsRGVwdGgKLQkJCQkJdmFyIHByZXZpb3VzRWxlbWVudDpGbG93TGVhZkVsZW1lbnQgPSBfdGV4dEZsb3cuZmluZExlYWYoX3N0YXJ0Q29tcG9zZVBvc2l0aW9uIC0gMSk7Ci0JCQkJCWlmIChwcmV2aW91c0VsZW1lbnQpCi0JCQkJCXsKLQkJCQkJCXZhciBwcmV2aW91c1BhcmFncmFwaDpQYXJhZ3JhcGhFbGVtZW50ID0gcHJldmlvdXNFbGVtZW50LmdldFBhcmFncmFwaCgpOwotCQkJCQkJaWYgKHByZXZpb3VzUGFyYWdyYXBoICYmIHByZXZpb3VzUGFyYWdyYXBoICE9IF9jdXJFbGVtZW50LmdldFBhcmFncmFwaCgpKQotCQkJCQkJCWlmIChwcmV2aW91c1BhcmFncmFwaC5wYWRkaW5nQm90dG9tICE9IHVuZGVmaW5lZCkKLQkJCQkJCQkJX3BhcmNlbExpc3QuYWRkVG90YWxEZXB0aChwcmV2aW91c1BhcmFncmFwaC5wYWRkaW5nQm90dG9tKTsKLQkJCQkJfQotCQkJCQkKLQkJCQkJLy8gY2hpbGQgaXMgdGFibGUgbWVhbnMgcmVjb21wb3NlIHN0YXJ0cyBpbiB0aGUgbWlkZGxlIG9mIGEgdGFibGUuIAotCQkJCQkvLyBJbiB0aGlzIGNhc2UsIHdlIGZpbmlzaGVkIGNvbXBvc2UgdGhlIHRhYmxlLCB0aGVuIGNvbnRpbnVlCi0JCQkJCWlmICggY2hpbGQgaXMgVGFibGVFbGVtZW50ICkKLQkJCQkJewotCQkJCQkJY2hpbGQgPSBfY3VyRWxlbWVudDsKLQkJCQkJCXdoaWxlICggY2hpbGQgJiYgISAoY2hpbGQgaXMgVGFibGVSb3dFbGVtZW50KSApCi0JCQkJCQkJY2hpbGQgPSBjaGlsZC5wYXJlbnQ7Ci0JCQkJCQkKLQkJCQkJCXZhciB0YWJsZUVsZW1lbnQ6VGFibGVFbGVtZW50ID0gY2hpbGQucGFyZW50IGFzIFRhYmxlRWxlbWVudDsKLQkJCQkJCXRhYmxlRWxlbWVudC50b3RhbFJvd0RlcHRoID0gMDsKLQkJCQkJCXRhYmxlRWxlbWVudC5udW1BY3Jvc3NQYXJjZWxzID0gMDsKLQkJCQkJCXRhYmxlRWxlbWVudC5vcmlnaW5QYXJjZWxJbmRleCA9IDA7Ci0JCQkJCQl0YWJsZUVsZW1lbnQuaGVpZ2h0QXJyYXkgPSBbXTsKLQkJCQkJCWlmICggISBjb21wb3NlQmxvY2tFbGVtZW50KGNoaWxkLnBhcmVudCwgX2N1ckVsZW1lbnRTdGFydCwgdHJ1ZSwgKGNoaWxkIGFzIFRhYmxlUm93RWxlbWVudCkucm93SW5kZXgpICkKLQkJCQkJCXsKLQkJCQkJCQlCYWNrZ3JvdW5kTWFuYWdlci5jb2xsZWN0QmxvY2soX3RleHRGbG93LCB0YWJsZUVsZW1lbnQsIF9wYXJjZWxMaXN0LCB0cnVlKTsKLQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCS8vIEFkZCB0YWJsZSBib3JkZXIgaW5mbwotCQkJCQkJdGFibGVFbGVtZW50LnRvdGFsUm93RGVwdGggKz0gdGFibGVFbGVtZW50LmdldEVmZmVjdGl2ZUJvcmRlckJvdHRvbVdpZHRoKCkgKyB0YWJsZUVsZW1lbnQuY29tcHV0ZWRGb3JtYXQuY2VsbFNwYWNpbmc7Ci0JCQkJCQl0YWJsZUVsZW1lbnQuaGVpZ2h0ID0gdGFibGVFbGVtZW50LnRvdGFsUm93RGVwdGg7Ci0JCQkJCQkKLQkJCQkJCWFic1N0YXJ0ID0gX2N1ckVsZW1lbnRTdGFydDsKLQkJCQkJCWlkeCArKzsKLQkJCQkJCQotCQkJCQkJaWYgKCAhIGdvdG9QYXJjZWwodGFibGVFbGVtZW50Lm51bUFjcm9zc1BhcmNlbHMsIHRhYmxlRWxlbWVudC50b3RhbFJvd0RlcHRoKSApCQotCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCQotCQkJCQkJX2F0Q29sdW1uU3RhcnQgPSBmYWxzZTsKLQkJCQkJCV9wYXJjZWxMaXN0LmFkZFRvdGFsRGVwdGgodGFibGVFbGVtZW50LmdldEVmZmVjdGl2ZU1hcmdpbkJvdHRvbSgpKTsKLQkJCQkJCQotCQkJCQkJQmFja2dyb3VuZE1hbmFnZXIuY29sbGVjdEJsb2NrKF90ZXh0RmxvdywgdGFibGVFbGVtZW50LCBfcGFyY2VsTGlzdCwgdHJ1ZSk7Ci0JCQkJCX0KKwkJCQkJdmFyIHByZXZpb3VzUGFyYWdyYXBoOlBhcmFncmFwaEVsZW1lbnQgPSBwcmV2aW91c0VsZW1lbnQuZ2V0UGFyYWdyYXBoKCk7CisJCQkJCWlmIChwcmV2aW91c1BhcmFncmFwaCAmJiBwcmV2aW91c1BhcmFncmFwaCAhPSBfY3VyRWxlbWVudC5nZXRQYXJhZ3JhcGgoKSkKKwkJCQkJCWlmIChwcmV2aW91c1BhcmFncmFwaC5wYWRkaW5nQm90dG9tICE9IHVuZGVmaW5lZCkKKwkJCQkJCQlfcGFyY2VsTGlzdC5hZGRUb3RhbERlcHRoKHByZXZpb3VzUGFyYWdyYXBoLnBhZGRpbmdCb3R0b20pOwogCQkJCX0KLQkJCX0KKwkJCQkKKwkJCQkvLyBjaGlsZCBpcyB0YWJsZSBtZWFucyByZWNvbXBvc2Ugc3RhcnRzIGluIHRoZSBtaWRkbGUgb2YgYSB0YWJsZS4gCisJCQkJLy8gSW4gdGhpcyBjYXNlLCB3ZSBmaW5pc2hlZCBjb21wb3NlIHRoZSB0YWJsZSwgdGhlbiBjb250aW51ZQorCQkJCS8vIEhhcmJzIC0gbmVlZCB0byBhbmFsaXplIHdoZXRoZXIgdGhpcyBtYWtlcyBzZW5zZSBhdCBhbGwuLi4KKwkJCQkvKgorCQkJCWlmICggY2hpbGQgaXMgVGFibGVFbGVtZW50ICkKKwkJCQl7CisJCQkJLy8gaWYgaXQgbWFrZXMgc2Vuc2UsIHdlIG5lZWQgdG8gcmVkbyB0aGlzIGxvZ2ljLgogCi0JCQkKLQkJCQorCQkJCX0KKwkJCQkqLworCQkJfQogCQkJCiAJCQl2YXIgY29tcG9zZUVudGlyZUVsZW1lbnQ6Qm9vbGVhbiA9IChhYnNTdGFydCA9PSBfY3VyRWxlbWVudFN0YXJ0ICsgX2N1ckVsZW1lbnRPZmZzZXQpOwogCkBAIC00MDAsNDEgKzM4Miw0NSBAQAogCQkJewogCQkJCWNoaWxkID0gZWxlbS5nZXRDaGlsZEF0KGlkeCk7CiAJCQkJCi0JCQkJaWYoIWlzSW5UYWJsZSkKKwkJCQkvLyBJZiB0aGUgZWxlbWVudCBoYXMgY2xlYXIgYXBwbGllZCwgaGFuZGxlIHRoYXQgbm93CisJCQkJaWYgKGNoaWxkLmNvbXB1dGVkRm9ybWF0LmNsZWFyRmxvYXRzICE9IENsZWFyRmxvYXRzLk5PTkUpCiAJCQkJewotCQkJCQkvLyBJZiB0aGUgZWxlbWVudCBoYXMgY2xlYXIgYXBwbGllZCwgaGFuZGxlIHRoYXQgbm93Ci0JCQkJCWlmIChjaGlsZC5jb21wdXRlZEZvcm1hdC5jbGVhckZsb2F0cyAhPSBDbGVhckZsb2F0cy5OT05FKQotCQkJCQl7Ci0JCQkJCQl2YXIgYWRqdXN0ZWREZXB0aDpOdW1iZXIgPSBfY3VyUGFyY2VsLmFwcGx5Q2xlYXIoY2hpbGQuY29tcHV0ZWRGb3JtYXQuY2xlYXJGbG9hdHMsIF9wYXJjZWxMaXN0LnRvdGFsRGVwdGgsIGNoaWxkLmNvbXB1dGVkRm9ybWF0LmRpcmVjdGlvbik7Ci0JCQkJCQlfcGFyY2VsTGlzdC5hZGRUb3RhbERlcHRoKGFkanVzdGVkRGVwdGgpOwotCQkJCQkJX3ZlcnRpY2FsU3BhY2VDYXJyaWVkID0gMDsKLQkJCQkJfQotCQotCQkJCQl2YXIgYm94TGVmdEluZGVudDpOdW1iZXI7CQkvLyBsb2dpY2FsIHdpdGggcmVzcGVjdCB0byBob3Jpem9udGFsL3ZlcnRpY2FsIHRleHQKLQkJCQkJdmFyIGJveFJpZ2h0SW5kZW50Ok51bWJlcjsJCS8vIGxvZ2ljYWwgd2l0aCByZXNwZWN0IHRvIGhvcml6b250YWwvdmVydGljYWwgdGV4dAotCQkJCQl2YXIgYm94VG9wSW5kZW50Ok51bWJlcjsJCS8vIGxvZ2ljYWwgd2l0aCByZXNwZWN0IHRvIGhvcml6b250YWwvdmVydGljYWwgdGV4dAotCQkJCQl2YXIgYm94Qm90dG9tSW5kZW50Ok51bWJlcjsJCS8vIGxvZ2ljYWwgd2l0aCByZXNwZWN0IHRvIGhvcml6b250YWwvdmVydGljYWwgdGV4dAotCQkJCQlpZiAoX2Jsb2NrUHJvZ3Jlc3Npb24gPT0gQmxvY2tQcm9ncmVzc2lvbi5STCkKLQkJCQkJewotCQkJCQkJYm94TGVmdEluZGVudCA9IGNoaWxkLmdldEVmZmVjdGl2ZVBhZGRpbmdUb3AoKSArIGNoaWxkLmdldEVmZmVjdGl2ZUJvcmRlclRvcFdpZHRoKCkgKyBjaGlsZC5nZXRFZmZlY3RpdmVNYXJnaW5Ub3AoKTsKLQkJCQkJCWJveFJpZ2h0SW5kZW50ID0gY2hpbGQuZ2V0RWZmZWN0aXZlUGFkZGluZ0JvdHRvbSgpICsgY2hpbGQuZ2V0RWZmZWN0aXZlQm9yZGVyQm90dG9tV2lkdGgoKSArIGNoaWxkLmdldEVmZmVjdGl2ZU1hcmdpbkJvdHRvbSgpOwotCQkJCQkJYm94VG9wSW5kZW50ID0gY2hpbGQuZ2V0RWZmZWN0aXZlUGFkZGluZ1JpZ2h0KCkgKyBjaGlsZC5nZXRFZmZlY3RpdmVCb3JkZXJSaWdodFdpZHRoKCkgKyBjaGlsZC5nZXRFZmZlY3RpdmVNYXJnaW5SaWdodCgpOwotCQkJCQkJYm94Qm90dG9tSW5kZW50ID0gY2hpbGQuZ2V0RWZmZWN0aXZlUGFkZGluZ0xlZnQoKSArIGNoaWxkLmdldEVmZmVjdGl2ZUJvcmRlckxlZnRXaWR0aCgpICsgY2hpbGQuZ2V0RWZmZWN0aXZlTWFyZ2luTGVmdCgpOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJYm94TGVmdEluZGVudCA9IGNoaWxkLmdldEVmZmVjdGl2ZVBhZGRpbmdMZWZ0KCkgKyBjaGlsZC5nZXRFZmZlY3RpdmVCb3JkZXJMZWZ0V2lkdGgoKSArIGNoaWxkLmdldEVmZmVjdGl2ZU1hcmdpbkxlZnQoKTsKLQkJCQkJCWJveFJpZ2h0SW5kZW50ID0gY2hpbGQuZ2V0RWZmZWN0aXZlUGFkZGluZ1JpZ2h0KCkgKyBjaGlsZC5nZXRFZmZlY3RpdmVCb3JkZXJSaWdodFdpZHRoKCkgKyBjaGlsZC5nZXRFZmZlY3RpdmVNYXJnaW5SaWdodCgpOwotCQkJCQkJYm94VG9wSW5kZW50ID0gY2hpbGQuZ2V0RWZmZWN0aXZlUGFkZGluZ1RvcCgpICsgY2hpbGQuZ2V0RWZmZWN0aXZlQm9yZGVyVG9wV2lkdGgoKSArIGNoaWxkLmdldEVmZmVjdGl2ZU1hcmdpblRvcCgpOwotCQkJCQkJYm94Qm90dG9tSW5kZW50ID0gY2hpbGQuZ2V0RWZmZWN0aXZlUGFkZGluZ0JvdHRvbSgpICsgY2hpbGQuZ2V0RWZmZWN0aXZlQm9yZGVyQm90dG9tV2lkdGgoKSArIGNoaWxkLmdldEVmZmVjdGl2ZU1hcmdpbkJvdHRvbSgpOwotCQkJCQl9Ci0JCQkJCUNPTkZJRzo6ZGVidWcgeyBhc3NlcnQoIWlzTmFOKGJveExlZnRJbmRlbnQpICYmICEgaXNOYU4oYm94UmlnaHRJbmRlbnQpLCJCQUQgaW5kZW50cyIpOyB9Ci0JCQkJCV9wYXJjZWxMaXN0LnB1c2hMZWZ0TWFyZ2luKGJveExlZnRJbmRlbnQpOwotCQkJCQlfcGFyY2VsTGlzdC5wdXNoUmlnaHRNYXJnaW4oYm94UmlnaHRJbmRlbnQpOwotCQkJCQlpZiAoY29tcG9zZUVudGlyZUVsZW1lbnQgJiYgYm94VG9wSW5kZW50ID4gX3ZlcnRpY2FsU3BhY2VDYXJyaWVkKQotCQkJCQkJX3BhcmNlbExpc3QuYWRkVG90YWxEZXB0aChib3hUb3BJbmRlbnQgLSBfdmVydGljYWxTcGFjZUNhcnJpZWQpOwotCQkJCQlfdmVydGljYWxTcGFjZUNhcnJpZWQgPSBNYXRoLm1heChib3hUb3BJbmRlbnQsIDApOworCQkJCQl2YXIgYWRqdXN0ZWREZXB0aDpOdW1iZXIgPSBfY3VyUGFyY2VsLmFwcGx5Q2xlYXIoY2hpbGQuY29tcHV0ZWRGb3JtYXQuY2xlYXJGbG9hdHMsIF9wYXJjZWxMaXN0LnRvdGFsRGVwdGgsIGNoaWxkLmNvbXB1dGVkRm9ybWF0LmRpcmVjdGlvbik7CisJCQkJCV9wYXJjZWxMaXN0LmFkZFRvdGFsRGVwdGgoYWRqdXN0ZWREZXB0aCk7CisJCQkJCV92ZXJ0aWNhbFNwYWNlQ2FycmllZCA9IDA7CiAJCQkJfQorCQkJCQorCQkJCXZhciBib3hMZWZ0SW5kZW50Ok51bWJlcjsJCS8vIGxvZ2ljYWwgd2l0aCByZXNwZWN0IHRvIGhvcml6b250YWwvdmVydGljYWwgdGV4dAorCQkJCXZhciBib3hSaWdodEluZGVudDpOdW1iZXI7CQkvLyBsb2dpY2FsIHdpdGggcmVzcGVjdCB0byBob3Jpem9udGFsL3ZlcnRpY2FsIHRleHQKKwkJCQl2YXIgYm94VG9wSW5kZW50Ok51bWJlcjsJCS8vIGxvZ2ljYWwgd2l0aCByZXNwZWN0IHRvIGhvcml6b250YWwvdmVydGljYWwgdGV4dAorCQkJCXZhciBib3hCb3R0b21JbmRlbnQ6TnVtYmVyOwkJLy8gbG9naWNhbCB3aXRoIHJlc3BlY3QgdG8gaG9yaXpvbnRhbC92ZXJ0aWNhbCB0ZXh0CisJCQkJaWYgKF9ibG9ja1Byb2dyZXNzaW9uID09IEJsb2NrUHJvZ3Jlc3Npb24uUkwpCisJCQkJeworCQkJCQlib3hMZWZ0SW5kZW50ID0gY2hpbGQuZ2V0RWZmZWN0aXZlUGFkZGluZ1RvcCgpICsgY2hpbGQuZ2V0RWZmZWN0aXZlQm9yZGVyVG9wV2lkdGgoKSArIGNoaWxkLmdldEVmZmVjdGl2ZU1hcmdpblRvcCgpOworCQkJCQlib3hSaWdodEluZGVudCA9IGNoaWxkLmdldEVmZmVjdGl2ZVBhZGRpbmdCb3R0b20oKSArIGNoaWxkLmdldEVmZmVjdGl2ZUJvcmRlckJvdHRvbVdpZHRoKCkgKyBjaGlsZC5nZXRFZmZlY3RpdmVNYXJnaW5Cb3R0b20oKTsKKwkJCQkJYm94VG9wSW5kZW50ID0gY2hpbGQuZ2V0RWZmZWN0aXZlUGFkZGluZ1JpZ2h0KCkgKyBjaGlsZC5nZXRFZmZlY3RpdmVCb3JkZXJSaWdodFdpZHRoKCkgKyBjaGlsZC5nZXRFZmZlY3RpdmVNYXJnaW5SaWdodCgpOworCQkJCQlib3hCb3R0b21JbmRlbnQgPSBjaGlsZC5nZXRFZmZlY3RpdmVQYWRkaW5nTGVmdCgpICsgY2hpbGQuZ2V0RWZmZWN0aXZlQm9yZGVyTGVmdFdpZHRoKCkgKyBjaGlsZC5nZXRFZmZlY3RpdmVNYXJnaW5MZWZ0KCk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCWJveExlZnRJbmRlbnQgPSBjaGlsZC5nZXRFZmZlY3RpdmVQYWRkaW5nTGVmdCgpICsgY2hpbGQuZ2V0RWZmZWN0aXZlQm9yZGVyTGVmdFdpZHRoKCkgKyBjaGlsZC5nZXRFZmZlY3RpdmVNYXJnaW5MZWZ0KCk7CisJCQkJCWJveFJpZ2h0SW5kZW50ID0gY2hpbGQuZ2V0RWZmZWN0aXZlUGFkZGluZ1JpZ2h0KCkgKyBjaGlsZC5nZXRFZmZlY3RpdmVCb3JkZXJSaWdodFdpZHRoKCkgKyBjaGlsZC5nZXRFZmZlY3RpdmVNYXJnaW5SaWdodCgpOworCQkJCQlib3hUb3BJbmRlbnQgPSBjaGlsZC5nZXRFZmZlY3RpdmVQYWRkaW5nVG9wKCkgKyBjaGlsZC5nZXRFZmZlY3RpdmVCb3JkZXJUb3BXaWR0aCgpICsgY2hpbGQuZ2V0RWZmZWN0aXZlTWFyZ2luVG9wKCk7CisJCQkJCWJveEJvdHRvbUluZGVudCA9IGNoaWxkLmdldEVmZmVjdGl2ZVBhZGRpbmdCb3R0b20oKSArIGNoaWxkLmdldEVmZmVjdGl2ZUJvcmRlckJvdHRvbVdpZHRoKCkgKyBjaGlsZC5nZXRFZmZlY3RpdmVNYXJnaW5Cb3R0b20oKTsKKwkJCQkJCisJCQkJCWlmIChpc0luVGFibGVDZWxsKSB7CisJCQkJCQlib3hMZWZ0SW5kZW50ICs9IGNlbGxTcGFjaW5nOworCQkJCQkJYm94UmlnaHRJbmRlbnQgKz0gY2VsbFNwYWNpbmc7CisJCQkJCQlib3hUb3BJbmRlbnQgKz0gY2VsbFNwYWNpbmc7CisJCQkJCQlib3hCb3R0b21JbmRlbnQgKz0gY2VsbFNwYWNpbmc7CisJCQkJCX0KKwkJCQl9CisJCQkJQ09ORklHOjpkZWJ1ZyB7IGFzc2VydCghaXNOYU4oYm94TGVmdEluZGVudCkgJiYgISBpc05hTihib3hSaWdodEluZGVudCksIkJBRCBpbmRlbnRzIik7IH0KKwkJCQlfcGFyY2VsTGlzdC5wdXNoTGVmdE1hcmdpbihib3hMZWZ0SW5kZW50KTsKKwkJCQlfcGFyY2VsTGlzdC5wdXNoUmlnaHRNYXJnaW4oYm94UmlnaHRJbmRlbnQpOworCQkJCWlmIChjb21wb3NlRW50aXJlRWxlbWVudCAmJiBib3hUb3BJbmRlbnQgPiBfdmVydGljYWxTcGFjZUNhcnJpZWQpCisJCQkJCV9wYXJjZWxMaXN0LmFkZFRvdGFsRGVwdGgoYm94VG9wSW5kZW50IC0gX3ZlcnRpY2FsU3BhY2VDYXJyaWVkKTsKKwkJCQlfdmVydGljYWxTcGFjZUNhcnJpZWQgPSBNYXRoLm1heChib3hUb3BJbmRlbnQsIDApOwogCQkJCQkJCQkKIAkJCQkKIAkJCQl2YXIgcGFyYTpQYXJhZ3JhcGhFbGVtZW50ID0gY2hpbGQgYXMgUGFyYWdyYXBoRWxlbWVudDsKQEAgLTQ2OCw3ICs0NTQsNyBAQAogCQkJCX0KIAkJCQllbHNlIGlmIChjaGlsZCBpcyBMaXN0RWxlbWVudCkKIAkJCQl7CQkJCQkJCi0JCQkJCXJzbHQgPSBjb21wb3NlQmxvY2tFbGVtZW50KEZsb3dHcm91cEVsZW1lbnQoY2hpbGQpLGFic1N0YXJ0LGlzSW5UYWJsZSk7CisJCQkJCXJzbHQgPSBjb21wb3NlQmxvY2tFbGVtZW50KEZsb3dHcm91cEVsZW1lbnQoY2hpbGQpLGFic1N0YXJ0KTsKIAkJCQkJCiAJCQkJCWlmICghcnNsdCkKIAkJCQkJewpAQCAtNDgxLDcgKzQ2Nyw3IEBACiAJCQkJewogCQkJCQl2YXIgc2F2ZWRMaXN0SXRlbUVsZW1lbnQ6TGlzdEl0ZW1FbGVtZW50ID0gX2xpc3RJdGVtRWxlbWVudDsKIAkJCQkJX2xpc3RJdGVtRWxlbWVudCA9IGNoaWxkIGFzIExpc3RJdGVtRWxlbWVudDsKLQkJCQkJcnNsdCA9IGNvbXBvc2VCbG9ja0VsZW1lbnQoRmxvd0dyb3VwRWxlbWVudChjaGlsZCksYWJzU3RhcnQsaXNJblRhYmxlKTsKKwkJCQkJcnNsdCA9IGNvbXBvc2VCbG9ja0VsZW1lbnQoRmxvd0dyb3VwRWxlbWVudChjaGlsZCksYWJzU3RhcnQpOwogCQkJCQlfbGlzdEl0ZW1FbGVtZW50ID0gc2F2ZWRMaXN0SXRlbUVsZW1lbnQ7CiAJCQkJCQkKIAkJCQkJaWYgKCFyc2x0KQpAQCAtNDkxLDI0ICs0NzcsNiBAQAogCQkJCQkJcmV0dXJuIGZhbHNlOwogCQkJCQl9CiAJCQkJfQotCQkJCWVsc2UgaWYgKGNoaWxkIGlzIFRhYmxlRWxlbWVudCkgICAgICAgICAvLyBDb21wb3NlIFRhYmxlRWxlbWVudAotCQkJCXsKLQkJCQkJaWYgKCAhIGNvbXBvc2VUYWJsZUVsZW1lbnQoY2hpbGQgYXMgVGFibGVFbGVtZW50LCBhYnNTdGFydCwgaXNJblRhYmxlKSApCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGNoaWxkIGlzIFRhYmxlUm93RWxlbWVudCkgICAgIC8vIENvbXBvc2UgVGFibGVSb3dFbGVtZW50Ci0JCQkJewotCQkJCQl2YXIgcm93RWxlbWVudDpUYWJsZVJvd0VsZW1lbnQgPSBjaGlsZCBhcyBUYWJsZVJvd0VsZW1lbnQ7Ci0JCQkJCXJvd0VsZW1lbnQucm93SW5kZXggPSBpZHg7Ci0JCQkJCQotCQkJCQlpZiAoICEgY29tcG9zZVRhYmxlUm93RWxlbWVudChlbGVtIGFzIFRhYmxlRWxlbWVudCwgcm93RWxlbWVudCwgYWJzU3RhcnQsIGlzSW5UYWJsZSkgKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQllbHNlIGlmIChjaGlsZCBpcyBUYWJsZURhdGFDZWxsRWxlbWVudCkgLy8gQ29tcG9zZSBUYWJsZURhdGFDZWxsRWxlbWVudAotCQkJCXsKLQkJCQkJaWYgKCAhIGNvbXBvc2VUYWJsZURhdGFDZWxsRWxlbWVudChlbGVtIGFzIFRhYmxlUm93RWxlbWVudCwgY2hpbGQgYXMgVGFibGVEYXRhQ2VsbEVsZW1lbnQsIGFic1N0YXJ0LCBpc0luVGFibGUpICkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9CiAJCQkJZWxzZSAKIAkJCQl7CiAJCQkJCWlmICggISBjb21wb3NlQmxvY2tFbGVtZW50KEZsb3dHcm91cEVsZW1lbnQoY2hpbGQpLGFic1N0YXJ0KSkKQEAgLTUxOSwyMiArNDg3LDIwIEBACiAJCQkJCX0KIAkJCQl9CiAJCQkJCi0JCQkJaWYoISBpc0luVGFibGUpCi0JCQkJewotCQkJCQlpZiAoYm94Qm90dG9tSW5kZW50ID4gX3ZlcnRpY2FsU3BhY2VDYXJyaWVkKQotCQkJCQkJX3BhcmNlbExpc3QuYWRkVG90YWxEZXB0aChib3hCb3R0b21JbmRlbnQgLSBfdmVydGljYWxTcGFjZUNhcnJpZWQpOwotCQkJCQlfdmVydGljYWxTcGFjZUNhcnJpZWQgPSBNYXRoLm1heChib3hCb3R0b21JbmRlbnQsIDApOwotCQotCQkJCQkvLyByZXN0b3JlIHRvIG9yaWdpbmFsIHZhbHVlcwotCQkJCQlfcGFyY2VsTGlzdC5wb3BMZWZ0TWFyZ2luKGJveExlZnRJbmRlbnQpOwotCQkJCQlfcGFyY2VsTGlzdC5wb3BSaWdodE1hcmdpbihib3hSaWdodEluZGVudCk7Ci0JCQkJCWNvbXBvc2VFbnRpcmVFbGVtZW50ID0gdHJ1ZTsKLQkJCQl9CisJCQkJaWYgKGJveEJvdHRvbUluZGVudCA+IF92ZXJ0aWNhbFNwYWNlQ2FycmllZCkKKwkJCQkJX3BhcmNlbExpc3QuYWRkVG90YWxEZXB0aChib3hCb3R0b21JbmRlbnQgLSBfdmVydGljYWxTcGFjZUNhcnJpZWQpOworCQkJCV92ZXJ0aWNhbFNwYWNlQ2FycmllZCA9IE1hdGgubWF4KGJveEJvdHRvbUluZGVudCwgMCk7CisJCQkJCisJCQkJLy8gcmVzdG9yZSB0byBvcmlnaW5hbCB2YWx1ZXMKKwkJCQlfcGFyY2VsTGlzdC5wb3BMZWZ0TWFyZ2luKGJveExlZnRJbmRlbnQpOworCQkJCV9wYXJjZWxMaXN0LnBvcFJpZ2h0TWFyZ2luKGJveFJpZ2h0SW5kZW50KTsKKwkJCQljb21wb3NlRW50aXJlRWxlbWVudCA9IHRydWU7CisJCQkJCiAJCQkJYWJzU3RhcnQgKz0gY2hpbGQudGV4dExlbmd0aDsKIAkJCX0KIAkJCQotCQkJLy9mb3IgZWxlbWVudHMsIHdob3NlIHRleHQgYXJlIGFsbCB2aXNpYmxlLCBleGNlcHQgZm9yIFRhYmxlRWxlbWVudCwgVGFibGVSb3dFbGVtZW50IGFuZCBUYWJsZURhdGFDZWxsRWxlbWVudAotCQkJaWYoIShlbGVtIGlzIFRhYmxlRWxlbWVudCB8fCBlbGVtIGlzIFRhYmxlUm93RWxlbWVudCB8fCBlbGVtIGlzIFRhYmxlRGF0YUNlbGxFbGVtZW50KSkKKwkJCS8vZm9yIGVsZW1lbnRzLCB3aG9zZSB0ZXh0IGFyZSBhbGwgdmlzaWJsZSwgZXhjZXB0IGZvciBUYWJsZUVsZW1lbnQsIFRhYmxlUm93RWxlbWVudCBhbmQgVGFibGVDZWxsRWxlbWVudAorCQkJaWYoIShlbGVtIGlzIFRhYmxlRWxlbWVudCB8fCBlbGVtIGlzIFRhYmxlUm93RWxlbWVudCB8fCBlbGVtIGlzIFRhYmxlQ2VsbEVsZW1lbnQpKS8vICh3ZSBkb24ndCBwcm9jZXNzIHRoZXNlLi4uKQogCQkJCUJhY2tncm91bmRNYW5hZ2VyLmNvbGxlY3RCbG9jayhfdGV4dEZsb3csIGVsZW0pOwogCQkJCiAJCQlyZXR1cm4gdHJ1ZTsKQEAgLTU0NSwzMjIgKzUxMSwxODYgQEAKIAkJICogSW4gIDogVGFibGVFbGVtZW50LCB0YWJsZSdzIGFic1N0YXJ0IHBvc2l0aW9uLCBpc0luVGFibGUKIAkJICogT3V0IDogQm9vbGVhbiB2YWx1ZSwgY29tcG9zaXRpb24gcmVzdWx0LCB0cnVlIC0gc3VjY2Vzc2Z1bCwgZmFsc2UgLSBmYWlsZWQKIAkJICovCi0JCXByaXZhdGUgZnVuY3Rpb24gY29tcG9zZVRhYmxlRWxlbWVudCh0YWJsZUVsZW1lbnQ6VGFibGVFbGVtZW50LCBhYnNTdGFydDppbnQsIGlzSW5UYWJsZTpCb29sZWFuKTpCb29sZWFuCisJCXByaXZhdGUgZnVuY3Rpb24gY29tcG9zZVRhYmxlRWxlbWVudCh0YWJsZUVsZW1lbnQ6VGFibGVFbGVtZW50LCBhYnNTdGFydDppbnQpOkJvb2xlYW4KIAkJewotCQkJLy8xc3Qgc3RlcCBmaW5kb3V0IHRoZSBUYWJsZUdyb3VwIGVsZW1lbnQgYW5kIGdldCB0aGUgY29tcG9zaW5nIHBhcmFtZXRlciBmb3IgdGhlIGNvbHVtbnMKLQkJCS8vbXkgZmlyc3QgaWRlYSBpcyB0byByZWFkIHRoZW0gdG8gYmUgYSBUYWJsZUVsZW1lbnQgbGlzdCBvciBtYXAuIEFuZCByZW1vdmUgYWxsIHRoZSBjb2x1bW4gCi0JCQkvL2VsZW1lbnQgc28gdGhhdCB0aGUgY29sdW1uIGVsZW1lbnQgd2lsbCBub3QgZmFsbCBpbnRvIHRoZSByZWN1cnNpdmUgbG9vcAotCQkJdGFibGVFbGVtZW50Lm51bUFjcm9zc1BhcmNlbHMgPSAwOwotICAgICAgICAgICAgdGFibGVFbGVtZW50LmhlaWdodEFycmF5ID0gW107Ci0gICAgICAgICAgICB0YWJsZUVsZW1lbnQuY3VyUm93SWR4ID0gMDsKLSAgICAgICAgICAgIHRhYmxlRWxlbWVudC5vdXRPZkxhc3RQYXJjZWwgPSBmYWxzZTsKLSAgICAgICAgICAgIAotCQkJLy8ybmQgc3RlcCBzZXR1cCB0aGUgZW52aXJvbm1lbnQgc2V0dGluZ3MKLQkJCXZhciBtYXJnaW5MZWZ0Ok51bWJlciA9IHRhYmxlRWxlbWVudC5jb21wdXRlZEZvcm1hdC5tYXJnaW5MZWZ0OwotCQkJdmFyIG1hcmdpblRvcDpOdW1iZXIgID0gdGFibGVFbGVtZW50LmNvbXB1dGVkRm9ybWF0Lm1hcmdpblRvcDsKLSAgICAgICAgICAgIAotCQkJdGFibGVFbGVtZW50LnggPSBfcGFyY2VsTGlzdC5jdXJyZW50UGFyY2VsLnggKyBtYXJnaW5MZWZ0OwotCQkJdGFibGVFbGVtZW50LnkgPSBfcGFyY2VsTGlzdC50b3RhbERlcHRoICsgKF9hdENvbHVtblN0YXJ0ID8gbWFyZ2luVG9wIDogX2ZpcnN0TGluZURlc2NlbnRBbmRMZWFkaW5nICsgbWFyZ2luVG9wKTsKLQkJCQotCQkJX3BhcmNlbExpc3QuYWRkVG90YWxEZXB0aCh0YWJsZUVsZW1lbnQueSAtIF9wYXJjZWxMaXN0LnRvdGFsRGVwdGgpOwotCQkJCi0JCQkvLyBUaGUgZm9sbG93aW5nIGNvZGVzIGFyZSBzZXR0aW5nIHRoZSBjb2x1bW4gd2lkdGgKLQkJCXNlcmlhbGl6ZVRhYmxlQ29sdW1uV2lkdGgodGFibGVFbGVtZW50KTsKLQkJCQotCQkJLy9UTy1ETzogVmVyaWZ5IHRoZSBib3JkZXJUb3BXaWR0aCBWYWx1ZQotCQkJdGFibGVFbGVtZW50Lm9yaWdpblBhcmNlbEluZGV4ID0gX3BhcmNlbExpc3QuY3VycmVudFBhcmNlbEluZGV4OwotCQkJdmFyIG9yaWdpblBhcmNlbDpQYXJjZWwgPSBfcGFyY2VsTGlzdC5jdXJyZW50UGFyY2VsOwotCQkJCi0JCQkvLyBBZGQgdGFibGUgYm9yZGVyIGluZm8KLQkJCV9wYXJjZWxMaXN0LmFkZFRvdGFsRGVwdGgodGFibGVFbGVtZW50LmdldEVmZmVjdGl2ZUJvcmRlclRvcFdpZHRoKCkpOwotCQkJdGFibGVFbGVtZW50LnRvdGFsUm93RGVwdGggPSBfcGFyY2VsTGlzdC50b3RhbERlcHRoOwotCQkJCi0JCQkvLzJuZCBzdGVwIHJlY3Vyc2l2ZWx5IGNvbXBvc2UgdGhlIHRhYmxlIGVsZW1lbnRzCi0JCQlpZiAoICEgY29tcG9zZUJsb2NrRWxlbWVudChGbG93R3JvdXBFbGVtZW50KHRhYmxlRWxlbWVudCksIGFic1N0YXJ0LCB0cnVlKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gSWYgd2UncmUgb3V0IG9mIHBhcmNlbCwgd2UgZG9uJ3QgbmVlZCB0byBjYWxjdWxhdGUgdGFibGUgaGVpZ2h0IGFueW1vcmUsCi0gICAgICAgICAgICAgICAgLy8gYmVjYXVzZSB3ZSd2ZSBkb25lIGluIGNvbXBvc2VUYWJsZVJvd0VsZW1lbnQgYmVmb3JlIGl0IHJldHVybiBmYWxzZS4KLSAgICAgICAgICAgICAgICBpZih0YWJsZUVsZW1lbnQub3V0T2ZMYXN0UGFyY2VsKQotICAgICAgICAgICAgICAgICAgICBCYWNrZ3JvdW5kTWFuYWdlci5jb2xsZWN0QmxvY2soX3RleHRGbG93LCB0YWJsZUVsZW1lbnQsIF9wYXJjZWxMaXN0LCBmYWxzZSwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotCQkJCi0JCQkvLyBBZGQgdGFibGUgYm9yZGVyIGluZm8KLQkJCXRhYmxlRWxlbWVudC50b3RhbFJvd0RlcHRoICs9IHRhYmxlRWxlbWVudC5nZXRFZmZlY3RpdmVCb3JkZXJCb3R0b21XaWR0aCgpICsgdGFibGVFbGVtZW50LmNvbXB1dGVkRm9ybWF0LmNlbGxTcGFjaW5nOwotCQkJCi0gICAgICAgICAgICBpZih0YWJsZUVsZW1lbnQubnVtQWNyb3NzUGFyY2VscyA9PSAwICYmIF9zdGFydENvbXBvc2VQb3NpdGlvbiA8PSB0YWJsZUVsZW1lbnQuZ2V0QWJzb2x1dGVTdGFydCgpKQotICAgICAgICAgICAgICAgIHRhYmxlRWxlbWVudC5oZWlnaHQgPSB0YWJsZUVsZW1lbnQudG90YWxSb3dEZXB0aCAtIHRhYmxlRWxlbWVudC55OwotICAgICAgICAgICAgZWxzZQotCQkJCXRhYmxlRWxlbWVudC5oZWlnaHQgPSB0YWJsZUVsZW1lbnQudG90YWxSb3dEZXB0aDsKKwkJCS8vVE9ETzogcmVtb3ZlIGFueSBvbGQgZXhpc3RpbmcgY2VsbHMgaW4gdGhlIF9wYXJjZWxMaXN0LmN1cnJlbnRQYXJjZWwuY29udHJvbGxlciBmcm9tIHRoZSBwb3NpdGlvbiBvZiB0aGUgdGFibGUgYW5kIG9uLgorCQkJLy8gbmVlZCB0byBmaWd1cmUgb3V0IHRoZSBhY2NvdW50aW5nIG5lZWRlZCBmb3IgdGhhdC4KIAotCQkJLy8gSWYgY3VycmVudCBjb21wb3NpdGlvbiBwb3NpdGlvbiBwbHVzIG9uZSBsaW5lIGhlaWdodCBiZXlvbmQgdGhlIHBhcmNlbCBib3R0b20sIHRoZW4gd2UganVtcCB0byBuZXh0IHBhcmNlbCAKLQkJCXZhciBkZXB0aDpOdW1iZXIgPSB0YWJsZUVsZW1lbnQudG90YWxSb3dEZXB0aDsKLQkJCQotCQkJLy8gSWYgdGFibGUgYWxyZWFkeSBmdWxsIHRoZSBsYXN0IGNvbHVtbiwgd2Ugd29uJ3QgZ290byB0YWJsZSBjZWxsIHBhcmNlbC4gSnVzdCBnb3RvIGxhc3Qgbm90IHRhYmxlIGNlbGwgcGFyY2VsCi0JCQl2YXIgcGFyY2VsSWR4OmludCA9IHRhYmxlRWxlbWVudC5vcmlnaW5QYXJjZWxJbmRleCArIHRhYmxlRWxlbWVudC5udW1BY3Jvc3NQYXJjZWxzOwotCQkJaWYgKCBfcGFyY2VsTGlzdC5nZXRQYXJjZWxBdChwYXJjZWxJZHgpLmlzVGFibGVQYXJjZWwgKQotCQkJCWRlcHRoID0gX3BhcmNlbExpc3QuZ2V0UGFyY2VsQXQoLS1wYXJjZWxJZHgpLmJvdHRvbTsKLQkJCQotCQkJaWYgKCAhIGdvdG9QYXJjZWwocGFyY2VsSWR4LCBkZXB0aCkgKQkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkKLSAgICAgICAgICAgIF9hdENvbHVtblN0YXJ0ID0gZmFsc2U7Ci0JCQlfcGFyY2VsTGlzdC5hZGRUb3RhbERlcHRoKHRhYmxlRWxlbWVudC5nZXRFZmZlY3RpdmVNYXJnaW5Cb3R0b20oKSk7Ci0JCQkKLQkJCUJhY2tncm91bmRNYW5hZ2VyLmNvbGxlY3RCbG9jayhfdGV4dEZsb3csIHRhYmxlRWxlbWVudCwgX3BhcmNlbExpc3QpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCS8qKiBAcHJpdmF0ZQotCQkgKiBDb21wb3NlIGEgZW50aXJlIHRhYmxlIHJvdyBlbGVtZW50Ci0JCSAqIEluICA6IFRhYmxlRWxlbWVudCwgVGFibGVSb3dFbGVtZW50LCB0YWJsZSdzIGFic1N0YXJ0IHBvc2l0aW9uLCBpc0luVGFibGUKLQkJICogT3V0IDogQm9vbGVhbiB2YWx1ZSwgY29tcG9zaXRpb24gcmVzdWx0LCB0cnVlIC0gc3VjY2Vzc2Z1bCwgZmFsc2UgLSBmYWlsZWQKLQkJICovCi0JCXByaXZhdGUgZnVuY3Rpb24gY29tcG9zZVRhYmxlUm93RWxlbWVudCh0YWJsZUVsZW1lbnQ6VGFibGVFbGVtZW50LCByb3dFbGVtZW50OlRhYmxlUm93RWxlbWVudCwgYWJzU3RhcnQ6aW50LCBpc0luVGFibGU6Qm9vbGVhbik6Qm9vbGVhbgotCQl7Ci0JCQlyb3dFbGVtZW50LmlNYXhSb3dEZXB0aCA9IDA7Ci0gICAgICAgICAgICByb3dFbGVtZW50LmNvbHVtbkluZGV4ID0gMDsKLQkJCQotCQkJLy8gQWRkIHRhYmxlIGNlbGwgc3BhY2luZyB2YWx1ZQotCQkJdGFibGVFbGVtZW50LnRvdGFsUm93RGVwdGggKz0gdGFibGVFbGVtZW50LmNvbXB1dGVkRm9ybWF0LmNlbGxTcGFjaW5nOwotCQkJCi0JCQkvLyBTYXZlIGVudmlyb25tZW50IHBhcmFtZXRlcnMgYmVmb3JlIGNvbXBvc2UgYSB0YWJsZSByb3csIGJlY2F1c2UgbWF5YmUgdGhpcyByb3cgb3V0IG9mICJjdXJyZW50IiBwYXJjZWwsIAotCQkJLy8gaW4gdGhhdCBjYXNlLCB3ZSBuZWVkIHRvIHJlbG9hZCB0aGVzZSBwYXJhbWV0ZXJzLCB0aGVuIHJlY29tcG9zZSB0aGlzIHJvdy4KLQkJCXZhciBjdXJQYXJhU3RhcnQ6aW50ID0gX2N1clBhcmFTdGFydDsKLQkJCXZhciBjdXJFbGVtZW50U3RhcnQ6aW50ID0gX2N1ckVsZW1lbnRTdGFydDsKLQkJCXZhciBjdXJQYXJjZWxTdGFydDppbnQgPSBfY3VyUGFyY2VsU3RhcnQ7Ci0JCQl2YXIgY3VyRWxlbWVudDpGbG93TGVhZkVsZW1lbnQgPSBfY3VyRWxlbWVudDsKLQkJCXZhciBjdXJQYXJhRWxlbWVudDpQYXJhZ3JhcGhFbGVtZW50ID0gX2N1clBhcmFFbGVtZW50OwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoICEgY29tcG9zZUJsb2NrRWxlbWVudChGbG93R3JvdXBFbGVtZW50KHJvd0VsZW1lbnQpLCBhYnNTdGFydCwgaXNJblRhYmxlKSApCi0JCQl7Ci0JCQkJLy8gQ29tcG9zZSByb3cgZmFpbGVkLCBzZWUgaWYgd2UgaXQncyBiZWNhdXNlIG9mIG91dCBvZiBwYXJjZWwKLQkJCQlpZiAoIHJvd0VsZW1lbnQuYmV5b25kUGFyY2VsICkKLQkJCQl7Ci0gICAgICAgICAgICAgICAgICAgIHZhciBuZXh0UGFyY2VsOlBhcmNlbCA9IF9wYXJjZWxMaXN0LmdldFBhcmNlbEF0KHRhYmxlRWxlbWVudC5vcmlnaW5QYXJjZWxJbmRleCArIHRhYmxlRWxlbWVudC5udW1BY3Jvc3NQYXJjZWxzICsgMSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYodGFibGVFbGVtZW50LmN1clJvd0lkeCA9PSAwKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZighbmV4dFBhcmNlbCB8fCBuZXh0UGFyY2VsLmlzVGFibGVQYXJjZWwpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVFbGVtZW50LnggPSB0YWJsZUVsZW1lbnQuY29tcHV0ZWRGb3JtYXQubWFyZ2luTGVmdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZUVsZW1lbnQueSA9IHRhYmxlRWxlbWVudC50b3RhbFJvd0RlcHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAvLyBSZWxlYXNlIHRleHRMaW5lcyBiZWZvcmUgcmUtY29tcG9zZQotICAgICAgICAgICAgICAgICAgICBmb3IgKCB2YXIgaTppbnQgPSAwOyBpIDwgcm93RWxlbWVudC5udW1DaGlsZHJlbjsgaSArKyApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjZWxsOlRhYmxlRGF0YUNlbGxFbGVtZW50ID0gcm93RWxlbWVudC5nZXRDaGlsZEF0KGkpIGFzIFRhYmxlRGF0YUNlbGxFbGVtZW50OwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yICggdmFyIGo6aW50ID0gMDsgaiA8IGNlbGwubnVtQ2hpbGRyZW47IGogKysgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwYXJhZ3JhcGg6UGFyYWdyYXBoRWxlbWVudCA9IGNlbGwuZ2V0Q2hpbGRBdChqKSBhcyBQYXJhZ3JhcGhFbGVtZW50OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ZXh0QmxvY2s6VGV4dEJsb2NrID0gcGFyYWdyYXBoLmdldFRleHRCbG9jaygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9wYXJjZWxMaXN0LmN1cnJlbnRQYXJjZWwuY29udHJvbGxlci5jbGVhckZsb2F0c0F0KHBhcmFncmFwaC5nZXRBYnNvbHV0ZVN0YXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHRleHRMaW5lOlRleHRMaW5lID0gdGV4dEJsb2NrLmxhc3RMaW5lOyB0ZXh0TGluZTsgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dEJsb2NrLnJlbGVhc2VMaW5lcyh0ZXh0TGluZSwgdGV4dExpbmUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0TGluZS51c2VyRGF0YSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRMaW5lLnZpc2libGUgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9UZXh0TGluZVJlY3ljbGVyLmFkZExpbmVGb3JSZXVzZSh0ZXh0TGluZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfdGV4dEZsb3cuYmFja2dyb3VuZE1hbmFnZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGV4dEZsb3cuYmFja2dyb3VuZE1hbmFnZXIucmVtb3ZlTGluZUZyb21DYWNoZSh0ZXh0TGluZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRMaW5lID0gdGV4dEJsb2NrLmxhc3RMaW5lOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhZ3JhcGgucmVsZWFzZVRleHRCbG9jaygpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotCQkJCQkvLyBJZiB0YWJsZSBhbHJlYWR5IGZ1bGwgdGhlIGxhc3QgY29sdW1uLCB3ZSB3b24ndCBnb3RvIHRhYmxlIGNlbGwgcGFyY2VsLiBKdXN0IGdvdG8gbGFzdCBub3QgdGFibGUgY2VsbCBwYXJjZWwKLQkJCQkJaWYgKCAhIG5leHRQYXJjZWwgfHwgbmV4dFBhcmNlbC5pc1RhYmxlUGFyY2VsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZUVsZW1lbnQub3V0T2ZMYXN0UGFyY2VsID0gdHJ1ZTsKLQkJCQkJCXJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYodGFibGVFbGVtZW50LmN1clJvd0lkeCA+IDApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlRWxlbWVudC5udW1BY3Jvc3NQYXJjZWxzICsrOwotICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVFbGVtZW50LmhlaWdodEFycmF5LnB1c2goMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZUVsZW1lbnQudG90YWxSb3dEZXB0aCA9IG5leHRQYXJjZWwueSArIHRhYmxlRWxlbWVudC5jb21wdXRlZEZvcm1hdC5jZWxsU3BhY2luZzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKHRhYmxlRWxlbWVudC5jdXJSb3dJZHggPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVFbGVtZW50Lm9yaWdpblBhcmNlbEluZGV4Kys7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZUVsZW1lbnQueCA9IG5leHRQYXJjZWwueCArIHRhYmxlRWxlbWVudC5jb21wdXRlZEZvcm1hdC5tYXJnaW5MZWZ0OwotICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVFbGVtZW50LnkgPSBuZXh0UGFyY2VsLnk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZUVsZW1lbnQudG90YWxSb3dEZXB0aCA9IG5leHRQYXJjZWwueSArIHRhYmxlRWxlbWVudC5jb21wdXRlZEZvcm1hdC5jZWxsU3BhY2luZyArIHRhYmxlRWxlbWVudC5nZXRFZmZlY3RpdmVCb3JkZXJUb3BXaWR0aCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLQkJCQkJcm93RWxlbWVudC5iZXlvbmRQYXJjZWwgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIC8vIFJlbG9hZCB2YWx1ZXMgZm9yIHJlY29tcG9zZQotICAgICAgICAgICAgICAgICAgICBfY3VyUGFyYVN0YXJ0ID0gY3VyUGFyYVN0YXJ0OwotICAgICAgICAgICAgICAgICAgICBfY3VyRWxlbWVudFN0YXJ0ID0gY3VyRWxlbWVudFN0YXJ0OwotICAgICAgICAgICAgICAgICAgICBfY3VyUGFyY2VsU3RhcnQgPSBjdXJQYXJjZWxTdGFydDsKLSAgICAgICAgICAgICAgICAgICAgX2N1ckVsZW1lbnQgPSBjdXJFbGVtZW50OwotICAgICAgICAgICAgICAgICAgICBfY3VyUGFyYUVsZW1lbnQgPSBjdXJQYXJhRWxlbWVudDsKLSAgICAgICAgICAgICAgICAgICAgX2N1ckVsZW1lbnRPZmZzZXQgPSAwOwotICAgICAgICAgICAgICAgICAgICBfY29udGVudExvZ2ljYWxFeHRlbnQgPSAwOwotICAgICAgICAgICAgICAgICAgICByb3dFbGVtZW50LmNvbHVtbkluZGV4ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgCi0JCQkJCS8vIFJlY29tcG9zZSBjdXJyZW50IHRhYmxlIHJvdwotCQkJCQlpZiAoICEgY29tcG9zZUJsb2NrRWxlbWVudChGbG93R3JvdXBFbGVtZW50KHJvd0VsZW1lbnQpLCBhYnNTdGFydCwgaXNJblRhYmxlKSApCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQkJCi0gICAgICAgICAgICB2YXIgY3VyUGFyY2VsOlBhcmNlbCA9IF9wYXJjZWxMaXN0LmdldFBhcmNlbEF0KHRhYmxlRWxlbWVudC5vcmlnaW5QYXJjZWxJbmRleCArIHRhYmxlRWxlbWVudC5udW1BY3Jvc3NQYXJjZWxzKTsKLQkJCXJvd0VsZW1lbnQucGFyY2VsSW5kZXggPSB0YWJsZUVsZW1lbnQub3JpZ2luUGFyY2VsSW5kZXggKyB0YWJsZUVsZW1lbnQubnVtQWNyb3NzUGFyY2VsczsKLQkJCXJvd0VsZW1lbnQuaGVpZ2h0ID0gcm93RWxlbWVudC5pTWF4Um93RGVwdGg7Ci0JCQlyb3dFbGVtZW50LnggPSBjdXJQYXJjZWwueDsKLQkJCXJvd0VsZW1lbnQueSA9IHRhYmxlRWxlbWVudC50b3RhbFJvd0RlcHRoOwotCQkJdGFibGVFbGVtZW50LnRvdGFsUm93RGVwdGggKz0gcm93RWxlbWVudC5oZWlnaHQ7Ci0JCQkKLQkJCWlmKHRhYmxlRWxlbWVudC5udW1BY3Jvc3NQYXJjZWxzID09IDAgJiYgX3N0YXJ0Q29tcG9zZVBvc2l0aW9uIDw9IHRhYmxlRWxlbWVudC5nZXRBYnNvbHV0ZVN0YXJ0KCkpCi0JCQkJdGFibGVFbGVtZW50LmhlaWdodCA9IHRhYmxlRWxlbWVudC50b3RhbFJvd0RlcHRoIC0gdGFibGVFbGVtZW50Lnk7CisJCQkvLyBTcGFjZSBiZWZvcmUgZG9lcyBub3QgYXBwbHkgdG8gdGhlIGZpcnN0IGxpbmUsIHVubGVzcyBMZWFkaW5nTW9kZWwuQk9YIGlzIHVzZWQKKwkJCS8vIFNwYWNlIGNhcnJpZWQgbmV2ZXIgYXBwbGllcyB0byB0aGUgZmlyc3QgbGluZQorCQkJaWYoX2N1ckxpbmUgJiYgX2N1ckxpbmUucGFyYWdyYXBoID09IF9jdXJQYXJhRWxlbWVudCkKKwkJCQl2YXIgc3BhY2VCZWZvcmU6TnVtYmVyID0gMDsKIAkJCWVsc2UKLQkJCQl0YWJsZUVsZW1lbnQuaGVpZ2h0ID0gdGFibGVFbGVtZW50LnRvdGFsUm93RGVwdGg7CisJCQkJc3BhY2VCZWZvcmUgPSBpc05hTihfY3VyUGFyYUVsZW1lbnQuY29tcHV0ZWRGb3JtYXQucGFyYWdyYXBoU3BhY2VCZWZvcmUpID8gMCA6IF9jdXJQYXJhRWxlbWVudC5jb21wdXRlZEZvcm1hdC5wYXJhZ3JhcGhTcGFjZUJlZm9yZTsKIAkJCQotCQkJdGFibGVFbGVtZW50LmhlaWdodCArPSB0YWJsZUVsZW1lbnQuY2VsbFNwYWNpbmc7CisJCQlzcGFjZUJlZm9yZSAgPSBfYXRDb2x1bW5TdGFydCA/IDAgOiBzcGFjZUJlZm9yZTsKKwkJCXZhciBzcGFjZUNhcnJpZWQ6TnVtYmVyID0gX2F0Q29sdW1uU3RhcnQgPyAwIDogX3BhcmFncmFwaFNwYWNlQ2FycmllZDsKKwkJCWlmIChzcGFjZUJlZm9yZSAhPSAwIHx8IHNwYWNlQ2FycmllZCAhPSAwKQorCQkJCV9wYXJjZWxMaXN0LmFkZFRvdGFsRGVwdGgoTWF0aC5tYXgoc3BhY2VCZWZvcmUsIHNwYWNlQ2FycmllZCkpOwogCQkJCi0JCQkvLyBBZGQgdGFibGUgY2VsbCB0byBjb2x1bW5TdGF0ZSBmb3IgaGl0VGVzdAotCQkJdmFyIGNjT2ZSb3c6Q29udGFpbmVyQ29udHJvbGxlciA9IF9wYXJjZWxMaXN0LmdldFBhcmNlbEF0KHJvd0VsZW1lbnQucGFyY2VsSW5kZXgpLmNvbnRyb2xsZXI7Ci0JCQlmb3IgKCBpID0gMDsgaSA8IHJvd0VsZW1lbnQubnVtQ2hpbGRyZW47IGkgKysgKQotCQkJewotCQkJCWNlbGwgPSByb3dFbGVtZW50LmdldENoaWxkQXQoaSkgYXMgVGFibGVEYXRhQ2VsbEVsZW1lbnQ7Ci0JCQkJY2VsbC5oZWlnaHQgPSByb3dFbGVtZW50LmhlaWdodDsKLQkJCQlfcGFyY2VsTGlzdC5hZGRUYWJsZUNlbGwyQ29sdW1uU3RhdGUoY2NPZlJvdywgY2VsbCk7Ci0JCQl9CisJCQlfcGFyYWdyYXBoU3BhY2VDYXJyaWVkID0gMDsKKwkJCWlmIChfdmVydGljYWxTcGFjZUNhcnJpZWQgIT0gMCkKKwkJCQlfdmVydGljYWxTcGFjZUNhcnJpZWQgPSAwOworCisJCQkvLyBnZXQgYSBzbHVnLi4uCisJCQlfcGFyY2VsTGlzdC5nZXRMaW5lU2x1ZyhfbGluZVNsdWcsIDAsIDEsIF90ZXh0SW5kZW50LCBfY3VyUGFyYUZvcm1hdC5kaXJlY3Rpb24gPT0gRGlyZWN0aW9uLkxUUik7CiAJCQkKLQkJCUJhY2tncm91bmRNYW5hZ2VyLmNvbGxlY3RCbG9jayhfdGV4dEZsb3csIHJvd0VsZW1lbnQsIF9wYXJjZWxMaXN0KTsKLSAgICAgICAgICAgIHRhYmxlRWxlbWVudC5jdXJSb3dJZHgrKzsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQkvKiogQHByaXZhdGUKLQkJICogQ29tcG9zZSBhIGVudGlyZSB0YWJsZSByb3cgZWxlbWVudAotCQkgKiBJbiAgOiBUYWJsZVJvd0VsZW1lbnQsIFRhYmxlRGF0YUNlbGxFbGVtZW50LCB0YWJsZSdzIGFic1N0YXJ0IHBvc2l0aW9uLCBpc0luVGFibGUKLQkJICogT3V0IDogQm9vbGVhbiB2YWx1ZSwgY29tcG9zaXRpb24gcmVzdWx0LCB0cnVlIC0gc3VjY2Vzc2Z1bCwgZmFsc2UgLSBmYWlsZWQKLQkJICovCi0JCXByaXZhdGUgZnVuY3Rpb24gY29tcG9zZVRhYmxlRGF0YUNlbGxFbGVtZW50KHJvd0VsZW1lbnQ6VGFibGVSb3dFbGVtZW50LCBjZWxsRWxlbWVudDpUYWJsZURhdGFDZWxsRWxlbWVudCwgYWJzU3RhcnQ6aW50LCBpc0luVGFibGU6Qm9vbGVhbik6Qm9vbGVhbgotCQl7Ci0JCQkvL1RhYmxlRGF0YUNlbGxFbGVtZW50J3MgcGFyZW50IG11c3QgYmUgVGFibGVSb3dFbGVtZW50Ci0JCQl2YXIgdGFibGVFbGVtZW50OlRhYmxlRWxlbWVudCA9IHJvd0VsZW1lbnQuZ2V0VGFibGUoKTsKKwkJCS8vIGRvZXNuJ3QgZG8gYW55dGhpbmcgeWV0LgorCQkJdGFibGVFbGVtZW50Lm5vcm1hbGl6ZUNvbHVtbldpZHRocyhfbGluZVNsdWcud2lkdGgpOwogCQkJCi0JCQkvL1RPLURPOiBUaGlzIGlzIHRlbXBvcmFyeSBjb2RlcywgbmVlZHMgdG8gYmUgdXBkYXRlZCB3aGVuIHRoZSByZWFsIGNvbHVtbiBhdHRyaWJ1dGUgaXMgaW1wbGVtZW50ZWQKLQkJCXZhciBjdXJyUGFyY2VsOlBhcmNlbCA9IF9wYXJjZWxMaXN0LmdldFBhcmNlbEF0KHRhYmxlRWxlbWVudC5vcmlnaW5QYXJjZWxJbmRleCArIHRhYmxlRWxlbWVudC5udW1BY3Jvc3NQYXJjZWxzKTsKLQkJCWNlbGxFbGVtZW50LnggPSBjdXJyUGFyY2VsLnggKyB0YWJsZUVsZW1lbnQuZ2V0Q29sdW1uQXQocm93RWxlbWVudC5jb2x1bW5JbmRleCkueDsKLQkJCWNlbGxFbGVtZW50LnkgPSB0YWJsZUVsZW1lbnQudG90YWxSb3dEZXB0aDsKLQkJCWNlbGxFbGVtZW50LndpZHRoID0gdGFibGVFbGVtZW50LmdldENvbHVtbldpZHRoKHJvd0VsZW1lbnQuY29sdW1uSW5kZXgpOwotCQkJY2VsbEVsZW1lbnQuaGVpZ2h0ID0gdW5kZWZpbmVkOwotCQkJdmFyIHJjOlJlY3RhbmdsZSA9IG5ldyBSZWN0YW5nbGUoY2VsbEVsZW1lbnQueCwgY2VsbEVsZW1lbnQueSwgY2VsbEVsZW1lbnQud2lkdGgsIDgwMDApOyAvLyA4MDAwIGlzIE1heCByb3cgaGVpZ2h0Ci0JCQljZWxsRWxlbWVudC5wYXJjZWxJbmRleCA9IF9wYXJjZWxMaXN0Lm51bVBhcmNlbHMoKTsKLQkJCXZhciBuZXdQYXJjZWw6UGFyY2VsID0gX3BhcmNlbExpc3QuYWRkUGFyY2VsKHJjLCBjdXJyUGFyY2VsLmNvbnRyb2xsZXIsCi0JCQkJdGFibGVFbGVtZW50Lm9yaWdpblBhcmNlbEluZGV4ICsgdGFibGVFbGVtZW50Lm51bUFjcm9zc1BhcmNlbHMpOwotCQkJbmV3UGFyY2VsLmlzVGFibGVQYXJjZWwgPSB0cnVlOworCQkJLy8gc3RlcCAxIC0tIG1ha2Ugc3VyZSBhbGwgY2VsbHMgYXJlIGNvbXBvc2VkCisJCQl0YWJsZUVsZW1lbnQuY29tcG9zZUNlbGxzKCk7CiAJCQkKLQkJCWlmICggISBnb3RvUGFyY2VsKGNlbGxFbGVtZW50LnBhcmNlbEluZGV4LCAwKSApCi0JCQkJcmV0dXJuIGZhbHNlOworCQkJLy8gc3RlcCAyIGdldCBoZWFkZXIgYW5kIGZvb3RlciBoZWlnaHRzCisJCQkvLyBJJ20gbm90IHN1cmUgaWYgd2UgbmVlZCB0byBjYWxjdWxhdGUgdGFibGUgcGFkZGluZy9tYXJnaW4KKwkJCS8vdmFyIGJhc2VUYWJsZUhlaWdodDpOdW1iZXIgPSB0YWJsZUVsZW1lbnQuZ2V0SGVhZGVySGVpZ2h0KCkgKyB0YWJsZUVsZW1lbnQuZ2V0Rm9vdGVySGVpZ2h0KCk7CisJCQkvL19wYXJjZWxMaXN0LmdldExpbmVTbHVnKF9saW5lU2x1ZywgMCwgMSwgX3RleHRJbmRlbnQsIF9jdXJQYXJhRm9ybWF0LmRpcmVjdGlvbiA9PSBEaXJlY3Rpb24uTFRSKTsKIAkJCQotCQkJLy8gQWRkIGJvcmRlciBhbmQgY2VsbCBwYWRkaW5nCi0JCQlfcGFyY2VsTGlzdC5hZGRUb3RhbERlcHRoKGNlbGxFbGVtZW50LmdldEVmZmVjdGl2ZUJvcmRlclRvcFdpZHRoKCkgKyBjZWxsRWxlbWVudC5jb21wdXRlZEZvcm1hdC5jZWxsUGFkZGluZyk7Ci0JCQlfcGFyY2VsTGlzdC5wdXNoTGVmdE1hcmdpbihjZWxsRWxlbWVudC5nZXRFZmZlY3RpdmVCb3JkZXJMZWZ0V2lkdGgoKSArIGNlbGxFbGVtZW50LmNvbXB1dGVkRm9ybWF0LmNlbGxQYWRkaW5nKTsKLQkJCV9wYXJjZWxMaXN0LnB1c2hSaWdodE1hcmdpbihjZWxsRWxlbWVudC5nZXRFZmZlY3RpdmVCb3JkZXJSaWdodFdpZHRoKCkgKyBjZWxsRWxlbWVudC5jb21wdXRlZEZvcm1hdC5jZWxsUGFkZGluZyk7CisJCQl2YXIgaGVhZGVySGVpZ2h0Ok51bWJlciA9IHRhYmxlRWxlbWVudC5nZXRIZWFkZXJIZWlnaHQoKTsKKwkJCXZhciBmb290ZXJIZWlnaHQ6TnVtYmVyID0gdGFibGVFbGVtZW50LmdldEZvb3RlckhlaWdodCgpOwogCQkJCi0JCQkvLyBmYWxsIGludG8gdGhlIHJlY3Vyc2l2ZSBsb29wIGRpcmVjdGx5Ci0JCQlpZiAoICEgY29tcG9zZUJsb2NrRWxlbWVudChGbG93R3JvdXBFbGVtZW50KGNlbGxFbGVtZW50KSwgYWJzU3RhcnQsIGlzSW5UYWJsZSkgKQotCQkJCXJldHVybiBmYWxzZTsKKwkJCS8vIG5lZWQgdG8gY2FsY3VsYXRlIG1hcmdpbnMgYW5kIHBhZGRpbmcgYXMgd2VsbC4gKHRvcCwgYm90dG9tIGFuZCBzaWRlcykgSXQgc2hvdWxkIGluaGVyaXQgZnJvbSB0aGUgY29udGFpbmluZyBwYXJhZ3JhcGggaWYgbmVjZXNzYXJ5LgorCQkJLy8gSSdtIGFzc3VtaW5nIHRhYmxlcyBjYW4gaW5oZXJpdCBwcm9lcHJ0aWVzIGZyb20gcGFyYWdyYXBocy4KIAkJCQotCQkJLy8gQWRkIGJvcmRlciBhbmQgY2VsbCBwYWRkaW5nLCBwb3Agb3V0IHBhZGRpbmcgbWFyZ2luCi0JCQlfcGFyY2VsTGlzdC5hZGRUb3RhbERlcHRoKGNlbGxFbGVtZW50LmdldEVmZmVjdGl2ZUJvcmRlckJvdHRvbVdpZHRoKCkgKyBjZWxsRWxlbWVudC5jb21wdXRlZEZvcm1hdC5jZWxsUGFkZGluZyk7Ci0JCQlfcGFyY2VsTGlzdC5wb3BMZWZ0TWFyZ2luKGNlbGxFbGVtZW50LmdldEVmZmVjdGl2ZUJvcmRlckxlZnRXaWR0aCgpICsgY2VsbEVsZW1lbnQuY29tcHV0ZWRGb3JtYXQuY2VsbFBhZGRpbmcpOwotCQkJX3BhcmNlbExpc3QucG9wUmlnaHRNYXJnaW4oY2VsbEVsZW1lbnQuZ2V0RWZmZWN0aXZlQm9yZGVyUmlnaHRXaWR0aCgpICsgY2VsbEVsZW1lbnQuY29tcHV0ZWRGb3JtYXQuY2VsbFBhZGRpbmcpOworCQkJLy8gc3RlcCAzIGxvb3AgdGhyb3VnaCB0aGUgY2VsbHMgYW5kIGFzc2lnbiB0aGVtIHRvIGNvbnRhaW5lcnMgYW5kIHNldCB0aGUgcG9zaXRpb25zCisKKwkJCXZhciB0b3RhbFJvd0hlaWdodDpOdW1iZXIgPSAwOworCQkJdmFyIGhhdmVSZWFsUm93czpCb29sZWFuID0gZmFsc2U7CisJCQkvL2dyYWIgdGhlIGhlYWRlcnMgYW5kIGZvb3RlcnMgZm9yIHVzZSBpbiBlYWNoIHBhcmNlbAorCQkJdmFyIGhlYWRlclJvd3M6VmVjdG9yLjwgVmVjdG9yLjxUYWJsZUNlbGxFbGVtZW50PiA+ID0gdGFibGVFbGVtZW50LmdldEhlYWRlclJvd3MoKTsKKwkJCXZhciBmb290ZXJSb3dzOlZlY3Rvci48IFZlY3Rvci48VGFibGVDZWxsRWxlbWVudD4gPiA9IHRhYmxlRWxlbWVudC5nZXRGb290ZXJSb3dzKCk7CiAJCQkKLQkJCS8vVE8tRE8sIFRoZSBjb2RlcyBtYXkgYmUgY2hhbmdlZCwgbWluZ2p1bidzIG9yaWdpbmFsIGNvZGVzIGFyZSBhcyBmb2xsb3dpbmc6Ci0JCQkvL2NlbGxFbGVtZW50LmhlaWdodCA9IF9wYXJjZWxMaXN0LnRvdGFsRGVwdGggKyBwYXJhZ3JhcGgucGFkZGluZ0JvdHRvbSArIHBhcmFncmFwaC5ib3JkZXJCb3R0b21XaWR0aCArIHBhcmFncmFwaC5tYXJnaW5Cb3R0b207Ci0JCQljZWxsRWxlbWVudC5oZWlnaHQgPSBfcGFyY2VsTGlzdC50b3RhbERlcHRoOwotCQkJaWYgKCBjZWxsRWxlbWVudC5oZWlnaHQgPiByb3dFbGVtZW50LmlNYXhSb3dEZXB0aCApCi0JCQkJcm93RWxlbWVudC5pTWF4Um93RGVwdGggPSBjZWxsRWxlbWVudC5oZWlnaHQ7Ci0JCQlyb3dFbGVtZW50LmNvbHVtbkluZGV4ICsrOworCQkJdmFyIGN1clJvdzpWZWN0b3IuPFRhYmxlQ2VsbEVsZW1lbnQ+ID0gdGFibGVFbGVtZW50LmdldE5leHRSb3coKTsKKwkJCXZhciBjdXJUYWJsZUJsb2NrOlRleHRGbG93VGFibGVCbG9jayA9IHRhYmxlRWxlbWVudC5nZXRGaXJzdEJsb2NrKCk7CisJCQljdXJUYWJsZUJsb2NrLmNsZWFyKCk7CisJCQljdXJUYWJsZUJsb2NrLnkgPSBfcGFyY2VsTGlzdC50b3RhbERlcHRoOworCQkJdmFyIGFkanVzdFRvcDpOdW1iZXIgPSBpc05hTihfbGFzdExpbmVEZXNjZW50KSA/IDAgOiBfbGFzdExpbmVEZXNjZW50OworCQkJY3VyVGFibGVCbG9jay55ICs9IGFkanVzdFRvcDsKKwkJCWN1clRhYmxlQmxvY2sueCA9IF9saW5lU2x1Zy5sZWZ0TWFyZ2luOworCQkJdmFyIGxpbmVPZmZzZXQ6TnVtYmVyID0gKF9jdXJQYXJhRm9ybWF0LmRpcmVjdGlvbiA9PSBEaXJlY3Rpb24uTFRSKSA/IF9saW5lU2x1Zy5sZWZ0TWFyZ2luIDogX2xpbmVTbHVnLnJpZ2h0TWFyZ2luOworCQkJY3VyVGFibGVCbG9jay5pbml0aWFsaXplKF9jdXJQYXJhRWxlbWVudCwgX2xpbmVTbHVnLndpZHRoLCBsaW5lT2Zmc2V0LV9wYXJjZWxMaXN0Lmluc2lkZUxpc3RJdGVtTWFyZ2luLCB0YWJsZUVsZW1lbnQuZ2V0QWJzb2x1dGVTdGFydCgpLDEpOworCQkJdmFyIGJsb2NrVG9BZGQ6Qm9vbGVhbiA9IHRydWU7CiAJCQkKLQkJCS8vIFNlZSBpZiB0aGUgY29tcG9zZWQgbGluZSBiZXlvbmQgImN1cnJlbnQiIHBhcmNlbCdzIGJvdHRvbQotCQkJaWYgKCB0YWJsZUVsZW1lbnQudG90YWxSb3dEZXB0aCArIHJvd0VsZW1lbnQuaU1heFJvd0RlcHRoID4gY3VyclBhcmNlbC5ib3R0b20pCi0JCQl7Ci0JCQkJcm93RWxlbWVudC5iZXlvbmRQYXJjZWwgPSB0cnVlOworCQkJd2hpbGUoY3VyUm93KXsKIAkJCQkKLQkJCQkvLyBQb3Agb3V0IHVzZWxlc3MgcGFyY2VscyBmb3IgdGhpcyByb3cKLQkJCQlmb3IgKCB2YXIgbjppbnQgPSAwOyBuIDwgcm93RWxlbWVudC5jb2x1bW5JbmRleDsgbiArKyApCi0JCQkJCV9wYXJjZWxMaXN0LnBvcFBhcmNlbCgpOwotCQkJCXJldHVybiBmYWxzZTsKKwkJCQkvLyBJJ20gaWdub3JpbmcgaGVhZGVycyBhbmQgZm9vdGVycyBmb3Igbm93LiBXZSBuZWVkIHRvIGFkZCB0aGVtIGluIGxhdGVyLgorCQkJCXZhciBySWR4OmludCA9IGN1clJvd1swXS5yb3dJbmRleDsKKwkJCQl2YXIgY3VyUm93RWxlbTpUYWJsZVJvd0VsZW1lbnQgPSB0YWJsZUVsZW1lbnQuZ2V0Um93QXQocklkeCk7CisJCQkJdmFyIHJvd0hlaWdodDpOdW1iZXIgPSBjdXJSb3dFbGVtLmNvbXBvc2VkSGVpZ2h0OworCQkJCXZhciBtaW5Sb3dIZWlnaHQ6TnVtYmVyID0gY3VyUm93RWxlbS50b3RhbEhlaWdodDsKKwkJCQkvL19wYXJjZWxMaXN0LmFkZFRvdGFsRGVwdGgodGFibGVFbGVtZW50LmdldEVmZmVjdGl2ZU1hcmdpbkJvdHRvbSgpKTsKKwkJCQkKKwkJCQl3aGlsZSgKKwkJCQkJZmFsc2UKKwkJCQkJLy8hKF9wYXJjZWxMaXN0LmN1cnJlbnRQYXJjZWwuZml0c0luSGVpZ2h0KF9wYXJjZWxMaXN0LnRvdGFsRGVwdGgsIG1pblJvd0hlaWdodCArIGZvb3RlckhlaWdodCkpCisJCQkJKXsKKwkJCQkJLy9UT0RPOiBhZGQgaW4gZm9vdGVyIHJvd3MuLi4KKwkJCQkJCisJCQkJCWN1clRhYmxlQmxvY2suaGVpZ2h0ID0gdG90YWxSb3dIZWlnaHQ7CisJCQkJCQorCQkJCQlpZighaGF2ZVJlYWxSb3dzKQorCQkJCQkJY3VyVGFibGVCbG9jay5jbGVhcigpOworCQkJCQkKKwkJCQkJZW5kVGFibGVCbG9jayhjdXJUYWJsZUJsb2NrKTsKKy8vCQkJCQljdXJUYWJsZUJsb2NrLnNldENvbnRyb2xsZXIoX3BhcmNlbExpc3QuY3VycmVudFBhcmNlbC5jb250cm9sbGVyLF9wYXJjZWxMaXN0LmN1cnJlbnRQYXJjZWwuY29sdW1uSW5kZXgpOworCisvLwkJCQkJX3BhcmNlbExpc3QuY3VycmVudFBhcmNlbC5jb250cm9sbGVyLmFkZENvbXBvc2VkVGFibGVCbG9jayhjdXJUYWJsZUJsb2NrLmNvbnRhaW5lcik7CisvLwkJCQkJQmFja2dyb3VuZE1hbmFnZXIuY29sbGVjdFRhYmxlQmxvY2soX3RleHRGbG93LGN1clRhYmxlQmxvY2ssIF9wYXJjZWxMaXN0LmN1cnJlbnRQYXJjZWwuY29udHJvbGxlcik7CisJCQkJCWJsb2NrVG9BZGQgPSBmYWxzZTsKKwkJCQkJCisJCQkJCWlmKCFfcGFyY2VsTGlzdC5uZXh0KCkpCisJCQkJCXsgLy8gY3VycmVudCBwYXJjZWwgbm90IHZhbGlkCisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQlfcGFyY2VsTGlzdC5nZXRMaW5lU2x1ZyhfbGluZVNsdWcsIDAsIDEsIF90ZXh0SW5kZW50LCBfY3VyUGFyYUZvcm1hdC5kaXJlY3Rpb24gPT0gRGlyZWN0aW9uLkxUUik7CisJCQkJCWN1clRhYmxlQmxvY2sgPSB0YWJsZUVsZW1lbnQuZ2V0TmV4dEJsb2NrKCk7CisJCQkJCWJsb2NrVG9BZGQgPSB0cnVlOworCQkJCQljdXJUYWJsZUJsb2NrLmNsZWFyKCk7CisJCQkJCWN1clRhYmxlQmxvY2sueSA9IF9wYXJjZWxMaXN0LnRvdGFsRGVwdGg7CisJCQkJCWN1clRhYmxlQmxvY2sueCA9IF9saW5lU2x1Zy5sZWZ0TWFyZ2luOworCQkJCQljdXJUYWJsZUJsb2NrLmluaXRpYWxpemUoX2N1clBhcmFFbGVtZW50LCBfbGluZVNsdWcud2lkdGgsIGxpbmVPZmZzZXQtX3BhcmNlbExpc3QuaW5zaWRlTGlzdEl0ZW1NYXJnaW4sIHRhYmxlRWxlbWVudC5nZXRBYnNvbHV0ZVN0YXJ0KCksMSk7CisJCQkJCXRvdGFsUm93SGVpZ2h0ID0gMDsKKwkJCQkJLy9UT0RPOiByZW1vdmUgYW55IG9sZCBleGlzdGluZyBjZWxscyBpbiB0aGUgX3BhcmNlbExpc3QuY3VycmVudFBhcmNlbC5jb250cm9sbGVyCisJCQkJCQorCQkJCQkvL1RPRE86IGFkZCBpbiBoZWFkZXIgcm93cy4gQ29sbGVjdCB0aGVtIG9uIHRoZSBuZXh0IGl0ZXJhdGlvbiBpZiBubyByZWFsIHJvd3MgZml0LgorCQkJCQkKKwkJCQkJLy8gbm90IG5lZWRlZD8KKwkJCQkJaWYoX3BhcmNlbExpc3QuY3VycmVudFBhcmNlbCA9PSBudWxsKXsKKwkJCQkJCWJsb2NrVG9BZGQgPSBmYWxzZTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJCQorCQkJCWlmKF9wYXJjZWxMaXN0LmN1cnJlbnRQYXJjZWwgPT0gbnVsbCl7CisJCQkJCWJsb2NrVG9BZGQgPSBmYWxzZTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCQorCQkJCS8vIHdlIGhhdmUgYSBwYXJjZWwgYW5kIGEgcm93LiBMZXQncyBhZGQgdGhlIGNlbGxzLgorCQkJCWZvciBlYWNoKHZhciBjZWxsOlRhYmxlQ2VsbEVsZW1lbnQgaW4gY3VyUm93KSB7CisJCQkJCWNlbGwueSA9IHRvdGFsUm93SGVpZ2h0OworCQkJCQl2YXIgY29sOlRhYmxlQ29sRWxlbWVudCA9IHRhYmxlRWxlbWVudC5nZXRDb2x1bW5BdChjZWxsLmNvbEluZGV4KTsKKwkJCQkJCisJCQkJCWlmIChjb2wpIHsKKwkJCQkJCWNlbGwueCA9IGNvbC54OworCQkJCQl9CisJCQkJCQorCQkJCQl0YWJsZUVsZW1lbnQuYWRkQ2VsbFRvQmxvY2soY2VsbCwgY3VyVGFibGVCbG9jayk7CisJCQkJCS8vY3VyVGFibGVCbG9jay5hZGRDZWxsKGNlbGwuY29udGFpbmVyKTsKKwkJCQkJLy8gYWRkIHRoZSBjZWxscyB0byBfcGFyY2VsTGlzdC5jdXJyZW50UGFyY2VsLmNvbnRyb2xsZXIKKwkJCQkJLy8gbmVlZCB0byBmaWd1cmUgb3V0IGV4YWN0bHkgaG93LgorCQkJCQkKKwkJCQl9CisJCQkJCisJCQkJLy8gYWRkIHRoZSByb3cgaGVpZ2h0CisJCQkJLy8gd2UncmUgYXNzdW1pbmcgbm9ybWFsIHRvcCB0byBib3R0b20gdGFibGVzIC0tIG5vdCBKYXBhbmVzZSBvbmVzLi4uCisJCQkJX3BhcmNlbExpc3QuYWRkVG90YWxEZXB0aChyb3dIZWlnaHQpOworCQkJCQorCQkJCWN1clJvdyA9IHRhYmxlRWxlbWVudC5nZXROZXh0Um93KCk7CisJCQkJdG90YWxSb3dIZWlnaHQgKz0gcm93SGVpZ2h0OwogCQkJfQogCQkJCisJCQlpZihfcGFyY2VsTGlzdC5jdXJyZW50UGFyY2VsICYmIGJsb2NrVG9BZGQpeworCQkJCWN1clRhYmxlQmxvY2suaGVpZ2h0ID0gdG90YWxSb3dIZWlnaHQ7CisJCQkJZW5kVGFibGVCbG9jayhjdXJUYWJsZUJsb2NrKTsKKy8vCQkJCWN1clRhYmxlQmxvY2suc2V0Q29udHJvbGxlcihfY3VyUGFyY2VsLmNvbnRyb2xsZXIsX2N1clBhcmNlbC5jb2x1bW5JbmRleCk7CisvLwkJCQlfcGFyY2VsTGlzdC5jdXJyZW50UGFyY2VsLmNvbnRyb2xsZXIuYWRkQ29tcG9zZWRUYWJsZUJsb2NrKGN1clRhYmxlQmxvY2suY29udGFpbmVyKTsKKy8vCQkJCUJhY2tncm91bmRNYW5hZ2VyLmNvbGxlY3RUYWJsZUJsb2NrKF90ZXh0RmxvdyxjdXJUYWJsZUJsb2NrLCBfcGFyY2VsTGlzdC5jdXJyZW50UGFyY2VsLmNvbnRyb2xsZXIpOworCQkJfQorCQkJLy9yZWZlcmVuY2UgQ29tcG9zZVN0YXRlLmNvbXBvc2VOZXh0TGluZSgpIHdoaWNoIGNyZWF0ZXMgdGhlIHRoZSBUZXh0TGluZS4KKwkJCS8vIFdlIGRvbid0IG5lZWQgZ2V0TGluZVNsdWcoKSBiZWNhdXNlIHRhYmxlcyBjYW4gZXh0ZW5kIGJleW9uZCB0aGUgY29udGFpbmVyIHdpZHRoCisJCQkvLyBXZSBkbyBuZWVkIHRvIGdldCB0aGUgYXZhaWxhYmxlIGhlaWdodCBhbmQgcHVzaCBhbnkgY2VsbHMgdGhhdCBkb24ndCBmaXQgdG8gdGhlIG5leHQgUGFyY2VsL2NvbnRhaW5lcgorCQkJLy8gUmVwZWF0IHVudGlsIHRoZXJlJ3Mgbm8gbW9yZSBQYXJjZWxzLgorCQkJCisJCQkvLyBzdGVwIDQgZHJhdyB0aGUgYmFja2dyb3VuZHMgYW5kIGJvcmRlcnMKKwkJCS8vIGhhbmRsZWQgYnkgdGhlIEJhY2tncm91bmRNYW5hZ2VyCQkJCisJCQkKIAkJCXJldHVybiB0cnVlOwogCQl9Ci0JCQotCQkvKiogQHByaXZhdGUKLQkJICogQ2FsY3VsYXRlIHRhYmxlIGNvbHVtbSB3aWR0aCBiYXNlZCBvbiBjb2x1bW4ncyB3aWR0aCB2YWx1ZSwgdGhlIHJ1bGUgaXMgOgotCQkgKiBpZiB0aGVyZSBhcmUgemVybyBjb2x1bW4gd2lkdGggb3IgdGhlIHN1bShjb2x1bW5XaWR0aCkgbm90IGVxdWFsIHRvIHRhYmxlLnRhYmxlV2lkdGgsCi0JCSAqIHdlIGNhbGN1bGF0ZSBhdmVyYWdlIGNvbHVtbiB3aWR0aC4KLQkJICogSW4gIDogTnVtYmVyIG9yIHBlcmNlbnRhZ2UKLQkJICogT3V0IDogU2V0IHBpeGNlbCBiYXNlZCB3aWR0aCBvZiBlYWNoIHRhYmxlIGNvbHVtbgotCQkgKi8KLQkJcHJpdmF0ZSBmdW5jdGlvbiBzZXJpYWxpemVUYWJsZUNvbHVtbldpZHRoKHRhYmxlOlRhYmxlRWxlbWVudCk6dm9pZAorCQkvKiogQ2FsbGVkIHdoZW4gd2UgYXJlIGZpbmlzaGVkIGNvbXBvc2luZyBhIGxpbmUsIGFuZCBpdCBpcyBjb21taXR0ZWQuIEhhbmRsZXIgZm9yIGRlcml2ZWQgY2xhc3NlcyB0byBvdmVycmlkZSBkZWZhdWx0IGJlaGF2aW9yLiAgKi8KKwkJcHJvdGVjdGVkIGZ1bmN0aW9uIGVuZFRhYmxlQmxvY2soYmxvY2s6VGV4dEZsb3dUYWJsZUJsb2NrKTp2b2lkCiAJCXsKLSAgICAgICAgICAgIHZhciBjdXJQYXJjZWxXaWR0aDpOdW1iZXIgPSBfcGFyY2VsTGlzdC5jdXJyZW50UGFyY2VsLndpZHRoOwotCQkJaWYgKCB0YWJsZS50YWJsZVdpZHRoICE9IHVuZGVmaW5lZCAmJiB0YWJsZS50YWJsZVdpZHRoIDwgY3VyUGFyY2VsV2lkdGggKQotCQkJCXRhYmxlLmNvbXB1dGVkV2lkdGggPSB0YWJsZS50YWJsZVdpZHRoOwotCQkJZWxzZQotICAgICAgICAgICAgICAgIHRhYmxlLmNvbXB1dGVkV2lkdGggPSBjdXJQYXJjZWxXaWR0aDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYodGFibGUuY29tcHV0ZWRGb3JtYXQubWFyZ2luTGVmdCA+IDApCi0gICAgICAgICAgICAgICAgdGFibGUuY29tcHV0ZWRXaWR0aCAtPSB0YWJsZS5jb21wdXRlZEZvcm1hdC5tYXJnaW5MZWZ0OwotICAgICAgICAgICAgCi0gICAgICAgICAgICB0YWJsZS5jb21wdXRlZFdpZHRoIC09IHRhYmxlLmNvbXB1dGVkRm9ybWF0Lm1hcmdpblJpZ2h0OwotICAgICAgICAgICAgCi0JCQl2YXIgbG9naWNhbFdpZHRoOk51bWJlciA9IHRhYmxlLmNvbXB1dGVkV2lkdGggLSB0YWJsZS5nZXRFZmZlY3RpdmVCb3JkZXJMZWZ0V2lkdGgoKSAtIHRhYmxlLmdldEVmZmVjdGl2ZUJvcmRlclJpZ2h0V2lkdGgoKSAtICh0YWJsZS5jb2x1bW4gKyAxKSAqIHRhYmxlLmNvbXB1dGVkRm9ybWF0LmNlbGxTcGFjaW5nOwotCQkJdmFyIGNvbHVtblRvdGFsV2lkdGg6TnVtYmVyID0gdGFibGUuZ2V0RWZmZWN0aXZlQm9yZGVyTGVmdFdpZHRoKCkgKyB0YWJsZS5jb21wdXRlZEZvcm1hdC5tYXJnaW5MZWZ0OwotICAgICAgICAgICAgCi0JCQlmb3IgKCB2YXIgaTppbnQgPSAwOyBpIDwgdGFibGUuY29sdW1uOyBpICsrICkKLQkJCXsKLQkJCQl2YXIgY29sV2lkdGg6KiA9IHRhYmxlLmdldENvbHVtbldpZHRoKGkpOwotCQkJCQotCQkJCS8vIENvbHVtbiB3aWR0aCBpcyBwZXJjZW50YWdlIGxpa2UgIjIwJSIKLQkJCQl2YXIgc3RyV2lkdGg6U3RyaW5nID0gY29sV2lkdGggYXMgU3RyaW5nOwotCQkJCWlmICggc3RyV2lkdGggJiYgc3RyV2lkdGgubGVuZ3RoICE9IDAgJiYgc3RyV2lkdGguY2hhckF0KHN0cldpZHRoLmxlbmd0aCAtIDEpID09ICclJyApCi0JCQkJewotCQkJCQljb2xXaWR0aCA9IFByb3BlcnR5LnRvTnVtYmVySWZQZXJjZW50KGNvbFdpZHRoKSAqIGxvZ2ljYWxXaWR0aCAvIDEwMDsKLQkJCQkJaWYgKCBjb2xXaWR0aCA+PSAwICkKLQkJCQkJCXRhYmxlLnNldENvbHVtbldpZHRoKGksIGNvbFdpZHRoKTsKLQkJCQl9Ci0JCQkJCi0JCQkJY29sdW1uVG90YWxXaWR0aCArPSB0YWJsZS5jb21wdXRlZEZvcm1hdC5jZWxsU3BhY2luZzsKLQkJCQl0YWJsZS5nZXRDb2x1bW5BdChpKS54ID0gY29sdW1uVG90YWxXaWR0aDsKLQkJCQljb2x1bW5Ub3RhbFdpZHRoICs9IGNvbFdpZHRoOwotCQkJfQotICAgICAgICAgICAgCi0JCQljb2x1bW5Ub3RhbFdpZHRoIC09ICh0YWJsZS5jb21wdXRlZEZvcm1hdC5tYXJnaW5MZWZ0ICsgdGFibGUuZ2V0RWZmZWN0aXZlQm9yZGVyTGVmdFdpZHRoKCkgKyB0YWJsZS5jb2x1bW4gKiB0YWJsZS5jb21wdXRlZEZvcm1hdC5jZWxsU3BhY2luZyk7CisJCQlfY3VyTGluZSA9IGJsb2NrOworCQkJYmxvY2suc2V0Q29udHJvbGxlcihfY3VyUGFyY2VsLmNvbnRyb2xsZXIsIF9jdXJQYXJjZWwuY29sdW1uSW5kZXgpOworCQkJLy8JCQkJX3BhcmNlbExpc3QuY3VycmVudFBhcmNlbC5jb250cm9sbGVyLmFkZENvbXBvc2VkVGFibGVCbG9jayhjdXJUYWJsZUJsb2NrLmNvbnRhaW5lcik7CisJCQlCYWNrZ3JvdW5kTWFuYWdlci5jb2xsZWN0VGFibGVCbG9jayhfdGV4dEZsb3csIGJsb2NrLCBfcGFyY2VsTGlzdC5jdXJyZW50UGFyY2VsLmNvbnRyb2xsZXIpOworCisJCQlfY29udGVudENvbW1pdHRlZEV4dGVudCA9IE1hdGgubWF4KF9jb250ZW50Q29tbWl0dGVkRXh0ZW50LCBfd29ya2luZ0NvbnRlbnRFeHRlbnQpOworCQkJX2NvbnRlbnRDb21taXR0ZWRIZWlnaHQgPSBNYXRoLm1heChfY29udGVudENvbW1pdHRlZEhlaWdodCwgX3dvcmtpbmdDb250ZW50SGVpZ2h0KTsKKwkJCV9jb250ZW50TG9naWNhbEV4dGVudCA9IE1hdGgubWF4KF9jb250ZW50TG9naWNhbEV4dGVudCwgX3dvcmtpbmdDb250ZW50TG9naWNhbEV4dGVudCk7CiAJCQkKLQkJCS8vIElmIHRoZSBzdW0gb2YgY29sdW1uIHdpZHRoIHdpZGVyIHRoYW4gdGFibGUgd2lkdGgsCi0JCQkvLyB3ZSBzZXQgZXZlcnkgY29sdW1uIHdpZHRoIHRvIGF2ZXJhZ2UgY29sdW1uIHdpZHRoCi0JCQlpZiAoIGNvbHVtblRvdGFsV2lkdGggLSBsb2dpY2FsV2lkdGggPiAxICkKLQkJCXsKLQkJCQl2YXIgYXZnQ29sdW1uV2lkdGg6TnVtYmVyID0gbG9naWNhbFdpZHRoIC8gdGFibGUuY29sdW1uOwotCQkJCWZvciAoIHZhciBtOmludCA9IDA7IG0gPCB0YWJsZS5jb2x1bW47IG0gKysgKQotCQkJCXsKLQkJCQkJdGFibGUuc2V0Q29sdW1uV2lkdGgobSwgYXZnQ29sdW1uV2lkdGgpOwotCQkJCQl0YWJsZS5nZXRDb2x1bW5BdChtKS54ID0gdGFibGUuZ2V0RWZmZWN0aXZlQm9yZGVyTGVmdFdpZHRoKCkgKyB0YWJsZS5jb21wdXRlZEZvcm1hdC5tYXJnaW5MZWZ0IAotCQkJCQkJKyAobSsxKSp0YWJsZS5jb21wdXRlZEZvcm1hdC5jZWxsU3BhY2luZyArIG0gKiBhdmdDb2x1bW5XaWR0aDsKLQkJCQl9Ci0JCQl9IAotCQkJLy8gaWYgdGhlIHN1bSBvZiBjb2x1bW4gd2lkdGggbGVzcyB0aGFuIHRhYmxlIHdpZHRoLCB3ZSBlbmxhcmdlIHRoZSBsYXN0IGNvbHVtbidzIHdpZHRoIHRvIGZpdCB0YWJsZSB3aWR0aAotCQkJZWxzZSBpZiAoIGNvbHVtblRvdGFsV2lkdGggPCBsb2dpY2FsV2lkdGggKSAKLQkJCXsKLQkJCQl2YXIgb3JnV2lkdGg6TnVtYmVyID0gdGFibGUuZ2V0Q29sdW1uV2lkdGgodGFibGUuY29sdW1uIC0gMSk7Ci0JCQkJdGFibGUuc2V0Q29sdW1uV2lkdGgodGFibGUuY29sdW1uIC0gMSwgb3JnV2lkdGggKyBsb2dpY2FsV2lkdGggLSBjb2x1bW5Ub3RhbFdpZHRoKTsKLQkJCX0KLQkJfQorCQkJLy8gaWYgbm90IG1lYXN1cmluZyB0aGFuIGNvbnRlbnRMb2dpY2FsRXh0ZW50IG5lZWRzIHRvIG1hdGNoIGNvbnRlbnRDb21taXRlZEV4dGVudCBzbyByZXN0YXJ0aW5nIGNvbXBvc2l0aW9uIGluIHRoZSBtaWRkbGUgZ2V0cyB0aGUgcmlnaHQgZXh0ZW50CisJCQkvLyBkb24ndCBuZWVkIGNvbnRlbnRMb2dpY2FsRXh0ZW50IHRvIGV4Y2x1ZGUgdGhpbmdzIHB1c2hpbmcgYmV5b25kIHRoZSByaWdodCBtYXJnaW4gYXMgYWxpZ25tZW50IGlzIGhhcHBlbmluZyBhcyB3ZSBnbworCQkJaWYgKCFfbWVhc3VyaW5nKQorCQkJCV9jb250ZW50TG9naWNhbEV4dGVudCA9IF9jb250ZW50Q29tbWl0dGVkRXh0ZW50OworCQkJaWYgKF9wdXNoSW5GbG9hdHMpCisJCQkJX3B1c2hJbkZsb2F0cy5sZW5ndGggPSAwOwkvLyB6ZXJvIGl0IG91dCBmb3IgdGhlIG5leHQgbGluZQorCQkJX2F0Q29sdW1uU3RhcnQgPSBmYWxzZTsKKwkJCV9saW5lUGFzcyA9IDA7CisJCQlpZiAoIWlzTmFOKF93b3JraW5nUGFyY2VsTG9naWNhbFRvcCkpCisJCQkJX3BhcmNlbExvZ2ljYWxUb3AgPSBfd29ya2luZ1BhcmNlbExvZ2ljYWxUb3A7CisJCX0JCQorCiAJCQogCQkvKioKIAkJICogQ29tcG9zZSB0aGUgZmxvdyBpbnRvIHRoZSB0ZXh0IGNvbnRhaW5lci4gU3RhcnRzIGF0IHRoZSByb290IGVsZW1lbnQsCkBAIC04OTIsOSArNzIyLDggQEAKIAkJCQogCQkJcmVzZXRDb250cm9sbGVyQm91bmRzKCk7CiAJCQkKLQkJCS8vIEJ1ZywgbmVlZHMgdG8gcmVtb3ZlCi0JCQlpZiAoQ29udGFpbmVyQ29udHJvbGxlci50bGZfaW50ZXJuYWw6OnN0YXJ0Q29tcG9zZUZyb21CZWdpbm5pbmcpCi0JCQkJX3N0YXJ0Q29tcG9zZVBvc2l0aW9uID0gX3N0YXJ0Q29udHJvbGxlci5hYnNvbHV0ZVN0YXJ0OworCQkJLy8gQnVnLCBuZWVkcyB0byByZW1vdmUgCisJCQlfc3RhcnRDb21wb3NlUG9zaXRpb24gPSBfc3RhcnRDb250cm9sbGVyLmFic29sdXRlU3RhcnQ7CiAJCQkKIAkJCS8vIFRoaXMgaXMgd2hlcmUgd2Ugd2lsbCBzdGFydCBjb21wb3NpbmcgZnJvbQogCQkJX2N1ckVsZW1lbnQgPSBfdGV4dEZsb3cuZmluZExlYWYoX3N0YXJ0Q29tcG9zZVBvc2l0aW9uKTsKQEAgLTk2NCw5ICs3OTMsNiBAQAogCQkJCX0KIAkJCQkKIAkJCQl2YXIgbmV4dFBhcmNlbDpQYXJjZWwgPSBwYXJjZWxMaXN0LmdldFBhcmNlbEF0KHBhcmNlbExpc3QuY3VycmVudFBhcmNlbEluZGV4ICsgMSk7Ci0JCQkJaWYgKCBwYXJjZWxMaXN0LmN1cnJlbnRQYXJjZWwuaXNUYWJsZVBhcmNlbAotCQkJCQkmJiAoKG5leHRQYXJjZWwgJiYgbmV4dFBhcmNlbC5pc1RhYmxlUGFyY2VsKSB8fCBwYXJjZWxMaXN0LmN1cnJlbnRQYXJjZWxJbmRleCA9PSBwYXJjZWxMaXN0Lm51bVBhcmNlbHMoKS0xKSkKLQkJCQkJX2NvcnJlY3RUZXh0TGVuZ3RoID0gdHJ1ZTsKIAkJCiAJCQkJYWR2YW5jZVRvTmV4dFBhcmNlbCgpOwogCQkJCV9jb3JyZWN0VGV4dExlbmd0aCA9IGZhbHNlOwpAQCAtMTE4Niw2ICsxMDEyLDcgQEAKIAkJewogCQkJX2N1clBhcmFFbGVtZW50ICA9IGVsZW07CiAJCQlfY3VyUGFyYVN0YXJ0ICAgID0gYWJzU3RhcnQ7CisJCQlfY3VyTGluZVN0YXJ0ICAgID0gYWJzU3RhcnQ7CiAJCQlfY3VyUGFyYUZvcm1hdCA9IGVsZW0uY29tcHV0ZWRGb3JtYXQ7CiAJCQkKIAkJCUNPTkZJRzo6ZGVidWcgeyBhc3NlcnQoX2N1clBhcmFTdGFydCA9PSBlbGVtLmdldEFic29sdXRlU3RhcnQoKSwiY29tcG9zZVBhcmFncmFwaEVsZW1lbnQ6IGJhZCBzdGFydCIpOyB9CkBAIC0xMjA0LDI1ICsxMDMxLDI4IEBACiAJCQl7CiAJCQkJLy8gTGluZXMgdGhhdCBhcmUgbm93IGNvbXBvc2VkIHRoYXQgd291bGQgbm90IGJlIHZpc2libGUgb24gdXBkYXRlLCBtaWdodCBzdGlsbCBiZSBpbiB0aGUgZGlzcGxheSBsaXN0IGZyb20KIAkJCQkvLyBhIHByZXZpb3VzIHVwZGF0ZS4gRG9uJ3QgcmVsZWFzZSBpbiB0aGF0IGNhc2UuCi0JCQkJdmFyIHRleHRCbG9jazpUZXh0QmxvY2sgPSBlbGVtLmdldFRleHRCbG9jaygpOworCQkJCXZhciB0ZXh0QmxvY2tzOlZlY3Rvci48VGV4dEJsb2NrPiA9IGVsZW0uZ2V0VGV4dEJsb2NrcygpOwogCQkJCXZhciB0ZXh0TGluZTpUZXh0TGluZTsKLQkJCQlmb3IgKHRleHRMaW5lID0gdGV4dEJsb2NrLmxhc3RMaW5lOyB0ZXh0TGluZSAmJiBva1RvUmVsZWFzZTsgdGV4dExpbmUgPSB0ZXh0TGluZS5wcmV2aW91c0xpbmUpIAorCQkJCWZvciBlYWNoKHZhciB0ZXh0QmxvY2s6VGV4dEJsb2NrIGluIHRleHRCbG9ja3MpCiAJCQkJewotCQkJCQlpZiAodGV4dExpbmUucGFyZW50KQotCQkJCQkJb2tUb1JlbGVhc2UgPSBmYWxzZTsKLQkJCQl9Ci0JCQkJaWYgKG9rVG9SZWxlYXNlKQkvLyBubyB0ZXh0bGluZXMgd2VyZSBpbiB2aWV3LCBnbyBhaGVhZCBhbmQgcmVsZWFzZSB0aGVtIGFsbCwgc3RhcnRpbmcgYXQgdGhlIGVuZCBhbmQgd29ya2luZyB0byB0aGUgc3RhcnQKLQkJCQl7Ci0JCQkJCWZvciAodGV4dExpbmUgPSB0ZXh0QmxvY2subGFzdExpbmU7IHRleHRMaW5lOyApCisJCQkJCWZvciAodGV4dExpbmUgPSB0ZXh0QmxvY2subGFzdExpbmU7IHRleHRMaW5lICYmIG9rVG9SZWxlYXNlOyB0ZXh0TGluZSA9IHRleHRMaW5lLnByZXZpb3VzTGluZSkgCiAJCQkJCXsKLQkJCQkJCXRleHRCbG9jay5yZWxlYXNlTGluZXModGV4dExpbmUsIHRleHRMaW5lKTsKLQkJCQkJCXRleHRMaW5lLnVzZXJEYXRhID0gbnVsbDsKLQkJCQkJCVRleHRMaW5lUmVjeWNsZXIuYWRkTGluZUZvclJldXNlKHRleHRMaW5lKTsKLQkJCQkJCWlmIChfdGV4dEZsb3cuYmFja2dyb3VuZE1hbmFnZXIpCi0JCQkJCQkJX3RleHRGbG93LmJhY2tncm91bmRNYW5hZ2VyLnJlbW92ZUxpbmVGcm9tQ2FjaGUodGV4dExpbmUpOwotCQkJCQkJdGV4dExpbmUgPSB0ZXh0QmxvY2subGFzdExpbmU7CisJCQkJCQlpZiAodGV4dExpbmUucGFyZW50KQorCQkJCQkJCW9rVG9SZWxlYXNlID0gZmFsc2U7CiAJCQkJCX0KLQkJCQkJZWxlbS5yZWxlYXNlVGV4dEJsb2NrKCk7CisJCQkJCWlmIChva1RvUmVsZWFzZSkJLy8gbm8gdGV4dGxpbmVzIHdlcmUgaW4gdmlldywgZ28gYWhlYWQgYW5kIHJlbGVhc2UgdGhlbSBhbGwsIHN0YXJ0aW5nIGF0IHRoZSBlbmQgYW5kIHdvcmtpbmcgdG8gdGhlIHN0YXJ0CisJCQkJCXsKKwkJCQkJCWZvciAodGV4dExpbmUgPSB0ZXh0QmxvY2subGFzdExpbmU7IHRleHRMaW5lOyApCisJCQkJCQl7CisJCQkJCQkJdGV4dEJsb2NrLnJlbGVhc2VMaW5lcyh0ZXh0TGluZSwgdGV4dExpbmUpOworCQkJCQkJCXRleHRMaW5lLnVzZXJEYXRhID0gbnVsbDsKKwkJCQkJCQlUZXh0TGluZVJlY3ljbGVyLmFkZExpbmVGb3JSZXVzZSh0ZXh0TGluZSk7CisJCQkJCQkJaWYgKF90ZXh0Rmxvdy5iYWNrZ3JvdW5kTWFuYWdlcikKKwkJCQkJCQkJX3RleHRGbG93LmJhY2tncm91bmRNYW5hZ2VyLnJlbW92ZUxpbmVGcm9tQ2FjaGUodGV4dExpbmUpOworCQkJCQkJCXRleHRMaW5lID0gdGV4dEJsb2NrLmxhc3RMaW5lOworCQkJCQkJfQorCQkJCQkJZWxlbS5yZWxlYXNlVGV4dEJsb2NrKHRleHRCbG9jayk7CisJCQkJCX0KIAkJCQl9CiAJCQl9CiAKQEAgLTEyNTYsOSArMTA4NiwxMiBAQAogCQkgKi8KIAkJcHJvdGVjdGVkIGZ1bmN0aW9uIGNvbXBvc2VQYXJhZ3JhcGhFbGVtZW50SW50b0xpbmVzKCk6Qm9vbGVhbgogCQl7CisJCQkvLyBtYWtlIHN1cmUgVGV4dEJsb2NrcyBhcmUgbm9ybWFsaXplZAorCQkJX2N1clBhcmFFbGVtZW50LmNyZWF0ZUNvbnRlbnRFbGVtZW50KCk7CiAJCQl2YXIgcmVzdWx0OkJvb2xlYW4gPSB0cnVlOwogCQkJdmFyIHRleHRMaW5lOlRleHRMaW5lOwogCQkJCisJCQkKIAkJCXZhciBsZWZ0TWFyZ2luOk51bWJlcjsKIAkJCXZhciByaWdodE1hcmdpbjpOdW1iZXI7CiAJCQkKQEAgLTEzMDQsNiArMTEzNywzNCBAQAogCQkJCQlicmVhazsKIAkJCQl9CiAKKwkJCQkvLyBkbyB0YWJsZSBoZXJlPworCQkJCS8vX2N1ckVsZW1lbnRTdGFydCA9PSBfY3VyUGFyYVN0YXJ0CisJCQkJLy8JCQl2YXIgc3RhcnRDb21wb3NlOmludCA9IF9jdXJFbGVtZW50U3RhcnQgKyBfY3VyRWxlbWVudE9mZnNldCAtIF9jdXJQYXJhU3RhcnQ7CisJCQkJdmFyIGN1ckNoaWxkOkZsb3dFbGVtZW50ID0gX2N1clBhcmFFbGVtZW50LmdldENoaWxkQXQoX2N1clBhcmFFbGVtZW50LmZpbmRDaGlsZEluZGV4QXRQb3NpdGlvbihfY3VyRWxlbWVudFN0YXJ0IC0gX2N1clBhcmFTdGFydCkpOworCQkJCWlmKGN1ckNoaWxkIGlzIFRhYmxlRWxlbWVudCkKKwkJCQl7CisJCQkJCQorCQkJCQlpZighY29tcG9zZVRhYmxlRWxlbWVudChjdXJDaGlsZCBhcyBUYWJsZUVsZW1lbnQsIF9jdXJFbGVtZW50U3RhcnQpKQorCQkJCQkJcmV0dXJuIGZhbHNlOworCQkJCQkKKwkJCQkJX2N1ckVsZW1lbnRPZmZzZXQgPSAwOworCQkJCQlfY3VyRWxlbWVudFN0YXJ0ICArPSBfY3VyRWxlbWVudC50ZXh0TGVuZ3RoOworCQkJCQlfY3VyRWxlbWVudCA9IF9jdXJFbGVtZW50LmdldE5leHRMZWFmKCk7CisJCQkJCV9jdXJMaW5lU3RhcnQrKzsKKwkJCQkJX3ByZXZpb3VzTGluZSA9IG51bGw7CisKKwkJCQkJLy8gaWYgdGhlIG5leHQgc3BhbiBpcyB0aGUgdGVybWluYXRvciBiYWlsIG91dC4uLgorCQkJCQlpZihfY3VyRWxlbWVudCBpcyBTcGFuRWxlbWVudCAmJiBTcGFuRWxlbWVudChfY3VyRWxlbWVudCkuaGFzUGFyYWdyYXBoVGVybWluYXRvciAmJiBfY3VyRWxlbWVudC50ZXh0TGVuZ3RoID09IDEpCisJCQkJCXsKKwkJCQkJCV9jdXJFbGVtZW50T2Zmc2V0ID0gMDsKKwkJCQkJCV9jdXJFbGVtZW50U3RhcnQgICs9IF9jdXJFbGVtZW50LnRleHRMZW5ndGg7CisJCQkJCQlfY3VyRWxlbWVudCA9IF9jdXJFbGVtZW50LmdldE5leHRMZWFmKCk7CisJCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQkJfQorCQkJCQkKKwkJCQkJLy9icmVhazsKKwkJCQkJLy9yZXR1cm4gdHJ1ZTsKKwkJCQl9CiAJCQkJLy8gR2V0IHRoZSBuZXh0IGxpbmUKIAkJCQl0ZXh0TGluZSA9IGNvbXBvc2VOZXh0TGluZSgpOwogCQkJCWlmICh0ZXh0TGluZSA9PSAgbnVsbCkKQEAgLTE1MDcsNyArMTM2OCw3IEBACiAJCQkKIAkJCXZhciB0ZXh0TGluZTpUZXh0TGluZSA9IG51bGw7CiAJCQl0ZXh0TGluZSA9IFRleHRMaW5lUmVjeWNsZXIuZ2V0TGluZUZvclJldXNlKCk7Ci0JCQl2YXIgdGV4dEJsb2NrOlRleHRCbG9jayA9IF9jdXJQYXJhRWxlbWVudC5nZXRUZXh0QmxvY2soKTsKKwkJCXZhciB0ZXh0QmxvY2s6VGV4dEJsb2NrID0gX2N1clBhcmFFbGVtZW50LmdldFRleHRCbG9ja0F0UG9zaXRpb24oX2N1ckVsZW1lbnQuZ2V0RWxlbWVudFJlbGF0aXZlU3RhcnQoX2N1clBhcmFFbGVtZW50KSk7CiAJCQlpZiAodGV4dExpbmUpCiAJCQl7CiAJCQkJQ09ORklHOjpkZWJ1ZyB7IGFzc2VydChfdGV4dEZsb3cuYmFja2dyb3VuZE1hbmFnZXIgPT0gbnVsbCB8fCBfdGV4dEZsb3cuYmFja2dyb3VuZE1hbmFnZXIuZ2V0RW50cnkodGV4dExpbmUpID09PSB1bmRlZmluZWQsImNyZWF0ZVRleHRMaW5lIC0gQmFkIFRleHRMaW5lIGluIHJlY3ljbGVyIGNhY2hlIik7IH0KQEAgLTE1MjcsOSArMTM4OCw4IEBACiAKIAkJCUNPTkZJRzo6ZGVidWcgeyBhc3NlcnQoX2N1clBhcmFTdGFydCA9PSBfY3VyUGFyYUVsZW1lbnQuZ2V0QWJzb2x1dGVTdGFydCgpLCJiYWQgX2N1clBhcmFTdGFydCIpOyB9CiAKLQkJCV9jdXJMaW5lLmluaXRpYWxpemUoX2N1clBhcmFFbGVtZW50LCB0YXJnZXRXaWR0aCwgbGluZU9mZnNldC1fcGFyY2VsTGlzdC5pbnNpZGVMaXN0SXRlbU1hcmdpbiwgdGV4dExpbmUudGV4dEJsb2NrQmVnaW5JbmRleCArIF9jdXJQYXJhU3RhcnQsIHRleHRMaW5lLnJhd1RleHRMZW5ndGgsIHRleHRMaW5lKTsKKwkJCV9jdXJMaW5lLmluaXRpYWxpemUoX2N1clBhcmFFbGVtZW50LCB0YXJnZXRXaWR0aCwgbGluZU9mZnNldC1fcGFyY2VsTGlzdC5pbnNpZGVMaXN0SXRlbU1hcmdpbiwgX2N1ckxpbmVTdGFydCwgdGV4dExpbmUucmF3VGV4dExlbmd0aCwgdGV4dExpbmUpOwogCQkJQ09ORklHOjpkZWJ1ZyB7IGFzc2VydChfY3VyTGluZS50YXJnZXRXaWR0aCA9PSB0YXJnZXRXaWR0aCwiQmFkIHRhcmdldFdpZHRoIik7IH0KLQogCQkJcmV0dXJuIHRleHRMaW5lOwogCQl9CiAJCQpAQCAtMTU1Myw2ICsxNDEzLDcgQEAKIAkJLyoqIENhbGxlZCB3aGVuIHdlIGFyZSBmaW5pc2hlZCBjb21wb3NpbmcgYSBsaW5lLCBhbmQgaXQgaXMgY29tbWl0dGVkLiBIYW5kbGVyIGZvciBkZXJpdmVkIGNsYXNzZXMgdG8gb3ZlcnJpZGUgZGVmYXVsdCBiZWhhdmlvci4gICovCiAJCXByb3RlY3RlZCBmdW5jdGlvbiBlbmRMaW5lKHRleHRMaW5lOlRleHRMaW5lKTp2b2lkCS8vIE5vIFBNRAogCQl7CisJCQlfY3VyTGluZVN0YXJ0ICs9IF9jdXJMaW5lLnRleHRMZW5ndGg7CiAJCQlfY29udGVudENvbW1pdHRlZEV4dGVudCA9IE1hdGgubWF4KF9jb250ZW50Q29tbWl0dGVkRXh0ZW50LCBfd29ya2luZ0NvbnRlbnRFeHRlbnQpOwogCQkJX2NvbnRlbnRDb21taXR0ZWRIZWlnaHQgPSBNYXRoLm1heChfY29udGVudENvbW1pdHRlZEhlaWdodCwgX3dvcmtpbmdDb250ZW50SGVpZ2h0KTsKIAkJCV9jb250ZW50TG9naWNhbEV4dGVudCA9IE1hdGgubWF4KF9jb250ZW50TG9naWNhbEV4dGVudCwgX3dvcmtpbmdDb250ZW50TG9naWNhbEV4dGVudCk7CkBAIC0xOTIyLDcgKzE3ODMsNyBAQAogCQkJCWJvdW5kcyA9IHRleHRMaW5lLmdldEF0b21Cb3VuZHMobGFzdEF0b20gIT0gMCAmJiBlbmRPZlBhcmFncmFwaCA/IDEgOiAwKTsJCQkJCQkKIAkJCQlsaW5lV2lkdGggLT0gKF9ibG9ja1Byb2dyZXNzaW9uID09IEJsb2NrUHJvZ3Jlc3Npb24uVEIpID8gYm91bmRzLmxlZnQgOiBib3VuZHMudG9wOwogCQkJfQotCQkJdGV4dExpbmUuZmx1c2hBdG9tRGF0YSgpOworCQkJLy90ZXh0TGluZS5mbHVzaEF0b21EYXRhKCk7IC8vIFdhcm5pbmc6IE5vdyBkb2VzIG5vdGhpbmcKIAkJCXJldHVybiBsaW5lV2lkdGg7CiAJCX0KIApAQCAtMjE5NCw3ICsyMDU1LDcgQEAKIAkJCQlmb3IgKDs7KQogCQkJCXsKIAkJCQkJYWR2YW5jZVRvTmV4dFBhcmNlbCgpOwotCQkJCQlpZiAoIV9jdXJMaW5lIHx8IF9wYXJjZWxMaXN0LmF0RW5kKCkgfHwgX3BhcmNlbExpc3QuY3VycmVudFBhcmNlbC5pc1RhYmxlUGFyY2VsKQorCQkJCQlpZiAoIV9jdXJMaW5lIHx8IF9wYXJjZWxMaXN0LmF0RW5kKCkpCiAJCQkJCQlyZXR1cm4gZmFsc2U7CiAJCQkJCWlmIChfcGFyY2VsTGlzdC5nZXRMaW5lU2x1ZyhfbGluZVNsdWcsMCwgMSwgX3RleHRJbmRlbnQsIF9jdXJQYXJhRm9ybWF0LmRpcmVjdGlvbiA9PSBEaXJlY3Rpb24uTFRSKSkKIAkJCQkJewpAQCAtMjg1NywxNSArMjcxOCwxNCBAQAogCQkJCXsKIAkJCQkJaWYgKG9sZENvbnRyb2xsZXIgPT0gbnVsbCAmJiBfc3RhcnRDb250cm9sbGVyKQogCQkJCQkJY2xlYXJDb250cm9sbGVycyhfc3RhcnRDb250cm9sbGVyLCBuZXdDb250cm9sbGVyKTsKLQkJCQkJZWxzZSBpZiAoICEgX2N1clBhcmNlbC5pc1RhYmxlUGFyY2VsICkKKwkJCQkJZWxzZQogCQkJCQkJY2xlYXJDb250cm9sbGVycyhvbGRDb250cm9sbGVyLCBuZXdDb250cm9sbGVyKTsKIAkJCQl9CiAJCQkJaWYgKG5ld0NvbnRyb2xsZXIpCiAJCQkJewogCQkJCQlDT05GSUc6OmRlYnVnIAogCQkJCQl7IAotCQkJCQkJaWYgKCAhIG5ld1BhcmNlbC5pc1RhYmxlUGFyY2VsICkKLQkJCQkJCQlhc3NlcnQoIW9sZENvbnRyb2xsZXIgfHwgbmV3Q29udHJvbGxlci5hYnNvbHV0ZVN0YXJ0ID09IG9sZENvbnRyb2xsZXIuYWJzb2x1dGVTdGFydCArIG9sZENvbnRyb2xsZXIudGV4dExlbmd0aCwgIm5ld0NvbnRyb2xsZXIgbm90IHlldCBzZXQgdXAiKTsKKwkJCQkJCWFzc2VydCghb2xkQ29udHJvbGxlciB8fCBuZXdDb250cm9sbGVyLmFic29sdXRlU3RhcnQgPT0gb2xkQ29udHJvbGxlci5hYnNvbHV0ZVN0YXJ0ICsgb2xkQ29udHJvbGxlci50ZXh0TGVuZ3RoLCAibmV3Q29udHJvbGxlciBub3QgeWV0IHNldCB1cCIpOwogCQkJCQl9CiAJCQkJCWlmIChvbGRDb250cm9sbGVyKQkJLy8gYWR2YW5jZSB0aGUgc3RhcnQgcG9zIHRvIHRoZSBuZXh0IGNvbnRyb2xsZXIgaWYgbmV3Q29udHJvbGxlciBpc24ndCB0aGUgZmlyc3QgY29udHJvbGxlcgogCQkJCQkJX3N0YXJ0Q29tcG9zZVBvc2l0aW9uID0gbmV3Q29udHJvbGxlci5hYnNvbHV0ZVN0YXJ0OwpkaWZmIC0tZ2l0IGEvdGV4dExheW91dC9zcmMvZmxhc2h4L3RleHRMYXlvdXQvY29tcG9zZS9Db21wb3NlU3RhdGUuYXMgYi90ZXh0TGF5b3V0L3NyYy9mbGFzaHgvdGV4dExheW91dC9jb21wb3NlL0NvbXBvc2VTdGF0ZS5hcwppbmRleCBkNDBkYzJiLi4xNzFlMWI2IDEwMDY0NAotLS0gYS90ZXh0TGF5b3V0L3NyYy9mbGFzaHgvdGV4dExheW91dC9jb21wb3NlL0NvbXBvc2VTdGF0ZS5hcworKysgYi90ZXh0TGF5b3V0L3NyYy9mbGFzaHgvdGV4dExheW91dC9jb21wb3NlL0NvbXBvc2VTdGF0ZS5hcwpAQCAtMjcsNyArMjcsNiBAQAogCWltcG9ydCBmbGFzaC50ZXh0LmVuZ2luZS5UZXh0TGluZUNyZWF0aW9uUmVzdWx0OwogCWltcG9ydCBmbGFzaC50ZXh0LmVuZ2luZS5UZXh0TGluZVZhbGlkaXR5OwogCQotCWltcG9ydCBmbGFzaHgudGV4dExheW91dC50bGZfaW50ZXJuYWw7CiAJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmNvbnRhaW5lci5Db250YWluZXJDb250cm9sbGVyOwogCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5kZWJ1Zy5EZWJ1Z2dpbmc7CiAJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmRlYnVnLmFzc2VydDsKQEAgLTQ3LDExICs0NiwxMSBAQAogCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5mb3JtYXRzLkxpc3RTdHlsZVBvc2l0aW9uOwogCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5mb3JtYXRzLlRleHRBbGlnbjsKIAlpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQuZm9ybWF0cy5WZXJ0aWNhbEFsaWduOworCWltcG9ydCBmbGFzaHgudGV4dExheW91dC50bGZfaW50ZXJuYWw7CiAJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LnV0aWxzLlR3aXBzOwogCQogCXVzZSBuYW1lc3BhY2UgdGxmX2ludGVybmFsOwogCi0JW0V4Y2x1ZGVDbGFzc10KIAkvKiogS2VlcHMgdHJhY2sgb2YgaW50ZXJuYWwgc3RhdGUgZHVyaW5nIGNvbXBvc2l0aW9uLiAKIAkgKiAKIAkgKiBUaGlzIGlzIHRoZSBzaW1wbGVyIHZlcnNpb24sIHVzZWQgd2hlbiB0aGVyZSBhcmUgbm8gZmxvYXRzLCBubyB3cmFwcywgbm8gY29sdW1ucy4KQEAgLTExMSw3ICsxMTAsNyBAQAogCQkJdmpCZWdpbkxpbmVJbmRleCA9IDA7CiAJCQl2akRpc2FibGVUaGlzUGFyY2VsID0gZmFsc2U7CiAJCQkKLQkJCXJldHVybiBzdXBlci5jb21wb3NlVGV4dEZsb3codGV4dEZsb3csIGNvbXBvc2VUb1Bvc2l0aW9uLCBjb250cm9sbGVyRW5kSW5kZXgpOworIAkJCXJldHVybiBzdXBlci5jb21wb3NlVGV4dEZsb3codGV4dEZsb3csIGNvbXBvc2VUb1Bvc2l0aW9uLCBjb250cm9sbGVyRW5kSW5kZXgpOwogCQl9CiAJCQogCQlwcm90ZWN0ZWQgb3ZlcnJpZGUgZnVuY3Rpb24gaW5pdGlhbGl6ZUZvckNvbXBvc2VyKGNvbXBvc2VyOklGbG93Q29tcG9zZXIsY29tcG9zZVRvUG9zaXRpb246aW50LGNvbnRyb2xsZXJTdGFydEluZGV4OmludCwgY29udHJvbGxlckVuZEluZGV4OmludCk6dm9pZApAQCAtMzAzLDcgKzMwMiwxNSBAQAogICAgICAgICAgCWlmIChtaW5ZICE9IFRleHRMaW5lLk1BWF9MSU5FX1dJRFRIICYmIE1hdGguYWJzKG1pblktX3BhcmNlbFRvcCkgPj0gMSkKICAgICAgICAgICAgCQlfcGFyY2VsVG9wID0gbWluWTsKICAJCX0KLSAJCQkJCisgCQkJCisJCXByb3RlY3RlZCBvdmVycmlkZSBmdW5jdGlvbiBlbmRUYWJsZUJsb2NrKGJsb2NrOlRleHRGbG93VGFibGVCbG9jayk6dm9pZAorCQl7CisJCQlzdXBlci5lbmRUYWJsZUJsb2NrKGJsb2NrKTsKKwkJCShfZmxvd0NvbXBvc2VyIGFzIFN0YW5kYXJkRmxvd0NvbXBvc2VyKS5hZGRMaW5lKGJsb2NrLF9jdXJMaW5lSW5kZXgpOworCQkJCisJCQljb21taXRMYXN0TGluZVN0YXRlIChfY3VyTGluZSk7CisJCQlfY3VyTGluZUluZGV4Kys7CisJCX0KIAkJLyoqIENhbGxlZCB3aGVuIHdlIGFyZSBmaW5pc2hlZCBjb21wb3NpbmcgYSBsaW5lLiBIYW5kbGVyIGZvciBkZXJpdmVkIGNsYXNzZXMgdG8gb3ZlcnJpZGUgZGVmYXVsdCBiZWhhdmlvci4gICovCiAJCW92ZXJyaWRlIHByb3RlY3RlZCBmdW5jdGlvbiBlbmRMaW5lKHRleHRMaW5lOlRleHRMaW5lKTp2b2lkCiAJCXsKQEAgLTMyOCw3ICszMzUsOCBAQAogCQlwcm90ZWN0ZWQgb3ZlcnJpZGUgZnVuY3Rpb24gY29tcG9zZU5leHRMaW5lKCk6VGV4dExpbmUKIAkJewkJCQogCQkJLy8gbWp6aGFuZzogdGhpcyBjb2RlIGFkZHMgZm9yIHJlY29tcG9zZSBhIHRhYmxlIHJvdywgd2UgbmVlZCB0byByZWNvcnJlY3QgX2N1ckxpbmVJbmRleCBwYXJhbWV0ZXIgYmFzZWQgb24gX2N1ckVsZW1lbnRTdGFydCBhbmQgX2N1ckVsZW1lbnRPZmZzZXQuCi0JCQlfY3VyTGluZUluZGV4ID0gX2Zsb3dDb21wb3Nlci5maW5kTGluZUluZGV4QXRQb3NpdGlvbihfY3VyRWxlbWVudFN0YXJ0ICsgX2N1ckVsZW1lbnRPZmZzZXQpOworCQkJLy9IYXJiczogSSBkb24ndCBzZWUgYSBuZWVkIGZvciB0aGlzIG5vdyB0aGF0IEkgY2hhbmdlZCB0aGUgdGFibGUgbG9naWMuCisJCQkvL19jdXJMaW5lSW5kZXggPSBfZmxvd0NvbXBvc2VyLmZpbmRMaW5lSW5kZXhBdFBvc2l0aW9uKF9jdXJFbGVtZW50U3RhcnQgKyBfY3VyRWxlbWVudE9mZnNldCk7CiAJCQkKIAkJCUNPTkZJRzo6ZGVidWcgeyBhc3NlcnQoX2N1ckxpbmVJbmRleCA9PSBfZmxvd0NvbXBvc2VyLmZpbmRMaW5lSW5kZXhBdFBvc2l0aW9uKF9jdXJFbGVtZW50U3RhcnQgKyBfY3VyRWxlbWVudE9mZnNldCksImJhZCBfY3VyTGluZUluZGV4Iik7IH0KIApAQCAtMzM4LDcgKzM0Niw2IEBACiAJCQkvLyB3aWR0aCBpbiBmaXRMaW5lVG9QYXJjZWwgdG8gbWFrZSBzdXJlIGl0IGZpdHMgYXQgdGhlIChwb3NzaWJseSBjaGFuZ2VkKSBsaW5lIGhlaWdodC4KIAkJCXZhciBzdGFydENvbXBvc2U6aW50ID0gX2N1ckVsZW1lbnRTdGFydCArIF9jdXJFbGVtZW50T2Zmc2V0IC0gX2N1clBhcmFTdGFydDsKIAkJCXZhciBsaW5lOlRleHRGbG93TGluZSA9IF9jdXJMaW5lSW5kZXggPCBfZmxvd0NvbXBvc2VyLm51bUxpbmVzID8gKF9mbG93Q29tcG9zZXIgYXMgU3RhbmRhcmRGbG93Q29tcG9zZXIpLmxpbmVzW19jdXJMaW5lSW5kZXhdIDogbnVsbDsKLQkJCQogCQkJdmFyIHVzZUV4aXN0aW5nTGluZTpCb29sZWFuID0gbGluZSAmJiAoIWxpbmUuaXNEYW1hZ2VkKCkgfHwgbGluZS52YWxpZGl0eSA9PSBGbG93RGFtYWdlVHlwZS5HRU9NRVRSWSk7CiAJCQlpZiAoQ29udGFpbmVyQ29udHJvbGxlci50bGZfaW50ZXJuYWw6OnVzZXNEaXNjcmV0aW9uYXJ5SHlwaGVucykKIAkJCXsKQEAgLTQxOCw3ICs0MjUsNyBAQAogCQkJCWlmIChmaXRMaW5lVG9QYXJjZWwodGV4dExpbmUsICF1c2VFeGlzdGluZ0xpbmUsIG51bWJlckxpbmUpKQogCQkJCQlicmVhazsJLy8gd2UgaGF2ZSBhIGdvb2QgbGluZQogCQkJCV9jdXJMaW5lID0gbnVsbDsJLy8ga2VlcCBsb29raW5nCi0JCQkJaWYgKF9wYXJjZWxMaXN0LmF0RW5kKCkgfHwgX3BhcmNlbExpc3QuY3VycmVudFBhcmNlbC5pc1RhYmxlUGFyY2VsKQorCQkJCWlmIChfcGFyY2VsTGlzdC5hdEVuZCgpKQogCQkJCXsKIAkJCQkJcG9wSW5zaWRlTGlzdEl0ZW1NYXJnaW5zKG51bWJlckxpbmUpOwogCQkJCQlyZXR1cm4gbnVsbDsKQEAgLTQ0Nyw3ICs0NTQsNyBAQAogCQkJdmFyIHRleHRMaW5lOlRleHRMaW5lID0gc3VwZXIuY3JlYXRlVGV4dExpbmUodGFyZ2V0V2lkdGgsIGFsbG93RW1lcmdlbmN5QnJlYWtzKTsKIAkJCQogCQkJaWYgKHRleHRMaW5lKQotCSAJCQl0ZXh0TGluZS5kb3VibGVDbGlja0VuYWJsZWQgPSB0cnVlOwkJLy8gYWxsb3cgbGluZSB0byBiZSB0aGUgdGFyZ2V0IG9pZiBhIGRvdWJsZSBjbGljayBldmVudAorCSAJCQl0ZXh0TGluZS5kb3VibGVDbGlja0VuYWJsZWQgPSB0cnVlOwkJLy8gYWxsb3cgbGluZSB0byBiZSB0aGUgdGFyZ2V0IG9mIGEgZG91YmxlIGNsaWNrIGV2ZW50CiAJCQllbHNlCiAJCQkJX2N1ckxpbmUgPSBudWxsOwogIAkJCQpkaWZmIC0tZ2l0IGEvdGV4dExheW91dC9zcmMvZmxhc2h4L3RleHRMYXlvdXQvY29tcG9zZS9GbG93Q29tcG9zZXJCYXNlLmFzIGIvdGV4dExheW91dC9zcmMvZmxhc2h4L3RleHRMYXlvdXQvY29tcG9zZS9GbG93Q29tcG9zZXJCYXNlLmFzCmluZGV4IGIwMzU5MmEuLmIwNTAyMDEgMTAwNjQ0Ci0tLSBhL3RleHRMYXlvdXQvc3JjL2ZsYXNoeC90ZXh0TGF5b3V0L2NvbXBvc2UvRmxvd0NvbXBvc2VyQmFzZS5hcworKysgYi90ZXh0TGF5b3V0L3NyYy9mbGFzaHgvdGV4dExheW91dC9jb21wb3NlL0Zsb3dDb21wb3NlckJhc2UuYXMKQEAgLTIzMCw2ICsyMzAsMTAgQEAKIAkJCQl3aGlsZSAodHJ1ZSkKIAkJCQl7CiAJCQkJCWxpbmUgPSBfbGluZXNbbGluZUlkeF07CisJCQkJCS8vIEFuIGVtcHR5IHNwYW4gZm9sbG93aW5nIGEgdGFibGUgY2FuIGNhdXNlIHRoaXMuCisJCQkJCS8vaWYobGluZSA9PSBudWxsKQorCQkJCQkvLwlicmVhazsKKwkJCQkJCiAJCQkJCWxpbmUuc2V0QWJzb2x1dGVTdGFydChsaW5lLmFic29sdXRlU3RhcnQgKyBsZW5Ub0RlbCArIGRlbHRhTGVuZ3RoKTsKIAkJCQkJY3VyUG9zID0gKHN0YXJ0UG9zaXRpb24gPiBsaW5lLmFic29sdXRlU3RhcnQgPyBzdGFydFBvc2l0aW9uIDogbGluZS5hYnNvbHV0ZVN0YXJ0KTsKIAkJCQkJCkBAIC00NTQsNyArNDU4LDIwIEBACiAJCQkJX2RhbWFnZUFic29sdXRlU3RhcnQgPSBuZXdMaW5lLmFic29sdXRlU3RhcnQgKyBuZXdMaW5lLnRleHRMZW5ndGg7CiAJCQkJCiAJCQlpZiAod29ya0xpbmUgPT0gbnVsbCkKLQkJCQlsaW5lcy5wdXNoKG5ld0xpbmUpOwkJCQkKKwkJCQlsaW5lcy5wdXNoKG5ld0xpbmUpOworCQkJZWxzZSBpZigod29ya0xpbmUgaXMgVGV4dEZsb3dUYWJsZUJsb2NrKSAmJiB3b3JrTGluZSAhPSBuZXdMaW5lKQorCQkJCV9saW5lcy5zcGxpY2Uod29ya0luZGV4LDEsbmV3TGluZSk7CisJCQllbHNlIGlmKG5ld0xpbmUgaXMgVGV4dEZsb3dUYWJsZUJsb2NrKQorCQkJeworCQkJCWlmKHdvcmtMaW5lICE9IG5ld0xpbmUpCisJCQkJeworCQkJCQlfbGluZXMuc3BsaWNlKHdvcmtJbmRleCwwLG5ld0xpbmUpOworCQkJCQkvLyBzZXQgdGhlIG5leHQgbGluZSBhYnNvbHV0ZSBzdGFydCB0byBiZSByYXRpb25hbCBmb3IgdGhlIG5leHQgbGluZS4uLgorCQkJCQlpZih3b3JrTGluZS5hYnNvbHV0ZVN0YXJ0ID09IG5ld0xpbmUuYWJzb2x1dGVTdGFydCkKKwkJCQkJCXdvcmtMaW5lLnNldEFic29sdXRlU3RhcnQod29ya0xpbmUuYWJzb2x1dGVTdGFydCsxKTsKKwkJCQl9CisJCQl9CisJCQkJCQkJCQogCQkJZWxzZSBpZiAod29ya0xpbmUuYWJzb2x1dGVTdGFydCAhPSBuZXdMaW5lLmFic29sdXRlU3RhcnQpCiAJCQl7CiAJCQkJaWYgKHdvcmtMaW5lLmFic29sdXRlU3RhcnQgKyB3b3JrTGluZS50ZXh0TGVuZ3RoID4gbmV3TGluZS5hYnNvbHV0ZVN0YXJ0ICsgbmV3TGluZS50ZXh0TGVuZ3RoKQpkaWZmIC0tZ2l0IGEvdGV4dExheW91dC9zcmMvZmxhc2h4L3RleHRMYXlvdXQvY29tcG9zZS9QYXJjZWwuYXMgYi90ZXh0TGF5b3V0L3NyYy9mbGFzaHgvdGV4dExheW91dC9jb21wb3NlL1BhcmNlbC5hcwppbmRleCA2ODc2OWI2Li45MDc5ZDk3IDEwMDY0NAotLS0gYS90ZXh0TGF5b3V0L3NyYy9mbGFzaHgvdGV4dExheW91dC9jb21wb3NlL1BhcmNlbC5hcworKysgYi90ZXh0TGF5b3V0L3NyYy9mbGFzaHgvdGV4dExheW91dC9jb21wb3NlL1BhcmNlbC5hcwpAQCAtMzEsOCArMzEsOCBAQAogCiAJdXNlIG5hbWVzcGFjZSB0bGZfaW50ZXJuYWw7CiAJCQotCVtFeGNsdWRlQ2xhc3NdCi0JLyoqIEhlbHBlciBjbGFzcyBmb3IgaW1wbGVtZW50YXRpb25zIG9mIElQYXJjZWxMaXN0CisJLyoqIAorCSAqIEhlbHBlciBjbGFzcyBmb3IgaW1wbGVtZW50YXRpb25zIG9mIElQYXJjZWxMaXN0CiAJICogCiAJICogQHByaXZhdGUKIAkgKi8KQEAgLTQzLDcgKzQzLDYgQEAKIAkJcHVibGljIHZhciB3aWR0aDpOdW1iZXI7CiAJCXB1YmxpYyB2YXIgaGVpZ2h0Ok51bWJlcjsKIAkJcHVibGljIHZhciBsb2dpY2FsV2lkdGg6TnVtYmVyOwotCQlwdWJsaWMgdmFyIGlzVGFibGVQYXJjZWw6Qm9vbGVhbjsKIAogCQlwcml2YXRlIHZhciBfY29udHJvbGxlcjpDb250YWluZXJDb250cm9sbGVyOwogCQlwcml2YXRlIHZhciBfY29sdW1uSW5kZXg6aW50OwpAQCAtNzMsNyArNzIsNiBAQAogCQkJdGhpcy5oZWlnaHQgPSBoZWlnaHQ7CiAJCQl0aGlzLmxvZ2ljYWxXaWR0aCA9IHZlcnRpY2FsVGV4dCA/IGhlaWdodCA6IHdpZHRoOwogCQkJdGhpcy5fdmVydGljYWxUZXh0ID0gdmVydGljYWxUZXh0OyAKLQkJCXRoaXMuaXNUYWJsZVBhcmNlbCA9IGZhbHNlOwogCQkJCiAJCQlfY29udHJvbGxlciAgID0gY29udHJvbGxlcjsKIAkJCV9jb2x1bW5JbmRleCAgPSAgY29sdW1uSW5kZXg7CmRpZmYgLS1naXQgYS90ZXh0TGF5b3V0L3NyYy9mbGFzaHgvdGV4dExheW91dC9jb21wb3NlL1BhcmNlbExpc3QuYXMgYi90ZXh0TGF5b3V0L3NyYy9mbGFzaHgvdGV4dExheW91dC9jb21wb3NlL1BhcmNlbExpc3QuYXMKaW5kZXggZmMzYjUxNi4uYjRlMmE3YiAxMDA2NDQKLS0tIGEvdGV4dExheW91dC9zcmMvZmxhc2h4L3RleHRMYXlvdXQvY29tcG9zZS9QYXJjZWxMaXN0LmFzCisrKyBiL3RleHRMYXlvdXQvc3JjL2ZsYXNoeC90ZXh0TGF5b3V0L2NvbXBvc2UvUGFyY2VsTGlzdC5hcwpAQCAtMjUsNyArMjUsNyBAQAogCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5jb250YWluZXIuQ29udGFpbmVyQ29udHJvbGxlcjsKIAlpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQuY29udGFpbmVyLlNjcm9sbFBvbGljeTsKIAlpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQuZGVidWcuYXNzZXJ0OwotCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5lbGVtZW50cy5UYWJsZURhdGFDZWxsRWxlbWVudDsKKwlpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQuZWxlbWVudHMuVGFibGVDZWxsRWxlbWVudDsKIAlpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQuZm9ybWF0cy5CbG9ja1Byb2dyZXNzaW9uOwogCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5mb3JtYXRzLklUZXh0TGF5b3V0Rm9ybWF0OwogCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5mb3JtYXRzLkxpbmVCcmVhazsKQEAgLTM1LDcgKzM1LDYgQEAKIAkKIAl1c2UgbmFtZXNwYWNlIHRsZl9pbnRlcm5hbDsKIAkJCQotCVtFeGNsdWRlQ2xhc3NdCiAJLyoqIEBwcml2YXRlCiAJICogVXNlZCBmb3IgY29tcG9zaW5nIHRleHQgY29udGFpbmVycywga2VlcHMgdHJhY2sgb2YgdGhlIGFyZWFzIHRoYXQgdGV4dCBpbiB0aGUgCiAJICogZmxvdyBpcyBjb21wb3NlZCBpbnRvLgpAQCAtMjA4LDcgKzIwNyw3IEBACiAJCQlyZXR1cm4gX3BhcmNlbEFycmF5LnBvcCgpOwogCQl9CiAJCQotCQlwdWJsaWMgZnVuY3Rpb24gYWRkVGFibGVDZWxsMkNvbHVtblN0YXRlKGNvbnRyb2xsZXI6Q29udGFpbmVyQ29udHJvbGxlciwgY2VsbDpUYWJsZURhdGFDZWxsRWxlbWVudCk6dm9pZAorCQlwdWJsaWMgZnVuY3Rpb24gYWRkVGFibGVDZWxsMkNvbHVtblN0YXRlKGNvbnRyb2xsZXI6Q29udGFpbmVyQ29udHJvbGxlciwgY2VsbDpUYWJsZUNlbGxFbGVtZW50KTp2b2lkCiAJCXsKIAkJCXZhciBjb2x1bW5TdGF0ZTpDb2x1bW5TdGF0ZSA9IGNvbnRyb2xsZXIuY29sdW1uU3RhdGU7CiAJCQlpZiAoY29sdW1uU3RhdGUpCmRpZmYgLS1naXQgYS90ZXh0TGF5b3V0L3NyYy9mbGFzaHgvdGV4dExheW91dC9jb21wb3NlL1N0YW5kYXJkRmxvd0NvbXBvc2VyLmFzIGIvdGV4dExheW91dC9zcmMvZmxhc2h4L3RleHRMYXlvdXQvY29tcG9zZS9TdGFuZGFyZEZsb3dDb21wb3Nlci5hcwppbmRleCBlMWNiMTQwLi5jYTRiNjZlIDEwMDY0NAotLS0gYS90ZXh0TGF5b3V0L3NyYy9mbGFzaHgvdGV4dExheW91dC9jb21wb3NlL1N0YW5kYXJkRmxvd0NvbXBvc2VyLmFzCisrKyBiL3RleHRMYXlvdXQvc3JjL2ZsYXNoeC90ZXh0TGF5b3V0L2NvbXBvc2UvU3RhbmRhcmRGbG93Q29tcG9zZXIuYXMKQEAgLTY1LDcgKzY1LDcgQEAKIAlwdWJsaWMgY2xhc3MgU3RhbmRhcmRGbG93Q29tcG9zZXIgZXh0ZW5kcyBGbG93Q29tcG9zZXJCYXNlIGltcGxlbWVudHMgSUZsb3dDb21wb3NlcgogCXsKIAkJLyoqIEBwcml2YXRlICovCi0JCXRsZl9pbnRlcm5hbCB2YXIgX3Jvb3RFbGVtZW50OkNvbnRhaW5lckZvcm1hdHRlZEVsZW1lbnQ7CisJCXByb3RlY3RlZCB2YXIgX3Jvb3RFbGVtZW50OkNvbnRhaW5lckZvcm1hdHRlZEVsZW1lbnQ7CiAJCXByaXZhdGUgdmFyIF9jb250cm9sbGVyTGlzdDpBcnJheTsKIAkJcHJpdmF0ZSB2YXIgX2NvbXBvc2luZzpCb29sZWFuOwogCmRpZmYgLS1naXQgYS90ZXh0TGF5b3V0L3NyYy9mbGFzaHgvdGV4dExheW91dC9jb21wb3NlL1RleHRGbG93TGluZS5hcyBiL3RleHRMYXlvdXQvc3JjL2ZsYXNoeC90ZXh0TGF5b3V0L2NvbXBvc2UvVGV4dEZsb3dMaW5lLmFzCmluZGV4IDExYjg1MTEuLmJkNmUwMTUgMTAwNjQ0Ci0tLSBhL3RleHRMYXlvdXQvc3JjL2ZsYXNoeC90ZXh0TGF5b3V0L2NvbXBvc2UvVGV4dEZsb3dMaW5lLmFzCisrKyBiL3RleHRMYXlvdXQvc3JjL2ZsYXNoeC90ZXh0TGF5b3V0L2NvbXBvc2UvVGV4dEZsb3dMaW5lLmFzCkBAIC01Miw2ICs1Miw4IEBACiAJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmVsZW1lbnRzLlNwYW5FbGVtZW50OwogCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5lbGVtZW50cy5TdWJQYXJhZ3JhcGhHcm91cEVsZW1lbnRCYXNlOwogCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5lbGVtZW50cy5UQ1lFbGVtZW50OworCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5lbGVtZW50cy5UYWJsZUVsZW1lbnQ7CisJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmVsZW1lbnRzLlRhYmxlTGVhZkVsZW1lbnQ7CiAJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmVsZW1lbnRzLlRleHRGbG93OwogCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5mYWN0b3J5LlN0cmluZ1RleHRMaW5lRmFjdG9yeTsKIAlpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQuZm9ybWF0cy5CYWNrZ3JvdW5kQ29sb3I7CkBAIC05Miw3ICs5NCw3IEBACiAJICogQGxhbmd2ZXJzaW9uIDMuMAogCSAqLwogCQotCXB1YmxpYyBmaW5hbCBjbGFzcyBUZXh0Rmxvd0xpbmUgaW1wbGVtZW50cyBJVmVydGljYWxKdXN0aWZpY2F0aW9uTGluZSAKKwlwdWJsaWMgY2xhc3MgVGV4dEZsb3dMaW5lIGltcGxlbWVudHMgSVZlcnRpY2FsSnVzdGlmaWNhdGlvbkxpbmUgCiAJewogCQkKIAkJLyoqIEBwcml2YXRlIC0gdGhlIHNlbGVjdGlvbiBibG9jayBjYWNoZSAqLwpAQCAtMTI2LDEwICsxMjgsMTAgQEAKIAkJCiAJCS8vIGFkZGVkIHRvIHN1cHBvcnQgVGV4dEZsb3dMaW5lIHdoZW4gVGV4dExpbmUgbm90IGF2YWlsYWJsZQogCi0JCXByaXZhdGUgdmFyIF9hc2NlbnQ6TnVtYmVyOwotCQlwcml2YXRlIHZhciBfZGVzY2VudDpOdW1iZXI7CisJCXByb3RlY3RlZCB2YXIgX2FzY2VudDpOdW1iZXI7CisJCXByb3RlY3RlZCB2YXIgX2Rlc2NlbnQ6TnVtYmVyOwogCQlwcml2YXRlIHZhciBfdGFyZ2V0V2lkdGg6TnVtYmVyOwotCQlwcml2YXRlIHZhciBfbGluZU9mZnNldDpOdW1iZXI7CisJCXByb3RlY3RlZCB2YXIgX2xpbmVPZmZzZXQ6TnVtYmVyOwogCQlwcml2YXRlIHZhciBfbGluZUV4dGVudDpOdW1iZXI7CS8vIGNvbnRlbnQgYm91bmRzIGxvZ2ljYWwgd2lkdGggZm9yIHRoZSBsaW5lCiAJCXByaXZhdGUgdmFyIF9hY2N1bXVsYXRlZExpbmVFeHRlbnQ6TnVtYmVyOwogCQlwcml2YXRlIHZhciBfYWNjdW11bGF0ZWRNaW5pbXVtU3RhcnQ6TnVtYmVyOwpAQCAtMzU2LDggKzM1OCwxNCBAQAogCQl7CiAJCQlpZiAoX3BhcmEpCiAJCQl7Ci0JCQkJdmFyIGxpbmVTdGFydDppbnQgPSBfYWJzb2x1dGVTdGFydCAtIF9wYXJhLmdldEFic29sdXRlU3RhcnQoKTsKKwkJCQl2YXIgbGluZVN0YXJ0OmludDsKIAkJCQkKKwkJCQkvLyBIYXJicyA4LTMxLTE0IGFkZGVkIGhhbmRsaW5nIG9mIG11bHRpcGxlIHRleHRCbG9ja3MgbWlnaHQgbmVlZCBtb3JlIHdvcmsgdG8gaGFuZGxlIGVuZD8KKwkJCQl2YXIgdGV4dExpbmU6VGV4dExpbmUgPSBwZWVrVGV4dExpbmUoKTsKKwkJCQlpZih0ZXh0TGluZSkKKwkJCQkJbGluZVN0YXJ0ID0gX2Fic29sdXRlU3RhcnQgLSBfcGFyYS5nZXRUZXh0QmxvY2tBYnNvbHV0ZVN0YXJ0KHRleHRMaW5lLnRleHRCbG9jayk7CisJCQkJZWxzZQorCQkJCQlsaW5lU3RhcnQgPSBfYWJzb2x1dGVTdGFydCAtIF9wYXJhLmdldEFic29sdXRlU3RhcnQoKTsKIAkJCQkvLyBJbml0aWFsaXplIHNldHRpbmdzIGZvciBsb2NhdGlvbgogCQkJCWlmIChsaW5lU3RhcnQgPT0gMCkJCS8vIHdlJ3JlIGF0IHRoZSBzdGFydCBvZiB0aGUgcGFyYWdyYXBoCiAJCQkJCXJldHVybiBfdGV4dExlbmd0aCA9PSBfcGFyYS50ZXh0TGVuZ3RoID8gVGV4dEZsb3dMaW5lTG9jYXRpb24uT05MWSA6IFRleHRGbG93TGluZUxvY2F0aW9uLkZJUlNUOwpAQCAtNzk3LDE1ICs4MDUsMTYgQEAKIAkJCQlyZXR1cm4gbnVsbDsKIAkJCQkJCQogCQkJLy8gTG9vayBpdCB1cCBpbiB0aGUgdGV4dEJsb2NrCi0JCQl2YXIgdGV4dEJsb2NrOlRleHRCbG9jayA9IHBhcmFncmFwaC5wZWVrVGV4dEJsb2NrKCk7Ci0JCQlpZiAodGV4dEJsb2NrKQorCQkJdmFyIHRleHRCbG9ja3M6VmVjdG9yLjxUZXh0QmxvY2s+ID0gcGFyYWdyYXBoLmdldFRleHRCbG9ja3MoKTsKKwkJCWZvciBlYWNoKHZhciB0ZXh0QmxvY2s6VGV4dEJsb2NrIGluIHRleHRCbG9ja3MpCiAJCQl7CiAJCQkJZm9yICh0ZXh0TGluZSA9IHRleHRCbG9jay5maXJzdExpbmU7IHRleHRMaW5lOyB0ZXh0TGluZSA9IHRleHRMaW5lLm5leHRMaW5lKQogCQkJCXsKIAkJCQkJaWYgKHRleHRMaW5lLnVzZXJEYXRhID09IHRoaXMpIC8vIGZvdW5kIGl0CiAJCQkJCQlyZXR1cm4gdGV4dExpbmU7Ci0JCQkJCX0KIAkJCQl9CisJCQkJCisJCQl9CiAJCQlyZXR1cm4gbnVsbDsKIAkJfQogCQkKQEAgLTg1MCwxMyArODU5LDE0IEBACiAJCX0KIAogCQlwcml2YXRlIGZ1bmN0aW9uIGdldFRleHRMaW5lSW50ZXJuYWwoKTpUZXh0TGluZQotCQl7CQkJCisJCXsJCQorCQkJLy8gOC0zMS0xNCBEbyB3ZSBuZWVkIHRvIGNoYW5nZSB0aGlzIHRvIGhhbmRsZSBtdWx0aXBsZSB0ZXh0QmxvY2tzPwogCQkJLy8gTG9vayBpdCB1cCBpbiB0aGUgdGV4dEJsb2NrCiAJCQl2YXIgcGFyYUFic1N0YXJ0OmludCA9IHBhcmFncmFwaC5nZXRBYnNvbHV0ZVN0YXJ0KCk7CiAJCQkKIAkJCS8vIElmIHdlIGhhdmVuJ3QgZm91bmQgaXQgeWV0LCB3ZSBuZWVkIHRvIHJlZ2VuZXJhdGUgaXQuCiAJCQkvLyBSZWdlbmVyYXRlIHRoZSB3aG9sZSBwYXJhZ3JhcGggYXQgb25jZSwgdXAgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24uIAotCQkJdmFyIHRleHRCbG9jazpUZXh0QmxvY2sgPSBwYXJhZ3JhcGguZ2V0VGV4dEJsb2NrKCk7CisJCQl2YXIgdGV4dEJsb2NrOlRleHRCbG9jayA9IHBhcmFncmFwaC5nZXRUZXh0QmxvY2tBdFBvc2l0aW9uKGFic29sdXRlU3RhcnQgLSBwYXJhQWJzU3RhcnQpOwogCQkJdmFyIGN1cnJlbnRMaW5lOlRleHRMaW5lID0gdGV4dEJsb2NrLmZpcnN0TGluZTsKIAkJCXZhciBmbG93Q29tcG9zZXI6SUZsb3dDb21wb3NlciA9IHBhcmFncmFwaC5nZXRUZXh0RmxvdygpLmZsb3dDb21wb3NlcjsKIAkJCXZhciBsaW5lSW5kZXg6aW50ID0gZmxvd0NvbXBvc2VyLmZpbmRMaW5lSW5kZXhBdFBvc2l0aW9uKHBhcmFBYnNTdGFydCk7CkBAIC04NzEsNiArODgxLDExIEBACiAJCQkJCXRleHRMaW5lID0gY3VycmVudExpbmU7CiAJCQkJCWN1cnJlbnRMaW5lID0gY3VycmVudExpbmUubmV4dExpbmU7CiAJCQkJfQorCQkJCWVsc2UgaWYobGluZSBpcyBUZXh0Rmxvd1RhYmxlQmxvY2spCisJCQkJeworCQkJCQl0ZXh0TGluZSA9IG51bGw7CisJCQkJCWN1cnJlbnRMaW5lID0gbnVsbDsKKwkJCQl9CiAJCQkJZWxzZQogCQkJCXsKIAkJCQkJdGV4dExpbmUgPSBsaW5lLnJlY3JlYXRlVGV4dExpbmUodGV4dEJsb2NrLCBwcmV2aW91c0xpbmUpOwpAQCAtMTIwNSw2ICsxMjIwLDggQEAKIAkJCQkJYnJlYWs7CiAJCQkJZWxlbSA9IGVsZW0uZ2V0TmV4dExlYWYoX3BhcmEpOwogCQkJCUNPTkZJRzo6ZGVidWcgeyBhc3NlcnQoZWxlbSAhPSBudWxsLCJiYWQgbmV4dExlYWYiKTsgfQorCQkJCWlmKGVsZW0gPT0gbnVsbCkKKwkJCQkJYnJlYWs7CiAJCQl9CiAJCQlyZXR1cm4gdG90YWxMZWFkaW5nOwogCQl9CkBAIC0xMzY3LDggKzEzODQsMTEgQEAKIAkJCWlmIChpc0RhbWFnZWQoKSkKIAkJCQlyZXR1cm4gbnVsbDsKIAkJCQorCQkJLy8gOC0zMS0xNCBEbyB3ZSBuZWVkIHRvIGFkanVzdCB0aGlzIGZvciBwYXJhcyB3aXRoIG11bHRpcGxlIHRleHRCbG9ja3M/IAogCQkJLy9nZXQgdGhlIGFic29sdXRlIHN0YXJ0IG9mIHRoZSBwYXJhZ3JhcGguICBDYWxjdWxhdGlvbiBpcyBleHBlbnNpdmUsIHNvIGp1c3QgZG8gdGhpcyBvbmNlLgotCQkJdmFyIHBhcmFBYnNTdGFydDppbnQgPSBfcGFyYS5nZXRBYnNvbHV0ZVN0YXJ0KCk7CisJCQkvL3ZhciBwYXJhQWJzU3RhcnQ6aW50ID0gX3BhcmEuZ2V0QWJzb2x1dGVTdGFydCgpOworCQkJdmFyIHRleHRMaW5lOlRleHRMaW5lID0gZ2V0VGV4dExpbmUoKTsKKwkJCXZhciBwYXJhQWJzU3RhcnQ6aW50ID0gX3BhcmEuZ2V0VGV4dEJsb2NrQWJzb2x1dGVTdGFydCh0ZXh0TGluZS50ZXh0QmxvY2spOwogCQkJCiAJCQkvL2lmIHRoZSBpbmRleGVzIGFyZSBpZGVudGljYWwgYW5kIGFyZSBlcXVhbCB0byB0aGUgc3RhcnQgb2YgdGhlIGxpbmUsIHRoZW4KIAkJCS8vZG9uJ3QgZHJhdyBhbnl0aGluZy4gIFRoaXMgcHJldmVudHMgYSBiYXIgYmVpbmcgZHJhd24gb24gYSBmb2xsb3dpbmcgbGluZSB3aGVuCkBAIC0xNDAyLDcgKzE0MjIsNiBAQAogCQkJc2VsZWN0aW9uQ2FjaGUuYmVnSWR4ID0gYmVnSWR4OwogCQkJc2VsZWN0aW9uQ2FjaGUuZW5kSWR4ID0gZW5kSWR4OwogCQkJCi0JCQl2YXIgdGV4dExpbmU6VGV4dExpbmUgPSBnZXRUZXh0TGluZSgpOwogCQkJdmFyIGhlaWdodEFuZEFkajpBcnJheSA9IGdldFJvbWFuU2VsZWN0aW9uSGVpZ2h0QW5kVmVydGljYWxBZGp1c3RtZW50KHByZXZMaW5lLCBuZXh0TGluZSk7CiAJCQljYWxjdWxhdGVTZWxlY3Rpb25Cb3VuZHModGV4dExpbmUsIGRyYXdSZWN0cywgYmVnSWR4LCBlbmRJZHgsIGJsb2NrUHJvZ3Jlc3Npb24sIGhlaWdodEFuZEFkaik7CiAJCQkKQEAgLTE0MTYsOCArMTQzNSw5IEBACiAJCQkKIAkJCQogCQkJLy9hbGxvdyB0aGUgYXRvbXMgdG8gYmUgZ2FyYmFnZSBjb2xsZWN0ZWQuCi0JCQlpZiAodGV4dExpbmUpCi0JCQkJdGV4dExpbmUuZmx1c2hBdG9tRGF0YSgpOworCQkJLy9pZiAodGV4dExpbmUpIHsKKwkJCQkvL3RleHRMaW5lLmZsdXNoQXRvbURhdGEoKTsgLy8gV2FybmluZzogTm93IGRvZXMgbm90aGluZworCQkJLy99CiAJCQkKIAkJCXJldHVybiBzZWxlY3Rpb25DYWNoZTsKIAkJfQpAQCAtMTQyOSw3ICsxNDQ5LDggQEAKIAkJCS8vdGhlIGRpcmVjdGlvbiBvZiB0aGUgdGV4dAogCQkJdmFyIGRpcmVjdGlvbjpTdHJpbmcgPSBfcGFyYS5jb21wdXRlZEZvcm1hdC5kaXJlY3Rpb247CiAJCQkvL2dldCB0aGUgYWJzb2x1dGUgc3RhcnQgb2YgdGhlIHBhcmFncmFwaC4gIENhbGN1bGF0aW9uIGlzIGV4cGVuc2l2ZSwgc28ganVzdCBkbyB0aGlzIG9uY2UuCi0JCQl2YXIgcGFyYUFic1N0YXJ0OmludCA9IF9wYXJhLmdldEFic29sdXRlU3RhcnQoKTsKKwkJCS8vdmFyIHBhcmFBYnNTdGFydDppbnQgPSBfcGFyYS5nZXRBYnNvbHV0ZVN0YXJ0KCk7CisJCQl2YXIgcGFyYUFic1N0YXJ0OmludCA9IF9wYXJhLmdldFRleHRCbG9ja0Fic29sdXRlU3RhcnQodGV4dExpbmUudGV4dEJsb2NrKTsKIAkJCS8vdGhlIGN1cnJlbnQgaW5kZXguICB1c2VkIHRvIGl0ZXJhdGUgdG8gdGhlIG5leHQgZWxlbWVudAogCQkJdmFyIGN1cklkeDppbnQgPSBiZWdJZHg7CiAJCQkvL3RoZSBjdXJyZW50IEZsb3dMZWFmRWxlbWVudCBhcyBkZXRlcm1pbmVkIGJ5IGN1cklkeApAQCAtMTQ3Miw2ICsxNDkzLDE4IEBACiAJCQkJfQogCQkJCS8vdGhlIG51bWJlciBvZiBwb3RlbnRpYWwgZ2x5cGhzIHRvIGhpbGl0ZS4gIENvdWxkIGxhcmdlciB0aGFuIG5lZWRzIGJlIGlmIHdlIGFyZSBvbmx5IHNlbGVjdGluZyBwYXJ0IG9mIGl0LgogCQkJCXZhciBudW1DaGFyc1NlbGVjdGluZzppbnQgPSBjdXJFbGVtLnRleHRMZW5ndGggKyBjdXJFbGVtLmdldEVsZW1lbnRSZWxhdGl2ZVN0YXJ0KF9wYXJhKSAtIGN1cklkeDsKKwkJCQkvLyBzcGVjaWFsIGhhbmRsaW5nIGZvciBUYWJsZUxlYWZFbGVtZW50cyAoZG8gbm90aGluZykKKwkJCQlpZihjdXJFbGVtIGlzIFRhYmxlTGVhZkVsZW1lbnQpCisJCQkJeworCQkJCQkvL2lmKGZsb2F0UmVjdEFycmF5ID09IG51bGwpCisJCQkJCS8vCWZsb2F0UmVjdEFycmF5ID0gbmV3IEFycmF5KCk7CisKKwkJCQkJLy92YXIgYmxvY2s6VGV4dEZsb3dUYWJsZUJsb2NrID0gVGFibGVFbGVtZW50KFRhYmxlTGVhZkVsZW1lbnQoY3VyRWxlbSkucGFyZW50KS5nZXRGaXJzdEJsb2NrKCk7CisJCQkJCS8vdmFyIGJsb2NrUmVjdDpSZWN0YW5nbGUgPSBuZXcgUmVjdGFuZ2xlKGZsb2F0SW5mby54IC0gdGV4dExpbmUueCwgZmxvYXRJbmZvLnkgLSB0ZXh0TGluZS55LCBpbGcuZWxlbWVudFdpZHRoLCBpbGcuZWxlbWVudEhlaWdodCk7CisJCQkJCS8vZmxvYXRSZWN0QXJyYXkucHVzaChuZXcgUmVjdGFuZ2xlKDAsMCxibG9jay53aWR0aCxibG9jay5oZWlnaHQpKTsKKwkJCQkJKytjdXJJZHg7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KIAkJCQkvL3RoZSBpbmRleCBvZiB0aGUgbGFzdCBnbHlwaCB0byBoaWxpdGUuICBJZiBhIHBhcnRpYWwgc2VsZWN0aW9uLCB1c2UgZW5kSWR4CiAJCQkJdmFyIGVuZFBvczppbnQgPSAobnVtQ2hhcnNTZWxlY3RpbmcgKyBjdXJJZHgpID4gZW5kSWR4ID8gZW5kSWR4IDogKG51bUNoYXJzU2VsZWN0aW5nICsgY3VySWR4KTsKIAkJCQkKQEAgLTE3NTMsNyArMTc4Niw3IEBACiAJCQogCQkvKiogQHByaXZhdGUgCiAJCSAqIAotCQkgKiAKKwkJICogPyBHZXQgYSBsaXN0IG9mIHJlY3RzIG9mIHRoZSBjaGFyYWN0ZXJzIGluIHRoZSBnaXZlbiB0ZXh0bGluZT8gVXNlZCB0byBzaG93IHNlbGVjdGlvbj8gSkYgCiAJCSAqLwogCQlwcml2YXRlIGZ1bmN0aW9uIG1ha2VTZWxlY3Rpb25CbG9ja3ModGV4dExpbmU6VGV4dExpbmUsIGJlZ0lkeDppbnQsIGVuZElkeDppbnQsIHBhcmFBYnNTdGFydDppbnQsIGJsb2NrUHJvZ3Jlc3Npb246U3RyaW5nLCBkaXJlY3Rpb246U3RyaW5nLCBoZWlnaHRBbmRBZGo6QXJyYXkpOkFycmF5CiAJCXsKQEAgLTE5MTgsNyArMTk1MSw3IEBACiAJCQogCQkvKiogQHByaXZhdGUgCiAJCSAqIAotCQkgKiAKKwkJICogPyBHZXQgdGhlIGJvdW5kcyBvZiB0aGUgc3VwcGxpZWQgcmFuZ2Ugb2YgY2hhcmFjdGVycyBpbiB0aGUgZ2l2ZW4gdGV4dGxpbmU/IFVzZWQgdG8gc2hvdyBzZWxlY3Rpb24/IEpGIAogCQkgKi8KIAkJcHJpdmF0ZSBmdW5jdGlvbiBtYWtlQmxvY2sodGV4dExpbmU6VGV4dExpbmUsIGJlZ1RleHRJbmRleDppbnQsIGJlZ0F0b21JbmRleDppbnQsIGVuZEF0b21JbmRleDppbnQsIHN0YXJ0TWV0cmljczpSZWN0YW5nbGUsIGJsb2NrUHJvZ3Jlc3Npb246U3RyaW5nLCBkaXJlY3Rpb246U3RyaW5nLCBoZWlnaHRBbmRBZGo6QXJyYXkpOlJlY3RhbmdsZQogCQl7CkBAIC0yMTU3LDcgKzIxOTAsNyBAQAogCQkJaWYgKCF0ZXh0TGluZSB8fCAhdGV4dExpbmUucGFyZW50KQogCQkJCXJldHVybjsKIAkJCQotCQkJdmFyIHBhcmFTdGFydDppbnQgPSBfcGFyYS5nZXRBYnNvbHV0ZVN0YXJ0KCk7CisJCQl2YXIgcGFyYVN0YXJ0OmludCA9IF9wYXJhLmdldFRleHRCbG9ja0Fic29sdXRlU3RhcnQodGV4dExpbmUudGV4dEJsb2NrKTsKIAkJCWJlZ0lkeCAtPSBwYXJhU3RhcnQ7CiAJCQllbmRJZHggLT0gcGFyYVN0YXJ0OwogCQkJCkBAIC0yMTk4LDcgKzIyMzEsOSBAQAogCQkJaWYgKCF0ZXh0TGluZSB8fCAhdGV4dExpbmUucGFyZW50KQogCQkJCXJldHVybiBudWxsOwkJCQogCQkJLy8gYWRqdXN0IHRvIHRoaXMgcGFyYWdyYXBoJ3MgVGV4dEJsb2NrCi0JCQlpZHggLT0gX3BhcmEuZ2V0QWJzb2x1dGVTdGFydCgpOworCQkJLy8gSSdtIGFzc3VtaW5nIHRoaXMgbmVlZHMgdG8gYmUgcmVsYXRpdmUgdG8gdGhlIFRleHRCbG9jayBhbmQgbm90IHRoZSBwYXJhZ3JhcGggLS0gSGFyYnMKKwkJCQlpZHggLT0gX3BhcmEuZ2V0VGV4dEJsb2NrQWJzb2x1dGVTdGFydCh0ZXh0TGluZS50ZXh0QmxvY2spOworCQkJLy9pZHggLT0gX3BhcmEuZ2V0QWJzb2x1dGVTdGFydCgpOwogCQkJCiAJCQl0ZXh0TGluZSA9IGdldFRleHRMaW5lKHRydWUpOwogCQkJCkBAIC0yMjQ3LDcgKzIyODIsNyBAQAogCQkJfQogCQkJCiAJCQl2YXIgaGVpZ2h0QW5kQWRqOkFycmF5ID0gZ2V0Um9tYW5TZWxlY3Rpb25IZWlnaHRBbmRWZXJ0aWNhbEFkanVzdG1lbnQocHJldkxpbmUsIG5leHRMaW5lKTsKLQkJCXZhciBibG9ja1JlY3RBcnJheTpBcnJheSA9IG1ha2VTZWxlY3Rpb25CbG9ja3ModGV4dExpbmUsIGlkeCwgZW5kSWR4LCBfcGFyYS5nZXRBYnNvbHV0ZVN0YXJ0KCksIGJsb2NrUHJvZ3Jlc3Npb24sIGRpcmVjdGlvbiwgaGVpZ2h0QW5kQWRqKTsKKwkJCXZhciBibG9ja1JlY3RBcnJheTpBcnJheSA9IG1ha2VTZWxlY3Rpb25CbG9ja3ModGV4dExpbmUsIGlkeCwgZW5kSWR4LCBfcGFyYS5nZXRUZXh0QmxvY2tBYnNvbHV0ZVN0YXJ0KHRleHRMaW5lLnRleHRCbG9jayksIGJsb2NrUHJvZ3Jlc3Npb24sIGRpcmVjdGlvbiwgaGVpZ2h0QW5kQWRqKTsKIAkJCUNPTkZJRzo6ZGVidWd7IGFzc2VydChibG9ja1JlY3RBcnJheS5sZW5ndGggPT0gMSwgIkEgcG9pbnQgc2VsZWN0aW9uIHNob3VsZCByZXR1cm4gYSBzaW5nbGUgc2VsZWN0aW9uIHJlY3RhbmdsZSEiKTsgfQogCQkJdmFyIHJlY3Q6UmVjdGFuZ2xlID0gYmxvY2tSZWN0QXJyYXlbMF07CiAJCQkKQEAgLTIyOTEsNyArMjMyNiw3IEBACiAJCQl9CiAJCQkKIAkJCS8vYWxsb3cgdGhlIGF0b21zIHRvIGJlIGdhcmJhZ2UgY29sbGVjdGVkLgotCQkJdGV4dExpbmUuZmx1c2hBdG9tRGF0YSgpOworCQkJLy90ZXh0TGluZS5mbHVzaEF0b21EYXRhKCk7IC8vIFdhcm5pbmc6IE5vdyBkb2VzIG5vdGhpbmcKIAkJCQogCQkJcmV0dXJuIHJlY3Q7CiAJCX0KQEAgLTIzMjAsNyArMjM1NSwxMiBAQAogCQkJfQogCQkJZWxzZQogCQkJewotCQkJCXZhciBwYXJhU3RhcnQ6aW50ID0gX3BhcmEuZ2V0QWJzb2x1dGVTdGFydCgpOworCQkJCXZhciBwYXJhU3RhcnQ6aW50OworCQkJCS8vOC0zMS0xNCBBc3N1bWluZyB0aGlzIHNob3VsZCBiZSBmcm9tIHRoZSB0ZXh0QmxvY2suIEtlZXBpbmcgZ2V0QWJzb2x1dGVTdGFydCgpIGluIGNhc2UgdGhlcmUncyBubyB0ZXh0TGluZSAtLSBub3Qgc3VyZSBpZiB0aGF0J3MgbmVlZGVkCisJCQkJaWYodGV4dExpbmUpCisJCQkJCXBhcmFTdGFydCA9IF9wYXJhLmdldFRleHRCbG9ja0Fic29sdXRlU3RhcnQodGV4dExpbmUudGV4dEJsb2NrKTsKKwkJCQllbHNlCisJCQkJCXBhcmFTdGFydCA9IF9wYXJhLmdldEFic29sdXRlU3RhcnQoKTsKIAkJCQl2YXIgc2VsQ2FjaGU6U2VsZWN0aW9uQ2FjaGUgPSB0aGlzLmdldFNlbGVjdGlvblNoYXBlc0NhY2hlRW50cnkoYmVnSWR4LXBhcmFTdGFydCxlbmRJZHgtcGFyYVN0YXJ0LHByZXZMaW5lLG5leHRMaW5lLGJsb2NrUHJvZ3Jlc3Npb24pOwogCQkJCWlmIChzZWxDYWNoZSkKIAkJCQl7CkBAIC0yNDkwLDYgKzI1MzAsOCBAQAogCQkvKiogQHByaXZhdGUgKi8KIAkJc3RhdGljIHRsZl9pbnRlcm5hbCBmdW5jdGlvbiBmaW5kTnVtYmVyTGluZSh0ZXh0TGluZTpUZXh0TGluZSk6VGV4dExpbmUKIAkJeworCQkJaWYodGV4dExpbmUgPT0gbnVsbCkKKwkJCQlyZXR1cm4gbnVsbDsKIAkJCS8vIG5vdCBhbHdheXMgZ29pbmcgdG8gYmUgYSBudW1iZXJMaW5lIC0gbGlzdFN0eWxlVHlwZSBtYXkgYmUgIm5vbmUiCiAJCQkvLyBoYXZlIHRvIGh1bnQgZm9yIGl0IGJlY2F1c2UgaW5saW5lZ3JhcGhpY3MgZ2V0IHB1c2hlZCBhdCB0aGUgYmVnaW5uaW5nCiAJCQkvLyByaXNrIGhlcmUgaXMgdGhhdCBjbGllbnRzIGRlY29yYXRlIFRleHRMaW5lcyB3aXRoIG90aGVyIFRleHRMaW5lcy4KQEAgLTI3MTUsNyArMjc1Nyw3IEBACiAJCQkJfQogCQkJfQogCQl9Ci0JCW51bWJlckxpbmUuZmx1c2hBdG9tRGF0YSgpOworCQkvLyBudW1iZXJMaW5lLmZsdXNoQXRvbURhdGEoKTsgLy8gV2FybmluZzogTm93IGRvZXMgbm90aGluZwogCQkvL3RyYWNlKCJ0ZXh0V2lkdGgiLG51bWJlckxpbmUudGV4dFdpZHRoLG1heFZhbC1taW5WYWwpOwogCQlyZXR1cm4gbWF4VmFsID4gbWluVmFsID8gbWF4VmFsLW1pblZhbCA6IDA7CiAJfQpkaWZmIC0tZ2l0IGEvdGV4dExheW91dC9zcmMvZmxhc2h4L3RleHRMYXlvdXQvY29tcG9zZS9UZXh0Rmxvd1RhYmxlQmxvY2suYXMgYi90ZXh0TGF5b3V0L3NyYy9mbGFzaHgvdGV4dExheW91dC9jb21wb3NlL1RleHRGbG93VGFibGVCbG9jay5hcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzdjODA0Ci0tLSAvZGV2L251bGwKKysrIGIvdGV4dExheW91dC9zcmMvZmxhc2h4L3RleHRMYXlvdXQvY29tcG9zZS9UZXh0Rmxvd1RhYmxlQmxvY2suYXMKQEAgLTAsMCArMSwyMjMgQEAKK3BhY2thZ2UgZmxhc2h4LnRleHRMYXlvdXQuY29tcG9zZQoreworCQorCWltcG9ydCBmbGFzaC5kaXNwbGF5LkRpc3BsYXlPYmplY3Q7CisJaW1wb3J0IGZsYXNoLmRpc3BsYXkuU2hhcGU7CisJaW1wb3J0IGZsYXNoLnRleHQuZW5naW5lLlRleHRMaW5lOworCQorCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5jb250YWluZXIuQ29udGFpbmVyQ29udHJvbGxlcjsKKwlpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQuZWRpdC5TZWxlY3Rpb25Gb3JtYXQ7CisJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmVsZW1lbnRzLkNlbGxDb250YWluZXI7CisJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmVsZW1lbnRzLkNlbGxDb29yZGluYXRlczsKKwlpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQuZWxlbWVudHMuUGFyYWdyYXBoRWxlbWVudDsKKwlpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQuZWxlbWVudHMuVGFibGVCbG9ja0NvbnRhaW5lcjsKKwlpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQuZWxlbWVudHMuVGFibGVDZWxsRWxlbWVudDsKKwlpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQuZWxlbWVudHMuVGFibGVFbGVtZW50OworCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5lbGVtZW50cy5UZXh0RmxvdzsKKwlpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQudGxmX2ludGVybmFsOworCQorCXVzZSBuYW1lc3BhY2UgdGxmX2ludGVybmFsOworCisJLyoqCisJICogCisJICoqLworCXB1YmxpYyBjbGFzcyBUZXh0Rmxvd1RhYmxlQmxvY2sgZXh0ZW5kcyBUZXh0Rmxvd0xpbmUKKwl7CisJCQorCQlwcml2YXRlIHZhciBfdGV4dEhlaWdodDpOdW1iZXI7CisJCQorCQkvKiogQ29uc3RydWN0b3IgLSBjcmVhdGVzIGEgbmV3IFRleHRGbG93VGFibGVCbG9jayBpbnN0YW5jZS4gCisJCSAqICA8cD48c3Ryb25nPk5vdGU8L3N0cm9uZz46IE5vIGNsaWVudCBzaG91bGQgY2FsbCB0aGlzLiBJdCdzIGV4cG9zZWQgZm9yIHdyaXRpbmcgeW91ciBvd24gY29tcG9zZXIuPC9wPgorCQkgKgorCQkgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IGluIHRoZSBUYWJsZSB0ZXh0IGZsb3cuCisJCSAqICovCisJCXB1YmxpYyBmdW5jdGlvbiBUZXh0Rmxvd1RhYmxlQmxvY2soaW5kZXg6dWludCkKKwkJeworCQkJYmxvY2tJbmRleCA9IGluZGV4OworCQkJX2NvbnRhaW5lciA9IG5ldyBUYWJsZUJsb2NrQ29udGFpbmVyKCk7CisJCQlzdXBlcihudWxsLG51bGwpOworCQl9CisJCQorCQkvKioKKwkJICogQGluaGVyaXREb2MKKwkJICoqLworCQlvdmVycmlkZSB0bGZfaW50ZXJuYWwgZnVuY3Rpb24gaW5pdGlhbGl6ZShwYXJhZ3JhcGg6UGFyYWdyYXBoRWxlbWVudCwgb3V0ZXJUYXJnZXRXaWR0aDpOdW1iZXIgPSAwLCBsaW5lT2Zmc2V0Ok51bWJlciA9IDAsIGFic29sdXRlU3RhcnQ6aW50ID0gMCwgbnVtQ2hhcnM6aW50ID0gMCwgdGV4dExpbmU6VGV4dExpbmUgPSBudWxsKTp2b2lkCisJCXsKKwkJCV9jb250YWluZXIudXNlckRhdGEgPSB0aGlzOworCQkJX2xpbmVPZmZzZXQgPSBsaW5lT2Zmc2V0OworCisJCQlzdXBlci5pbml0aWFsaXplKHBhcmFncmFwaCwgb3V0ZXJUYXJnZXRXaWR0aCwgbGluZU9mZnNldCwgYWJzb2x1dGVTdGFydCwgbnVtQ2hhcnMsIHRleHRMaW5lKTsKKwkJfQorCQlvdmVycmlkZSB0bGZfaW50ZXJuYWwgZnVuY3Rpb24gc2V0Q29udHJvbGxlcihjb250OkNvbnRhaW5lckNvbnRyb2xsZXIsY29sTnVtYmVyOmludCk6dm9pZAorCQl7CisJCQlzdXBlci5zZXRDb250cm9sbGVyKGNvbnQsIGNvbE51bWJlcik7CisJCQlpZihjb250KQorCQkJCWNvbnRyb2xsZXIuYWRkQ29tcG9zZWRUYWJsZUJsb2NrKGNvbnRhaW5lcik7CisJCX0KKworCQkKKwkJLyoqCisJCSAqIFRoZSB0YWJsZSB0aGF0IG93bnMgdGhpcyB0YWJsZSBibG9jaworCQkgKiovCisJCXB1YmxpYyB2YXIgcGFyZW50VGFibGU6VGFibGVFbGVtZW50OworCQkKKwkJLyoqCisJCSAqIFRoZSBpbmRleCBvZiB0aGlzIGJsb2NrIGluIHRoZSB0YWJsZSB0ZXh0IGZsb3cgbGF5b3V0CisJCSAqKi8KKwkJcHVibGljIHZhciBibG9ja0luZGV4OnVpbnQgPSAwOworCQkKKwkJLyoqCisJCSAqIEBwcml2YXRlCisJCSAqKi8KKwkJcHJpdmF0ZSB2YXIgX2NvbnRhaW5lcjpUYWJsZUJsb2NrQ29udGFpbmVyOworCQkKKwkJcHJpdmF0ZSB2YXIgX2NlbGxzOkFycmF5OworCQkKKwkJLyoqCisJCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgdGFibGUgY2VsbHMuIAorCQkgKiBAcHJpdmF0ZQorCQkgKiovCisJCXByaXZhdGUgZnVuY3Rpb24gZ2V0Q2VsbHMoKTpBcnJheXsKKwkJCWlmKF9jZWxscyA9PSBudWxsKXsKKwkJCQlfY2VsbHMgPSBbXTsKKwkJCX0KKwkJCXJldHVybiBfY2VsbHM7CisJCX0KKwkJCisJCS8qKgorCQkgKiBSZXR1cm5zIGEgdmVjdG9yIG9mIHRhYmxlIGNlbGwgZWxlbWVudHMgaW4gdGhlIGdpdmVuIGNlbGwgcmFuZ2UuIAorCQkgKiovCisJCXB1YmxpYyBmdW5jdGlvbiBnZXRDZWxsc0luUmFuZ2UoYW5jaG9yQ29vcmRzOkNlbGxDb29yZGluYXRlcyxhY3RpdmVDb29yZHM6Q2VsbENvb3JkaW5hdGVzKTpWZWN0b3IuPFRhYmxlQ2VsbEVsZW1lbnQ+CisJCXsKKwkJCWlmKCFwYXJlbnRUYWJsZSkKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCXJldHVybiBwYXJlbnRUYWJsZS5nZXRDZWxsc0luUmFuZ2UoYW5jaG9yQ29vcmRzLGFjdGl2ZUNvb3Jkcyx0aGlzKTsKKwkJfQorCQkKKwkJLyoqCisJCSAqIENsZWFycyB0aGUgY2VsbHMgaW4gdGhlIHRhYmxlIGJsb2NrLiBXcmFwcyBjbGVhckNlbGxzKCkuIAorCQkgKiovCisJCXB1YmxpYyBmdW5jdGlvbiBjbGVhcigpOnZvaWR7CisJCQljbGVhckNlbGxzKCk7CisJCX0KKwkJCisJCS8qKgorCQkgKiBDbGVhcnMgdGhlIGNlbGxzIGluIHRoZSB0YWJsZSBibG9jaworCQkgKiovCisJCXB1YmxpYyBmdW5jdGlvbiBjbGVhckNlbGxzKCk6dm9pZHsKKwkJCV9jb250YWluZXIucmVtb3ZlQ2hpbGRyZW4oKTsKKwkJCWdldENlbGxzKCkubGVuZ3RoID0gMDsKKwkJfQorCQkKKwkJLyoqCisJCSAqIEFkZHMgYSBjZWxsIGNvbnRhaW5lciB0byB0YWJsZSBjb250YWluZXIuIFRoaXMgYWRkcyBpdCB0byB0aGUgZGlzcGxheSBsaXN0LiAKKwkJICogSWYgdGhlIGNlbGwgaXMgYWxyZWFkeSBhZGRlZCBpdCBkb2VzIG5vdCBhZGQgaXQgdHdpY2UuIAorCQkgKiovCisJCXB1YmxpYyBmdW5jdGlvbiBhZGRDZWxsKGNlbGw6Q2VsbENvbnRhaW5lcik6dm9pZHsKKwkJCXZhciBjZWxsczpBcnJheSA9IGdldENlbGxzKCk7CisJCQlpZihjZWxscy5pbmRleE9mKGNlbGwpIDwgMCl7CisJCQkJY2VsbHMucHVzaChjZWxsKTsKKwkJCQlfY29udGFpbmVyLmFkZENoaWxkKGNlbGwpOworCQkJfQorCQl9CisJCQorCQkKKwkJcHVibGljIGZ1bmN0aW9uIGRyYXdCYWNrZ3JvdW5kKGJhY2tncm91bmRJbmZvOiopOnZvaWR7CisJCQkvL1RPRE86IG5lZWQgdG8gZmlndXJlIHRoaXMgb3V0Li4uCisJCQkKKwkJfQorCQkKKwkJLyoqCisJCSAqIENvbnRhaW5lciB0aGF0IGRpc3BsYXlzIHRoaXMgY29sbGVjdGlvbiBvZiBjZWxscworCQkgKiovCisJCXB1YmxpYyBmdW5jdGlvbiBnZXQgY29udGFpbmVyKCk6VGFibGVCbG9ja0NvbnRhaW5lcg0KKwkJeworCQkJcmV0dXJuIF9jb250YWluZXI7CisJCX0KKwkJCisJCS8qKgorCQkgKiBUcmlnZ2VycyBkcmF3aW5nIG9mIGNvbXBvc2VkIGNlbGwgY29udGVudHMKKwkJICoqLworCQlwdWJsaWMgZnVuY3Rpb24gdXBkYXRlQ29tcG9zaXRpb25TaGFwZXMoKTp2b2lkeworCQkJdmFyIGNlbGxzOkFycmF5ID0gZ2V0Q2VsbHMoKTsKKwkJCWZvciBlYWNoKHZhciBjZWxsOkNlbGxDb250YWluZXIgaW4gY2VsbHMpeworCQkJCWNlbGwuZWxlbWVudC51cGRhdGVDb21wb3NpdGlvblNoYXBlcygpOworCQkJfQorCQl9CisKKwkJLyoqCisJCSAqIFNldHMgdGhlIGhlaWdodCBvZiB0aGUgY29udGFpbmVyIAorCQkgKiovCisJCXB1YmxpYyBmdW5jdGlvbiBzZXQgaGVpZ2h0KHZhbHVlOk51bWJlcik6dm9pZHsKKwkJCS8vX2NvbnRhaW5lci5oZWlnaHQgPSB2YWx1ZTsKKwkJCV90ZXh0SGVpZ2h0ID0gdmFsdWU7CisJCX0KKwkJCisJCS8qKgorCQkgKiBAaW5oZXJpdERvYworCQkgKiovCisJCW92ZXJyaWRlIHB1YmxpYyBmdW5jdGlvbiBnZXQgaGVpZ2h0KCk6TnVtYmVyeworCQkJcmV0dXJuIF90ZXh0SGVpZ2h0OworCQl9CisJCS8qKgorCQkgKiBTZXRzIHRoZSB3aWR0aCBvZiB0aGUgY29udGFpbmVyIAorCQkgKiovCisJCXB1YmxpYyBmdW5jdGlvbiBzZXQgd2lkdGgodmFsdWU6TnVtYmVyKTp2b2lkeworCQkJX2NvbnRhaW5lci53aWR0aCA9IHZhbHVlOworCQl9CisJCQorCQkvKioKKwkJICogR2V0cyB0aGUgd2lkdGggb2YgdGhlIGNvbnRhaW5lciAKKwkJICoqLworCQlwdWJsaWMgZnVuY3Rpb24gZ2V0IHdpZHRoKCk6TnVtYmVyeworCQkJcmV0dXJuIF9jb250YWluZXIud2lkdGg7CisJCX0KKwkJCisJCS8qKgorCQkgKiBTZXRzIHRoZSB4IHBvc2l0aW9uIG9mIHRoZSBjb250YWluZXIKKwkJICoqLworCQlvdmVycmlkZSBwdWJsaWMgZnVuY3Rpb24gc2V0IHgodmFsdWU6TnVtYmVyKTp2b2lkeworCQkJc3VwZXIueCA9IF9jb250YWluZXIueCA9IHZhbHVlOworCQl9CisJCQorCQlvdmVycmlkZSBwdWJsaWMgZnVuY3Rpb24gZ2V0IHgoKTpOdW1iZXJ7CisJCQlyZXR1cm4gX2NvbnRhaW5lci54OworCQl9CisJCQorCQkvKioKKwkJICogU2V0cyB0aGUgeSB2YWx1ZSBvZiB0aGUgY29udGFpbmVyCisJCSAqKi8KKwkJb3ZlcnJpZGUgcHVibGljIGZ1bmN0aW9uIHNldCB5KHZhbHVlOk51bWJlcik6dm9pZHsKKwkJCXN1cGVyLnkgPSBfY29udGFpbmVyLnkgPSB2YWx1ZTsKKwkJfQorCQlvdmVycmlkZSBwdWJsaWMgZnVuY3Rpb24gZ2V0IHkoKTpOdW1iZXJ7CisJCQlyZXR1cm4gX2NvbnRhaW5lci55OworCQl9CisJCQorCQkvKioKKwkJICogUmV0dXJucyBhIHZlY3RvciBvZiB0YWJsZSBjZWxsIGVsZW1lbnRzLgorCQkgKiovCisJCXB1YmxpYyBmdW5jdGlvbiBnZXRUYWJsZUNlbGxzKCk6VmVjdG9yLjxUYWJsZUNlbGxFbGVtZW50PgorCQl7CisJCQl2YXIgdENlbGxzOlZlY3Rvci48VGFibGVDZWxsRWxlbWVudD4gPSBuZXcgVmVjdG9yLjxUYWJsZUNlbGxFbGVtZW50PigpOworCQkJdmFyIGNlbGxzOkFycmF5ID0gZ2V0Q2VsbHMoKTsKKwkJCQorCQkJZm9yIGVhY2godmFyIGNlbGxDb250YWluZXI6Q2VsbENvbnRhaW5lciBpbiBjZWxscyl7CisJCQkJdENlbGxzLnB1c2goY2VsbENvbnRhaW5lci5lbGVtZW50KTsKKwkJCX0KKwkJCQorCQkJcmV0dXJuIHRDZWxsczsKKwkJfQorCisJCXB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBnZXQgdGV4dEhlaWdodCgpOk51bWJlcg0KKwkJeworCQkJcmV0dXJuIF90ZXh0SGVpZ2h0OworCQl9CisJCQorCQl0bGZfaW50ZXJuYWwgb3ZlcnJpZGUgZnVuY3Rpb24gaGlsaXRlQmxvY2tTZWxlY3Rpb24oc2VsT2JqOlNoYXBlLCBzZWxGb3JtYXQ6U2VsZWN0aW9uRm9ybWF0LCBjb250YWluZXI6RGlzcGxheU9iamVjdCwgYmVnSWR4OmludCwgZW5kSWR4OmludCwgcHJldkxpbmU6VGV4dEZsb3dMaW5lLCBuZXh0TGluZTpUZXh0Rmxvd0xpbmUpOnZvaWQKKwkJeworCQkJLy8gZG8gbm90aGluZyBmb3Igbm93Li4uCisJCX0KKworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXh0TGF5b3V0L3NyYy9mbGFzaHgvdGV4dExheW91dC9jb250YWluZXIvQ29sdW1uU3RhdGUuYXMgYi90ZXh0TGF5b3V0L3NyYy9mbGFzaHgvdGV4dExheW91dC9jb250YWluZXIvQ29sdW1uU3RhdGUuYXMKaW5kZXggNDBhNTRlMS4uZTg0ZGQ2NCAxMDA2NDQKLS0tIGEvdGV4dExheW91dC9zcmMvZmxhc2h4L3RleHRMYXlvdXQvY29udGFpbmVyL0NvbHVtblN0YXRlLmFzCisrKyBiL3RleHRMYXlvdXQvc3JjL2ZsYXNoeC90ZXh0TGF5b3V0L2NvbnRhaW5lci9Db2x1bW5TdGF0ZS5hcwpAQCAtMjEsNyArMjEsNyBAQAogCWltcG9ydCBmbGFzaC5nZW9tLlJlY3RhbmdsZTsKIAkKIAlpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQuZGVidWcuYXNzZXJ0OwotCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5lbGVtZW50cy5UYWJsZURhdGFDZWxsRWxlbWVudDsKKwlpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQuZWxlbWVudHMuVGFibGVDZWxsRWxlbWVudDsKIAlpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQuZm9ybWF0cy5CbG9ja1Byb2dyZXNzaW9uOwogCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5mb3JtYXRzLkRpcmVjdGlvbjsKIAlpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQuZm9ybWF0cy5Gb3JtYXRWYWx1ZTsKQEAgLTE4MSwxMiArMTgxLDEyIEBACiAJCQlyZXR1cm4gX2NvbHVtbkNvdW50ID09IDEgPyBfc2luZ2xlQ29sdW1uIDogX2NvbHVtbkFycmF5W2luZGV4XTsKIAkJfQogCQkKLQkJcHVibGljIGZ1bmN0aW9uIGdldENlbGxBdChpbmRleDppbnQpOlRhYmxlRGF0YUNlbGxFbGVtZW50CisJCXB1YmxpYyBmdW5jdGlvbiBnZXRDZWxsQXQoaW5kZXg6aW50KTpUYWJsZUNlbGxFbGVtZW50CiAJCXsKIAkJCXJldHVybiBfdGFibGVDZWxsQXJyYXlbaW5kZXhdOwogCQl9CiAJCQotCQlwdWJsaWMgZnVuY3Rpb24gcHVzaFRhYmxlQ2VsbChjZWxsOlRhYmxlRGF0YUNlbGxFbGVtZW50KTp2b2lkCisJCXB1YmxpYyBmdW5jdGlvbiBwdXNoVGFibGVDZWxsKGNlbGw6VGFibGVDZWxsRWxlbWVudCk6dm9pZAogCQl7CiAJCQlpZiAoIF90YWJsZUNlbGxBcnJheSA9PSBudWxsICkKIAkJCQlfdGFibGVDZWxsQXJyYXkgPSBuZXcgQXJyYXkoKTsKZGlmZiAtLWdpdCBhL3RleHRMYXlvdXQvc3JjL2ZsYXNoeC90ZXh0TGF5b3V0L2NvbnRhaW5lci9Db250YWluZXJDb250cm9sbGVyLmFzIGIvdGV4dExheW91dC9zcmMvZmxhc2h4L3RleHRMYXlvdXQvY29udGFpbmVyL0NvbnRhaW5lckNvbnRyb2xsZXIuYXMKaW5kZXggZjk5MjczNC4uYTAwMDAzNSAxMDA2NDQKLS0tIGEvdGV4dExheW91dC9zcmMvZmxhc2h4L3RleHRMYXlvdXQvY29udGFpbmVyL0NvbnRhaW5lckNvbnRyb2xsZXIuYXMKKysrIGIvdGV4dExheW91dC9zcmMvZmxhc2h4L3RleHRMYXlvdXQvY29udGFpbmVyL0NvbnRhaW5lckNvbnRyb2xsZXIuYXMKQEAgLTgwLDYgKzgwLDUzIEBACiAKICAgICB1c2UgbmFtZXNwYWNlIHRsZl9pbnRlcm5hbDsKIAkKKwlpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQuY29tcG9zZS5GbG9hdENvbXBvc2l0aW9uRGF0YTsKKwlpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQuY29tcG9zZS5GbG93Q29tcG9zZXJCYXNlOworCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5jb21wb3NlLkZsb3dEYW1hZ2VUeXBlOworCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5jb21wb3NlLklGbG93Q29tcG9zZXI7CisJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmNvbXBvc2UuVGV4dEZsb3dMaW5lOworCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5jb21wb3NlLlRleHRGbG93VGFibGVCbG9jazsKKwlpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQuY29tcG9zZS5UZXh0TGluZVJlY3ljbGVyOworCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5kZWJ1Zy5EZWJ1Z2dpbmc7CisJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmRlYnVnLmFzc2VydDsKKwlpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQuZWRpdC5FZGl0aW5nTW9kZTsKKwlpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQuZWRpdC5JSW50ZXJhY3Rpb25FdmVudEhhbmRsZXI7CisJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmVkaXQuSVNlbGVjdGlvbk1hbmFnZXI7CisJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmVkaXQuU2VsZWN0aW9uRm9ybWF0OworCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5lbGVtZW50cy5CYWNrZ3JvdW5kTWFuYWdlcjsKKwlpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQuZWxlbWVudHMuQ2VsbENvb3JkaW5hdGVzOworCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5lbGVtZW50cy5DZWxsUmFuZ2U7CisJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmVsZW1lbnRzLkNvbmZpZ3VyYXRpb247CisJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmVsZW1lbnRzLkNvbnRhaW5lckZvcm1hdHRlZEVsZW1lbnQ7CisJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmVsZW1lbnRzLkZsb3dFbGVtZW50OworCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5lbGVtZW50cy5GbG93TGVhZkVsZW1lbnQ7CisJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmVsZW1lbnRzLkZsb3dWYWx1ZUhvbGRlcjsKKwlpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQuZWxlbWVudHMuSW5saW5lR3JhcGhpY0VsZW1lbnQ7CisJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmVsZW1lbnRzLkxpbmtFbGVtZW50OworCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5lbGVtZW50cy5QYXJhZ3JhcGhFbGVtZW50OworCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5lbGVtZW50cy5UYWJsZUJsb2NrQ29udGFpbmVyOworCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5lbGVtZW50cy5UYWJsZUNlbGxFbGVtZW50OworCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5lbGVtZW50cy5UYWJsZUVsZW1lbnQ7CisJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmVsZW1lbnRzLlRhYmxlUm93RWxlbWVudDsKKwlpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQuZWxlbWVudHMuVGV4dEZsb3c7CisJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmV2ZW50cy5GbG93RWxlbWVudE1vdXNlRXZlbnQ7CisJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmV2ZW50cy5GbG93RWxlbWVudE1vdXNlRXZlbnRNYW5hZ2VyOworCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5ldmVudHMuTW9kZWxDaGFuZ2U7CisJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmV2ZW50cy5TY3JvbGxFdmVudDsKKwlpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQuZXZlbnRzLlNjcm9sbEV2ZW50RGlyZWN0aW9uOworCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5ldmVudHMuVGV4dExheW91dEV2ZW50OworCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5ldmVudHMuVXBkYXRlQ29tcGxldGVFdmVudDsKKwlpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQuZm9ybWF0cy5CbG9ja1Byb2dyZXNzaW9uOworCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5mb3JtYXRzLkZsb2F0OworCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5mb3JtYXRzLkZvcm1hdFZhbHVlOworCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5mb3JtYXRzLklUZXh0TGF5b3V0Rm9ybWF0OworCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5mb3JtYXRzLlRleHRMYXlvdXRGb3JtYXQ7CisJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LnByb3BlcnR5LlByb3BlcnR5OworCWltcG9ydCBmbGFzaHgudGV4dExheW91dC50bGZfaW50ZXJuYWw7CisJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LnV0aWxzLlR3aXBzOworCQorCXVzZSBuYW1lc3BhY2UgdGxmX2ludGVybmFsOworCQogCS8qKiAKIAkgKiBUaGUgQ29udGFpbmVyQ29udHJvbGxlciBjbGFzcyBkZWZpbmVzIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBhIFRleHRGbG93IG9iamVjdCBhbmQgYSBjb250YWluZXIuCiAJICogQSBUZXh0RmxvdyBtYXkgaGF2ZSBvbmUgb3IgbW9yZSByZWN0YW5ndWxhciBhcmVhcyB0aGF0IGNhbiBob2xkIHRleHQ7IHRoZSB0ZXh0IGlzIHNhaWQgdG8gYmUgZmxvd2luZwpAQCAtMTA5LDcgKzE1Niw2IEBACiAJcHVibGljIGNsYXNzIENvbnRhaW5lckNvbnRyb2xsZXIgaW1wbGVtZW50cyBJSW50ZXJhY3Rpb25FdmVudEhhbmRsZXIsIElUZXh0TGF5b3V0Rm9ybWF0LCBJU2FuZGJveFN1cHBvcnQKIAl7CQkKIAkJc3RhdGljIHRsZl9pbnRlcm5hbCB2YXIgdXNlc0Rpc2NyZXRpb25hcnlIeXBoZW5zOkJvb2xlYW4gPSB0cnVlOwotCQlzdGF0aWMgdGxmX2ludGVybmFsIHZhciBzdGFydENvbXBvc2VGcm9tQmVnaW5uaW5nOkJvb2xlYW4gPSBmYWxzZTsKIAkJCiAJCXByaXZhdGUgdmFyIF90ZXh0Rmxvd0NhY2hlOlRleHRGbG93OwogCQlwcml2YXRlIHZhciBfcm9vdEVsZW1lbnQ6Q29udGFpbmVyRm9ybWF0dGVkRWxlbWVudDsKQEAgLTE3NSw2ICsyMjEsNyBAQAogCQkKIAkJcHJpdmF0ZSB2YXIgX2xpbmVzSW5WaWV3OkFycmF5OwkvLyBsaW5lcyB0aGF0IHdlcmUgaW4gdmlldyBhY2NvcmRpbmcgdG8gdGhlIHByZXZpb3VzIGNvbXBvc2UoKS4gRW1wdHkgaWYgdGhlIGxpbmVzIGhhdmUgYWxyZWFkeSBiZWVuIHBvc3RlZCB0byB0aGUgZGlzcGxheSBsaXN0LgogCQlwcml2YXRlIHZhciBfdXBkYXRlU3RhcnQ6aW50OworCQlwcml2YXRlIHZhciBfdGFibGVCbG9ja3NJblZpZXc6QXJyYXk7IC8vIC8vIHRhYmxlIGJsb2NrcyB0aGF0IHdlcmUgaW4gdmlldyBhY2NvcmRpbmcgdG8gdGhlIHByZXZpb3VzIGNvbXBvc2UoKS4gRW1wdHkgaWYgdGhlIGxpbmVzIGhhdmUgYWxyZWFkeSBiZWVuIHBvc3RlZCB0byB0aGUgZGlzcGxheSBsaXN0LgogCQkKIAkJcHJpdmF0ZSB2YXIgX2NvbXBvc2VkRmxvYXRzOkFycmF5OyAgLy8gZmxvYXRzIHRoYXQgd2VyZSBjb21wb3NlZCBpbnRvIHRoZSBjb250cm9sbGVyIC0tIGFycmF5IG9mIEZsb2F0Q29tcG9zaXRpb25EYXRhCiAJCXByaXZhdGUgdmFyIF9mbG9hdHNJbkNvbnRhaW5lcjpBcnJheTsgIC8vIGZsb2F0cyBhcmUgY3VycmVudGx5IGluIHZpZXcgLS0gYXJyYXkgb2YgRGlzcGxheU9iamVjdApAQCAtMjY0LDYgKzMxMSw3IEBACiAJCQkKIAkJCV9zaGFwZUNoaWxkcmVuID0gWyBdOwogCQkJX2xpbmVzSW5WaWV3ID0gWyBdOworCQkJX3RhYmxlQmxvY2tzSW5WaWV3ID0gW107CiAJCQkKIAkJCXNldENvbXBvc2l0aW9uU2l6ZShjb21wb3NpdGlvbldpZHRoLCBjb21wb3NpdGlvbkhlaWdodCk7CiAJCQlmb3JtYXQgPSBfY29udGFpbmVyQ29udHJvbGxlckluaXRpYWxGb3JtYXQ7CkBAIC0zOTQsNyArNDQyLDcgQEAKIAkJLyoqIAogCQkgKiBTZXRzIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IGFsbG93ZWQgZm9yIHRleHQgaW4gdGhlIGNvbnRhaW5lci4gV2lkdGggYW5kIGhlaWdodCBjYW4gYmUgc3BlY2lmaWVkIGluIHBpeGVscyBvciA8Y29kZT5OYU48L2NvZGU+IGNhbiBiZSB1c2VkIGZvciBlaXRoZXIgdmFsdWUuICA8Y29kZT5OYU48L2NvZGU+IGluZGljYXRlcyBtZWFzdXJlIHRoYXQgdmFsdWUuIAogCQkgKiBUaGlzIGNhbiBiZSB1c2VkIHRvIGZpbmQgdGhlIHdpZGVzdCBsaW5lIGFuZC9vciB0aGUgdG90YWwgaGVpZ2h0IG9mIGFsbCB0aGUgY29udGVudC4gIFdoZW4gTmFOIGlzIHNwZWNpZmllZCBhcyB0aGUgd2lkdGggbGluZXMgYXJlIGJyb2tlbiB3aXRoIGEgbWF4aW11bSB3aWR0aCBvZiA8Y29kZT5UZXh0TGluZS5NQVhfTElORV9XSURUSDwvY29kZT4uIAotCQkgKiBXaGVuIDxjb2RlPk5hTjwvY29kZT4gaXMgc3BlY2lmaWVkIGFzIHRoZSBoZWlnaHQgdGhlIGNvbnRhaW5lciBpcyBhc3N1bWVkIHRvIGhhdmUgdW5saW1pdGVkIGhlaWdodC4gIFRoZSBhY3R1YWwgbWVhc3VyZWQgdmFsdWVzIGNhbiBiZSByZWFkeSBiYWNrIGluIDxjb2RlPmdldENvbnRlbnRCb3VuZHM8L2NvZGU+LiAgCisJCSAqIFdoZW4gPGNvZGU+TmFOPC9jb2RlPiBpcyBzcGVjaWZpZWQgYXMgdGhlIGhlaWdodCB0aGUgY29udGFpbmVyIGlzIGFzc3VtZWQgdG8gaGF2ZSB1bmxpbWl0ZWQgaGVpZ2h0LiAgVGhlIGFjdHVhbCBtZWFzdXJlZCB2YWx1ZXMgY2FuIGJlIHJlYWQgYmFjayBpbiA8Y29kZT5nZXRDb250ZW50Qm91bmRzPC9jb2RlPi4gIAogCQkgKiBXaGVuIHRoZSBjb21wdXRlZCA8Y29kZT5ibG9ja1Byb2dyZXNzaW9uPC9jb2RlPiBwcm9wZXJ0eSBvZiA8Y29kZT5UZXh0RmxvdzwvY29kZT4KIAkJICogaXMgPGNvZGU+QmxvY2tQcm9ncmVzc2lvbi5STDwvY29kZT4gdGhlIG1lYW5pbmdzIG9mIHdpZHRoIGFuZCBoZWlnaHQgYXJlIGV4Y2hhbmdlZC4KIAkJICoKQEAgLTQxMiw3ICs0NjAsNyBAQAogCQkgKiBAbGFuZ3ZlcnNpb24gMy4wCiAJCSAqLwogCQkKLQkJcHVibGljIGZ1bmN0aW9uIHNldENvbXBvc2l0aW9uU2l6ZSh3Ok51bWJlcixoOk51bWJlcik6dm9pZAorCQlwdWJsaWMgZnVuY3Rpb24gc2V0Q29tcG9zaXRpb25TaXplKHc6TnVtYmVyLCBoOk51bWJlcik6dm9pZAogCQl7CiAJCS8vCXRyYWNlKCJzZXRDb21wb3NpdGlvblNpemUoIiArIHcgKyAiLCAiICsgaCArICIpIik7CiAJCQkKQEAgLTczNCwxMyArNzgyLDE5IEBACiAJCQkJdmFyIGN1ckxpbmU6VGV4dEZsb3dMaW5lOwogCQkJCXZhciB0ZXh0TGluZTpUZXh0TGluZTsKIAkJCQl2YXIgbGluZUluZGV4OmludDsKKwkJCQl2YXIgdGVzdFJzbHQ6KjsKIAkJCQkKIAkJCQkvL1VzZSBiaW5hcnkgc2VhcmNoIHdoZW4gdGhlcmUgaXMgb25lIHNpbmdsZSBjb2x1bW4KIAkJCQlpZihjb2x1bW5Db3VudCA9PSAxKQogCQkJCXsKIAkJCQkJLy8gRmlyc3QganVzdCB0ZXN0IHRoZSBmaXJzdExpbmUgLSBub3JtYWwgdW5zY3JvbGxlZCBjYXNlCi0JCQkJCWN1ckxpbmUgPSBmbG93Q29tcG9zZXIuZ2V0TGluZUF0KGZpcnN0TGluZSk7CQotCQkJCQl0ZXh0TGluZSA9IHRlc3RMaW5lVmlzaWJsZSh3bW9kZSwgc2Nyb2xsQWRqdXN0WFRXLCBzY3JvbGxBZGp1c3RZVFcsIHNjcm9sbEFkanVzdFdpZHRoVFcsIHNjcm9sbEFkanVzdEhlaWdodFRXLCBjdXJMaW5lLCBudWxsKSBhcyBUZXh0TGluZTsKKwkJCQkJdmFyIHRlc3RQb3M6aW50ID0gZmlyc3RMaW5lOworCQkJCQljdXJMaW5lID0gZmxvd0NvbXBvc2VyLmdldExpbmVBdCh0ZXN0UG9zKyspOworCQkJCQl3aGlsZShjdXJMaW5lICYmIGN1ckxpbmUgaXMgVGV4dEZsb3dUYWJsZUJsb2NrKQorCQkJCQkJY3VyTGluZSA9IGZsb3dDb21wb3Nlci5nZXRMaW5lQXQodGVzdFBvcysrKTsKKwkJCQkJCisJCQkJCXRlc3RSc2x0ID0gdGVzdExpbmVWaXNpYmxlKHdtb2RlLCBzY3JvbGxBZGp1c3RYVFcsIHNjcm9sbEFkanVzdFlUVywgc2Nyb2xsQWRqdXN0V2lkdGhUVywgc2Nyb2xsQWRqdXN0SGVpZ2h0VFcsIGN1ckxpbmUsIG51bGwpCisJCQkJCXRleHRMaW5lID0gdGVzdFJzbHQgYXMgVGV4dExpbmU7CiAJCQkJCWZpcnN0TGluZSsrOwkvLyBpdHMgYmVlbiB0ZXN0ZWQKIAkJCQkJaWYgKHRleHRMaW5lKQogCQkJCQl7CkBAIC03NTYsMTAgKzgxMCwxMSBAQAogCQkJCQkJCXZhciBtaWQ6aW50ID0gKGZpcnN0TGluZStoaSkvMjsKIAkJCQkJCQlDT05GSUc6OmRlYnVnIHsgYXNzZXJ0KG1pZCAhPSAwLCJDb250YWluZXJDb250cm9sbGVyOmdhdGhlclZpc2libGVMaW5lczogYmFkIG1pZCIpOyB9CiAJCQkJCQkJY3VyTGluZSA9IGZsb3dDb21wb3Nlci5nZXRMaW5lQXQobWlkKTsKLQkJCQkJCQl2YXIgdGVzdFJzbHQ6KiA9IHRlc3RMaW5lVmlzaWJsZSh3bW9kZSwgc2Nyb2xsQWRqdXN0WFRXLCBzY3JvbGxBZGp1c3RZVFcsIHNjcm9sbEFkanVzdFdpZHRoVFcsIHNjcm9sbEFkanVzdEhlaWdodFRXLCBjdXJMaW5lLCBudWxsKTsKLQkJCQkJCQl0ZXh0TGluZSA9IHRlc3RSc2x0IGFzIFRleHRMaW5lOwotCQkJCQkJCWlmICh0ZXh0TGluZSkKKwkJCQkJCQl0ZXN0UnNsdCA9IHRlc3RMaW5lVmlzaWJsZSh3bW9kZSwgc2Nyb2xsQWRqdXN0WFRXLCBzY3JvbGxBZGp1c3RZVFcsIHNjcm9sbEFkanVzdFdpZHRoVFcsIHNjcm9sbEFkanVzdEhlaWdodFRXLCBjdXJMaW5lLCBudWxsKTsKKwkJCQkJCQkKKwkJCQkJCQlpZiAodGVzdFJzbHQgJiYgdGVzdFJzbHQgaXMgVGV4dExpbmUpCiAJCQkJCQkJeworCQkJCQkJCQl0ZXh0TGluZSA9IHRlc3RSc2x0IGFzIFRleHRMaW5lOwogCQkJCQkJCQkvLyBub3RlIHRoYXQgd2UgdGVzdGVkIGZpcnN0TGluZSBhYm92ZSBzbyBnb2luZyB0byBtaWQtMSBpcyBhbHdheXMgdmFsaWQKIAkJCQkJCQkJdmFyIHRlbXBMaW5lOlRleHRGbG93TGluZSA9IGZsb3dDb21wb3Nlci5nZXRMaW5lQXQobWlkLTEpOwogCQkJCQkJCQlpZiAoISh0ZXN0TGluZVZpc2libGUod21vZGUsIHNjcm9sbEFkanVzdFhUVywgc2Nyb2xsQWRqdXN0WVRXLCBzY3JvbGxBZGp1c3RXaWR0aFRXLCBzY3JvbGxBZGp1c3RIZWlnaHRUVywgdGVtcExpbmUsIG51bGwpIGlzIFRleHRMaW5lKSkKQEAgLTc3Myw2ICs4MjgsOCBAQAogCQkJCQkJCQl9CiAJCQkJCQkJCXRlc3RSc2x0ID0gLTE7CS8vIHBhc3QgdGhlIHN0YXJ0CiAJCQkJCQkJfQorCQkJCQkJCS8vIG5lZWQgdG8gZGVhbCB3aXRoIFRleHRGbG93VGFibGVCbG9ja3MKKwkJCQkJCQkKIAkJCQkJCQlpZiAodGVzdFJzbHQgPCAwIHx8IHRlc3RSc2x0ID09IDIpCiAJCQkJCQkJCWhpID0gbWlkLTE7CiAJCQkJCQkJZWxzZQpAQCAtNzgyLDggKzgzOSwxMiBAQAogCQkJCQkKIAkJCQkJZm9yIChsaW5lSW5kZXggPSBmaXJzdExpbmU7IGxpbmVJbmRleCA8PSBsYXN0TGluZTsgbGluZUluZGV4KyspCiAJCQkJCXsKLQkJCQkJCWN1ckxpbmUgPSBmbG93Q29tcG9zZXIuZ2V0TGluZUF0KGxpbmVJbmRleCk7CQotCQkJCQkJdGV4dExpbmUgPSB0ZXN0TGluZVZpc2libGUod21vZGUsIHNjcm9sbEFkanVzdFhUVywgc2Nyb2xsQWRqdXN0WVRXLCBzY3JvbGxBZGp1c3RXaWR0aFRXLCBzY3JvbGxBZGp1c3RIZWlnaHRUVywgY3VyTGluZSwgbnVsbCkgYXMgVGV4dExpbmU7CisJCQkJCQljdXJMaW5lID0gZmxvd0NvbXBvc2VyLmdldExpbmVBdChsaW5lSW5kZXgpOworCQkJCQkJdGVzdFJzbHQgPSB0ZXN0TGluZVZpc2libGUod21vZGUsIHNjcm9sbEFkanVzdFhUVywgc2Nyb2xsQWRqdXN0WVRXLCBzY3JvbGxBZGp1c3RXaWR0aFRXLCBzY3JvbGxBZGp1c3RIZWlnaHRUVywgY3VyTGluZSwgbnVsbCk7CisJCQkJCQkKKwkJCQkJCWlmKHRlc3RSc2x0IGlzIFRhYmxlQmxvY2tDb250YWluZXIpCisJCQkJCQkJY29udGludWU7CisJCQkJCQl0ZXh0TGluZSA9IHRlc3RSc2x0IGFzIFRleHRMaW5lOwogCQkJCQkJaWYgKCF0ZXh0TGluZSkKIAkJCQkJCQlicmVhazsKIAkJCkBAIC0yODE1LDYgKzI4NzYsNDIgQEAKIAkJCWFkZFNlbGVjdGlvbkNoaWxkKHNlbE9iaik7CiAJCX0KIAkJCisJCS8qKiBBZGQgY2VsbCBzZWxlY3Rpb24gc2hhcGVzIHRvIHRoZSBkaXNwbGF5bGlzdC4gQHByaXZhdGUgKi8KKwkJdGxmX2ludGVybmFsIGZ1bmN0aW9uIGFkZENlbGxTZWxlY3Rpb25TaGFwZXMoY29sb3I6dWludCwgdGFibGVCbG9jazpUZXh0Rmxvd1RhYmxlQmxvY2ssIHN0YXJ0Q29vcmRzOkNlbGxDb29yZGluYXRlcywgZW5kQ29vcmRzOkNlbGxDb29yZGluYXRlcyk6IHZvaWQKKwkJeworCQkJaWYoIXRhYmxlQmxvY2spCisJCQkJcmV0dXJuOworCQkJaWYoIXN0YXJ0Q29vcmRzLmlzVmFsaWQoKSB8fCAhZW5kQ29vcmRzLmlzVmFsaWQoKSkKKwkJCQlyZXR1cm47CisJCQl2YXIgY2VsbHM6VmVjdG9yLjxUYWJsZUNlbGxFbGVtZW50PiA9IHRhYmxlQmxvY2suZ2V0Q2VsbHNJblJhbmdlKHN0YXJ0Q29vcmRzLGVuZENvb3Jkcyk7CisJCQl2YXIgc2VsT2JqOlNoYXBlID0gbmV3IFNoYXBlKCk7CisJCQlzZWxPYmouZ3JhcGhpY3MuYmVnaW5GaWxsKGNvbG9yKTsKKwkJCWZvciBlYWNoKCB2YXIgY2VsbDpUYWJsZUNlbGxFbGVtZW50IGluIGNlbGxzKQorCQkJeworCQkJCXZhciByb3c6VGFibGVSb3dFbGVtZW50ID0gY2VsbC5nZXRSb3coKTsKKwkJCQl2YXIgcjpSZWN0YW5nbGUgPSBuZXcgUmVjdGFuZ2xlKGNlbGwueCwgY2VsbC55ICsgdGFibGVCbG9jay55LCBjZWxsLndpZHRoLCByb3cuY29tcG9zZWRIZWlnaHQpOworCQkJCXNlbE9iai5ncmFwaGljcy5kcmF3UmVjdChyLngsci55LHIud2lkdGgsci5oZWlnaHQpOworCQkJfQorCQkJYWRkU2VsZWN0aW9uQ2hpbGQoc2VsT2JqKTsKKwkJfQorCQkKKwkJLyoqIAorCQkgKiBBZGQgY2VsbCBzZWxlY3Rpb24gc2hhcGVzIHRvIHRoZSBkaXNwbGF5bGlzdC4KKwkJICogKi8KKwkJdGxmX2ludGVybmFsIGZ1bmN0aW9uIGFkZENlbGxTZWxlY3Rpb25zKGNlbGxzOkFycmF5LCBjb2xvcjp1aW50LCB0YWJsZUJsb2NrOlRleHRGbG93VGFibGVCbG9jayk6IHZvaWQKKwkJeworCQkJdmFyIHNoYXBlOlNoYXBlID0gbmV3IFNoYXBlKCk7CisJCQlzaGFwZS5ncmFwaGljcy5iZWdpbkZpbGwoY29sb3IpOworCQkJCisJCQlmb3IgZWFjaCh2YXIgY2VsbDpUYWJsZUNlbGxFbGVtZW50IGluIGNlbGxzKSB7CisJCQkJdmFyIHJvdzpUYWJsZVJvd0VsZW1lbnQgPSBjZWxsLmdldFJvdygpOworCQkJCXZhciByZWN0YW5nbGU6UmVjdGFuZ2xlID0gbmV3IFJlY3RhbmdsZShjZWxsLngsIGNlbGwueSArIHRhYmxlQmxvY2sueSwgY2VsbC53aWR0aCwgcm93LmNvbXBvc2VkSGVpZ2h0KTsKKwkJCQlzaGFwZS5ncmFwaGljcy5kcmF3UmVjdChyZWN0YW5nbGUueCwgcmVjdGFuZ2xlLnksIHJlY3RhbmdsZS53aWR0aCwgcmVjdGFuZ2xlLmhlaWdodCk7CisJCQl9CisJCQkKKwkJCWFkZFNlbGVjdGlvbkNoaWxkKHNoYXBlKTsKKwkJfQorCQkKIAkJLyoqIEFkZCBzZWxlY3Rpb24gc2hhcGVzIHRvIHRoZSBkaXNwbGF5bGlzdC4gQHByaXZhdGUgKi8KIAkJdGxmX2ludGVybmFsIGZ1bmN0aW9uIGFkZFNlbGVjdGlvblNoYXBlcyhzZWxGb3JtYXQ6U2VsZWN0aW9uRm9ybWF0LCBzZWxlY3Rpb25BYnNvbHV0ZVN0YXJ0OmludCwgc2VsZWN0aW9uQWJzb2x1dGVFbmQ6aW50KTogdm9pZAogCQl7CkBAIC0yODU5LDYgKzI5NTYsNyBAQAogCQkJCXsKIAkJCQkJbmV4dExpbmUgPSBpZHggIT0gZmxvd0NvbXBvc2VyLm51bUxpbmVzIC0gMSA/IGZsb3dDb21wb3Nlci5nZXRMaW5lQXQoaWR4KzEpIDogbnVsbDsKIAkJCQkJCisJCQkJCS8vIDktMS0xNCBIYXJicyBEbyB3ZSBkcmF3IGEgc2VsZWN0aW9uIHJlY3QgZm9yIHRhYmxlcz8gSWYgeWVzLCB0aGlzIG5lZWRzIHNwZWNpYWwgaGFuZGxpbmcgaW4gVGV4dEZsb3dUYWJsZUJsb2NrCiAJCQkJCWxpbmUuaGlsaXRlQmxvY2tTZWxlY3Rpb24oc2VsT2JqLCBzZWxGb3JtYXQsIHRoaXMuX2NvbnRhaW5lciwKIAkJCQkJCXNlbGVjdGlvbkFic29sdXRlU3RhcnQgPCBsaW5lLmFic29sdXRlU3RhcnQgPyBsaW5lLmFic29sdXRlU3RhcnQgOiBzZWxlY3Rpb25BYnNvbHV0ZVN0YXJ0LAogCQkJCQkJc2VsZWN0aW9uQWJzb2x1dGVFbmQgPiBsaW5lLmFic29sdXRlU3RhcnQrbGluZS50ZXh0TGVuZ3RoID8gbGluZS5hYnNvbHV0ZVN0YXJ0K2xpbmUudGV4dExlbmd0aCA6IHNlbGVjdGlvbkFic29sdXRlRW5kLCBwcmV2TGluZSwgbmV4dExpbmUpOwpAQCAtMjkwNyw3ICszMDA1LDcgQEAKIAkJewogCQkJLy8gSWYgdGhlcmUncyBubyBzZWxlY3Rpb25TcHJpdGUgb24gdGhpcyBjb250cm9sbGVyLCB3ZSB1c2UgdGhlIHBhcmVudCdzLgogCQkJLy8gVGhhdCBtZWFucyB3ZSBoYXZlIHRvIHRyYW5zbGF0ZSB0aGUgY29vcmRpbmF0ZXMuCi0JCQkvLyBUT0RPOiB0aGlzIG9ubHkgc3VwcG9ydHMgb25lIGxldmVsIG9mIG50ZXN0aW5nCisJCQkvLyBUT0RPOiB0aGlzIG9ubHkgc3VwcG9ydHMgb25lIGxldmVsIG9mIG5lc3RpbmcKIAkJCXZhciBzZWxlY3Rpb25TcHJpdGU6RGlzcGxheU9iamVjdENvbnRhaW5lciA9IGdldFNlbGVjdGlvblNwcml0ZSh0cnVlKTsKIAkJCQogCQkJaWYgKHNlbGVjdGlvblNwcml0ZSA9PSBudWxsKQpAQCAtMjkyMiw3ICszMDIwLDcgQEAKIAkJCQlzZWxlY3Rpb25TcHJpdGUuYmxlbmRNb2RlID0gY3VyQmxlbmRNb2RlOwogCQkJCiAJCQlpZiAoc2VsZWN0aW9uU3ByaXRlLmFscGhhICE9IGN1ckFscGhhKQotCQkJCXNlbGVjdGlvblNwcml0ZS5hbHBoYSA9IGN1ckFscGhhOworCQkJCXNlbGVjdGlvblNwcml0ZS5hbHBoYSA9IDE7Ly9jdXJBbHBoYTsgdGVzdGluZyByZW1vdmUgdGhpcyAKIAkJCQogCQkJaWYgKHNlbGVjdGlvblNwcml0ZS5udW1DaGlsZHJlbiA9PSAwKQogCQkJCWFkZFNlbGVjdGlvbkNvbnRhaW5lcihzZWxlY3Rpb25TcHJpdGUpOwpAQCAtMzA0NiwxMCArMzE0NCwxMyBAQAogCQl7CiAJCQlzZXRUZXh0TGVuZ3RoKDApOyAKIAkJCQotCQkJZm9yIGVhY2ggKHZhciB0ZXh0TGluZTpUZXh0TGluZSBpbiBfc2hhcGVDaGlsZHJlbikKKwkJCWZvciBlYWNoICh2YXIgbGluZToqIGluIF9zaGFwZUNoaWxkcmVuKQogCQkJewotCQkJCXJlbW92ZVRleHRMaW5lKHRleHRMaW5lKTsKLQkJCQlDT05GSUc6OmRlYnVnIHsgRGVidWdnaW5nLnRyYWNlRlRFQ2FsbChudWxsLF9jb250YWluZXIsInJlbW92ZVRleHRMaW5lIix0ZXh0TGluZSk7IH0KKwkJCQlpZihsaW5lIGlzIFRleHRMaW5lKQorCQkJCQlyZW1vdmVUZXh0TGluZShsaW5lIGFzIFRleHRMaW5lKTsKKwkJCQllbHNlCisJCQkJCXJlbW92ZVRhYmxlQmxvY2sobGluZSBhcyBUYWJsZUJsb2NrQ29udGFpbmVyKTsKKwkJCQlDT05GSUc6OmRlYnVnIHsgRGVidWdnaW5nLnRyYWNlRlRFQ2FsbChudWxsLF9jb250YWluZXIsInJlbW92ZVRleHRMaW5lIixsaW5lKTsgfQogCQkJfQogCQkJX3NoYXBlQ2hpbGRyZW4ubGVuZ3RoID0gMDsKIAkJCV9saW5lc0luVmlldy5sZW5ndGggPSAwOwpAQCAtMzA2Miw2ICszMTYzLDIxIEBACiAJCQogCQlwcml2YXRlIHN0YXRpYyB2YXIgc2NyYXRjaFJlY3RhbmdsZTpSZWN0YW5nbGUgPSBuZXcgUmVjdGFuZ2xlKCk7CiAJCQorCQlwcml2YXRlIGZ1bmN0aW9uIGludGVyc3BlcnNlVGFibGVCbG9ja3ModGFyZ2V0QXJyYXk6QXJyYXkpOnZvaWR7CisJCQlpZihfdGFibGVCbG9ja3NJblZpZXcubGVuZ3RoID09IDApCisJCQkJcmV0dXJuOworCQkJdmFyIGJsb2NrSWR4OmludCA9IDA7CisJCQl2YXIgc3RhcnRMb2M6aW50ID0gKF90YWJsZUJsb2Nrc0luVmlld1swXSBhcyBUYWJsZUJsb2NrQ29udGFpbmVyKS51c2VyRGF0YS5wYXJlbnRUYWJsZS5nZXRBYnNvbHV0ZVN0YXJ0KCk7CisJCQlmb3IodmFyIGk6aW50PTA7aTx0YXJnZXRBcnJheS5sZW5ndGg7aSsrKXsKKwkJCQlpZiggdGFyZ2V0QXJyYXlbaV0udXNlckRhdGEuYWJzb2x1dGVTdGFydCA8IHN0YXJ0TG9jICkKKwkJCQkJY29udGludWU7CisJCQkJdGFyZ2V0QXJyYXkuc3BsaWNlKGksMCxfdGFibGVCbG9ja3NJblZpZXdbYmxvY2tJZHgrK10pOworCQkJCWlmKGJsb2NrSWR4ID09IF90YWJsZUJsb2Nrc0luVmlldy5sZW5ndGgpCisJCQkJCWJyZWFrOworCQkJfQorCQkJd2hpbGUoYmxvY2tJZHggPCBfdGFibGVCbG9ja3NJblZpZXcubGVuZ3RoKQorCQkJCXRhcmdldEFycmF5LnB1c2goX3RhYmxlQmxvY2tzSW5WaWV3W2Jsb2NrSWR4KytdKTsKKwkJfQogCQkvKiogQWRkIERpc3BsYXlPYmplY3RzIHRoYXQgd2VyZSBjcmVhdGVkIGJ5IGNvbXBvc2l0aW9uIHRvIHRoZSBjb250YWluZXIuIEBwcml2YXRlICovCiAJCXRsZl9pbnRlcm5hbCBmdW5jdGlvbiB1cGRhdGVDb21wb3NpdGlvblNoYXBlcygpOnZvaWQKIAkJewpAQCAtMzA4OSw2ICszMjA1LDkgQEAKIAkJCWZpbGxTaGFwZUNoaWxkcmVuKCk7CiAJCQl2YXIgbmV3U2hhcGVDaGlsZHJlbjpBcnJheSA9IF9saW5lc0luVmlldzsKIAkJCQorCQkJLy8gQWRkIGluIHRhYmxlIGJsb2NrcworCQkJaW50ZXJzcGVyc2VUYWJsZUJsb2NrcyhuZXdTaGFwZUNoaWxkcmVuKTsKKwkJCQogCQkJdmFyIGNoaWxkSWR4OmludCA9IGdldEZpcnN0VGV4dExpbmVDaGlsZEluZGV4KCk7IC8vIGluZGV4IHdoZXJlIHRoZSBmaXJzdCB0ZXh0IGxpbmUgbXVzdCBhcHBlYXIgYXQgaW4gaXRzIGNvbnRhaW5lciAgCiAJCQl2YXIgbmV3SWR4OmludCA9IDA7CQkvLyBvZmZzZXQgaW50byBuZXdTaGFwZUNoaWxkcmVuCiAJCQl2YXIgc2hhcGVDaGlsZHJlblN0YXJ0SWR4OmludCA9IDA7CS8vIHN0YXJ0aW5nIG9mZnNldCBpbnRvIHNoYXBlQ2hpbGRyZW4KQEAgLTMxMDAsMTEgKzMyMTksMTQgQEAKIAkJCS8vIGJlZ2lubmluZyBhcyB1c3VhbC4gVGhpcyBjYW4gaGFwcGVuIGlmIHdlJ3JlIHNjcm9sbGVkIGZvcndhcmQsIGFuZCB0aGVuIGVkaXQgdGhlIGZpcnN0IHZpc2libGUgbGluZS4KIAkJCWlmIChfdXBkYXRlU3RhcnQgPiBhYnNvbHV0ZVN0YXJ0ICYmIG5ld1NoYXBlQ2hpbGRyZW4ubGVuZ3RoID4gMCkKIAkJCXsKLQkJCQl2YXIgZmlyc3RUZXh0TGluZTpUZXh0TGluZSA9IG5ld1NoYXBlQ2hpbGRyZW5bMF07Ci0JCQkJdmFyIGZpcnN0TGluZTpUZXh0Rmxvd0xpbmUgPSBUZXh0Rmxvd0xpbmUoZmlyc3RUZXh0TGluZS51c2VyRGF0YSk7CisJCQkJdmFyIGZpcnN0TGluZTpUZXh0Rmxvd0xpbmUgPSBUZXh0Rmxvd0xpbmUobmV3U2hhcGVDaGlsZHJlblswXS51c2VyRGF0YSk7CiAJCQkJdmFyIHByZXZMaW5lOlRleHRGbG93TGluZSA9IGZsb3dDb21wb3Nlci5maW5kTGluZUF0UG9zaXRpb24oZmlyc3RMaW5lLmFic29sdXRlU3RhcnQgLSAxKTsKLQkJCQl2YXIgcHJldlRleHRMaW5lOlRleHRMaW5lID0gcHJldkxpbmUucGVla1RleHRMaW5lKCk7IAotCQkJCXNoYXBlQ2hpbGRyZW5TdGFydElkeCA9IF9zaGFwZUNoaWxkcmVuLmluZGV4T2YocHJldlRleHRMaW5lKTsKKwkJCQlpZihwcmV2TGluZSBpcyBUZXh0Rmxvd1RhYmxlQmxvY2speworCQkJCQlzaGFwZUNoaWxkcmVuU3RhcnRJZHggPSBfc2hhcGVDaGlsZHJlbi5pbmRleE9mKChwcmV2TGluZSBhcyBUZXh0Rmxvd1RhYmxlQmxvY2spLmNvbnRhaW5lcik7CisJCQkJfSBlbHNlIHsKKwkJCQkJdmFyIHByZXZUZXh0TGluZTpUZXh0TGluZSA9IHByZXZMaW5lLnBlZWtUZXh0TGluZSgpOyAKKwkJCQkJc2hhcGVDaGlsZHJlblN0YXJ0SWR4ID0gX3NoYXBlQ2hpbGRyZW4uaW5kZXhPZihwcmV2VGV4dExpbmUpOworCQkJCX0KIAkJCQlpZiAoc2hhcGVDaGlsZHJlblN0YXJ0SWR4ID49IDApCiAJCQkJewogCQkJCQlzaGFwZUNoaWxkcmVuU3RhcnRJZHgrKzsKQEAgLTMxMTcsNyArMzIzOSw3IEBACiAJCQkKIAkJCXdoaWxlIChuZXdJZHggIT0gbmV3U2hhcGVDaGlsZHJlbi5sZW5ndGgpCiAJCQl7Ci0JCQkJdmFyIG5ld0NoaWxkOlRleHRMaW5lID0gbmV3U2hhcGVDaGlsZHJlbltuZXdJZHhdOworCQkJCXZhciBuZXdDaGlsZDoqID0gbmV3U2hhcGVDaGlsZHJlbltuZXdJZHhdOwogCQkJCWlmIChuZXdDaGlsZCA9PSBfc2hhcGVDaGlsZHJlbltvbGRJZHhdKQogCQkJCXsKIAkJCQkJLy8gU2FtZSBzaGFwZSBpcyBpbiBib3RoIGxpc3RzLCBubyBjaGFuZ2UgbmVjZXNzYXJ5LCBhZHZhbmNlIHRvIG5leHQgaXRlbSBpbiBlYWNoIGxpc3QKQEAgLTMxMjUsMjMgKzMyNDcsNDUgQEAKIAkJCQkJY2hpbGRJZHgrKzsKIAkJCQkJbmV3SWR4Kys7CiAJCQkJCW9sZElkeCsrOworCQkJCQlpZihuZXdDaGlsZCBpcyBUYWJsZUJsb2NrQ29udGFpbmVyKQorCQkJCQl7CisJCQkJCQkvLyB1cGRhdGUgdGhlIGNvbnRlbnRzIGluIGNhc2UgY2VsbHMgd2VyZSBhZGRlZCBvciByZW1vdmVkLiAoVGhlcmUgbWlnaHQgYmUgYSBtb3JlIGVmZmljaWVudCB3YXkgdG8gZG8gdGhpcywgYnV0IHRoaXMgd29ya3MuKQorCQkJCQkJKG5ld0NoaWxkIGFzIFRhYmxlQmxvY2tDb250YWluZXIpLnVzZXJEYXRhLnVwZGF0ZUNvbXBvc2l0aW9uU2hhcGVzKCk7CisJCQkJCX0KIAkJCQkJY29udGludWU7CiAJCQkJfQotCQkJCQogCQkJCXZhciBuZXdDaGlsZElkeDppbnQgPSBfc2hhcGVDaGlsZHJlbi5pbmRleE9mKG5ld0NoaWxkKTsKLQkJCQlpZiAobmV3Q2hpbGRJZHggPT0gLTEpCi0JCQkJewotCQkJCQkvLyBTaGFwZSBpcyBpbiB0aGUgbmV3IGxpc3QsIGJ1dCBub3QgaW4gdGhlIG9sZCBsaXN0LCBhZGQgaXQgdG8gdGhlIGRpc3BsYXkgbGlzdCBhdCB0aGUgY3VycmVudCBsb2NhdGlvbiwgYW5kIGFkdmFuY2UgdG8gbmV4dCBpdGVtCi0JCQkJCWFkZFRleHRMaW5lKG5ld0NoaWxkLCBjaGlsZElkeCsrKTsKLQkJCQkJQ09ORklHOjpkZWJ1ZyB7IERlYnVnZ2luZy50cmFjZUZURUNhbGwobnVsbCxfY29udGFpbmVyLCJhZGRUZXh0TGluZSIsbmV3Q2hpbGQpOyB9Ci0JCQkJCW5ld0lkeCsrOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJeworCQkJCWlmKG5ld0NoaWxkIGlzIFRleHRMaW5lKXsKKwkJCQkJaWYgKG5ld0NoaWxkSWR4ID09IC0xKQorCQkJCQl7CisJCQkJCQkvLyBTaGFwZSBpcyBpbiB0aGUgbmV3IGxpc3QsIGJ1dCBub3QgaW4gdGhlIG9sZCBsaXN0LCBhZGQgaXQgdG8gdGhlIGRpc3BsYXkgbGlzdCBhdCB0aGUgY3VycmVudCBsb2NhdGlvbiwgYW5kIGFkdmFuY2UgdG8gbmV4dCBpdGVtCisJCQkJCQlhZGRUZXh0TGluZSgobmV3Q2hpbGQgYXMgVGV4dExpbmUpLCBjaGlsZElkeCsrKTsKKwkJCQkJCUNPTkZJRzo6ZGVidWcgeyBEZWJ1Z2dpbmcudHJhY2VGVEVDYWxsKG51bGwsX2NvbnRhaW5lciwiYWRkVGV4dExpbmUiLG5ld0NoaWxkKTsgfQorCQkJCQkJbmV3SWR4Kys7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CiAJCQkJCQkvLyBUaGUgc2hhcGUgaXMgb24gYm90aCBsaXN0cywgYnV0IHRoZXJlIGFyZSBzZXZlcmFsIGludGVydmVuaW5nICJvbGQiIHNoYXBlcyBpbiBiZXR3ZWVuLiBXZSdsbCByZW1vdmUgdGhlIG9sZCBzaGFwZXMgdGhhdAotCQkJCQkvLyBjb21lIGJlZm9yZSB0aGUgbmV3IG9uZSB3ZSB3YW50IHRvIGluc2VydC4KLQkJCQkJcmVtb3ZlQW5kUmVjeWNsZVRleHRMaW5lcyAob2xkSWR4LCBuZXdDaGlsZElkeCk7Ci0JCQkJCW9sZElkeCA9IG5ld0NoaWxkSWR4OworCQkJCQkJLy8gY29tZSBiZWZvcmUgdGhlIG5ldyBvbmUgd2Ugd2FudCB0byBpbnNlcnQuCisJCQkJCQlyZW1vdmVBbmRSZWN5Y2xlVGV4dExpbmVzIChvbGRJZHgsIG5ld0NoaWxkSWR4KTsKKwkJCQkJCW9sZElkeCA9IG5ld0NoaWxkSWR4OworCQkJCQl9CisJCQkJfSBlbHNlIHsvLyBpdCdzIGEgdGFibGUgYmxvY2sKKwkJCQkJaWYgKG5ld0NoaWxkSWR4ID09IC0xKQorCQkJCQl7CisJCQkJCQkvLyBTaGFwZSBpcyBpbiB0aGUgbmV3IGxpc3QsIGJ1dCBub3QgaW4gdGhlIG9sZCBsaXN0LCBhZGQgaXQgdG8gdGhlIGRpc3BsYXkgbGlzdCBhdCB0aGUgY3VycmVudCBsb2NhdGlvbiwgYW5kIGFkdmFuY2UgdG8gbmV4dCBpdGVtCisJCQkJCQlhZGRUYWJsZUJsb2NrKChuZXdDaGlsZCBhcyBUYWJsZUJsb2NrQ29udGFpbmVyKSwgY2hpbGRJZHgrKyk7CisJCQkJCQlDT05GSUc6OmRlYnVnIHsgRGVidWdnaW5nLnRyYWNlRlRFQ2FsbChudWxsLF9jb250YWluZXIsImFkZFRhYmxlQmxvY2siLG5ld0NoaWxkKTsgfQorCQkJCQkJbmV3SWR4Kys7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQkvLyBUaGUgc2hhcGUgaXMgb24gYm90aCBsaXN0cywgYnV0IHRoZXJlIGFyZSBzZXZlcmFsIGludGVydmVuaW5nICJvbGQiIHNoYXBlcyBpbiBiZXR3ZWVuLiBXZSdsbCByZW1vdmUgdGhlIG9sZCBzaGFwZXMgdGhhdAorCQkJCQkJLy8gY29tZSBiZWZvcmUgdGhlIG5ldyBvbmUgd2Ugd2FudCB0byBpbnNlcnQuCisJCQkJCQkobmV3Q2hpbGQgYXMgVGFibGVCbG9ja0NvbnRhaW5lcikudXNlckRhdGEudXBkYXRlQ29tcG9zaXRpb25TaGFwZXMoKTsKKwkJCQkJCXJlbW92ZUFuZFJlY3ljbGVUZXh0TGluZXMgKG9sZElkeCwgbmV3Q2hpbGRJZHgpOworCQkJCQkJb2xkSWR4ID0gbmV3Q2hpbGRJZHg7CisJCQkJCX0JCQkJCQogCQkJCX0KIAkJCX0KIAkJCQpAQCAtMzE1Myw3ICszMjk3LDggQEAKIAkJCXsKIAkJCQkvLyBXZSBvbmx5IHVwZGF0ZWQgc29tZSBvZiB0aGUgbGluZXMuIFJlbW92ZSB0aGUgb2xkIHZlcnNpb25zIG9mZiB0aGUgZW5kLCBhbmQgYWRkIGluIHRoZSBuZXcgb25lcyBmcm9tIF9saW5lc0luVmlldwogCQkJCV9zaGFwZUNoaWxkcmVuLmxlbmd0aCA9IHNoYXBlQ2hpbGRyZW5TdGFydElkeDsJCS8vIHRydW5jYXRlCi0JCQkJX3NoYXBlQ2hpbGRyZW4gPSBfc2hhcGVDaGlsZHJlbi5jb25jYXQoX2xpbmVzSW5WaWV3KTsJLy8gYXBwZW5kIF9saW5lc0luVmlldyB0byBlbmQgb2YgX3NoYXBlQ2hpbGRyZW4KKwkJCQkvL19zaGFwZUNoaWxkcmVuID0gX3NoYXBlQ2hpbGRyZW4uY29uY2F0KF9saW5lc0luVmlldyk7CS8vIGFwcGVuZCBfbGluZXNJblZpZXcgdG8gZW5kIG9mIF9zaGFwZUNoaWxkcmVuCisJCQkJX3NoYXBlQ2hpbGRyZW4gPSBfc2hhcGVDaGlsZHJlbi5jb25jYXQobmV3U2hhcGVDaGlsZHJlbik7CS8vIGFwcGVuZCBfbGluZXNJblZpZXcgdG8gZW5kIG9mIF9zaGFwZUNoaWxkcmVuCiAJCQkJX2xpbmVzSW5WaWV3Lmxlbmd0aCA9IDA7CS8vIHRydW5jYXRlCiAJCQl9CiAJCQllbHNlCkBAIC0zOTkzLDYgKzQxMzgsMTIgQEAKIAkJCXZhciB0ZXh0QmxvY2s6VGV4dEJsb2NrOwogCQkJZm9yICh2YXIgaW5kZXg6aW50ID0gYmVnaW5JbmRleDsgaW5kZXggPCBlbmRJbmRleDsgaW5kZXgrKykKIAkJCXsKKwkJCQkvLyB3ZSBkb24ndCByZWN5Y2xlIHRhYmxlIGJsb2NrcworCQkJCWlmKCAhKF9zaGFwZUNoaWxkcmVuW2luZGV4XSBpcyBUZXh0TGluZSkgKXsKKwkJCQkJcmVtb3ZlVGFibGVCbG9jayhfc2hhcGVDaGlsZHJlbltpbmRleF0pOworCQkJCQljaGlsZCA9IG51bGw7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KIAkJCQljaGlsZCA9IF9zaGFwZUNoaWxkcmVuW2luZGV4XTsJCQkJCQogCQkJCXJlbW92ZVRleHRMaW5lKGNoaWxkKTsKIAkJCQlDT05GSUc6OmRlYnVnIHsgRGVidWdnaW5nLnRyYWNlRlRFQ2FsbChudWxsLF9jb250YWluZXIsInJlbW92ZVRleHRMaW5lIixjaGlsZCk7IH0KQEAgLTQwMTcsNiArNDE2OCwxMCBAQAogCQkJewogCQkJCXdoaWxlIChiZWdpbkluZGV4IDwgZW5kSW5kZXgpCiAJCQkJeworCQkJCQlpZiggIShfc2hhcGVDaGlsZHJlbltiZWdpbkluZGV4XSBpcyBUZXh0TGluZSkgKXsKKwkJCQkJCWJlZ2luSW5kZXgrKzsKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl9CiAJCQkJCWNoaWxkID0gX3NoYXBlQ2hpbGRyZW5bYmVnaW5JbmRleCsrXTsKIAkJCQkJCQkJCQkKIAkJCQkJLy8gUmVjeWNsZSBpZiBpdHMgbm90IGRpc3BsYXllZCBhbmQgbm90IGNvbm5lY3RlZCB0byB0aGUgdGV4dGJsb2NrCkBAIC00MDczLDYgKzQyMjgsMTAgQEAKIAkJCQl7CiAJCQkJCWJyZWFrOwogCQkJCX0KKwkJCQkKKwkJCQlpZihfY29udGFpbmVyLmdldENoaWxkQXQoZmlyc3RUZXh0TGluZSkgaXMgVGFibGVCbG9ja0NvbnRhaW5lcikKKwkJCQkJYnJlYWs7CisJCQkJCiAJCQl9CiAJCQlyZXR1cm4gZmlyc3RUZXh0TGluZTsKIAkJfQpAQCAtNDEyNSw2ICs0Mjg0LDU0IEBACiAJCX0KIAkJCiAJCS8qKgorCQkgKiBBZGRzIGEgPGNvZGU+VGFibGVCbG9ja0NvbnRhaW5lcjwvY29kZT4gb2JqZWN0IGFzIGEgZGVzY2VuZGFudCBvZiA8Y29kZT5jb250YWluZXI8L2NvZGU+LgorCQkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCwgd2hpY2ggbWF5IGJlIG92ZXJyaWRlbiwgYWRkcyB0aGUgb2JqZWN0CisJCSAqIGFzIGEgZGlyZWN0IGNoaWxkIG9mIDxjb2RlPmNvbnRhaW5lcjwvY29kZT4gYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KKwkJICogCisJCSAqIEBwYXJhbSB0ZXh0TGluZSB0aGUgPGNvZGU+VGFibGVCbG9ja0NvbnRhaW5lcjwvY29kZT4gb2JqZWN0IHRvIGFkZAorCQkgKiBAcGFyYW0gaW5kZXggaW5zZXJ0aW9uIGluZGV4IG9mIHRoZSB0ZXh0IGxpbmUgaW4gaXRzIHBhcmVudCAKKwkJICogCisJCSAqIEBwbGF5ZXJ2ZXJzaW9uIEZsYXNoIDEwCisJCSAqIEBwbGF5ZXJ2ZXJzaW9uIEFJUiAxLjUKKwkJICogQGxhbmd2ZXJzaW9uIDMuMAorCQkgKiAKKwkJICogQHNlZSAjY29udGFpbmVyCisJCSAqIAorCQkgKi8JCisJCXByb3RlY3RlZCBmdW5jdGlvbiBhZGRUYWJsZUJsb2NrKGJsb2NrOlRhYmxlQmxvY2tDb250YWluZXIsIGluZGV4OmludCk6dm9pZAorCQl7IAorCQkJaWYgKCBpbmRleCA+IF9jb250YWluZXIubnVtQ2hpbGRyZW4gKQorCQkJCWluZGV4ID0gX2NvbnRhaW5lci5udW1DaGlsZHJlbjsKKwkJCV9jb250YWluZXIuYWRkQ2hpbGRBdChibG9jaywgaW5kZXgpOworCQkJYmxvY2sudXNlckRhdGEudXBkYXRlQ29tcG9zaXRpb25TaGFwZXMoKTsKKwkJfQorCQkKKwkJLyoqCisJCSAqIFJlbW92ZXMgYSA8Y29kZT5UYWJsZUJsb2NrQ29udGFpbmVyPC9jb2RlPiBvYmplY3QgZnJvbSBpdHMgcGFyZW50LiAKKwkJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QsIHdoaWNoIG1heSBiZSBvdmVycmlkZW4sIHJlbW92ZXMgdGhlIG9iamVjdAorCQkgKiBmcm9tIDxjb2RlPmNvbnRhaW5lcjwvY29kZT4gaWYgaXQgaXMgYSBkaXJlY3QgY2hpbGQgb2YgdGhlIGxhdHRlci4KKwkJICogCisJCSAqIFRoaXMgbWV0aG9kIG1heSBiZSBjYWxsZWQgZXZlbiBpZiB0aGUgb2JqZWN0IGlzIG5vdCBhIGRlc2NlbmRhbnQgb2YgPGNvZGU+Y29udGFpbmVyPC9jb2RlPi4KKwkJICogQW55IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIG11c3QgZW5zdXJlIHRoYXQgbm8gYWN0aW9uIGlzIHRha2VuIGluIHRoaXMgY2FzZS4KKwkJICogCisJCSAqIEBwYXJhbSB0ZXh0TGluZSB0aGUgPGNvZGU+VGFibGVCbG9ja0NvbnRhaW5lcjwvY29kZT4gb2JqZWN0IHRvIHJlbW92ZSAKKwkJICogCisJCSAqIEBwbGF5ZXJ2ZXJzaW9uIEZsYXNoIDEwCisJCSAqIEBwbGF5ZXJ2ZXJzaW9uIEFJUiAxLjUKKwkJICogQGxhbmd2ZXJzaW9uIDMuMAorCQkgKiAKKwkJICogQHNlZSAjY29udGFpbmVyCisJCSAqIAorCQkgKi8JCisKKwkJcHJvdGVjdGVkIGZ1bmN0aW9uIHJlbW92ZVRhYmxlQmxvY2soYmxvY2s6VGFibGVCbG9ja0NvbnRhaW5lcik6dm9pZAorCQl7CisJCQlpZiAoX2NvbnRhaW5lci5jb250YWlucyhibG9jaykpCisJCQkJX2NvbnRhaW5lci5yZW1vdmVDaGlsZChibG9jayk7CisJCX0KKworCQkKKwkJLyoqCiAJCSAqIEFkZHMgYSA8Y29kZT5mbGFzaC5kaXNwbGF5LlNoYXBlPC9jb2RlPiBvYmplY3Qgb24gd2hpY2ggYmFja2dyb3VuZCBzaGFwZXMgKHN1Y2ggYXMgYmFja2dyb3VuZCBjb2xvcikgYXJlIGRyYXduLgogCQkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCwgd2hpY2ggbWF5IGJlIG92ZXJyaWRlbiwgYWRkcyB0aGUgb2JqZWN0IHRvIDxjb2RlPmNvbnRhaW5lcjwvY29kZT4KIAkJICoganVzdCBiZWZvcmUgdGhlIGZpcnN0IDxjb2RlPmZsYXNoLnRleHQuZW5naW5lLlRleHRMaW5lPC9jb2RlPiBjaGlsZCwgaWYgb25lIGV4aXN0cywgYW5kIGFmdGVyIHRoZSBsYXN0IGV4aXNpdGluZwpAQCAtNDU5MCw2ICs0Nzk3LDEzIEBACiAJCQkvLyBib3VuZHMgdGhhbiB0aGUgZ2V0Qm91bmRzLiBJJ3ZlIGxlZnQgdGhlIG9sZCBjb2RlIGhlcmUgZm9yIHZlcmlmaWNhdGlvbi4KIAkJCUNPTkZJRzo6ZGVidWcgeyBhc3NlcnQodGV4dEZsb3dMaW5lICE9IG51bGwsInRlc3RMaW5lVmlzaWJsZSIpOyB9CiAJCQkKKwkJCWlmKHRleHRGbG93TGluZSBpcyBUZXh0Rmxvd1RhYmxlQmxvY2spCisJCQl7CisJCQkJaWYodGV4dEZsb3dMaW5lLmNvbnRyb2xsZXIgPT0gdGhpcykKKwkJCQkJcmV0dXJuIFRleHRGbG93VGFibGVCbG9jayh0ZXh0Rmxvd0xpbmUpLmNvbnRhaW5lcjsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJCQogCQkJLy9CdWcgIzI5ODg4NTIsIHNjcm9sbGluZyBpbiB0aGUgYXBwbGljYXRpb24gY2F1c2VzIGFsbCB0ZXh0IHRvIGRpc2FwcGVhci4gV2hlbiBhdXRvLXNpemUgaW1hZ2VzIG1ha2UgdGhlIGxpbmUgImFmdGVyIHZpc2libGUiCiAJCQkvL0l0J3MgImFmdGVyIHZpc2libGUiLCBidXQgaXQgY2Fubm90IHJldHVybiAxLiBCZWNhdXNlIGlmIGl0IHdlcmUgMSwgdGhlIGJpbmFyeS1zZWFyY2ggaW4gZ2F0aGVyVmlzaWJsZUxpbmVzKCkgd291bGQgbWFrZSBhbGwgdGhlIGxpbmVzIGludmlzaWJsZS4KIAkJCWlmKHRleHRGbG93TGluZS5jb250cm9sbGVyID09IG51bGwpCkBAIC00NjU3LDYgKzQ4NzEsMTAgQEAKIAkJCS8vIGFib3V0IHRoZSBjaGlsZHJlbiwgYW5kIGFsc28gdGhlIGJvdW5kcyBvZiB2aXNpYmxlIGdseXBocy4gV2UgZGVjaWRlZCB0aGF0IHRoZSBsb2dpY2FsIGJvdW5kcyBpcyBjbG9zZSBlbm91Z2gsCiAJCQkvLyBhbmQgaXMgbXVjaCBmYXN0ZXIgdG8gb2J0YWluLiBIb3dldmVyLCB0aGVyZSBtYXkgYmUgc29tZSBsaW5lcywgdGhhdCBnZXQgYSBkaWZmZXJlbnQgcmVzdWx0IHVzaW5nIHRoZSBsb2dpY2FsIAogCQkJLy8gYm91bmRzIHRoYW4gdGhlIGdldEJvdW5kcy4gSSd2ZSBsZWZ0IHRoZSBvbGQgY29kZSBoZXJlIGZvciB2ZXJpZmljYXRpb24uCisJCQkKKwkJCWlmKHRleHRGbG93TGluZSBpcyBUZXh0Rmxvd1RhYmxlQmxvY2spCisJCQkJcmV0dXJuIG51bGw7CisKIAkJCWlmICghdGV4dEZsb3dMaW5lLmhhc0xpbmVCb3VuZHMoKSkKIAkJCXsKIAkJCQlpZiAoIXRleHRMaW5lKQpAQCAtNDczMSw3ICs0OTQ5LDQ3IEBACiAJCQl9CiAJCQlyZXR1cm4gYm91bmRzUmVjdDsKIAkJfQotCQkKKwkJLyoqIEBwcml2YXRlICovCisJCXRsZl9pbnRlcm5hbCBmdW5jdGlvbiBmaW5kQ2VsbEF0UG9zaXRpb24ocG9pbnQ6UG9pbnQpOkNlbGxDb29yZGluYXRlcworCQl7CisJCQlwb2ludCA9IHBvaW50LmNsb25lKCk7CisJCQlmb3IgZWFjaCh2YXIgY2hsZDpPYmplY3QgaW4gX3NoYXBlQ2hpbGRyZW4pCisJCQl7CisJCQkJaWYoICEoY2hsZCBpcyBUYWJsZUJsb2NrQ29udGFpbmVyKSApCisJCQkJCWNvbnRpbnVlOworCQkJCQorCQkJCXZhciBibG9jazpUYWJsZUJsb2NrQ29udGFpbmVyID0gY2hsZCBhcyBUYWJsZUJsb2NrQ29udGFpbmVyOworCQkJCWlmKGJsb2NrLnkgPiBwb2ludC55KQorCQkJCQljb250aW51ZTsKKwkJCQlpZihibG9jay54ID4gcG9pbnQueCkKKwkJCQkJY29udGludWU7CisJCQkJaWYoYmxvY2sueSArIGJsb2NrLmhlaWdodCA8IHBvaW50LnkpCisJCQkJCWNvbnRpbnVlOworCQkJCWlmKGJsb2NrLnggKyBibG9jay5nZXRUYWJsZVdpZHRoKCkgPCBwb2ludC54KQorCQkJCQljb250aW51ZTsKKwkJCQkKKwkJCQlwb2ludC54IC09IGJsb2NrLng7CisJCQkJcG9pbnQueSAtPSBibG9jay55OworCQkJCQorCQkJCS8vIHRoZSBwb2ludCBmYWxscyBvdXQgaW5zaWRlIHRoZSBibG9jay4gRmluZCB0aGUgY2VsbC4uLgorCQkJCXZhciBjZWxsczpWZWN0b3IuPFRhYmxlQ2VsbEVsZW1lbnQ+ID0gYmxvY2sudXNlckRhdGEuZ2V0VGFibGVDZWxscygpOworCQkJCWZvciBlYWNoICh2YXIgY2VsbDpUYWJsZUNlbGxFbGVtZW50IGluICBjZWxscykKKwkJCQl7CisJCQkJCWlmKGNlbGwueCArIGNlbGwud2lkdGggPCBwb2ludC54KQorCQkJCQkJY29udGludWU7CisJCQkJCWlmKGNlbGwueSArIGNlbGwuZ2V0Um93KCkuY29tcG9zZWRIZWlnaHQgPCBwb2ludC55KQorCQkJCQkJY29udGludWU7CisJCQkJCWlmKGNlbGwueCA+IHBvaW50LngpCisJCQkJCQljb250aW51ZTsKKwkJCQkJaWYoY2VsbC55ID4gcG9pbnQueSkKKwkJCQkJCWNvbnRpbnVlOworCQkJCQlyZXR1cm4gbmV3IENlbGxDb29yZGluYXRlcyhjZWxsLnJvd0luZGV4LGNlbGwuY29sSW5kZXgsY2VsbC5nZXRUYWJsZSgpKTsKKwkJCQkJCisJCQkJfQorCQkJfQorCQkJCisJCQlyZXR1cm4gbnVsbDsKKwkJfQogCQkvKiogQHByaXZhdGUgKi8KIAkJdGxmX2ludGVybmFsIGZ1bmN0aW9uIGdldFBsYWNlZFRleHRMaW5lQm91bmRzKHRleHRMaW5lOlRleHRMaW5lKTpSZWN0YW5nbGUKIAkJewpAQCAtNDc4NiwxMyArNTA0NCwyNSBAQAogCQl7CiAJCQlfbGluZXNJblZpZXcucHVzaCh0ZXh0TGluZSk7CQkJCiAJCX0KLQkJCisKKwkJLyoqIEBwcml2YXRlICovCisJCXRsZl9pbnRlcm5hbCBmdW5jdGlvbiBhZGRDb21wb3NlZFRhYmxlQmxvY2soYmxvY2s6VGFibGVCbG9ja0NvbnRhaW5lcik6dm9pZAorCQl7CisJCQl2YXIgaWR4OmludCA9IF90YWJsZUJsb2Nrc0luVmlldy5pbmRleE9mKGJsb2NrKTsKKwkJCWlmKGlkeCA+PSAwKQorCQkJCV90YWJsZUJsb2Nrc0luVmlldy5zcGxpY2UoaWR4LDEpOworCQkJZWxzZQorCQkJCV90YWJsZUJsb2Nrc0luVmlldy5wdXNoKGJsb2NrKTsKKwkJfQorCiAJCS8qKiBAcHJpdmF0ZSBSZXR1cm4gdGhlIGFycmF5LiBDbGllbnQgY29kZSBtYXkgYWRkIGxpbmVzIHRvIHRoZSBhcnJheS4gKi8KIAkJdGxmX2ludGVybmFsIGZ1bmN0aW9uIGdldCBjb21wb3NlZExpbmVzKCk6QXJyYXkKIAkJewogCQkJaWYgKCFfbGluZXNJblZpZXcpCiAJCQkJX2xpbmVzSW5WaWV3ID0gW107Ci0JCQlyZXR1cm4gX2xpbmVzSW5WaWV3OworCQkJdmFyIGFycjpBcnJheSA9IF9saW5lc0luVmlldy5zbGljZSgpOworCQkJaW50ZXJzcGVyc2VUYWJsZUJsb2NrcyhhcnIpOworCQkJcmV0dXJuIGFycjsKIAkJfQogCQkKIAkJLyoqIEBwcml2YXRlIEVtcHR5IG91dCB0aGUgbGluZXNJblZpZXcsIHN0YXJ0aW5nIGZyb20gdGhlIHN1cHBsaWVkIHRleHQgaW5kZXguICovCkBAIC00ODA3LDYgKzUwNzcsMTcgQEAKIAkJCQlpbmRleCsrOwogCQkJfQogCQkJX2xpbmVzSW5WaWV3Lmxlbmd0aCA9IGluZGV4OworCQkJCisJCQlpbmRleCA9IDA7CisJCQlmb3IgZWFjaCAodmFyIHRiYzpUYWJsZUJsb2NrQ29udGFpbmVyIGluIF90YWJsZUJsb2Nrc0luVmlldykKKwkJCXsKKwkJCQl2YXIgdGZ0YjpUZXh0Rmxvd1RhYmxlQmxvY2sgPSB0YmMudXNlckRhdGE7CisJCQkJaWYodGJjLnVzZXJEYXRhLmFic29sdXRlU3RhcnQgPj0gcG9zKQorCQkJCQlicmVhazsKKwkJCQlpbmRleCsrOworCQkJfQorCQkJX3RhYmxlQmxvY2tzSW5WaWV3Lmxlbmd0aCA9IGluZGV4OworCQkJCiAJCQlfdXBkYXRlU3RhcnQgPSBNYXRoLm1pbihfdXBkYXRlU3RhcnQsIHBvcyk7CiAJCX0KIAkJCmRpZmYgLS1naXQgYS90ZXh0TGF5b3V0L3NyYy9mbGFzaHgvdGV4dExheW91dC9jb252ZXJzaW9uL0Jhc2VUZXh0TGF5b3V0RXhwb3J0ZXIuYXMgYi90ZXh0TGF5b3V0L3NyYy9mbGFzaHgvdGV4dExheW91dC9jb252ZXJzaW9uL0Jhc2VUZXh0TGF5b3V0RXhwb3J0ZXIuYXMKaW5kZXggNmI4OGNjMi4uOWUwZTEwNSAxMDA2NDQKLS0tIGEvdGV4dExheW91dC9zcmMvZmxhc2h4L3RleHRMYXlvdXQvY29udmVyc2lvbi9CYXNlVGV4dExheW91dEV4cG9ydGVyLmFzCisrKyBiL3RleHRMYXlvdXQvc3JjL2ZsYXNoeC90ZXh0TGF5b3V0L2NvbnZlcnNpb24vQmFzZVRleHRMYXlvdXRFeHBvcnRlci5hcwpAQCAtMjIsNiArMjIsNyBAQAogCWltcG9ydCBmbGFzaC51dGlscy5nZXRRdWFsaWZpZWRDbGFzc05hbWU7CiAJCiAJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LlRleHRMYXlvdXRWZXJzaW9uOworCWltcG9ydCBmbGFzaHgudGV4dExheW91dC50bGZfaW50ZXJuYWw7CiAJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmRlYnVnLmFzc2VydDsKIAlpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQuZWxlbWVudHMuQ29uZmlndXJhdGlvbjsKIAlpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQuZWxlbWVudHMuQ29udGFpbmVyRm9ybWF0dGVkRWxlbWVudDsKQEAgLTMxLDM0ICszMiwzNSBAQAogCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5lbGVtZW50cy5MaW5rRWxlbWVudDsKIAlpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQuZWxlbWVudHMuUGFyYWdyYXBoRm9ybWF0dGVkRWxlbWVudDsKIAlpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQuZWxlbWVudHMuU3BhbkVsZW1lbnQ7CisJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmVsZW1lbnRzLlRhYmxlQ2VsbEVsZW1lbnQ7CisJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmVsZW1lbnRzLlRhYmxlRWxlbWVudDsKKwlpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQuZWxlbWVudHMuVGFibGVSb3dFbGVtZW50OwogCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5lbGVtZW50cy5UZXh0RmxvdzsKIAlpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQuZWxlbWVudHMuVGV4dFJhbmdlOwogCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5mb3JtYXRzLklUZXh0TGF5b3V0Rm9ybWF0OwogCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5mb3JtYXRzLlRleHRMYXlvdXRGb3JtYXQ7CiAJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmZvcm1hdHMuV2hpdGVTcGFjZUNvbGxhcHNlOwogCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5wcm9wZXJ0eS5Qcm9wZXJ0eTsKLQlpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQudGxmX2ludGVybmFsOworCiAJdXNlIG5hbWVzcGFjZSB0bGZfaW50ZXJuYWw7CiAJCi0JW0V4Y2x1ZGVDbGFzc10KIAkvKiogCi0JICogQHByaXZhdGUgCi0JICogRXhwb3J0IGNvbnZlcnRlciBmb3IgVGV4dExheW91dCBmb3JtYXQuIAorCSAqIEJhc2UgZXhwb3J0IGNvbnZlcnRlciBmb3IgVGV4dExheW91dCBmb3JtYXQuIAogCSAqLwotCWludGVybmFsIGNsYXNzIEJhc2VUZXh0TGF5b3V0RXhwb3J0ZXIgZXh0ZW5kcyBDb252ZXJ0ZXJCYXNlIGltcGxlbWVudHMgSVRleHRFeHBvcnRlcgotCXsJCi0JCXByaXZhdGUgdmFyIF9jb25maWc6SW1wb3J0RXhwb3J0Q29uZmlndXJhdGlvbjsKKwlwdWJsaWMgY2xhc3MgQmFzZVRleHRMYXlvdXRFeHBvcnRlciBleHRlbmRzIENvbnZlcnRlckJhc2UgaW1wbGVtZW50cyBJVGV4dEV4cG9ydGVyCisJewogCQlwcml2YXRlIHZhciBfcm9vdFRhZzpYTUw7CiAJCXByaXZhdGUgdmFyIF9uczpOYW1lc3BhY2U7Ci0JCQkJCi0JCXB1YmxpYyBmdW5jdGlvbiBCYXNlVGV4dExheW91dEV4cG9ydGVyKG5zOk5hbWVzcGFjZSwgcm9vdFRhZzpYTUwsIGNvbmZpZzpJbXBvcnRFeHBvcnRDb25maWd1cmF0aW9uKQorCQkKKwkJcHVibGljIGZ1bmN0aW9uIEJhc2VUZXh0TGF5b3V0RXhwb3J0ZXIobnM6TmFtZXNwYWNlLCByb290VGFnOlhNTCwgY29uZmlndXJhdGlvbjpJbXBvcnRFeHBvcnRDb25maWd1cmF0aW9uKQogCQl7Ci0JCQlfY29uZmlnID0gY29uZmlnOworCQkJY29uZmlnID0gY29uZmlndXJhdGlvbjsKIAkJCV9ucyA9IG5zOwogCQkJX3Jvb3RUYWcgPSByb290VGFnOwogCQl9CiAJCQotCQkvKiogQGNvcHkgSVRleHRFeHBvcnRlciNleHBvcnQoKQorCQkvKiogCisJCSAqIEBjb3B5IElUZXh0RXhwb3J0ZXIjZXhwb3J0KCkKIAkJICovCiAJCXB1YmxpYyBmdW5jdGlvbiBleHBvcnQoc291cmNlOlRleHRGbG93LCBjb252ZXJzaW9uVHlwZTpTdHJpbmcpOk9iamVjdAogCQl7CkBAIC02OCw3ICs3MCw5IEBACiAJCQlyZXR1cm4gY29udmVyc2lvblR5cGUgPT0gQ29udmVyc2lvblR5cGUuU1RSSU5HX1RZUEUgPyBjb252ZXJ0WE1MVG9TdHJpbmcocmVzdWx0KSA6IHJlc3VsdDsKIAkJfQogCQkKLQkJLyoqIEV4cG9ydCB0ZXh0IGNvbnRlbnQgb2YgYSBUZXh0RmxvdyBpbnRvIFhGTCBmb3JtYXQuCisJCS8qKiAKKwkJICogRXhwb3J0IHRleHQgY29udGVudCBvZiBhIFRleHRGbG93IGludG8gWEZMIGZvcm1hdC4KKwkJICogCiAJCSAqIEBwYXJhbSBzb3VyY2UJdGhlIHRleHQgdG8gZXhwb3J0CiAJCSAqIEByZXR1cm4gWE1MCXRoZSBleHBvcnRlZCBjb250ZW50CiAJCSAqLwpAQCAtODksNyArOTMsOSBAQAogCQkJcmV0dXJuIHJlc3VsdDsKIAkJfQogCQkKLQkJLyoqIEV4cG9ydCB0ZXh0IGNvbnRlbnQgYXMgYSBzdHJpbmcKKwkJLyoqIAorCQkgKiBFeHBvcnQgdGV4dCBjb250ZW50IGFzIGEgc3RyaW5nCisJCSAqIAogCQkgKiBAcGFyYW0geG1sCXRoZSBYTUwgdG8gY29udmVydAogCQkgKiBAcmV0dXJuIFN0cmluZwl0aGUgZXhwb3J0ZWQgY29udGVudAogCQkgKiBAcHJpdmF0ZQpAQCAtMTE4LDcgKzEyNCw5IEBACiAJCX0KIAogCQotCQkvKiogQmFzZSBmdW5jdGlvbmFsaXR5IGZvciBleHBvcnRpbmcgYSBGbG93RWxlbWVudC4gCisJCS8qKiAKKwkJICogQmFzZSBmdW5jdGlvbmFsaXR5IGZvciBleHBvcnRpbmcgYSBGbG93RWxlbWVudC4KKwkJICogIAogCQkgKiBAcGFyYW0gZXhwb3J0ZXIJUm9vdCBvYmplY3QgZm9yIHRoZSBleHBvcnQKIAkJICogQHBhcmFtIGZsb3dFbGVtZW50CUVsZW1lbnQgdG8gZXhwb3J0CiAJCSAqIEByZXR1cm4gWE1MTGlzdAlYTUwgZm9yIHRoZSBlbGVtZW50CkBAIC0xMjgsMTQgKzEzNiwxNiBAQAogCQkJcmV0dXJuIGV4cG9ydGVyLmV4cG9ydEZsb3dFbGVtZW50KGZsb3dFbGVtZW50KTsKIAkJfQogCQkKLQkJLyoqIE92ZXJyaWRhYmxlIHdvcmtlciBtZXRob2QgZm9yIGV4cG9ydGluZyBhIEZsb3dFbGVtZW50LiBDcmVhdGVzIHRoZSBYTUxMaXN0LgorCQkvKiogCisJCSAqIE92ZXJyaWRhYmxlIHdvcmtlciBtZXRob2QgZm9yIGV4cG9ydGluZyBhIEZsb3dFbGVtZW50LiBDcmVhdGVzIHRoZSBYTUxMaXN0LgorCQkgKiAKIAkJICogQHBhcmFtIGZsb3dFbGVtZW50CUVsZW1lbnQgdG8gZXhwb3J0CiAJCSAqIEByZXR1cm4gWE1MTGlzdAlYTUwgZm9yIHRoZSBlbGVtZW50CiAJCSAqLwogCQlwcm90ZWN0ZWQgZnVuY3Rpb24gZXhwb3J0Rmxvd0VsZW1lbnQgKGZsb3dFbGVtZW50OkZsb3dFbGVtZW50KTpYTUxMaXN0CiAJCXsKIAkJCXZhciBjbGFzc05hbWU6U3RyaW5nID0gZmxhc2gudXRpbHMuZ2V0UXVhbGlmaWVkQ2xhc3NOYW1lKGZsb3dFbGVtZW50KTsKLQkJCXZhciBlbGVtZW50TmFtZTpTdHJpbmcgPSBfY29uZmlnLmxvb2t1cE5hbWUoY2xhc3NOYW1lKTsJLy8gTk8gUE1ECisJCQl2YXIgZWxlbWVudE5hbWU6U3RyaW5nID0gY29uZmlnLmxvb2t1cE5hbWUoY2xhc3NOYW1lKTsJLy8gTk8gUE1ECiAJCQl2YXIgb3V0cHV0OlhNTCA9IDx7ZWxlbWVudE5hbWV9Lz47CiAJCQlvdXRwdXQuc2V0TmFtZXNwYWNlKF9ucyk7CiAJCQlyZXR1cm4gWE1MTGlzdChvdXRwdXQpOwpAQCAtMTk5LDggKzIwOSwxMCBAQAogCQkJfQkJCiAJCX0gIAogCQkKLQkJLyoqIEJhc2UgZnVuY3Rpb25hbGl0eSBmb3IgZXhwb3J0aW5nIGEgU3Bhbi4gRXhwb3J0cyBhcyBhIEZsb3dFbGVtZW50LAorCQkvKiogCisJCSAqIEJhc2UgZnVuY3Rpb25hbGl0eSBmb3IgZXhwb3J0aW5nIGEgU3Bhbi4gRXhwb3J0cyBhcyBhIEZsb3dFbGVtZW50LAogCQkgKiBhbmQgZXhwb3J0cyB0aGUgdGV4dCBvZiB0aGUgc3Bhbi4KKwkJICogCiAJCSAqIEBwYXJhbSBleHBvcnRlcglSb290IG9iamVjdCBmb3IgdGhlIGV4cG9ydAogCQkgKiBAcGFyYW0gc3BhbglFbGVtZW50IHRvIGV4cG9ydAogCQkgKiBAcmV0dXJuIFhNTExpc3QJWE1MIGZvciB0aGUgZWxlbWVudApAQCAtMjE0LDcgKzIyNiw4IEBACiAJCQogCQlzdGF0aWMgcHJpdmF0ZSBjb25zdCBiclJlZ0V4OlJlZ0V4cCA9IC9cdTIwMjgvOwogCQkKLQkJLyoqIEdldHMgdGhlIHJlZ2V4IHRoYXQgc3BlY2lmaWVzIGNoYXJhY3RlcnMgaW4gc3BhbiB0ZXh0IHRvIGJlIHJlcGxhY2VkIHdpdGggWE1MIGVsZW1lbnRzCisJCS8qKiAKKwkJICogR2V0cyB0aGUgcmVnZXggdGhhdCBzcGVjaWZpZXMgY2hhcmFjdGVycyBpbiBzcGFuIHRleHQgdG8gYmUgcmVwbGFjZWQgd2l0aCBYTUwgZWxlbWVudHMuCiAJCSAqICBOb3RlOiBFYWNoIG1hdGNoIGlzIGEgc2luZ2xlIGNoYXJhY3RlciAKIAkJICovCiAJCXByb3RlY3RlZCBmdW5jdGlvbiBnZXQgc3BhblRleHRSZXBsYWNlbWVudFJlZ2V4KCk6UmVnRXhwCkBAIC0yMjIsNyArMjM1LDggQEAKIAkJCXJldHVybiBiclJlZ0V4OwogCQl9CiAKLQkJLyoqIEdldHMgdGhlIHhtbCBlbGVtZW50IHVzZWQgdG8gcmVwcmVzZW50IGEgY2hhcmFjdGVyIGluIHRoZSBleHBvcnQgZm9ybWF0CisJCS8qKiAKKwkJICogR2V0cyB0aGUgeG1sIGVsZW1lbnQgdXNlZCB0byByZXByZXNlbnQgYSBjaGFyYWN0ZXIgaW4gdGhlIGV4cG9ydCBmb3JtYXQKIAkJICovCiAJCXByb3RlY3RlZCBmdW5jdGlvbiBnZXRTcGFuVGV4dFJlcGxhY2VtZW50WE1MKGNoOlN0cmluZyk6WE1MCiAJCXsKQEAgLTIzMiw4ICsyNDYsMTAgQEAKIAkJCXJldHVybiBicmVha1hNTDsKIAkJfQogCQkKLQkJLyoqIEJhc2UgZnVuY3Rpb25hbGl0eSBmb3IgZXhwb3J0aW5nIGEgRmxvd0dyb3VwRWxlbWVudC4gRXhwb3J0cyBhcyBhIEZsb3dFbGVtZW50LAorCQkvKiogCisJCSAqIEJhc2UgZnVuY3Rpb25hbGl0eSBmb3IgZXhwb3J0aW5nIGEgRmxvd0dyb3VwRWxlbWVudC4gRXhwb3J0cyBhcyBhIEZsb3dFbGVtZW50LAogCQkgKiBhbmQgZXhwb3J0cyB0aGUgY2hpbGRyZW4gb2YgYSBlbGVtZW50LgorCQkgKiAKIAkJICogQHBhcmFtIGV4cG9ydGVyCVJvb3Qgb2JqZWN0IGZvciB0aGUgZXhwb3J0CiAJCSAqIEBwYXJhbSBmbG93QmxvY2tFbGVtZW50CUVsZW1lbnQgdG8gZXhwb3J0CiAJCSAqIEByZXR1cm4gWE1MTGlzdAlYTUwgZm9yIHRoZSBlbGVtZW50CkBAIC0yNDEsMjAgKzI1NywyNiBAQAogCQlzdGF0aWMgcHVibGljIGZ1bmN0aW9uIGV4cG9ydEZsb3dHcm91cEVsZW1lbnQoZXhwb3J0ZXI6QmFzZVRleHRMYXlvdXRFeHBvcnRlciwgZmxvd0Jsb2NrRWxlbWVudDpGbG93R3JvdXBFbGVtZW50KTpYTUxMaXN0CiAJCXsKIAkJCXZhciBvdXRwdXQ6WE1MTGlzdCA9IGV4cG9ydEZsb3dFbGVtZW50KGV4cG9ydGVyLCBmbG93QmxvY2tFbGVtZW50KTsKKwkJCXZhciBjb3VudDppbnQgPSBmbG93QmxvY2tFbGVtZW50Lm51bUNoaWxkcmVuOwogCQkJCiAJCQkvLyBvdXRwdXQgZWFjaCBjaGlsZAotCQkJZm9yKHZhciBjaGlsZEl0ZXI6aW50ID0gMDsgY2hpbGRJdGVyIDwgZmxvd0Jsb2NrRWxlbWVudC5udW1DaGlsZHJlbjsgKytjaGlsZEl0ZXIpCisJCQlmb3IodmFyIGluZGV4OmludDsgaW5kZXggPCBjb3VudDsgKytpbmRleCkKIAkJCXsKLQkJCQl2YXIgZmxvd0NoaWxkOkZsb3dFbGVtZW50ID0gZmxvd0Jsb2NrRWxlbWVudC5nZXRDaGlsZEF0KGNoaWxkSXRlcik7CisJCQkJdmFyIGZsb3dDaGlsZDpGbG93RWxlbWVudCA9IGZsb3dCbG9ja0VsZW1lbnQuZ2V0Q2hpbGRBdChpbmRleCk7CiAJCQkJdmFyIGNoaWxkWE1MOlhNTExpc3QgPSBleHBvcnRlci5leHBvcnRDaGlsZChmbG93Q2hpbGQpOwotCQkJCWlmIChjaGlsZFhNTCkKKwkJCQkKKwkJCQlpZiAoY2hpbGRYTUwpIHsKIAkJCQkJb3V0cHV0LmFwcGVuZENoaWxkKGNoaWxkWE1MKTsKKwkJCQl9CiAJCQl9CisJCQkKIAkJCXJldHVybiBvdXRwdXQ7CiAJCX0KIAotCQkvKiogQmFzZSBmdW5jdGlvbmFsaXR5IGZvciBleHBvcnRpbmcgYSBQYXJhZ3JhcGhGb3JtYXR0ZWRFbGVtZW50LiBFeHBvcnRzIGFzIGEgRmxvd0dyb3VwRWxlbWVudCwKKwkJLyoqIAorCQkgKiBCYXNlIGZ1bmN0aW9uYWxpdHkgZm9yIGV4cG9ydGluZyBhIFBhcmFncmFwaEZvcm1hdHRlZEVsZW1lbnQuIEV4cG9ydHMgYXMgYSBGbG93R3JvdXBFbGVtZW50LAogCQkgKiBhbmQgZXhwb3J0cyBwYXJhZ3JhcGggYXR0cmlidXRlcy4KKwkJICogCiAJCSAqIEBwYXJhbSBleHBvcnRlcglSb290IG9iamVjdCBmb3IgdGhlIGV4cG9ydAogCQkgKiBAcGFyYW0gZmxvd1BhcmFncmFwaAlFbGVtZW50IHRvIGV4cG9ydAogCQkgKiBAcmV0dXJuIFhNTExpc3QJWE1MIGZvciB0aGUgZWxlbWVudApAQCAtMjY0LDIyICsyODYsNiBAQAogCQkJcmV0dXJuIGV4cG9ydGVyLmV4cG9ydFBhcmFncmFwaEZvcm1hdHRlZEVsZW1lbnQoZmxvd1BhcmFncmFwaCk7CiAJCX0KIAkJCi0JCS8qKiBPdmVycmlkYWJsZSB3b3JrZXIgbWV0aG9kIGZvciBleHBvcnRpbmcgYSBQYXJhZ3JhcGhGb3JtYXR0ZWRFbGVtZW50LiBDcmVhdGVzIHRoZSBYTUxMaXN0LgotCQkgKiBAcGFyYW0gZmxvd0VsZW1lbnQJRWxlbWVudCB0byBleHBvcnQKLQkJICogQHJldHVybiBYTUxMaXN0CVhNTCBmb3IgdGhlIGVsZW1lbnQKLQkJICovCi0JCXByb3RlY3RlZCBmdW5jdGlvbiBleHBvcnRQYXJhZ3JhcGhGb3JtYXR0ZWRFbGVtZW50KGZsb3dFbGVtZW50OkZsb3dFbGVtZW50KTpYTUxMaXN0Ci0JCXsKLQkJCXZhciByc2x0OlhNTExpc3QgPSBleHBvcnRGbG93RWxlbWVudChmbG93RWxlbWVudCk7Ci0JCQkvLyBvdXRwdXQgZWFjaCBjaGlsZAotCQkJZm9yKHZhciBjaGlsZEl0ZXI6aW50ID0gMDsgY2hpbGRJdGVyIDwgUGFyYWdyYXBoRm9ybWF0dGVkRWxlbWVudChmbG93RWxlbWVudCkubnVtQ2hpbGRyZW47ICsrY2hpbGRJdGVyKQotCQkJewotCQkJCXZhciBmbG93Q2hpbGQ6Rmxvd0VsZW1lbnQgPSBQYXJhZ3JhcGhGb3JtYXR0ZWRFbGVtZW50KGZsb3dFbGVtZW50KS5nZXRDaGlsZEF0KGNoaWxkSXRlcik7Ci0JCQkJcnNsdC5hcHBlbmRDaGlsZChleHBvcnRDaGlsZChmbG93Q2hpbGQpKTsKLQkJCX0KLQkJCXJldHVybiByc2x0OwotCQl9Ci0JCQogCQlzdGF0aWMgcHVibGljIGZ1bmN0aW9uIGV4cG9ydExpc3QoZXhwb3J0ZXI6QmFzZVRleHRMYXlvdXRFeHBvcnRlciwgZmxvd1BhcmFncmFwaDpQYXJhZ3JhcGhGb3JtYXR0ZWRFbGVtZW50KTpYTUxMaXN0CiAJCXsKIAkJCXJldHVybiBleHBvcnRlci5leHBvcnRMaXN0KGZsb3dQYXJhZ3JhcGgpOwpAQCAtMjg3LDE0ICsyOTMsMTcgQEAKIAkJCiAJCXByb3RlY3RlZCBmdW5jdGlvbiBleHBvcnRMaXN0KGZsb3dFbGVtZW50OkZsb3dFbGVtZW50KTpYTUxMaXN0CiAJCXsKLQkJCXZhciByc2x0OlhNTExpc3QgPSBleHBvcnRGbG93RWxlbWVudChmbG93RWxlbWVudCk7CisJCQl2YXIgcmVzdWx0OlhNTExpc3QgPSBleHBvcnRGbG93RWxlbWVudChmbG93RWxlbWVudCk7CisJCQl2YXIgY291bnQ6aW50ID0gRmxvd0dyb3VwRWxlbWVudChmbG93RWxlbWVudCkubnVtQ2hpbGRyZW47CisJCQkKIAkJCS8vIG91dHB1dCBlYWNoIGNoaWxkCi0JCQlmb3IodmFyIGNoaWxkSXRlcjppbnQgPSAwOyBjaGlsZEl0ZXIgPCBGbG93R3JvdXBFbGVtZW50KGZsb3dFbGVtZW50KS5udW1DaGlsZHJlbjsgKytjaGlsZEl0ZXIpCisJCQlmb3IodmFyIGluZGV4OmludDsgaW5kZXggPCBjb3VudDsgKytpbmRleCkKIAkJCXsKLQkJCQl2YXIgZmxvd0NoaWxkOkZsb3dFbGVtZW50ID0gRmxvd0dyb3VwRWxlbWVudChmbG93RWxlbWVudCkuZ2V0Q2hpbGRBdChjaGlsZEl0ZXIpOwotCQkJCXJzbHQuYXBwZW5kQ2hpbGQoZXhwb3J0Q2hpbGQoZmxvd0NoaWxkKSk7CisJCQkJdmFyIGZsb3dDaGlsZDpGbG93RWxlbWVudCA9IEZsb3dHcm91cEVsZW1lbnQoZmxvd0VsZW1lbnQpLmdldENoaWxkQXQoaW5kZXgpOworCQkJCXJlc3VsdC5hcHBlbmRDaGlsZChleHBvcnRDaGlsZChmbG93Q2hpbGQpKTsKIAkJCX0KLQkJCXJldHVybiByc2x0OworCQkJCisJCQlyZXR1cm4gcmVzdWx0OwogCQl9CiAJCQogCQlzdGF0aWMgcHVibGljIGZ1bmN0aW9uIGV4cG9ydExpc3RJdGVtKGV4cG9ydGVyOkJhc2VUZXh0TGF5b3V0RXhwb3J0ZXIsIGZsb3dQYXJhZ3JhcGg6UGFyYWdyYXBoRm9ybWF0dGVkRWxlbWVudCk6WE1MTGlzdApAQCAtMzA0LDE4ICszMTMsMjMgQEAKIAkJCiAJCXByb3RlY3RlZCBmdW5jdGlvbiBleHBvcnRMaXN0SXRlbShmbG93RWxlbWVudDpGbG93RWxlbWVudCk6WE1MTGlzdAogCQl7Ci0JCQl2YXIgcnNsdDpYTUxMaXN0ID0gZXhwb3J0Rmxvd0VsZW1lbnQoZmxvd0VsZW1lbnQpOworCQkJdmFyIHJlc3VsdDpYTUxMaXN0ID0gZXhwb3J0Rmxvd0VsZW1lbnQoZmxvd0VsZW1lbnQpOworCQkJdmFyIGNvdW50OmludCA9IEZsb3dHcm91cEVsZW1lbnQoZmxvd0VsZW1lbnQpLm51bUNoaWxkcmVuOworCQkJCiAJCQkvLyBvdXRwdXQgZWFjaCBjaGlsZAotCQkJZm9yKHZhciBjaGlsZEl0ZXI6aW50ID0gMDsgY2hpbGRJdGVyIDwgRmxvd0dyb3VwRWxlbWVudChmbG93RWxlbWVudCkubnVtQ2hpbGRyZW47ICsrY2hpbGRJdGVyKQorCQkJZm9yKHZhciBpbmRleDppbnQ7IGluZGV4IDwgY291bnQ7ICsraW5kZXgpCiAJCQl7Ci0JCQkJdmFyIGZsb3dDaGlsZDpGbG93RWxlbWVudCA9IEZsb3dHcm91cEVsZW1lbnQoZmxvd0VsZW1lbnQpLmdldENoaWxkQXQoY2hpbGRJdGVyKTsKLQkJCQlyc2x0LmFwcGVuZENoaWxkKGV4cG9ydENoaWxkKGZsb3dDaGlsZCkpOworCQkJCXZhciBmbG93Q2hpbGQ6Rmxvd0VsZW1lbnQgPSBGbG93R3JvdXBFbGVtZW50KGZsb3dFbGVtZW50KS5nZXRDaGlsZEF0KGluZGV4KTsKKwkJCQlyZXN1bHQuYXBwZW5kQ2hpbGQoZXhwb3J0Q2hpbGQoZmxvd0NoaWxkKSk7CiAJCQl9Ci0JCQlyZXR1cm4gcnNsdDsKKwkJCQorCQkJcmV0dXJuIHJlc3VsdDsKIAkJfQogCQkKLQkJLyoqIEJhc2UgZnVuY3Rpb25hbGl0eSBmb3IgZXhwb3J0aW5nIGEgQ29udGFpbmVyRm9ybWF0dGVkRWxlbWVudC4gRXhwb3J0cyBhcyBhIFBhcmFncmFwaEZvcm1hdHRlZEVsZW1lbnQsCisJCS8qKiAKKwkJICogQmFzZSBmdW5jdGlvbmFsaXR5IGZvciBleHBvcnRpbmcgYSBDb250YWluZXJGb3JtYXR0ZWRFbGVtZW50LiBFeHBvcnRzIGFzIGEgUGFyYWdyYXBoRm9ybWF0dGVkRWxlbWVudCwKIAkJICogYW5kIGV4cG9ydHMgY29udGFpbmVyIGF0dHJpYnV0ZXMuCisJCSAqIAogCQkgKiBAcGFyYW0gZXhwb3J0ZXIJUm9vdCBvYmplY3QgZm9yIHRoZSBleHBvcnQKIAkJICogQHBhcmFtIGNvbnRhaW5lcglFbGVtZW50IHRvIGV4cG9ydAogCQkgKiBAcmV0dXJuIFhNTExpc3QJWE1MIGZvciB0aGUgZWxlbWVudApAQCAtMzI1LDcgKzMzOSw5IEBACiAJCQlyZXR1cm4gZXhwb3J0ZXIuZXhwb3J0Q29udGFpbmVyRm9ybWF0dGVkRWxlbWVudChjb250YWluZXIpOwogCQl9CiAJCQotCQkvKiogT3ZlcnJpZGFibGUgd29ya2VyIG1ldGhvZCBmb3IgZXhwb3J0aW5nIGEgUGFyYWdyYXBoRm9ybWF0dGVkRWxlbWVudC4gQ3JlYXRlcyB0aGUgWE1MTGlzdC4KKwkJLyoqIAorCQkgKiBPdmVycmlkYWJsZSB3b3JrZXIgbWV0aG9kIGZvciBleHBvcnRpbmcgYSBQYXJhZ3JhcGhGb3JtYXR0ZWRFbGVtZW50LiBDcmVhdGVzIHRoZSBYTUxMaXN0LgorCQkgKiAKIAkJICogQHBhcmFtIGZsb3dFbGVtZW50CUVsZW1lbnQgdG8gZXhwb3J0CiAJCSAqIEByZXR1cm4gWE1MTGlzdAlYTUwgZm9yIHRoZSBlbGVtZW50CiAJCSAqLwpAQCAtMzMzLDkgKzM0OSwxMjYgQEAKIAkJewogCQkJcmV0dXJuIGV4cG9ydFBhcmFncmFwaEZvcm1hdHRlZEVsZW1lbnQoZmxvd0VsZW1lbnQpOwogCQl9Ci0KLQkJLyoqIEJhc2UgZnVuY3Rpb25hbGl0eSBmb3IgZXhwb3J0aW5nIGEgVGV4dEZsb3cuIEV4cG9ydHMgYXMgYSBDb250YWluZXJFbGVtZW50LAorCQkKKwkJLyoqIAorCQkgKiBCYXNlIGZ1bmN0aW9uYWxpdHkgZm9yIGV4cG9ydGluZyBhIFRhYmxlRWxlbWVudC4gRXhwb3J0cyBhcyBhIFRhYmxlRWxlbWVudCwKKwkJICogYW5kIGV4cG9ydHMgdGFibGUgYXR0cmlidXRlcy4KKwkJICogCisJCSAqIEBwYXJhbSBleHBvcnRlcglSb290IG9iamVjdCBmb3IgdGhlIGV4cG9ydAorCQkgKiBAcGFyYW0gY29udGFpbmVyCUVsZW1lbnQgdG8gZXhwb3J0CisJCSAqIEByZXR1cm4gWE1MTGlzdAlYTUwgZm9yIHRoZSBlbGVtZW50CisJCSAqLworCQlzdGF0aWMgcHVibGljIGZ1bmN0aW9uIGV4cG9ydFRhYmxlRWxlbWVudChleHBvcnRlcjpCYXNlVGV4dExheW91dEV4cG9ydGVyLCB0YWJsZTpUYWJsZUVsZW1lbnQpOlhNTExpc3QKKwkJeworCQkJcmV0dXJuIGV4cG9ydGVyLmV4cG9ydFRhYmxlRWxlbWVudCh0YWJsZSk7CisJCX0KKwkJCisJCS8qKiAKKwkJICogT3ZlcnJpZGFibGUgd29ya2VyIG1ldGhvZCBmb3IgZXhwb3J0aW5nIGEgVGFibGVFbGVtZW50LiBDcmVhdGVzIHRoZSBYTUxMaXN0LgorCQkgKiAKKwkJICogQHBhcmFtIGZsb3dFbGVtZW50CUVsZW1lbnQgdG8gZXhwb3J0CisJCSAqIEByZXR1cm4gWE1MTGlzdAlYTUwgZm9yIHRoZSBlbGVtZW50CisJCSAqLworCQlwcm90ZWN0ZWQgZnVuY3Rpb24gZXhwb3J0VGFibGVFbGVtZW50KHRhYmxlRWxlbWVudDpUYWJsZUVsZW1lbnQpOlhNTExpc3QKKwkJeworCQkJdmFyIHJlc3VsdDpYTUxMaXN0ID0gZXhwb3J0Rmxvd0VsZW1lbnQodGFibGVFbGVtZW50KTsKKwkJCXZhciBjb3VudDppbnQgPSB0YWJsZUVsZW1lbnQubnVtUm93czsKKwkJCQorCQkJLy8gb3V0cHV0IGVhY2ggY2hpbGQKKwkJCWZvcih2YXIgaW5kZXg6aW50ID0gMDsgaW5kZXggPCBjb3VudDsgKytpbmRleCkKKwkJCXsKKwkJCQl2YXIgZmxvd0NoaWxkOkZsb3dFbGVtZW50ID0gdGFibGVFbGVtZW50LmdldFJvd0F0KGluZGV4KTsKKwkJCQlyZXN1bHQuYXBwZW5kQ2hpbGQoZXhwb3J0Q2hpbGQoZmxvd0NoaWxkKSk7CisJCQl9CisJCQkKKwkJCXJldHVybiByZXN1bHQ7CisJCX0KKwkJCisJCS8qKiAKKwkJICogQmFzZSBmdW5jdGlvbmFsaXR5IGZvciBleHBvcnRpbmcgYSBUYWJsZVJvd0VsZW1lbnQuIEV4cG9ydHMgYXMgYSBUYWJsZVJvd0VsZW1lbnQsCisJCSAqIGFuZCBleHBvcnRzIHRhYmxlIHJvdyBhdHRyaWJ1dGVzLgorCQkgKiAKKwkJICogQHBhcmFtIGV4cG9ydGVyCVJvb3Qgb2JqZWN0IGZvciB0aGUgZXhwb3J0CisJCSAqIEBwYXJhbSBjb250YWluZXIJRWxlbWVudCB0byBleHBvcnQKKwkJICogQHJldHVybiBYTUxMaXN0CVhNTCBmb3IgdGhlIGVsZW1lbnQKKwkJICovCisJCXN0YXRpYyBwdWJsaWMgZnVuY3Rpb24gZXhwb3J0VGFibGVSb3dFbGVtZW50KGV4cG9ydGVyOkJhc2VUZXh0TGF5b3V0RXhwb3J0ZXIsIHRhYmxlUm93OlRhYmxlUm93RWxlbWVudCk6WE1MTGlzdAorCQl7CisJCQlyZXR1cm4gZXhwb3J0ZXIuZXhwb3J0VGFibGVSb3dFbGVtZW50KHRhYmxlUm93KTsKKwkJfQorCQkKKwkJLyoqIAorCQkgKiBPdmVycmlkYWJsZSB3b3JrZXIgbWV0aG9kIGZvciBleHBvcnRpbmcgYSBUYWJsZVJvd0VsZW1lbnQuIENyZWF0ZXMgdGhlIFhNTExpc3QuCisJCSAqIAorCQkgKiBAcGFyYW0gZmxvd0VsZW1lbnQJRWxlbWVudCB0byBleHBvcnQKKwkJICogQHJldHVybiBYTUxMaXN0CVhNTCBmb3IgdGhlIGVsZW1lbnQKKwkJICovCisJCXByb3RlY3RlZCBmdW5jdGlvbiBleHBvcnRUYWJsZVJvd0VsZW1lbnQodGFibGVSb3dFbGVtZW50OlRhYmxlUm93RWxlbWVudCk6WE1MTGlzdAorCQl7CisJCQl2YXIgcmVzdWx0OlhNTExpc3QgPSBleHBvcnRGbG93RWxlbWVudCh0YWJsZVJvd0VsZW1lbnQpOworCQkJdmFyIGNvdW50OmludCA9IHRhYmxlUm93RWxlbWVudC5udW1DZWxsczsKKwkJCQorCQkJLy8gb3V0cHV0IGVhY2ggY2hpbGQKKwkJCWZvcih2YXIgaW5kZXg6aW50OyBpbmRleCA8IGNvdW50OyArK2luZGV4KQorCQkJeworCQkJCXZhciBmbG93Q2hpbGQ6Rmxvd0VsZW1lbnQgPSB0YWJsZVJvd0VsZW1lbnQuZ2V0Q2VsbEF0KGluZGV4KTsKKwkJCQlyZXN1bHQuYXBwZW5kQ2hpbGQoZXhwb3J0Q2hpbGQoZmxvd0NoaWxkKSk7CisJCQl9CisJCQkKKwkJCXJldHVybiByZXN1bHQ7CisJCX0KKwkJCisJCS8qKiAKKwkJICogQmFzZSBmdW5jdGlvbmFsaXR5IGZvciBleHBvcnRpbmcgYSBUYWJsZUNlbGxFbGVtZW50LiBFeHBvcnRzIGFzIGEgVGFibGVDZWxsRWxlbWVudCwKKwkJICogYW5kIGV4cG9ydHMgdGFibGUgY2VsbCBhdHRyaWJ1dGVzLgorCQkgKiAKKwkJICogQHBhcmFtIGV4cG9ydGVyCVJvb3Qgb2JqZWN0IGZvciB0aGUgZXhwb3J0CisJCSAqIEBwYXJhbSBjb250YWluZXIJRWxlbWVudCB0byBleHBvcnQKKwkJICogQHJldHVybiBYTUxMaXN0CVhNTCBmb3IgdGhlIGVsZW1lbnQKKwkJICovCisJCXN0YXRpYyBwdWJsaWMgZnVuY3Rpb24gZXhwb3J0VGFibGVDZWxsRWxlbWVudChleHBvcnRlcjpCYXNlVGV4dExheW91dEV4cG9ydGVyLCB0YWJsZUNlbGw6VGFibGVDZWxsRWxlbWVudCk6WE1MTGlzdAorCQl7CisJCQlyZXR1cm4gZXhwb3J0ZXIuZXhwb3J0VGFibGVDZWxsRWxlbWVudCh0YWJsZUNlbGwpOworCQl9CisJCQorCQkvKiogCisJCSAqIE92ZXJyaWRhYmxlIHdvcmtlciBtZXRob2QgZm9yIGV4cG9ydGluZyBhIFRhYmxlQ2VsbEVsZW1lbnQuIENyZWF0ZXMgdGhlIFhNTExpc3QuCisJCSAqIAorCQkgKiBAcGFyYW0gZmxvd0VsZW1lbnQJRWxlbWVudCB0byBleHBvcnQKKwkJICogQHJldHVybiBYTUxMaXN0CVhNTCBmb3IgdGhlIGVsZW1lbnQKKwkJICovCisJCXByb3RlY3RlZCBmdW5jdGlvbiBleHBvcnRUYWJsZUNlbGxFbGVtZW50KHRhYmxlQ2VsbEVsZW1lbnQ6VGFibGVDZWxsRWxlbWVudCk6WE1MTGlzdAorCQl7CisJCQl2YXIgcmVzdWx0OlhNTExpc3QgPSBleHBvcnRGbG93RWxlbWVudCh0YWJsZUNlbGxFbGVtZW50KTsKKwkJCQorCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQorCQkKKwkJLyoqIAorCQkgKiBPdmVycmlkYWJsZSB3b3JrZXIgbWV0aG9kIGZvciBleHBvcnRpbmcgYSBQYXJhZ3JhcGhGb3JtYXR0ZWRFbGVtZW50LiBDcmVhdGVzIHRoZSBYTUxMaXN0LgorCQkgKiAKKwkJICogQHBhcmFtIGZsb3dFbGVtZW50CUVsZW1lbnQgdG8gZXhwb3J0CisJCSAqIEByZXR1cm4gWE1MTGlzdAlYTUwgZm9yIHRoZSBlbGVtZW50CisJCSAqLworCQlwcm90ZWN0ZWQgZnVuY3Rpb24gZXhwb3J0UGFyYWdyYXBoRm9ybWF0dGVkRWxlbWVudChmbG93RWxlbWVudDpGbG93RWxlbWVudCk6WE1MTGlzdAorCQl7CisJCQl2YXIgcmVzdWx0OlhNTExpc3QgPSBleHBvcnRGbG93RWxlbWVudChmbG93RWxlbWVudCk7CisJCQl2YXIgY291bnQ6aW50ID0gUGFyYWdyYXBoRm9ybWF0dGVkRWxlbWVudChmbG93RWxlbWVudCkubnVtQ2hpbGRyZW47CisJCQkKKwkJCS8vIG91dHB1dCBlYWNoIGNoaWxkCisJCQlmb3IodmFyIGluZGV4OmludDsgaW5kZXggPCBjb3VudDsgKytpbmRleCkKKwkJCXsKKwkJCQl2YXIgZmxvd0NoaWxkOkZsb3dFbGVtZW50ID0gUGFyYWdyYXBoRm9ybWF0dGVkRWxlbWVudChmbG93RWxlbWVudCkuZ2V0Q2hpbGRBdChpbmRleCk7CisJCQkJcmVzdWx0LmFwcGVuZENoaWxkKGV4cG9ydENoaWxkKGZsb3dDaGlsZCkpOworCQkJfQorCQkJCisJCQlyZXR1cm4gcmVzdWx0OworCQl9CisJCQorCQkvKiogCisJCSAqIEJhc2UgZnVuY3Rpb25hbGl0eSBmb3IgZXhwb3J0aW5nIGEgVGV4dEZsb3cuIEV4cG9ydHMgYXMgYSBDb250YWluZXJFbGVtZW50LAogCQkgKiBhbmQgZXhwb3J0cyBjb250YWluZXIgYXR0cmlidXRlcy4KKwkJICogCiAJCSAqIEBwYXJhbSBleHBvcnRlcglSb290IG9iamVjdCBmb3IgdGhlIGV4cG9ydAogCQkgKiBAcGFyYW0gdGV4dEZsb3cJRWxlbWVudCB0byBleHBvcnQKIAkJICogQHJldHVybiBYTUxMaXN0CVhNTCBmb3IgdGhlIGVsZW1lbnQKQEAgLTM0NCw4ICs0NzcsMTAgQEAKIAkJewogCQkJdmFyIG91dHB1dDpYTUxMaXN0ID0gZXhwb3J0Q29udGFpbmVyRm9ybWF0dGVkRWxlbWVudChleHBvcnRlciwgdGV4dEZsb3cpOwogCQkJCi0JCQkvLyBUZXh0TGF5b3V0IHdpbGwgdXNlIFBSRVNFUlZFIG9uIG91dHB1dAotCQkJb3V0cHV0LkBbVGV4dExheW91dEZvcm1hdC53aGl0ZVNwYWNlQ29sbGFwc2VQcm9wZXJ0eS5uYW1lXSA9IFdoaXRlU3BhY2VDb2xsYXBzZS5QUkVTRVJWRTsKKwkJCWlmIChleHBvcnRlci5jb25maWcud2hpdGVTcGFjZUNvbGxhcHNlKSB7CisJCQkJLy8gVGV4dExheW91dCB3aWxsIHVzZSBQUkVTRVJWRSBvbiBvdXRwdXQKKwkJCQlvdXRwdXQuQFtUZXh0TGF5b3V0Rm9ybWF0LndoaXRlU3BhY2VDb2xsYXBzZVByb3BlcnR5Lm5hbWVdID0gZXhwb3J0ZXIuY29uZmlnLndoaXRlU3BhY2VDb2xsYXBzZTsKKwkJCX0KIAkJCQogCQkJLy8gVGV4dExheW91dCBhZGRzIHZlcnNpb24gaW5mb3JtYXRpb24KIAkJCW91dHB1dC5AWyJ2ZXJzaW9uIl0gPSBUZXh0TGF5b3V0VmVyc2lvbi5nZXRWZXJzaW9uU3RyaW5nKFRleHRMYXlvdXRWZXJzaW9uLkNVUlJFTlRfVkVSU0lPTik7CkBAIC0zNTQsOCArNDg5LDEwIEBACiAJCX0KIAogCi0JCS8qKiBFeHBvcnRzIHRoZSBvYmplY3QuIEl0IHdpbGwgZmluZCB0aGUgYXBwcm9wcmlhdGUgZXhwb3J0ZXIgYW5kIHVzZSBpdCB0byAKKwkJLyoqIAorCQkgKiBFeHBvcnRzIHRoZSBvYmplY3QuIEl0IHdpbGwgZmluZCB0aGUgYXBwcm9wcmlhdGUgZXhwb3J0ZXIgYW5kIHVzZSBpdCB0byAKIAkJICogZXhwb3J0IHRoZSBvYmplY3QuCisJCSAqIAogCQkgKiBAcGFyYW0gZXhwb3J0ZXIJUm9vdCBvYmplY3QgZm9yIHRoZSBleHBvcnQKIAkJICogQHBhcmFtIGZsb3dFbGVtZW50CUVsZW1lbnQgdG8gZXhwb3J0CiAJCSAqIEByZXR1cm4gWE1MTGlzdAlYTUwgZm9yIHRoZSBmbG93RWxlbWVudApAQCAtMzYzLDEzICs1MDAsMTUgQEAKIAkJcHVibGljIGZ1bmN0aW9uIGV4cG9ydENoaWxkKGZsb3dFbGVtZW50OkZsb3dFbGVtZW50KTpYTUxMaXN0CiAJCXsKIAkJCXZhciBjbGFzc05hbWU6U3RyaW5nID0gZmxhc2gudXRpbHMuZ2V0UXVhbGlmaWVkQ2xhc3NOYW1lKGZsb3dFbGVtZW50KTsKLQkJCXZhciBpbmZvOkZsb3dFbGVtZW50SW5mbyA9IF9jb25maWcubG9va3VwQnlDbGFzcyhjbGFzc05hbWUpOworCQkJdmFyIGluZm86Rmxvd0VsZW1lbnRJbmZvID0gY29uZmlnLmxvb2t1cEJ5Q2xhc3MoY2xhc3NOYW1lKTsKIAkJCWlmIChpbmZvICE9IG51bGwpCiAJCQkJcmV0dXJuIGluZm8uZXhwb3J0ZXIodGhpcywgZmxvd0VsZW1lbnQpOwogCQkJcmV0dXJuIG51bGw7CiAJCX0KIAkJCQkJCi0JCS8qKiBIZWxwZXIgZnVuY3Rpb24gdG8gZXhwb3J0IHN0eWxlcyAoY29yZSBvciB1c2VyKSBpbiB0aGUgZm9ybSBvZiB4bWwgYXR0cmlidXRlcyBvciB4bWwgY2hpbGRyZW4KKwkJLyoqIAorCQkgKiBIZWxwZXIgZnVuY3Rpb24gdG8gZXhwb3J0IHN0eWxlcyAoY29yZSBvciB1c2VyKSBpbiB0aGUgZm9ybSBvZiB4bWwgYXR0cmlidXRlcyBvciB4bWwgY2hpbGRyZW4uCisJCSAqIAogCQkgKiBAcGFyYW0geG1sIG9iamVjdCB0byB3aGljaCBhdHRyaWJ1dGVzL2NoaWxkcmVuIGFyZSBhZGRlZCAKIAkJICogQHBhcmFtIHNvcnRhYmxlU3R5bGVzIGFuIGFycmF5IG9mIG9iamVjdHMgKHhtbE5hbWUseG1sVmFsKSBtZW1iZXJzIHRoYXQgaXMgc29ydGVkIGFuZCBleHBvcnRlZC4KIAkJICovCkBAIC00MDAsNyArNTM5LDYgQEAKIAkJcHJvdGVjdGVkIGZ1bmN0aW9uIGdldCBmb3JtYXREZXNjcmlwdGlvbigpOk9iamVjdAogCQl7CiAJCQlyZXR1cm4gbnVsbDsKLQkJfQkJCi0KKwkJfQogCX0KIH0KZGlmZiAtLWdpdCBhL3RleHRMYXlvdXQvc3JjL2ZsYXNoeC90ZXh0TGF5b3V0L2NvbnZlcnNpb24vQmFzZVRleHRMYXlvdXRJbXBvcnRlci5hcyBiL3RleHRMYXlvdXQvc3JjL2ZsYXNoeC90ZXh0TGF5b3V0L2NvbnZlcnNpb24vQmFzZVRleHRMYXlvdXRJbXBvcnRlci5hcwppbmRleCAyMTMxN2IzLi4zZWI2YWMzIDEwMDY0NAotLS0gYS90ZXh0TGF5b3V0L3NyYy9mbGFzaHgvdGV4dExheW91dC9jb252ZXJzaW9uL0Jhc2VUZXh0TGF5b3V0SW1wb3J0ZXIuYXMKKysrIGIvdGV4dExheW91dC9zcmMvZmxhc2h4L3RleHRMYXlvdXQvY29udmVyc2lvbi9CYXNlVGV4dExheW91dEltcG9ydGVyLmFzCkBAIC0yMSw2ICsyMSw3IEBACiAJaW1wb3J0IGZsYXNoLnN5c3RlbS5TeXN0ZW07CiAJCiAJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LlRleHRMYXlvdXRWZXJzaW9uOworCWltcG9ydCBmbGFzaHgudGV4dExheW91dC50bGZfaW50ZXJuYWw7CiAJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmRlYnVnLmFzc2VydDsKIAlpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQuZWxlbWVudHMuQnJlYWtFbGVtZW50OwogCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5lbGVtZW50cy5Db25maWd1cmF0aW9uOwpAQCAtMzYsMTUgKzM3LDE1IEBACiAJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmVsZW1lbnRzLlBhcmFncmFwaEZvcm1hdHRlZEVsZW1lbnQ7CiAJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmVsZW1lbnRzLlNwYW5FbGVtZW50OwogCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5lbGVtZW50cy5UYWJFbGVtZW50OworCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5lbGVtZW50cy5UYWJsZUNlbGxFbGVtZW50OwogCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5lbGVtZW50cy5UZXh0RmxvdzsKIAlpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQucHJvcGVydHkuUHJvcGVydHk7Ci0JaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LnRsZl9pbnRlcm5hbDsKKwogCXVzZSBuYW1lc3BhY2UgdGxmX2ludGVybmFsOwogCi0JW0V4Y2x1ZGVDbGFzc10KIAkvKioKLQkgKiBAcHJpdmF0ZSAgCi0JICogQmFzZVRleHRMYXlvdXRJbXBvcnRlciBpcyBhIGJhc2UgY2xhc3MgZm9yIGhhbmRsaW5nIHRoZSBpbXBvcnQvZXhwb3J0IG9mIFRleHRMYXlvdXQgdGV4dCBpbiB0aGUgbmF0aXZlIGZvcm1hdC4KKwkgKiBCYXNlVGV4dExheW91dEltcG9ydGVyIGlzIGEgYmFzZSBjbGFzcyBmb3IgaGFuZGxpbmcgdGhlIGltcG9ydC9leHBvcnQgb2YgVGV4dExheW91dCB0ZXh0IAorCSAqIGluIHRoZSBuYXRpdmUgZm9ybWF0LgogCSAqLyAKIAlpbnRlcm5hbCBjbGFzcyBCYXNlVGV4dExheW91dEltcG9ydGVyIGV4dGVuZHMgQ29udmVydGVyQmFzZSBpbXBsZW1lbnRzIElUZXh0SW1wb3J0ZXIKIAl7CQpAQCAtMjA1LDcgKzIwNiw5IEBACiAJCQlyZXR1cm4gaW1wb3J0ZXIuY3JlYXRlVGV4dEZsb3dGcm9tWE1MKHhtbFRvUGFyc2UsIG51bGwpOwogCQl9CQkKIAkJCi0JCS8qKiBTdGF0aWMgbWV0aG9kIHRvIHBhcnNlIHRoZSBzdXBwbGllZCBYTUwgaW50byBhIHBhcmFncnBoLiBQYXJzZSB0aGUgPHAgLi4uPiB0YWcgYW5kIGl0J3MgY2hpbGRyZW4uCisJCS8qKiAKKwkJICogU3RhdGljIG1ldGhvZCB0byBwYXJzZSB0aGUgc3VwcGxpZWQgWE1MIGludG8gYSBwYXJhZ3JwaC4gCisJCSAqIFBhcnNlIHRoZSA8cCAuLi4+IHRhZyBhbmQgaXQncyBjaGlsZHJlbi4KIAkJICogCiAJCSAqIEBwYXJhbSBpbXBvcnRlcglwYXJzZXIgb2JqZWN0CiAJCSAqIEBwYXJhbSB4bWxUb1BhcnNlCWNvbnRlbnQgdG8gcGFyc2UKQEAgLTIzMCw3ICsyMzMsOCBAQAogCQkJZHN0LmlkICAgICAgICAgID0gc3JjLmlkOwogCQl9CiAJCQotCQkvKiogU3RhdGljIG1ldGhvZCBmb3IgY29uc3RydWN0aW5nIGEgc3BhbiBmcm9tIFhNTC4gUGFyc2UgdGhlIDxzcGFuPiAuLi4gPC9zcGFuPiB0YWcuIAorCQkvKiogCisJCSAqIFN0YXRpYyBtZXRob2QgZm9yIGNvbnN0cnVjdGluZyBhIHNwYW4gZnJvbSBYTUwuIFBhcnNlIHRoZSA8c3Bhbj4gLi4uIDwvc3Bhbj4gdGFnLiAKIAkJICogSW5zZXJ0IHRoZSBzcGFuIGludG8gaXRzIHBhcmVudAogCQkgKiAKIAkJICogQHBhcmFtIGltcG9ydGVyCXBhcnNlciBvYmplY3QKQEAgLTI5Niw3ICszMDAsOCBAQAogCQkJfQogCQl9CiAJCQotCQkvKiogU3RhdGljIG1ldGhvZCBmb3IgY29uc3RydWN0aW5nIGEgYnJlYWsgZWxlbWVudCBmcm9tIFhNTC4gVmFsaWRhdGUgdGhlIDxicj4gLi4uIDwvYnI+IHRhZy4gCisJCS8qKiAKKwkJICogU3RhdGljIG1ldGhvZCBmb3IgY29uc3RydWN0aW5nIGEgYnJlYWsgZWxlbWVudCBmcm9tIFhNTC4gVmFsaWRhdGUgdGhlIDxicj4gLi4uIDwvYnI+IHRhZy4gCiAJCSAqIFVzZSAiXHUyMDI4IiBhcyB0aGUgdGV4dDsgSW5zZXJ0IHRoZSBuZXcgZWxlbWVudCBpbnRvIGl0cyBwYXJlbnQgCiAJCSAqIAogCQkgKiBAcGFyYW0gaW1wb3J0ZXIJcGFyc2VyIG9iamVjdApAQCAtMzA4LDkgKzMxMyw5IEBACiAJCQl2YXIgYnJlYWtFbGVtOkJyZWFrRWxlbWVudCA9IGltcG9ydGVyLmNyZWF0ZUJyZWFrRnJvbVhNTCh4bWxUb1BhcnNlKTsKIAkJCWltcG9ydGVyLmFkZENoaWxkKHBhcmVudCwgYnJlYWtFbGVtKTsKIAkJfQotCiAJCQotCQkvKiogU3RhdGljIG1ldGhvZCBmb3IgY29uc3RydWN0aW5nIGEgdGFiIGVsZW1lbnQgZnJvbSBYTUwuIFZhbGlkYXRlIHRoZSA8dGFiPiAuLi4gPC90YWI+IHRhZy4gCisJCS8qKiAKKwkJICogU3RhdGljIG1ldGhvZCBmb3IgY29uc3RydWN0aW5nIGEgdGFiIGVsZW1lbnQgZnJvbSBYTUwuIFZhbGlkYXRlIHRoZSA8dGFiPiAuLi4gPC90YWI+IHRhZy4gCiAJCSAqIFVzZSAiXHQiIGFzIHRoZSB0ZXh0OyBJbnNlcnQgdGhlIG5ldyBlbGVtZW50IGludG8gaXRzIHBhcmVudCAKIAkJICogCiAJCSAqIEBwYXJhbSBpbXBvcnRlcglwYXJzZXIgb2JqZWN0CkBAIC0zMjMsNyArMzI4LDE0IEBACiAJCQlpZiAodGFiRWxlbSkKIAkJCQlpbXBvcnRlci5hZGRDaGlsZChwYXJlbnQsIHRhYkVsZW0pOwogCQl9Ci0KKwkJCisJCS8qKiAKKwkJICogU3RhdGljIG1ldGhvZCBmb3IgY29uc3RydWN0aW5nIGEgbGlzdCBlbGVtZW50IGZyb20gWE1MLiAKKwkJICogCisJCSAqIEBwYXJhbSBpbXBvcnRlcglwYXJzZXIgb2JqZWN0CisJCSAqIEBwYXJhbSB4bWxUb1BhcnNlCWNvbnRlbnQgdG8gcGFyc2UKKwkJICogQHBhcmFtIHBhcmVudCAJCXRoZSBwYXJlbnQgZm9yIHRoZSBuZXcgY29udGVudAorCQkgKi8KIAkJc3RhdGljIHB1YmxpYyBmdW5jdGlvbiBwYXJzZUxpc3QoaW1wb3J0ZXI6QmFzZVRleHRMYXlvdXRJbXBvcnRlciwgeG1sVG9QYXJzZTpYTUwsIHBhcmVudDpGbG93R3JvdXBFbGVtZW50KTp2b2lkCiAJCXsKIAkJCXZhciBsaXN0RWxlbTpMaXN0RWxlbWVudCA9IGltcG9ydGVyLmNyZWF0ZUxpc3RGcm9tWE1MKHhtbFRvUGFyc2UpOwpAQCAtMzMyLDcgKzM0NCwxNCBAQAogCQkJCWltcG9ydGVyLnBhcnNlRmxvd0dyb3VwRWxlbWVudENoaWxkcmVuKHhtbFRvUGFyc2UsIGxpc3RFbGVtKTsKIAkJCX0KIAkJfQotCisJCQorCQkvKiogCisJCSAqIFN0YXRpYyBtZXRob2QgZm9yIGNvbnN0cnVjdGluZyBhIGxpc3QgaXRlbSBmcm9tIFhNTC4gCisJCSAqIAorCQkgKiBAcGFyYW0gaW1wb3J0ZXIJcGFyc2VyIG9iamVjdAorCQkgKiBAcGFyYW0geG1sVG9QYXJzZQljb250ZW50IHRvIHBhcnNlCisJCSAqIEBwYXJhbSBwYXJlbnQgCQl0aGUgcGFyZW50IGZvciB0aGUgbmV3IGNvbnRlbnQKKwkJICovCiAJCXN0YXRpYyBwdWJsaWMgZnVuY3Rpb24gcGFyc2VMaXN0SXRlbShpbXBvcnRlcjpCYXNlVGV4dExheW91dEltcG9ydGVyLCB4bWxUb1BhcnNlOlhNTCwgcGFyZW50OkZsb3dHcm91cEVsZW1lbnQpOnZvaWQKIAkJewogCQkJdmFyIGxpc3RJdGVtOkxpc3RJdGVtRWxlbWVudCA9IGltcG9ydGVyLmNyZWF0ZUxpc3RJdGVtRnJvbVhNTCh4bWxUb1BhcnNlKTsKQEAgLTQyMCw3ICs0MzksOSBAQAogCQkJcmV0dXJuIHdvcmtBdHRyczsKIAkJfQkKIAkJCi0JCS8qKiBQYXJzZSBYTUwgYW5kIGNvbnZlcnQgdG8gIFRleHRGbG93LgorCQkvKiogCisJCSAqIFBhcnNlIFhNTCBhbmQgY29udmVydCB0byAgVGV4dEZsb3cuCisJCSAqIAogCQkgKiBAcGFyYW0geG1sVG9QYXJzZQljb250ZW50IHRvIHBhcnNlCiAJCSAqIEBwYXJhbSB0ZXh0RmxvdyAJCVRleHRGbG93IHdlJ3JlIHBhcnNpbmcuIElmIG51bGwsIGNyZWF0ZSBvciBmaW5kIGEgbmV3IFRleHRGbG93IGJhc2VkIG9uIFhNTCBjb250ZW50CiAJCSAqIEByZXR1cm4gVGV4dEZsb3cJdGhlIG5ldyBUZXh0RmxvdyBjcmVhdGVkIGFzIGEgcmVzdWx0IG9mIHRoZSBwYXJzZQpAQCAtNDY3LDcgKzQ4OCw5IEBACiAJCQlyZXR1cm4gbmV3IFRhYkVsZW1lbnQoKTsKIAkJfQogCQkKLQkJLyoqIFBhcnNlIFhNTCwgY29udmVydCB0byBGbG93RWxlbWVudHMgYW5kIGFkZCB0byB0aGUgcGFyZW50LgorCQkvKiogCisJCSAqIFBhcnNlIFhNTCwgY29udmVydCB0byBGbG93RWxlbWVudHMgYW5kIGFkZCB0byB0aGUgcGFyZW50LgorCQkgKiAKIAkJICogQHBhcmFtIHhtbFRvUGFyc2UJY29udGVudCB0byBwYXJzZQogCQkgKiBAcGFyYW0gcGFyZW50IAkJdGhlIHBhcmVudCBmb3IgdGhlIG5ldyBjb250ZW50CiAJCSAqLwpAQCAtNDc2LDcgKzQ5OSw5IEBACiAJCQlwYXJzZUZsb3dHcm91cEVsZW1lbnRDaGlsZHJlbih4bWxUb1BhcnNlLCBwYXJlbnQpOwogCQl9CiAJCQotCQkvKiogUGFyc2UgWE1MLCBjb252ZXJ0IHRvIEZsb3dFbGVtZW50cyBhbmQgYWRkIHRvIHRoZSBwYXJlbnQuCisJCS8qKiAKKwkJICogUGFyc2UgWE1MLCBjb252ZXJ0IHRvIEZsb3dFbGVtZW50cyBhbmQgYWRkIHRvIHRoZSBwYXJlbnQuCisJCSAqIAogCQkgKiBAcGFyYW0geG1sVG9QYXJzZQljb250ZW50IHRvIHBhcnNlCiAJCSAqIEBwYXJhbSBwYXJlbnQgCQl0aGUgcGFyZW50IGZvciB0aGUgbmV3IGNvbnRlbnQKIAkJICogQHBhcmFtIGNoYWluZWRQYXJlbnQgd2hldGhlciBwYXJlbnQgYWN0dWFsbHkgY29ycmVzcG9uZHMgdG8geG1sVG9QYXJzZSBvciBoYXMgYmVlbiBjaGFpbmVkIChzdWNoIGFzIHdoZW4geG1sVG9QYXJzZSBpcyBhIGZvcm1hdHRpbmcgZWxlbWVudCkgCkBAIC01MTAsNiArNTM1LDU0IEBACiAJCQkJcmVzZXRJbXBsaWVkUGFyYSgpOwogCQl9CiAJCQorCQkvKiogCisJCSAqIFBhcnNlIFhNTCwgY29udmVydCBYTUwgdG8gRmxvd0VsZW1lbnRzIGFuZCBUZXh0RmxvdyBhbmQgYWRkIHRvIHRoZSBwYXJlbnQgdGFibGUgY2VsbAorCQkgKiAKKwkJICogQHBhcmFtIHhtbFRvUGFyc2UJY29udGVudCB0byBwYXJzZQorCQkgKiBAcGFyYW0gcGFyZW50IAkJdGhlIHBhcmVudCBmb3IgdGhlIG5ldyBjb250ZW50CisJCSAqIEBwYXJhbSBjaGFpbmVkUGFyZW50IHdoZXRoZXIgcGFyZW50IGFjdHVhbGx5IGNvcnJlc3BvbmRzIHRvIHhtbFRvUGFyc2Ugb3IgaGFzIGJlZW4gY2hhaW5lZCAoc3VjaCBhcyB3aGVuIHhtbFRvUGFyc2UgaXMgYSBmb3JtYXR0aW5nIGVsZW1lbnQpIAorCQkgKi8KKwkJcHVibGljIGZ1bmN0aW9uIHBhcnNlVGFibGVDZWxsRWxlbWVudENoaWxkcmVuKHhtbFRvUGFyc2U6WE1MLCBwYXJlbnQ6Rmxvd0dyb3VwRWxlbWVudCwgZXhjZXB0aW9uRWxlbWVudHM6T2JqZWN0ID0gbnVsbCwgY2hhaW5lZFBhcmVudDpCb29sZWFuPWZhbHNlKTp2b2lkCisJCXsKKwkJCXZhciB0ZXh0RmxvdzpUZXh0RmxvdzsKKwkJCQorCQkJZm9yIGVhY2ggKHZhciBjaGlsZDpYTUwgaW4geG1sVG9QYXJzZS5jaGlsZHJlbigpKQorCQkJeworCQkJCWlmIChjaGlsZC5ub2RlS2luZCgpID09ICJlbGVtZW50IikKKwkJCQl7CisJCQkJCWlmIChjaGlsZC5uYW1lKCkubG9jYWxOYW1lPT0icCIpIHsKKwkJCQkJCXRleHRGbG93ID0gbmV3IFRleHRGbG93KCk7CisJCQkJCQlwYXJzZU9iamVjdChjaGlsZC5uYW1lKCkubG9jYWxOYW1lLCBjaGlsZCwgdGV4dEZsb3csIGV4Y2VwdGlvbkVsZW1lbnRzKTsKKwkJCQkJfQorCQkJCQllbHNlIGlmIChjaGlsZC5uYW1lKCkubG9jYWxOYW1lPT0iVGV4dEZsb3ciKSB7CisJCQkJCQlUYWJsZUNlbGxFbGVtZW50KHBhcmVudCkudGV4dEZsb3cgPSBjcmVhdGVUZXh0Rmxvd0Zyb21YTUwoY2hpbGQpOworCQkJCQl9CisJCQkJfQorCQkJCQkvLyBsb29rIGZvciBtaXhlZCBjb250ZW50IGhlcmUKKwkJCQllbHNlIGlmIChjaGlsZC5ub2RlS2luZCgpID09ICJ0ZXh0IikgCisJCQkJeworCQkJCQl2YXIgdHh0OlN0cmluZyA9IGNoaWxkLnRvU3RyaW5nKCk7CisJCQkJCS8vIFN0cmlwIHdoaXRlc3BhY2Utb25seSB0ZXh0IGFwcGVhcmluZyBhcyBhIGNoaWxkIG9mIGEgY29udGFpbmVyLWZvcm1hdHRlZCBlbGVtZW50CisJCQkJCXZhciBzdHJpcDpCb29sZWFuID0gZmFsc2U7CisJCQkJCWlmIChwYXJlbnQgaXMgQ29udGFpbmVyRm9ybWF0dGVkRWxlbWVudCkKKwkJCQkJeworCQkJCQkJc3RyaXAgPSB0eHQuc2VhcmNoKGFueVByaW50Q2hhcikgPT0gLTE7CisJCQkJCX0KKwkJCQkJCisJCQkJCWlmICghc3RyaXApIHsKKwkJCQkJCXRleHRGbG93ID0gbmV3IFRleHRGbG93KCk7CisJCQkJCQlwYXJzZU9iamVjdChjaGlsZC5uYW1lKCkubG9jYWxOYW1lLCBjaGlsZCwgdGV4dEZsb3csIGV4Y2VwdGlvbkVsZW1lbnRzKTsKKwkJCQkJCS8vYWRkQ2hpbGQodGV4dEZsb3csIGNyZWF0ZUltcGxpZWRTcGFuKHR4dCkpOworCQkJCQl9CisJCQkJfQorCQkJCQorCQkJCWlmICh0ZXh0RmxvdykgeworCQkJCQlUYWJsZUNlbGxFbGVtZW50KHBhcmVudCkudGV4dEZsb3cgPSB0ZXh0RmxvdzsKKwkJCQkJdGV4dEZsb3cgPSBudWxsOworCQkJCX0KKwkJCX0KKwkJfQorCQkKIAkJLyoqIGNyZWF0ZSBhbiBpbXBsaWVkIHNwYW4gd2l0aCBzcGVjaWZpZWQgdGV4dCAqLwogCQlwdWJsaWMgZnVuY3Rpb24gY3JlYXRlSW1wbGllZFNwYW4odGV4dDpTdHJpbmcpOlNwYW5FbGVtZW50CiAJCXsKZGlmZiAtLWdpdCBhL3RleHRMYXlvdXQvc3JjL2ZsYXNoeC90ZXh0TGF5b3V0L2NvbnZlcnNpb24vQ29udmVydGVyQmFzZS5hcyBiL3RleHRMYXlvdXQvc3JjL2ZsYXNoeC90ZXh0TGF5b3V0L2NvbnZlcnNpb24vQ29udmVydGVyQmFzZS5hcwppbmRleCBkZTIyOTcwLi42OTI0ZDIxIDEwMDY0NAotLS0gYS90ZXh0TGF5b3V0L3NyYy9mbGFzaHgvdGV4dExheW91dC9jb252ZXJzaW9uL0NvbnZlcnRlckJhc2UuYXMKKysrIGIvdGV4dExheW91dC9zcmMvZmxhc2h4L3RleHRMYXlvdXQvY29udmVyc2lvbi9Db252ZXJ0ZXJCYXNlLmFzCkBAIC0zNCw2ICszNCw3IEBACiAJCXByaXZhdGUgdmFyIF9lcnJvcnM6VmVjdG9yLjxTdHJpbmc+ID0gbnVsbDsKIAkJcHJpdmF0ZSB2YXIgX3Rocm93T25FcnJvcjpCb29sZWFuID0gZmFsc2U7CiAJCXByaXZhdGUgdmFyIF91c2VDbGlwYm9hcmRBbm5vdGF0aW9uczpCb29sZWFuID0gZmFsc2U7CisJCXByaXZhdGUgdmFyIF9jb25maWc6SW1wb3J0RXhwb3J0Q29uZmlndXJhdGlvbjsKIAogCQkvKiogQSBjb252ZXJ0ZXIgdGhhdCBjb252ZXJ0cyBjbGlwYm9hcmQgZGF0YSBpbnRvIGEgVGV4dEZsb3cgc2hvdWxkIHVzZSB0aGUgTUVSR0VfVE9fTkVYVF9PTl9QQVNURSBwcm9wZXJ0eQogCQkgKiB0byBjb250cm9sIGhvdyB0aGUgZWxlbWVudHMgYXJlIHRyZWF0ZWQgd2hlbiB0aGV5IGFyZSBtZXJnZWQgaW50byBhbiBleGlzdGluZyBUZXh0RmxvdyBvbiBwYXN0ZS4gVGhpcyBpcyB1c2VmdWwKQEAgLTExMSw1ICsxMTIsMTkgQEAKIAkJCV91c2VDbGlwYm9hcmRBbm5vdGF0aW9ucyA9IHZhbHVlOwogCQl9CiAJCQorCQkvKioKKwkJICogUmV0dXJucyB0aGUgaW1wb3J0IGFuZCBleHBvcnQgY29uZmlndXJhdGlvbi4gCisJCSAqKi8KKwkJcHVibGljIGZ1bmN0aW9uIGdldCBjb25maWcoKTpJbXBvcnRFeHBvcnRDb25maWd1cmF0aW9uIHsKKwkJCXJldHVybiBfY29uZmlnOworCQl9CisJCQorCQkvKioKKwkJICogQHByaXZhdGUKKwkJICoqLworCQlwdWJsaWMgZnVuY3Rpb24gc2V0IGNvbmZpZyh2YWx1ZTpJbXBvcnRFeHBvcnRDb25maWd1cmF0aW9uKTp2b2lkIHsKKwkJCV9jb25maWcgPSB2YWx1ZTsKKwkJfQorCQkKIAl9CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGV4dExheW91dC9zcmMvZmxhc2h4L3RleHRMYXlvdXQvY29udmVyc2lvbi9JVGV4dEV4cG9ydGVyLmFzIGIvdGV4dExheW91dC9zcmMvZmxhc2h4L3RleHRMYXlvdXQvY29udmVyc2lvbi9JVGV4dEV4cG9ydGVyLmFzCmluZGV4IDhiM2E5NTUuLmZjMTAxMjggMTAwNjQ0Ci0tLSBhL3RleHRMYXlvdXQvc3JjL2ZsYXNoeC90ZXh0TGF5b3V0L2NvbnZlcnNpb24vSVRleHRFeHBvcnRlci5hcworKysgYi90ZXh0TGF5b3V0L3NyYy9mbGFzaHgvdGV4dExheW91dC9jb252ZXJzaW9uL0lUZXh0RXhwb3J0ZXIuYXMKQEAgLTk0LDYgKzk0LDEyIEBACiAJCSAqIEBsYW5ndmVyc2lvbiAzLjAKIAkJICovCiAJCWZ1bmN0aW9uIGdldCB1c2VDbGlwYm9hcmRBbm5vdGF0aW9ucygpOkJvb2xlYW47Ci0JCWZ1bmN0aW9uIHNldCB1c2VDbGlwYm9hcmRBbm5vdGF0aW9ucyh2YWx1ZTpCb29sZWFuKTp2b2lkOwkJCisJCWZ1bmN0aW9uIHNldCB1c2VDbGlwYm9hcmRBbm5vdGF0aW9ucyh2YWx1ZTpCb29sZWFuKTp2b2lkOworCQkKKwkJLyoqCisJCSAqIEFjY2Vzc2VzIHRoZSBjb25maWcgb3B0aW9ucyBmb3IgdGhlIGV4cG9ydGVyLiAKKwkJICoqLworCQlmdW5jdGlvbiBnZXQgY29uZmlnKCk6SW1wb3J0RXhwb3J0Q29uZmlndXJhdGlvbjsKKwkJZnVuY3Rpb24gc2V0IGNvbmZpZyh2YWx1ZTpJbXBvcnRFeHBvcnRDb25maWd1cmF0aW9uKTp2b2lkOwkJCiAJfQogfQpkaWZmIC0tZ2l0IGEvdGV4dExheW91dC9zcmMvZmxhc2h4L3RleHRMYXlvdXQvY29udmVyc2lvbi9JbXBvcnRFeHBvcnRDb25maWd1cmF0aW9uLmFzIGIvdGV4dExheW91dC9zcmMvZmxhc2h4L3RleHRMYXlvdXQvY29udmVyc2lvbi9JbXBvcnRFeHBvcnRDb25maWd1cmF0aW9uLmFzCmluZGV4IDM0MDYyODQuLmI5Yzk5NmMgMTAwNjQ0Ci0tLSBhL3RleHRMYXlvdXQvc3JjL2ZsYXNoeC90ZXh0TGF5b3V0L2NvbnZlcnNpb24vSW1wb3J0RXhwb3J0Q29uZmlndXJhdGlvbi5hcworKysgYi90ZXh0TGF5b3V0L3NyYy9mbGFzaHgvdGV4dExheW91dC9jb252ZXJzaW9uL0ltcG9ydEV4cG9ydENvbmZpZ3VyYXRpb24uYXMKQEAgLTE4LDEzICsxOCwxNiBAQAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIHBhY2thZ2UgZmxhc2h4LnRleHRMYXlvdXQuY29udmVyc2lvbgogewotCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5kZWJ1Zy5hc3NlcnQ7CiAJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LnRsZl9pbnRlcm5hbDsKKwlpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQuZGVidWcuYXNzZXJ0OworCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5mb3JtYXRzLldoaXRlU3BhY2VDb2xsYXBzZTsKKwogCXVzZSBuYW1lc3BhY2UgdGxmX2ludGVybmFsOwogCi0JW0V4Y2x1ZGVDbGFzc10KLQkvKiogQ29uZmlndXJlIGZvciBpbXBvcnQvZXhwb3J0IG9mIHN0YW5kYXJkIGNvbXBvbmVudHMuCi0JICogQ29uZmlndXJlcyB0aGUgaW1wb3J0L2V4cG9ydCBwYWNrYWdlIHNvIGl0IGNhbiBleHBvcnQgYWxsIHRoZSBzdGFuZGFyZCBGbG93RWxlbWVudHMuIAorCS8qKiAKKwkgKiBDb25maWd1cmUgZm9yIGltcG9ydC9leHBvcnQgb2Ygc3RhbmRhcmQgY29tcG9uZW50cy4KKwkgKiBDb25maWd1cmVzIHRoZSBpbXBvcnQvZXhwb3J0IHBhY2thZ2Ugc28gaXQgY2FuIGV4cG9ydCBhbGwgdGhlIHN0YW5kYXJkIEZsb3dFbGVtZW50cy4KKwkgKiAgCiAJICogQHNlZSBmbGFzaHgudGV4dExheW91dC5lbGVtZW50cy5Db25maWd1cmF0aW9uCiAJICogQHBsYXllcnZlcnNpb24gRmxhc2ggMTAKIAkgKiBAcGxheWVydmVyc2lvbiBBSVIgMS41CkBAIC0zMiwxMiArMzUsMjIgQEAKIAkgKi8KIAlwdWJsaWMgY2xhc3MgSW1wb3J0RXhwb3J0Q29uZmlndXJhdGlvbiAKIAl7Ci0JCS8qKiBhcnJheSBvZiBGbG93RWxlbWVudEluZm8gb2JqZWN0cyAoa2V5ID0gbmFtZSwgdmFsdWUgPSBGbG93RWxlbWVudEluZm8pICovCQorCQkvKiogCisJCSAqIGFycmF5IG9mIEZsb3dFbGVtZW50SW5mbyBvYmplY3RzIChrZXkgPSBuYW1lLCB2YWx1ZSA9IEZsb3dFbGVtZW50SW5mbykgCisJCSAqICovCQogCQl0bGZfaW50ZXJuYWwgdmFyIGZsb3dFbGVtZW50SW5mb0xpc3Q6T2JqZWN0ID0ge307CQogCQl0bGZfaW50ZXJuYWwgdmFyIGZsb3dFbGVtZW50Q2xhc3NMaXN0Ok9iamVjdD0ge307CQogCQl0bGZfaW50ZXJuYWwgdmFyIGNsYXNzVG9OYW1lTWFwOk9iamVjdCA9IHt9OworCQkKKwkJLyoqCisJCSAqIFdoaXRlc3BhY2UgY29sbGFwc2UgZXhwb3J0IHNldHRpbmcKKwkJICogQGRlZmF1bHQgV2hpdGVTcGFjZUNvbGxhcHNlLlBSRVNFUlZFCisJCSAqKi8KKwkJcHVibGljIHZhciB3aGl0ZVNwYWNlQ29sbGFwc2U6U3RyaW5nID0gV2hpdGVTcGFjZUNvbGxhcHNlLlBSRVNFUlZFOwogCi0JCS8qKiBDb25zdHJ1Y3Rvci4KKwkJLyoqIAorCQkgKiBDb25zdHJ1Y3Rvci4KKwkJICogCiAJCSogQHBsYXllcnZlcnNpb24gRmxhc2ggMTAKIAkJKiBAcGxheWVydmVyc2lvbiBBSVIgMS41CiAJIAkqIEBsYW5ndmVyc2lvbiAzLjAKQEAgLTQ2LDggKzU5LDEwIEBACiAJCXsKIAkJfQogCQkKLQkJLyoqIEFkZCBhIHBhcnNlciBmb3IgYSBuZXcgRmxvd0VsZW1lbnQgdHlwZS4gVGhpcyBhbGxvd3MgRmxvd0VsZW1lbnRzIHRvIGJlIGFkZGVkIGZyb20gb3V0c2lkZSB0aGUgbWFpbiBzeXN0ZW0sCisJCS8qKiAKKwkJICogQWRkIGEgcGFyc2VyIGZvciBhIG5ldyBGbG93RWxlbWVudCB0eXBlLiBUaGlzIGFsbG93cyBGbG93RWxlbWVudHMgdG8gYmUgYWRkZWQgZnJvbSBvdXRzaWRlIHRoZSBtYWluIHN5c3RlbSwKIAkJICogYW5kIHN0aWxsIGhhdmUgdGhlIG1haW4gc3lzdGVtIGJlIGFibGUgdG8gaW1wb3J0IHRoZW0gZnJvbSBYTUwuCisJCSAqIAogCQkgKiBAcGFyYW0gbmFtZQkJdGhlIG5hbWUgb2YgdGhlIEZsb3dFbGVtZW50IGNsYXNzLCBhcyBpdCBhcHBlYXIgaW4gdGhlIFhNTAogCQkgKiBAcGFyYW0gZmxvd0NsYXNzCXRoZSBjbGFzcyBvZiB0aGUgRmxvd0VsZW1lbnQKIAkJICogQHBhcmFtIHBhcnNlcglmdW5jdGlvbiBmcHIgaW1wb3J0aW5nIHRoZSBYTUwgaW50byBhIEZsb3dFbGVtZW50CkBAIC03MSw3ICs4Niw5IEBACiAJCQkJY2xhc3NUb05hbWVNYXBbaW5mby5mbG93Q2xhc3NOYW1lXSA9IG5hbWU7CiAJCX0KIAkJCi0JCS8qKiBSZXR1cm4gdGhlIGluZm9ybWF0aW9uIGJlaW5nIGhlbGQgYWJvdXQgdGhlIEZsb3dFbGVtZW50LCBhcyBhIEZsb3dFbGVtZW50SW5mby4KKwkJLyoqIAorCQkgKiBSZXR1cm4gdGhlIGluZm9ybWF0aW9uIGJlaW5nIGhlbGQgYWJvdXQgdGhlIEZsb3dFbGVtZW50LCBhcyBhIEZsb3dFbGVtZW50SW5mby4KKwkJICogCiAJCSAqIEBwYXJhbSBuYW1lCQkJCXRoZSBuYW1lIG9mIHRoZSBGbG93RWxlbWVudCBjbGFzcywgYXMgaXQgYXBwZWFycyBpbiB0aGUgWE1MCiAJCSAqIEByZXR1cm4gRmxvd0VsZW1lbnRJbmZvCXRoZSBpbmZvcm1hdGlvbiBiZWluZyBoZWxkLCBhcyBpdCB3YXMgc3VwcGxpZWQgdG8gYWRkUGFyc2VJbmZvCiAJCSAqIEBwcml2YXRlCkBAIC04MSw3ICs5OCw5IEBACiAJCQlyZXR1cm4gZmxvd0VsZW1lbnRJbmZvTGlzdFtuYW1lXTsKIAkJfQogCi0JCS8qKiBSZXR1cm4gdGhlIGVsZW1lbnQgbmFtZSBmb3IgdGhlIGNsYXNzCisJCS8qKiAKKwkJICogUmV0dXJuIHRoZSBlbGVtZW50IG5hbWUgZm9yIHRoZSBjbGFzcworCQkgKiAKIAkJICogQHBhcmFtIGNsYXNzVG9NYXRjaAkJZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIEZsb3dFbGVtZW50CiAJCSAqIEByZXR1cm4gbmFtZQkJCQlleHBvcnQgbmFtZSB0byB1c2UgZm9yIGNsYXNzCiAJCSAqIEBwcml2YXRlCkBAIC05MSw3ICsxMTAsOSBAQAogCQkJcmV0dXJuIGNsYXNzVG9OYW1lTWFwW2NsYXNzVG9NYXRjaF07CiAJCX0KIAotCQkvKiogUmV0dXJuIHRoZSBpbmZvcm1hdGlvbiBiZWluZyBoZWxkIGFib3V0IHRoZSBGbG93RWxlbWVudCwgYXMgYSBGbG93RWxlbWVudEluZm8uCisJCS8qKiAKKwkJICogUmV0dXJuIHRoZSBpbmZvcm1hdGlvbiBiZWluZyBoZWxkIGFib3V0IHRoZSBGbG93RWxlbWVudCwgYXMgYSBGbG93RWxlbWVudEluZm8uCisJCSAqIAogCQkgKiBAcGFyYW0gY2xhc3NUb01hdGNoCQlmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgRmxvd0VsZW1lbnQKIAkJICogQHJldHVybiBGbG93RWxlbWVudEluZm8JdGhlIGluZm9ybWF0aW9uIGJlaW5nIGhlbGQsIGFzIGl0IHdhcyBzdXBwbGllZCB0byBhZGRQYXJzZUluZm8KIAkJICogQHByaXZhdGUKZGlmZiAtLWdpdCBhL3RleHRMYXlvdXQvc3JjL2ZsYXNoeC90ZXh0TGF5b3V0L2NvbnZlcnNpb24vVGV4dExheW91dEV4cG9ydGVyLmFzIGIvdGV4dExheW91dC9zcmMvZmxhc2h4L3RleHRMYXlvdXQvY29udmVyc2lvbi9UZXh0TGF5b3V0RXhwb3J0ZXIuYXMKaW5kZXggNDk2NTk5My4uZDQ2NDliYSAxMDA2NDQKLS0tIGEvdGV4dExheW91dC9zcmMvZmxhc2h4L3RleHRMYXlvdXQvY29udmVyc2lvbi9UZXh0TGF5b3V0RXhwb3J0ZXIuYXMKKysrIGIvdGV4dExheW91dC9zcmMvZmxhc2h4L3RleHRMYXlvdXQvY29udmVyc2lvbi9UZXh0TGF5b3V0RXhwb3J0ZXIuYXMKQEAgLTIwLDYgKzIwLDcgQEAKIHsKIAlpbXBvcnQgZmxhc2gudXRpbHMuRGljdGlvbmFyeTsKIAkKKwlpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQudGxmX2ludGVybmFsOwogCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5kZWJ1Zy5hc3NlcnQ7CiAJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmVsZW1lbnRzLkNvbnRhaW5lckZvcm1hdHRlZEVsZW1lbnQ7CiAJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmVsZW1lbnRzLkRpdkVsZW1lbnQ7CkBAIC0zMyw2ICszNCw5IEBACiAJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmVsZW1lbnRzLlNwYW5FbGVtZW50OwogCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5lbGVtZW50cy5TdWJQYXJhZ3JhcGhHcm91cEVsZW1lbnQ7CiAJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmVsZW1lbnRzLlRDWUVsZW1lbnQ7CisJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmVsZW1lbnRzLlRhYmxlRWxlbWVudDsKKwlpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQuZWxlbWVudHMuVGFibGVDZWxsRWxlbWVudDsKKwlpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQuZWxlbWVudHMuVGFibGVSb3dFbGVtZW50OwogCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5lbGVtZW50cy5UZXh0RmxvdzsKIAlpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQuZm9ybWF0cy5Gb3JtYXRWYWx1ZTsKIAlpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQuZm9ybWF0cy5JVGV4dExheW91dEZvcm1hdDsKQEAgLTQwLDEzICs0NCwxMCBAQAogCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5mb3JtYXRzLlRleHRMYXlvdXRGb3JtYXQ7CiAJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmZvcm1hdHMuV2hpdGVTcGFjZUNvbGxhcHNlOwogCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5wcm9wZXJ0eS5Qcm9wZXJ0eTsKLQlpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQudGxmX2ludGVybmFsOwogCQogCXVzZSBuYW1lc3BhY2UgdGxmX2ludGVybmFsOwogCQotCVtFeGNsdWRlQ2xhc3NdCiAJLyoqIAotCSAqIEBwcml2YXRlCiAJICogRXhwb3J0IGZpbHRlciBmb3IgVGV4dExheW91dCBmb3JtYXQuIAogCSAqLwogCWludGVybmFsIGNsYXNzIFRleHRMYXlvdXRFeHBvcnRlciBleHRlbmRzIEJhc2VUZXh0TGF5b3V0RXhwb3J0ZXIKQEAgLTg3LDggKzg4LDkgQEAKIAkJCXJldHVybiByZXBsYWNlbWVudFhNTDsJCiAJCX0KIAkJCi0JCS8qKiBIZWxwZXIgZnVuY3Rpb24gdG8gZXhwb3J0IHN0eWxlcyAoY29yZSBvciB1c2VyKSBpbiB0aGUgZm9ybSBvZiB4bWwgYXR0cmlidXRlcyBvciB4bWwgY2hpbGRyZW4KLQkJICogQHByaXZhdGUKKwkJLyoqIAorCQkgKiBIZWxwZXIgZnVuY3Rpb24gdG8gZXhwb3J0IHN0eWxlcyAoY29yZSBvciB1c2VyKSBpbiB0aGUgZm9ybSBvZiB4bWwgYXR0cmlidXRlcyBvciB4bWwgY2hpbGRyZW4KKwkJICogCiAJCSAqLwogCQl0bGZfaW50ZXJuYWwgZnVuY3Rpb24gY3JlYXRlU3R5bGVzRnJvbURlc2NyaXB0aW9uKHN0eWxlczpPYmplY3QsIGRlc2NyaXB0aW9uOk9iamVjdCwgaW5jbHVkZVVzZXJTdHlsZXM6Qm9vbGVhbiwgZXhjbHVzaW9uczpBcnJheSk6QXJyYXkKIAkJewpAQCAtMTcwLDcgKzE3Miw3IEBACiAJCQkJZXhwb3J0U3R5bGVzKHJzbHQsIHNvcnRhYmxlU3R5bGVzICk7CiAJCQl9CiAJCQkKLQkJCS8vIGV4cG9ydCBpZCBhbmQgc3R5bGVOYW1lCisJCQkvLyBleHBvcnQgaWQgYW5kIHR5cGVOYW1lCiAJCQlpZiAoZmxvd0VsZW1lbnQuaWQgIT0gbnVsbCkKIAkJCQlyc2x0LkBbImlkIl0gPSBmbG93RWxlbWVudC5pZDsKIAkJCWlmIChmbG93RWxlbWVudC50eXBlTmFtZSAhPSBmbG93RWxlbWVudC5kZWZhdWx0VHlwZU5hbWUpCkBAIC0xNzksOCArMTgxLDEwIEBACiAJCQlyZXR1cm4gcnNsdDsKIAkJfQogCi0JCS8qKiBCYXNlIGZ1bmN0aW9uYWxpdHkgZm9yIGV4cG9ydGluZyBhbiBJbWFnZS4gRXhwb3J0cyBhcyBhIEZsb3dFbGVtZW50LAorCQkvKiogCisJCSAqIEJhc2UgZnVuY3Rpb25hbGl0eSBmb3IgZXhwb3J0aW5nIGFuIEltYWdlLiBFeHBvcnRzIGFzIGEgRmxvd0VsZW1lbnQsCiAJCSAqIGFuZCBleHBvcnRzIGltYWdlIHByb3BlcnRpZXMuCisJCSAqIAogCQkgKiBAcGFyYW0gZXhwb3J0ZXIJUm9vdCBvYmplY3QgZm9yIHRoZSBleHBvcnQKIAkJICogQHBhcmFtIGltYWdlCUVsZW1lbnQgdG8gZXhwb3J0CiAJCSAqIEByZXR1cm4gWE1MTGlzdAlYTUwgZm9yIHRoZSBlbGVtZW50CkBAIC0yMDMsOCArMjA3LDEwIEBACiAJCQlyZXR1cm4gb3V0cHV0OwogCQl9CiAKLQkJLyoqIEJhc2UgZnVuY3Rpb25hbGl0eSBmb3IgZXhwb3J0aW5nIGEgTGlua0VsZW1lbnQuIEV4cG9ydHMgYXMgYSBGbG93R3JvdXBFbGVtZW50LAorCQkvKiogCisJCSAqIEJhc2UgZnVuY3Rpb25hbGl0eSBmb3IgZXhwb3J0aW5nIGEgTGlua0VsZW1lbnQuIEV4cG9ydHMgYXMgYSBGbG93R3JvdXBFbGVtZW50LAogCQkgKiBhbmQgZXhwb3J0cyBsaW5rIHByb3BlcnRpZXMuCisJCSAqIAogCQkgKiBAcGFyYW0gZXhwb3J0ZXIJUm9vdCBvYmplY3QgZm9yIHRoZSBleHBvcnQKIAkJICogQHBhcmFtIGxpbmsJRWxlbWVudCB0byBleHBvcnQKIAkJICogQHJldHVybiBYTUxMaXN0CVhNTCBmb3IgdGhlIGVsZW1lbnQKQEAgLTIyMiw3ICsyMjgsOSBAQAogCQkJcmV0dXJuIG91dHB1dDsKIAkJfQogCQkKLQkJLyoqIEJhc2UgZnVuY3Rpb25hbGl0eSBmb3IgZXhwb3J0aW5nIGEgRGl2RWxlbWVudC4gRXhwb3J0cyBhcyBhIEZsb3dDb250YWluZXJGb3JtYXR0ZWRFbGVtZW50CisJCS8qKiAKKwkJICogQmFzZSBmdW5jdGlvbmFsaXR5IGZvciBleHBvcnRpbmcgYSBEaXZFbGVtZW50LiBFeHBvcnRzIGFzIGEgRmxvd0NvbnRhaW5lckZvcm1hdHRlZEVsZW1lbnQKKwkJICogCiAJCSAqIEBwYXJhbSBleHBvcnRlcglSb290IG9iamVjdCBmb3IgdGhlIGV4cG9ydAogCQkgKiBAcGFyYW0gZGl2CUVsZW1lbnQgdG8gZXhwb3J0CiAJCSAqIEByZXR1cm4gWE1MTGlzdAlYTUwgZm9yIHRoZSBlbGVtZW50CkBAIC0yMzIsNyArMjQwLDkgQEAKIAkJCXJldHVybiBleHBvcnRDb250YWluZXJGb3JtYXR0ZWRFbGVtZW50KGV4cG9ydGVyLCBkaXYpOwogCQl9CiAJCQotCQkvKiogQmFzZSBmdW5jdGlvbmFsaXR5IGZvciBleHBvcnRpbmcgYSBTdWJQYXJhZ3JhcGhHcm91cEVsZW1lbnQuIEV4cG9ydHMgYXMgYSBGbG93R3JvdXBFbGVtZW50CisJCS8qKiAKKwkJICogQmFzZSBmdW5jdGlvbmFsaXR5IGZvciBleHBvcnRpbmcgYSBTdWJQYXJhZ3JhcGhHcm91cEVsZW1lbnQuIEV4cG9ydHMgYXMgYSBGbG93R3JvdXBFbGVtZW50CisJCSAqIAogCQkgKiBAcGFyYW0gZXhwb3J0ZXIJUm9vdCBvYmplY3QgZm9yIHRoZSBleHBvcnQKIAkJICogQHBhcmFtIGVsZW0JRWxlbWVudCB0byBleHBvcnQKIAkJICogQHJldHVybiBYTUxMaXN0CVhNTCBmb3IgdGhlIGVsZW1lbnQKQEAgLTI0MSw3ICsyNTEsOSBAQAogCQl7CiAJCQlyZXR1cm4gZXhwb3J0Rmxvd0dyb3VwRWxlbWVudChleHBvcnRlciwgZWxlbSk7CiAJCX0KLQkJLyoqIEJhc2UgZnVuY3Rpb25hbGl0eSBmb3IgZXhwb3J0aW5nIGEgVENZRWxlbWVudC4gRXhwb3J0cyBhcyBhIEZsb3dHcm91cEVsZW1lbnQKKwkJLyoqIAorCQkgKiBCYXNlIGZ1bmN0aW9uYWxpdHkgZm9yIGV4cG9ydGluZyBhIFRDWUVsZW1lbnQuIEV4cG9ydHMgYXMgYSBGbG93R3JvdXBFbGVtZW50CisJCSAqIAogCQkgKiBAcGFyYW0gZXhwb3J0ZXIJUm9vdCBvYmplY3QgZm9yIHRoZSBleHBvcnQKIAkJICogQHBhcmFtIHRjeQlFbGVtZW50IHRvIGV4cG9ydAogCQkgKiBAcmV0dXJuIFhNTExpc3QJWE1MIGZvciB0aGUgZWxlbWVudApAQCAtMjUxLDYgKzI2Myw0MiBAQAogCQkJcmV0dXJuIGV4cG9ydEZsb3dHcm91cEVsZW1lbnQoZXhwb3J0ZXIsIHRjeSk7CiAJCX0KIAkJCisJCS8qKiAKKwkJICogQmFzZSBmdW5jdGlvbmFsaXR5IGZvciBleHBvcnRpbmcgYSBUYWJsZUVsZW1lbnQuIAorCQkgKiAKKwkJICogQHBhcmFtIGV4cG9ydGVyCVJvb3Qgb2JqZWN0IGZvciB0aGUgZXhwb3J0CisJCSAqIEBwYXJhbSB0YWJsZQlFbGVtZW50IHRvIGV4cG9ydAorCQkgKiBAcmV0dXJuIFhNTExpc3QJWE1MIGZvciB0aGUgZWxlbWVudAorCQkgKi8KKwkJc3RhdGljIHB1YmxpYyBmdW5jdGlvbiBleHBvcnRUYWJsZShleHBvcnRlcjpCYXNlVGV4dExheW91dEV4cG9ydGVyLCB0YWJsZTpUYWJsZUVsZW1lbnQpOlhNTExpc3QKKwkJeworCQkJcmV0dXJuIGV4cG9ydFRhYmxlRWxlbWVudChleHBvcnRlciwgdGFibGUpOworCQl9CisJCQorCQkvKiogCisJCSAqIEJhc2UgZnVuY3Rpb25hbGl0eSBmb3IgZXhwb3J0aW5nIGEgVGFibGVSb3dFbGVtZW50LiAKKwkJICogCisJCSAqIEBwYXJhbSBleHBvcnRlcglSb290IG9iamVjdCBmb3IgdGhlIGV4cG9ydAorCQkgKiBAcGFyYW0gdGFibGUJRWxlbWVudCB0byBleHBvcnQKKwkJICogQHJldHVybiBYTUxMaXN0CVhNTCBmb3IgdGhlIGVsZW1lbnQKKwkJICovCisJCXN0YXRpYyBwdWJsaWMgZnVuY3Rpb24gZXhwb3J0VGFibGVSb3coZXhwb3J0ZXI6QmFzZVRleHRMYXlvdXRFeHBvcnRlciwgdGFibGVSb3c6VGFibGVSb3dFbGVtZW50KTpYTUxMaXN0CisJCXsKKwkJCXJldHVybiBleHBvcnRUYWJsZVJvd0VsZW1lbnQoZXhwb3J0ZXIsIHRhYmxlUm93KTsKKwkJfQorCQkKKwkJLyoqIAorCQkgKiBCYXNlIGZ1bmN0aW9uYWxpdHkgZm9yIGV4cG9ydGluZyBhIFRhYmxlQ2VsbEVsZW1lbnQuIAorCQkgKiAKKwkJICogQHBhcmFtIGV4cG9ydGVyCVJvb3Qgb2JqZWN0IGZvciB0aGUgZXhwb3J0CisJCSAqIEBwYXJhbSB0YWJsZQlFbGVtZW50IHRvIGV4cG9ydAorCQkgKiBAcmV0dXJuIFhNTExpc3QJWE1MIGZvciB0aGUgZWxlbWVudAorCQkgKi8KKwkJc3RhdGljIHB1YmxpYyBmdW5jdGlvbiBleHBvcnRUYWJsZUNlbGwoZXhwb3J0ZXI6QmFzZVRleHRMYXlvdXRFeHBvcnRlciwgdGFibGVDZWxsOlRhYmxlQ2VsbEVsZW1lbnQpOlhNTExpc3QKKwkJeworCQkJcmV0dXJuIGV4cG9ydFRhYmxlQ2VsbEVsZW1lbnQoZXhwb3J0ZXIsIHRhYmxlQ2VsbCk7CisJCX0KKwkJCiAJCW92ZXJyaWRlIHByb3RlY3RlZCBmdW5jdGlvbiBnZXQgZm9ybWF0RGVzY3JpcHRpb24oKTpPYmplY3QKIAkJewogCQkJcmV0dXJuIF9mb3JtYXREZXNjcmlwdGlvbjsKZGlmZiAtLWdpdCBhL3RleHRMYXlvdXQvc3JjL2ZsYXNoeC90ZXh0TGF5b3V0L2NvbnZlcnNpb24vVGV4dExheW91dEltcG9ydGVyLmFzIGIvdGV4dExheW91dC9zcmMvZmxhc2h4L3RleHRMYXlvdXQvY29udmVyc2lvbi9UZXh0TGF5b3V0SW1wb3J0ZXIuYXMKaW5kZXggOWViYzYxYy4uMmNjOTc5MyAxMDA2NDQKLS0tIGEvdGV4dExheW91dC9zcmMvZmxhc2h4L3RleHRMYXlvdXQvY29udmVyc2lvbi9UZXh0TGF5b3V0SW1wb3J0ZXIuYXMKKysrIGIvdGV4dExheW91dC9zcmMvZmxhc2h4L3RleHRMYXlvdXQvY29udmVyc2lvbi9UZXh0TGF5b3V0SW1wb3J0ZXIuYXMKQEAgLTE3LDE1ICsxNywxOSBAQAogLy8KIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiBwYWNrYWdlIGZsYXNoeC50ZXh0TGF5b3V0LmNvbnZlcnNpb24gCi17CQorewogCWltcG9ydCBmbGFzaC5kaXNwbGF5LlNoYXBlOwogCWltcG9ydCBmbGFzaC50ZXh0LmVuZ2luZS5UZXh0Um90YXRpb247CiAJaW1wb3J0IGZsYXNoLnV0aWxzLkRpY3Rpb25hcnk7CiAJCiAJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LlRleHRMYXlvdXRWZXJzaW9uOworCWltcG9ydCBmbGFzaHgudGV4dExheW91dC50bGZfaW50ZXJuYWw7CiAJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmNvbnRhaW5lci5Db250YWluZXJDb250cm9sbGVyOwogCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5kZWJ1Zy5hc3NlcnQ7CisJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmVkaXQuRWRpdE1hbmFnZXI7CisJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmVkaXQuU2VsZWN0aW9uTWFuYWdlcjsKIAlpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQuZWxlbWVudHMuQnJlYWtFbGVtZW50OworCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5lbGVtZW50cy5Db250YWluZXJGb3JtYXR0ZWRFbGVtZW50OwogCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5lbGVtZW50cy5EaXZFbGVtZW50OwogCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5lbGVtZW50cy5GbG93RWxlbWVudDsKIAlpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQuZWxlbWVudHMuRmxvd0dyb3VwRWxlbWVudDsKQEAgLTQwLDE2ICs0NCwxOCBAQAogCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5lbGVtZW50cy5TdWJQYXJhZ3JhcGhHcm91cEVsZW1lbnQ7CiAJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmVsZW1lbnRzLlRDWUVsZW1lbnQ7CiAJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmVsZW1lbnRzLlRhYkVsZW1lbnQ7CisJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmVsZW1lbnRzLlRhYmxlQ2VsbEVsZW1lbnQ7CisJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmVsZW1lbnRzLlRhYmxlQ29sRWxlbWVudDsKKwlpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQuZWxlbWVudHMuVGFibGVFbGVtZW50OworCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5lbGVtZW50cy5UYWJsZVJvd0VsZW1lbnQ7CiAJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmVsZW1lbnRzLlRleHRGbG93OwogCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5mb3JtYXRzLklUZXh0TGF5b3V0Rm9ybWF0OwogCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5mb3JtYXRzLkxpc3RNYXJrZXJGb3JtYXQ7CiAJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmZvcm1hdHMuVGV4dExheW91dEZvcm1hdDsKIAlpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQucHJvcGVydHkuUHJvcGVydHk7Ci0JaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LnRsZl9pbnRlcm5hbDsKIAkKIAl1c2UgbmFtZXNwYWNlIHRsZl9pbnRlcm5hbDsKIAotCVtFeGNsdWRlQ2xhc3NdCiAJLyoqIAogCSAqIEBwcml2YXRlCiAJICogVGV4dExheW91dEltcG9ydGVyIGNvbnZlcnRzIGZyb20gWE1MIHRvIFRleHRMYXlvdXQgZGF0YSBzdHJ1Y3R1cmVzIGFuZCBiYWNrLgpAQCAtODIsNiArODgsMTAgQEAKIAkJCQlfZGVmYXVsdENvbmZpZ3VyYXRpb24uYWRkSUVJbmZvKCJhIiwgTGlua0VsZW1lbnQsICAgICAgICAgICAgVGV4dExheW91dEltcG9ydGVyLnBhcnNlTGluaywgCQkJVGV4dExheW91dEV4cG9ydGVyLmV4cG9ydExpbmspOwogCSAJCQlfZGVmYXVsdENvbmZpZ3VyYXRpb24uYWRkSUVJbmZvKCJkaXYiLCBEaXZFbGVtZW50LCAgICAgICAgICAgVGV4dExheW91dEltcG9ydGVyLnBhcnNlRGl2RWxlbWVudCwgCVRleHRMYXlvdXRFeHBvcnRlci5leHBvcnREaXYpOwogCQkJCV9kZWZhdWx0Q29uZmlndXJhdGlvbi5hZGRJRUluZm8oImltZyIsIElubGluZUdyYXBoaWNFbGVtZW50LCBUZXh0TGF5b3V0SW1wb3J0ZXIucGFyc2VJbmxpbmVHcmFwaGljLCBUZXh0TGF5b3V0RXhwb3J0ZXIuZXhwb3J0SW1hZ2UpOwkKKwkJCQlfZGVmYXVsdENvbmZpZ3VyYXRpb24uYWRkSUVJbmZvKCJ0YWJsZSIsIFRhYmxlRWxlbWVudCwgCQkgVGV4dExheW91dEltcG9ydGVyLnBhcnNlVGFibGUsICAgICAJVGV4dExheW91dEV4cG9ydGVyLmV4cG9ydFRhYmxlKTsJCisJCQkJX2RlZmF1bHRDb25maWd1cmF0aW9uLmFkZElFSW5mbygidHIiLCBUYWJsZVJvd0VsZW1lbnQsIAkgICAgIFRleHRMYXlvdXRJbXBvcnRlci5wYXJzZVRhYmxlUm93LAkgICAgVGV4dExheW91dEV4cG9ydGVyLmV4cG9ydFRhYmxlUm93KTsJCisJCQkJX2RlZmF1bHRDb25maWd1cmF0aW9uLmFkZElFSW5mbygidGgiLCBUYWJsZUNlbGxFbGVtZW50LCAJIFRleHRMYXlvdXRJbXBvcnRlci5wYXJzZVRhYmxlQ2VsbCwgIAlUZXh0TGF5b3V0RXhwb3J0ZXIuZXhwb3J0VGFibGVDZWxsKTsJCisJCQkJX2RlZmF1bHRDb25maWd1cmF0aW9uLmFkZElFSW5mbygidGQiLCBUYWJsZUNlbGxFbGVtZW50LCAJIFRleHRMYXlvdXRJbXBvcnRlci5wYXJzZVRhYmxlQ2VsbCwgIAlUZXh0TGF5b3V0RXhwb3J0ZXIuZXhwb3J0VGFibGVDZWxsKTsJCiAJCQkJCiAJCQkJLy8gdmFsaWRhdGUgdGhlIGRlZmF1bHRUeXBlTmFtZSB2YWx1ZXMuICBUaGV5IGFyZSB0byBtYXRjaCB0aGUgVExGIGZvcm1hdCBleHBvcnQgeG1sIG5hbWVzCiAJCQkJQ09ORklHOjpkZWJ1ZyAKQEAgLTI1MSw2ICsyNjEsNDggQEAKIAkJCXJldHVybiBkaXZFbGVtOwogCQl9CiAJCQorCQkvKioKKwkJICogQ3JlYXRlIGEgdGFibGUgZWxlbWVudCBmcm9tIFhNTAorCQkgKiovCisJCXB1YmxpYyBmdW5jdGlvbiBjcmVhdGVUYWJsZUZyb21YTUwoeG1sVG9QYXJzZTpYTUwpOlRhYmxlRWxlbWVudAorCQl7CisJCQkvLyBhZGQgdGhlIHRhYmxlIGVsZW1lbnQgdG8gdGhlIHBhcmVudAorCQkJdmFyIHRhYmxlRWxlbWVudDpUYWJsZUVsZW1lbnQgPSBuZXcgVGFibGVFbGVtZW50KCk7CisJCQkKKwkJCXBhcnNlU3RhbmRhcmRGbG93RWxlbWVudEF0dHJpYnV0ZXModGFibGVFbGVtZW50LCB4bWxUb1BhcnNlKTsKKworCQkJcmV0dXJuIHRhYmxlRWxlbWVudDsKKwkJfQorCQkKKwkJLyoqCisJCSAqIENyZWF0ZSBhIHRhYmxlIHJvdyBlbGVtZW50IGZyb20gWE1MCisJCSAqKi8KKwkJcHVibGljIGZ1bmN0aW9uIGNyZWF0ZVRhYmxlUm93RnJvbVhNTCh4bWxUb1BhcnNlOlhNTCk6VGFibGVSb3dFbGVtZW50CisJCXsKKwkJCS8vIGFkZCB0aGUgdGFibGUgcm93IGVsZW1lbnQgdG8gdGhlIHBhcmVudAorCQkJdmFyIHRhYmxlUm93RWxlbWVudDpUYWJsZVJvd0VsZW1lbnQgPSBuZXcgVGFibGVSb3dFbGVtZW50KCk7CisJCQkKKwkJCXBhcnNlU3RhbmRhcmRGbG93RWxlbWVudEF0dHJpYnV0ZXModGFibGVSb3dFbGVtZW50LCB4bWxUb1BhcnNlKTsKKwkJCQorCQkJcmV0dXJuIHRhYmxlUm93RWxlbWVudDsKKwkJfQorCQkKKwkJLyoqCisJCSAqIENyZWF0ZSBhIHRhYmxlIGNlbGwgZWxlbWVudCBmcm9tIFhNTAorCQkgKiovCisJCXB1YmxpYyBmdW5jdGlvbiBjcmVhdGVUYWJsZUNlbGxGcm9tWE1MKHhtbFRvUGFyc2U6WE1MKTpUYWJsZUNlbGxFbGVtZW50CisJCXsKKwkJCS8vIGFkZCB0aGUgdGFibGUgY2VsbCBlbGVtZW50IHRvIHRoZSBwYXJlbnQKKwkJCXZhciB0YWJsZUNlbGxFbGVtZW50OlRhYmxlQ2VsbEVsZW1lbnQgPSBuZXcgVGFibGVDZWxsRWxlbWVudCgpOworCQkJCisJCQlwYXJzZVN0YW5kYXJkRmxvd0VsZW1lbnRBdHRyaWJ1dGVzKHRhYmxlQ2VsbEVsZW1lbnQsIHhtbFRvUGFyc2UpOworCQkJCisJCQlyZXR1cm4gdGFibGVDZWxsRWxlbWVudDsKKwkJfQorCQkKKwkJLyoqCisJCSAqIENyZWF0ZSBhIHBhcmFncmFwaCBlbGVtZW50IGZyb20gWE1MCisJCSAqKi8KIAkJcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIGNyZWF0ZVBhcmFncmFwaEZyb21YTUwoeG1sVG9QYXJzZTpYTUwpOlBhcmFncmFwaEVsZW1lbnQKIAkJewogCQkJdmFyIHBhcmFFbGVtOlBhcmFncmFwaEVsZW1lbnQgPSBuZXcgUGFyYWdyYXBoRWxlbWVudCgpOwpAQCAtMjU4LDYgKzMxMCw5IEBACiAJCQlyZXR1cm4gcGFyYUVsZW07CiAJCX0KIAkJCisJCS8qKgorCQkgKiBDcmVhdGUgYSBzdWIgcGFyYWdyYXBoIGdyb3VwIGVsZW1lbnQgZnJvbSBYTUwKKwkJICoqLwogCQlwdWJsaWMgZnVuY3Rpb24gY3JlYXRlU3ViUGFyYWdyYXBoR3JvdXBGcm9tWE1MKHhtbFRvUGFyc2U6WE1MKTpTdWJQYXJhZ3JhcGhHcm91cEVsZW1lbnQKIAkJewogCQkJdmFyIGVsZW06U3ViUGFyYWdyYXBoR3JvdXBFbGVtZW50ID0gbmV3IFN1YlBhcmFncmFwaEdyb3VwRWxlbWVudCgpOwpAQCAtMjY1LDYgKzMyMCw5IEBACiAJCQlyZXR1cm4gZWxlbTsKIAkJfQogCQkKKwkJLyoqCisJCSAqIENyZWF0ZSBhIHRhdGUgY2h1IHlva28gZWxlbWVudCBmcm9tIFhNTAorCQkgKiovCiAJCXB1YmxpYyBmdW5jdGlvbiBjcmVhdGVUQ1lGcm9tWE1MKHhtbFRvUGFyc2U6WE1MKTpUQ1lFbGVtZW50CiAJCXsKIAkJCXZhciB0Y3lFbGVtOlRDWUVsZW1lbnQgPSBuZXcgVENZRWxlbWVudCgpOwpAQCAtMjcyLDcgKzMzMCw3IEBACiAJCQlyZXR1cm4gdGN5RWxlbTsKIAkJfQogCQkKLQkJCQorCQkKIAkJc3RhdGljIGludGVybmFsIGNvbnN0IF9saW5rRGVzY3JpcHRpb246T2JqZWN0ID0gewogCQkJaHJlZiA6IFByb3BlcnR5Lk5ld1N0cmluZ1Byb3BlcnR5KCJocmVmIixudWxsLCBmYWxzZSwgbnVsbCksCiAJCQl0YXJnZXQgOiBQcm9wZXJ0eS5OZXdTdHJpbmdQcm9wZXJ0eSgidGFyZ2V0IixudWxsLCBmYWxzZSwgbnVsbCkKQEAgLTI4MCw3ICszMzgsOCBAQAogCQlzdGF0aWMgcHJpdmF0ZSBjb25zdCBfbGlua0Zvcm1hdEltcG9ydGVyOlRMRm9ybWF0SW1wb3J0ZXIgPSBuZXcgVExGb3JtYXRJbXBvcnRlcihEaWN0aW9uYXJ5LF9saW5rRGVzY3JpcHRpb24pOwogCQlzdGF0aWMgcHJpdmF0ZSBjb25zdCBfbGlua0VsZW1lbnRGb3JtYXRJbXBvcnRlcnM6QXJyYXkgPSBbIF9saW5rRm9ybWF0SW1wb3J0ZXIsIF9mb3JtYXRJbXBvcnRlcixfaWRJbXBvcnRlcixfdHlwZU5hbWVJbXBvcnRlcixfY3VzdG9tRm9ybWF0SW1wb3J0ZXIgXTsKIAotCQkvKiogUGFyc2UgYSBMaW5rRWxlbWVudCBCbG9jay4KKwkJLyoqIAorCQkgKiBQYXJzZSBhIExpbmtFbGVtZW50IEJsb2NrLgogCQkgKiAKIAkJICogQHBhcmFtIC0gaW1wb3J0RmlsdGVyOkJhc2VUZXh0TGF5b3V0SW1wb3J0ZXIgLSBwYXJzZXIgb2JqZWN0CiAJCSAqIEBwYXJhbSAtIHhtbFRvUGFyc2U6WE1MIC0gdGhlIHhtbCBkZXNjcmliaW5nIHRoZSBMaW5rCkBAIC0zMDAsNiArMzU5LDkgQEAKIAkJCXJldHVybiBsaW5rRWxlbTsKIAkJfQogCQkKKwkJLyoqCisJCSAqIENyZWF0ZSBhIHNwYW4gZWxlbWVudCBmcm9tIFhNTAorCQkgKiovCiAJCXB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBjcmVhdGVTcGFuRnJvbVhNTCh4bWxUb1BhcnNlOlhNTCk6U3BhbkVsZW1lbnQKIAkJewogCQkJdmFyIHNwYW5FbGVtOlNwYW5FbGVtZW50ID0gbmV3IFNwYW5FbGVtZW50KCk7CkBAIC0zMTksNiArMzgxLDkgQEAKIAkJc3RhdGljIHByaXZhdGUgY29uc3QgX2lsZ0Zvcm1hdEltcG9ydGVyOlRMRm9ybWF0SW1wb3J0ZXIgPSBuZXcgVExGb3JtYXRJbXBvcnRlcihEaWN0aW9uYXJ5LF9pbWFnZURlc2NyaXB0aW9uKTsKIAkJc3RhdGljIHByaXZhdGUgY29uc3QgX2lsZ0VsZW1lbnRGb3JtYXRJbXBvcnRlcnM6QXJyYXkgPSBbIF9pbGdGb3JtYXRJbXBvcnRlciwgX2Zvcm1hdEltcG9ydGVyLCBfaWRJbXBvcnRlciwgX3R5cGVOYW1lSW1wb3J0ZXIsIF9jdXN0b21Gb3JtYXRJbXBvcnRlciBdOwogCisJCS8qKgorCQkgKiBDcmVhdGUgYW4gaW5saW5lIGdyYXBoaWMgZnJvbSBYTUwKKwkJICoqLwogCQlwdWJsaWMgZnVuY3Rpb24gY3JlYXRlSW5saW5lR3JhcGhpY0Zyb21YTUwoeG1sVG9QYXJzZTpYTUwpOklubGluZUdyYXBoaWNFbGVtZW50CiAJCXsJCQkJCiAJCQl2YXIgaW1nRWxlbTpJbmxpbmVHcmFwaGljRWxlbWVudCA9IG5ldyBJbmxpbmVHcmFwaGljRWxlbWVudCgpOwpAQCAtMzQxLDYgKzQwNiw5IEBACiAJCQlyZXR1cm4gaW1nRWxlbTsKIAkJfQogCQorCQkvKioKKwkJICogQ3JlYXRlIGEgbGlzdCBlbGVtZW50IGZyb20gWE1MCisJCSAqKi8KIAkJcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIGNyZWF0ZUxpc3RGcm9tWE1MKHhtbFRvUGFyc2U6WE1MKTpMaXN0RWxlbWVudAogCQl7CiAJCQl2YXIgcnNsdDpMaXN0RWxlbWVudCA9IG5ldyBMaXN0RWxlbWVudDsKQEAgLTM0OCw2ICs0MTYsOSBAQAogCQkJcmV0dXJuIHJzbHQ7CiAJCX0KIAorCQkvKioKKwkJICogQ3JlYXRlIGEgbGlzdCBpdGVtIGVsZW1lbnQgZnJvbSBYTUwKKwkJICoqLwogCQlwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gY3JlYXRlTGlzdEl0ZW1Gcm9tWE1MKHhtbFRvUGFyc2U6WE1MKTpMaXN0SXRlbUVsZW1lbnQKIAkJewogCQkJdmFyIHJzbHQ6TGlzdEl0ZW1FbGVtZW50ID0gbmV3IExpc3RJdGVtRWxlbWVudDsKQEAgLTM1NSwxMiArNDI2LDE2IEBACiAJCQlyZXR1cm4gcnNsdDsKIAkJfQogCQkKKwkJLyoqCisJCSAqIEV4dHJhY3QgdGV4dCBmb3JtYXQgYXR0cmlidXRlcworCQkgKiovCiAJCXB1YmxpYyBmdW5jdGlvbiBleHRyYWN0VGV4dEZvcm1hdEF0dHJpYnV0ZXNIZWxwZXIoY3VyQXR0cnM6T2JqZWN0LCBpbXBvcnRlcjpUTEZvcm1hdEltcG9ydGVyKTpPYmplY3QKIAkJewogCQkJcmV0dXJuIGV4dHJhY3RBdHRyaWJ1dGVzSGVscGVyKGN1ckF0dHJzLGltcG9ydGVyKTsKIAkJfQogCQkKLQkJLyoqIFBhcnNlIGFuIFNQR0UgZWxlbWVudAorCQkvKiogCisJCSAqIFBhcnNlIGFuIFNQR0UgZWxlbWVudAogCQkgKiAKIAkJICogQHBhcmFtIC0gaW1wb3J0RmlsdGVyOkJhc2VUZXh0TGF5b3V0SW1wb3J0ZXIgLSBwYXJzZXIgb2JqZWN0CiAJCSAqIEBwYXJhbSAtIHhtbFRvUGFyc2U6WE1MIC0gdGhlIHhtbCBkZXNjcmliaW5nIHRoZSBUQ1kgQmxvY2sKQEAgLTM3OSw3ICs0NTQsOCBAQAogCQkJfQogCQl9CiAKLQkJLyoqIFBhcnNlIGEgVENZIEJsb2NrLgorCQkvKiogCisJCSAqIFBhcnNlIGEgVENZIEJsb2NrLgogCQkgKiAKIAkJICogQHBhcmFtIC0gaW1wb3J0RmlsdGVyOkJhc2VUZXh0TGF5b3V0SW1wb3J0ZXIgLSBwYXJzZXIgb2JqZWN0CiAJCSAqIEBwYXJhbSAtIHhtbFRvUGFyc2U6WE1MIC0gdGhlIHhtbCBkZXNjcmliaW5nIHRoZSBUQ1kgQmxvY2sKQEAgLTM5OSw3ICs0NzUsOCBAQAogCQl9CiAJCQogCQkJCQotCQkvKiogUGFyc2UgYSBMaW5rRWxlbWVudCBCbG9jay4KKwkJLyoqIAorCQkgKiBQYXJzZSBhIExpbmtFbGVtZW50IEJsb2NrLgogCQkgKiAKIAkJICogQHBhcmFtIC0gaW1wb3J0RmlsdGVyOkJhc2VUZXh0TGF5b3V0SW1wb3J0ZXIgLSBwYXJzZXIgb2JqZWN0CiAJCSAqIEBwYXJhbSAtIHhtbFRvUGFyc2U6WE1MIC0gdGhlIHhtbCBkZXNjcmliaW5nIHRoZSBMaW5rCkBAIC00NTYsNyArNTMzLDggQEAKIAkJc3RhdGljIHB1YmxpYyBmdW5jdGlvbiBwYXJzZUxpc3RNYXJrZXJGb3JtYXQoaW1wb3J0RmlsdGVyOkJhc2VUZXh0TGF5b3V0SW1wb3J0ZXIsIHhtbFRvUGFyc2U6WE1MLCBwYXJlbnQ6Rmxvd0dyb3VwRWxlbWVudCk6dm9pZAogCQl7IHBhcmVudC5saXN0TWFya2VyRm9ybWF0ID0gVGV4dExheW91dEltcG9ydGVyKGltcG9ydEZpbHRlcikuY3JlYXRlTGlzdE1hcmtlckZvcm1hdERpY3Rpb25hcnlGcm9tWE1MKHhtbFRvUGFyc2UpOyB9CiAKLQkJLyoqIFBhcnNlIHRoZSA8ZGl2IC4uLj4gdGFnIGFuZCBhbGwgaXRzIGNoaWxkcmVuCisJCS8qKiAKKwkJICogUGFyc2UgdGhlIDxkaXYgLi4uPiB0YWcgYW5kIGFsbCBpdHMgY2hpbGRyZW4KIAkJICogCiAJCSAqIEBwYXJhbSAtIGltcG9ydEZpbHRlcjpCYXNlVGV4dExheW91dEltcG9ydEZpbHRlciAtIHBhcnNlciBvYmplY3QKIAkJICogQHBhcmFtIC0geG1sVG9QYXJzZTpYTUwgLSB0aGUgeG1sIGRlc2NyaWJpbmcgdGhlIERpdgpAQCAtNDc0LDcgKzU1Miw4IEBACiAJCQl9CiAJCX0KIAotCQkvKiogUGFyc2UgYSBsZWFmIGVsZW1lbnQsIHRoZSA8aW1nIC4uLj4gIHRhZy4KKwkJLyoqIAorCQkgKiBQYXJzZSBhIGxlYWYgZWxlbWVudCwgdGhlIDxpbWcgLi4uPiAgdGFnLgogCQkgKiAKIAkJICogQHBhcmFtIC0gaW1wb3J0RmlsdGVyOkJhc2VUZXh0TGF5b3V0SW1wb3J0ZXIgLSBwYXJzZXIgb2JqZWN0CiAJCSAqIEBwYXJhbSAtIHhtbFRvUGFyc2U6WE1MIC0gdGhlIHhtbCBkZXNjcmliaW5nIHRoZSBJbmxpbmVHcmFwaGljIEZsb3dFbGVtZW50CkBAIC00ODUsNiArNTY0LDExNSBAQAogCQkJdmFyIGlsZzpJbmxpbmVHcmFwaGljRWxlbWVudCA9IFRleHRMYXlvdXRJbXBvcnRlcihpbXBvcnRGaWx0ZXIpLmNyZWF0ZUlubGluZUdyYXBoaWNGcm9tWE1MKHhtbFRvUGFyc2UpOwogCQkJaW1wb3J0RmlsdGVyLmFkZENoaWxkKHBhcmVudCwgaWxnKTsKIAkJfQorCQkKKwkJLyoqIAorCQkgKiBQYXJzZSB0aGUgPHRhYmxlIC4uLj4gdGFnIGFuZCBhbGwgaXRzIGNoaWxkcmVuCisJCSAqIAorCQkgKiBAcGFyYW0gLSBpbXBvcnRGaWx0ZXI6QmFzZVRleHRMYXlvdXRJbXBvcnRGaWx0ZXIgLSBwYXJzZXIgb2JqZWN0CisJCSAqIEBwYXJhbSAtIHhtbFRvUGFyc2U6WE1MIC0gdGhlIHhtbCBkZXNjcmliaW5nIHRoZSBUYWJsZQorCQkgKiBAcGFyYW0gLSBwYXJlbnQ6Rmxvd0Jsb2NrRWxlbWVudCAtIHRoZSBwYXJlbnQgb2YgdGhlIG5ldyBUYWJsZQorCQkgKi8KKwkJc3RhdGljIHB1YmxpYyBmdW5jdGlvbiBwYXJzZVRhYmxlKGltcG9ydEZpbHRlcjpCYXNlVGV4dExheW91dEltcG9ydGVyLCB4bWxUb1BhcnNlOlhNTCwgcGFyZW50OkZsb3dHcm91cEVsZW1lbnQpOnZvaWQKKwkJeworCQkJdmFyIHRhYmxlRWxlbWVudDpUYWJsZUVsZW1lbnQgPSBUZXh0TGF5b3V0SW1wb3J0ZXIoaW1wb3J0RmlsdGVyKS5jcmVhdGVUYWJsZUZyb21YTUwoeG1sVG9QYXJzZSk7CisJCQkKKwkJCWlmIChpbXBvcnRGaWx0ZXIuYWRkQ2hpbGQocGFyZW50LCB0YWJsZUVsZW1lbnQpKSAKKwkJCXsKKwkJCQlpbXBvcnRGaWx0ZXIucGFyc2VGbG93R3JvdXBFbGVtZW50Q2hpbGRyZW4oeG1sVG9QYXJzZSwgdGFibGVFbGVtZW50KTsKKwkJCQkKKwkJCX0KKwkJfQorCQkKKwkJLyoqIAorCQkgKiBQYXJzZSB0aGUgPHRyIC4uLj4gdGFnIChUYWJsZVJvd0VsZW1lbnQpIGFuZCBhbGwgaXRzIGNoaWxkcmVuCisJCSAqIAorCQkgKiBAcGFyYW0gLSBpbXBvcnRGaWx0ZXI6QmFzZVRleHRMYXlvdXRJbXBvcnRGaWx0ZXIgLSBwYXJzZXIgb2JqZWN0CisJCSAqIEBwYXJhbSAtIHhtbFRvUGFyc2U6WE1MIC0gdGhlIHhtbCBkZXNjcmliaW5nIHRoZSBUYWJsZQorCQkgKiBAcGFyYW0gLSBwYXJlbnQ6Rmxvd0Jsb2NrRWxlbWVudCAtIHRoZSBwYXJlbnQgb2YgdGhlIG5ldyBUYWJsZQorCQkgKi8KKwkJc3RhdGljIHB1YmxpYyBmdW5jdGlvbiBwYXJzZVRhYmxlUm93KGltcG9ydEZpbHRlcjpCYXNlVGV4dExheW91dEltcG9ydGVyLCB4bWxUb1BhcnNlOlhNTCwgcGFyZW50OkZsb3dHcm91cEVsZW1lbnQpOnZvaWQKKwkJeworCQkJdmFyIHRhYmxlUm93RWxlbWVudDpUYWJsZVJvd0VsZW1lbnQgPSBUZXh0TGF5b3V0SW1wb3J0ZXIoaW1wb3J0RmlsdGVyKS5jcmVhdGVUYWJsZVJvd0Zyb21YTUwoeG1sVG9QYXJzZSk7CisJCQl2YXIgdGFibGU6VGFibGVFbGVtZW50OworCQkJCisJCQlpZiAoaW1wb3J0RmlsdGVyLmFkZENoaWxkKHBhcmVudCwgdGFibGVSb3dFbGVtZW50KSkKKwkJCXsKKwkJCQkKKwkJCQlpbXBvcnRGaWx0ZXIucGFyc2VGbG93R3JvdXBFbGVtZW50Q2hpbGRyZW4oeG1sVG9QYXJzZSwgdGFibGVSb3dFbGVtZW50KTsKKwkJCQkKKwkJCQl0YWJsZSA9IHRhYmxlUm93RWxlbWVudC5nZXRUYWJsZSgpOworCQkJCQorCQkJCXZhciBjb2x1bW5Db3VudDppbnQgPSB0YWJsZVJvd0VsZW1lbnQuZ2V0Q29sdW1uQ291bnQoKTsKKwkJCQkKKwkJCQlpZiAodGFibGUubnVtQ29sdW1uczxjb2x1bW5Db3VudCkgeworCQkJCQl0YWJsZS5udW1Db2x1bW5zID0gY29sdW1uQ291bnQ7CisJCQkJfQorCQkJCQorCQkJCXRhYmxlLmluc2VydFJvdyh0YWJsZVJvd0VsZW1lbnQsIHRhYmxlUm93RWxlbWVudC5teG1sQ2hpbGRyZW4pOworCQkJCQorCQkJfQorCQl9CisJCQorCQkvKiogCisJCSAqIFBhcnNlIHRoZSA8dGQgLi4uPiBvciA8dGggLi4uPiB0YWcgKFRhYmxlQ2VsbEVsZW1lbnQpIGFuZCBhbGwgaXRzIGNoaWxkcmVuCisJCSAqIAorCQkgKiBAcGFyYW0gLSBpbXBvcnRGaWx0ZXI6QmFzZVRleHRMYXlvdXRJbXBvcnRGaWx0ZXIgLSBwYXJzZXIgb2JqZWN0CisJCSAqIEBwYXJhbSAtIHhtbFRvUGFyc2U6WE1MIC0gdGhlIHhtbCBkZXNjcmliaW5nIHRoZSBUYWJsZQorCQkgKiBAcGFyYW0gLSBwYXJlbnQ6Rmxvd0Jsb2NrRWxlbWVudCAtIHRoZSBwYXJlbnQgb2YgdGhlIG5ldyBUYWJsZQorCQkgKi8KKwkJc3RhdGljIHB1YmxpYyBmdW5jdGlvbiBwYXJzZVRhYmxlQ2VsbChpbXBvcnRGaWx0ZXI6QmFzZVRleHRMYXlvdXRJbXBvcnRlciwgeG1sVG9QYXJzZTpYTUwsIHBhcmVudDpGbG93R3JvdXBFbGVtZW50KTp2b2lkCisJCXsKKwkJCXZhciB0YWJsZUNlbGxFbGVtZW50OlRhYmxlQ2VsbEVsZW1lbnQgPSBUZXh0TGF5b3V0SW1wb3J0ZXIoaW1wb3J0RmlsdGVyKS5jcmVhdGVUYWJsZUNlbGxGcm9tWE1MKHhtbFRvUGFyc2UpOworCQkJCisJCQlpZiAoaW1wb3J0RmlsdGVyLmFkZENoaWxkKHBhcmVudCwgdGFibGVDZWxsRWxlbWVudCkpCisJCQl7CisJCQkJaW1wb3J0RmlsdGVyLnBhcnNlVGFibGVDZWxsRWxlbWVudENoaWxkcmVuKHhtbFRvUGFyc2UsIHRhYmxlQ2VsbEVsZW1lbnQpOworCQkJfQorCQkJCisJCQkvL3RhYmxlQ2VsbEVsZW1lbnQudGV4dEZsb3cgPSBnZXRUZXh0Rmxvd0NvbnRlbnQoInRlc3QgY2VsbCIpOworCQkJCisJCQlUYWJsZVJvd0VsZW1lbnQocGFyZW50KS5hZGRDZWxsKHRhYmxlQ2VsbEVsZW1lbnQpOworCQkJLy9UYWJsZVJvd0VsZW1lbnQocGFyZW50KS5nZXRUYWJsZSgpLmFkZENoaWxkKHRhYmxlQ2VsbEVsZW1lbnQpOworCQkJLy9pbXBvcnRGaWx0ZXIucGFyc2VGbG93R3JvdXBFbGVtZW50Q2hpbGRyZW4oeG1sVG9QYXJzZSwgdGFibGVDZWxsRWxlbWVudCk7CisJCQkKKwkJCS8vIHdlIGNhbid0IGhhdmUgYSA8dGQ+IHRhZyB3L25vIGNoaWxkcmVuLi4uIHNvLCBhZGQgYW4gZW1wdHkgdGV4dCBmbG93CisJCQkvL2lmICh0YWJsZUNlbGxFbGVtZW50Lm51bUNoaWxkcmVuID09IDApIHsKKwkJCS8vCXRhYmxlQ2VsbEVsZW1lbnQuYWRkQ2hpbGQobmV3IFRleHRGbG93KCkpOworCQkJLy99CisJCQkJCisJCX0KKwkJCisJCS8qKgorCQkgKiBDcmVhdGVzIGRlZmF1bHQgdGV4dCBmbG93IGZyb20gdGhlIHRleHQgdmFsdWUgcGFzc2VkIGluLiBVc2VkIGZvciB0YWJsZSBjZWxsIHRleHQgZmxvd3MuIAorCQkgKiBVc2VkIGZvciB0ZXN0aW5nLiBNYXkgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLiAKKwkJICoqLworCQlzdGF0aWMgcHVibGljIGZ1bmN0aW9uIGdldFRleHRGbG93Q29udGVudCh0ZXh0OlN0cmluZyA9IG51bGwsIHNlbGVjdGFibGU6Qm9vbGVhbiA9IGZhbHNlLCBlZGl0YWJsZTpCb29sZWFuID0gZmFsc2UpOlRleHRGbG93IHsKKwkJCXZhciB0ZXh0Rmxvd0NvbnRlbnQ6VGV4dEZsb3cgPSBuZXcgVGV4dEZsb3coKTsKKwkJCXZhciBwYXJhZ3JhcGg6UGFyYWdyYXBoRWxlbWVudCA9IG5ldyBQYXJhZ3JhcGhFbGVtZW50KCk7CisJCQl2YXIgc3BhbjpTcGFuRWxlbWVudCA9IG5ldyBTcGFuRWxlbWVudCgpOworCQkJCisJCQlpZiAodGV4dCkgeworCQkJCXNwYW4udGV4dCA9IHRleHQ7CisJCQl9CisJCQllbHNlIHsKKwkJCQlzcGFuLnRleHQgPSAiIjsKKwkJCX0KKwkJCQorCQkJcGFyYWdyYXBoLmJhY2tncm91bmRBbHBoYSA9IDAuMjsKKwkJCXBhcmFncmFwaC5iYWNrZ3JvdW5kQ29sb3IgPSAweEZGMDAwMDsKKwkJCXBhcmFncmFwaC5hZGRDaGlsZChzcGFuKTsKKwkJCQorCQkJaWYgKGVkaXRhYmxlKSB7CisJCQkJLy90ZXh0Rmxvd0NvbnRlbnQuaW50ZXJhY3Rpb25NYW5hZ2VyID0gbmV3IEVkaXRNYW5hZ2VyKG5ldyBVbmRvTWFuYWdlcik7CisJCQl9CisJCQllbHNlIGlmIChzZWxlY3RhYmxlKSB7CisJCQkJLy90ZXh0Rmxvd0NvbnRlbnQuaW50ZXJhY3Rpb25NYW5hZ2VyID0gbmV3IFNlbGVjdGlvbk1hbmFnZXIoKTsKKwkJCX0KKwkJCQorCQkJdGV4dEZsb3dDb250ZW50LmFkZENoaWxkKHBhcmFncmFwaCk7CisJCQkKKwkJCXJldHVybiB0ZXh0Rmxvd0NvbnRlbnQ7CisJCX0KIAl9CiB9CiAKZGlmZiAtLWdpdCBhL3RleHRMYXlvdXQvc3JjL2ZsYXNoeC90ZXh0TGF5b3V0L2VkaXQvRWRpdE1hbmFnZXIuYXMgYi90ZXh0TGF5b3V0L3NyYy9mbGFzaHgvdGV4dExheW91dC9lZGl0L0VkaXRNYW5hZ2VyLmFzCmluZGV4IDJiNDZlNzIuLjI4YTQ1YzYgMTAwNjQ0Ci0tLSBhL3RleHRMYXlvdXQvc3JjL2ZsYXNoeC90ZXh0TGF5b3V0L2VkaXQvRWRpdE1hbmFnZXIuYXMKKysrIGIvdGV4dExheW91dC9zcmMvZmxhc2h4L3RleHRMYXlvdXQvZWRpdC9FZGl0TWFuYWdlci5hcwpAQCAtMzUsNiArMzUsNyBAQAogCWltcG9ydCBmbGFzaC51aS5LZXlib2FyZDsKIAlpbXBvcnQgZmxhc2gudXRpbHMuZ2V0UXVhbGlmaWVkQ2xhc3NOYW1lOwogCQorCWltcG9ydCBmbGFzaHgudGV4dExheW91dC50bGZfaW50ZXJuYWw7CiAJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmNvbXBvc2UuSUZsb3dDb21wb3NlcjsKIAlpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQuY29udGFpbmVyLkNvbnRhaW5lckNvbnRyb2xsZXI7CiAJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmRlYnVnLkRlYnVnZ2luZzsKQEAgLTUyLDExICs1MywxMiBAQAogCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5lbGVtZW50cy5QYXJhZ3JhcGhFbGVtZW50OwogCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5lbGVtZW50cy5TdWJQYXJhZ3JhcGhHcm91cEVsZW1lbnQ7CiAJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmVsZW1lbnRzLlRDWUVsZW1lbnQ7Ci0JaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmVsZW1lbnRzLlRhYmxlRGF0YUNlbGxFbGVtZW50OworCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5lbGVtZW50cy5UYWJsZUNlbGxFbGVtZW50OwogCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5lbGVtZW50cy5UYWJsZUVsZW1lbnQ7CiAJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmVsZW1lbnRzLlRleHRGbG93OwogCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5lbGVtZW50cy5UZXh0UmFuZ2U7CiAJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmV2ZW50cy5GbG93T3BlcmF0aW9uRXZlbnQ7CisJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmV2ZW50cy5Nb2RlbENoYW5nZTsKIAlpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQuZm9ybWF0cy5JTGlzdE1hcmtlckZvcm1hdDsKIAlpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQuZm9ybWF0cy5JVGV4dExheW91dEZvcm1hdDsKIAlpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQuZm9ybWF0cy5UZXh0TGF5b3V0Rm9ybWF0OwpAQCAtODUsNyArODcsNiBAQAogCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5vcGVyYXRpb25zLlNwbGl0RWxlbWVudE9wZXJhdGlvbjsKIAlpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQub3BlcmF0aW9ucy5TcGxpdFBhcmFncmFwaE9wZXJhdGlvbjsKIAlpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQub3BlcmF0aW9ucy5VbmRvT3BlcmF0aW9uOwotCWltcG9ydCBmbGFzaHgudGV4dExheW91dC50bGZfaW50ZXJuYWw7CiAJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LnV0aWxzLkNoYXJhY3RlclV0aWw7CiAJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LnV0aWxzLkdlb21ldHJ5VXRpbDsKIAlpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQudXRpbHMuTmF2aWdhdGlvblV0aWw7CkBAIC00NjYsNiArNDY3LDIzIEBACiAJCQkJCQkJCWRvT3BlcmF0aW9uKG5ldyBDcmVhdGVMaXN0T3BlcmF0aW9uKG5ldyBTZWxlY3Rpb25TdGF0ZSh0ZXh0RmxvdywgZWxlbWVudC5nZXRBYnNvbHV0ZVN0YXJ0KCksIGVsZW1lbnQuZ2V0QWJzb2x1dGVTdGFydCgpICsgZWxlbWVudC50ZXh0TGVuZ3RoKSwgbGlzdEl0ZW0ucGFyZW50KSk7CiAJCQkJCQkJfQogCQkJCQkJfQorCQkJCQkJZWxzZSBpZiAodGV4dEZsb3cubmVzdGVkSW5UYWJsZSgpKSB7CisJCQkJCQkJdmFyIGNlbGw6VGFibGVDZWxsRWxlbWVudDsKKwkJCQkJCQkKKwkJCQkJCQlpZiAoZXZlbnQuc2hpZnRLZXkpIHsKKwkJCQkJCQkJY2VsbCA9ICh0ZXh0Rmxvdy5wYXJlbnRFbGVtZW50IGFzIFRhYmxlQ2VsbEVsZW1lbnQpLmdldFByZXZpb3VzQ2VsbCgpOworCQkJCQkJCX0KKwkJCQkJCQllbHNlIHsKKwkJCQkJCQkJY2VsbCA9ICh0ZXh0Rmxvdy5wYXJlbnRFbGVtZW50IGFzIFRhYmxlQ2VsbEVsZW1lbnQpLmdldE5leHRDZWxsKCk7CisJCQkJCQkJfQorCQkJCQkJCQorCQkJCQkJCS8vIHNlbGVjdCBuZXh0IGNlbGwgaW4gdGFibGUKKwkJCQkJCQlpZiAoY2VsbCAmJiBjZWxsLnRleHRGbG93ICYmIGNlbGwudGV4dEZsb3cuaW50ZXJhY3Rpb25NYW5hZ2VyIGlzIEVkaXRNYW5hZ2VyKSB7CisJCQkJCQkJCS8vY2VsbC50ZXh0Rmxvdy5pbnRlcmFjdGlvbk1hbmFnZXIuc2VsZWN0TGFzdFBvc2l0aW9uKCk7CisJCQkJCQkJCWNlbGwudGV4dEZsb3cuaW50ZXJhY3Rpb25NYW5hZ2VyLnNlbGVjdEFsbCgpOworCQkJCQkJCQljZWxsLnRleHRGbG93LmludGVyYWN0aW9uTWFuYWdlci5zZXRGb2N1cygpOworCQkJCQkJCX0KKwkJCQkJCX0KIAkJCQkJCWVsc2UKIAkJCQkJCXsKIAkJCQkJCQlvdmVyd3JpdGVNb2RlID8gb3ZlcndyaXRlVGV4dChTdHJpbmcuZnJvbUNoYXJDb2RlKGV2ZW50LmNoYXJDb2RlKSkgOiBpbnNlcnRUZXh0KFN0cmluZy5mcm9tQ2hhckNvZGUoZXZlbnQuY2hhckNvZGUpKTsKQEAgLTgyOSw4ICs4NDcsMTkgQEAKIAkJCQlyZWRyYXdMaXN0ZW5lciA9IG51bGw7CiAJCQl9CiAKKwkJCXZhciBjZWxsSGVpZ2h0Ok51bWJlciA9IDA7CiAJCQlpZiAodGV4dEZsb3cuZmxvd0NvbXBvc2VyKQogCQkJeworCQkJCWlmKHN1cGVyTWFuYWdlciAmJiBzdXBlck1hbmFnZXIgaXMgSUVkaXRNYW5hZ2VyKQorCQkJCXsKKwkJCQkJdmFyIGNvbnRyb2xsZXI6Q29udGFpbmVyQ29udHJvbGxlciA9IHRleHRGbG93LmZsb3dDb21wb3Nlci5nZXRDb250cm9sbGVyQXQoMCk7CisJCQkJCWlmIChjb250cm9sbGVyKQorCQkJCQl7CisJCQkJCQljZWxsSGVpZ2h0ID0gY29udHJvbGxlci5jb250YWluZXIuaGVpZ2h0OworCQkJCQl9CisJCQkJfQorCisKIAkJCQkgdGV4dEZsb3cuZmxvd0NvbXBvc2VyLnVwZGF0ZUFsbENvbnRyb2xsZXJzKCk7IAogCiAJCQkJLy8gU2Nyb2xsIHRvIHNlbGVjdGlvbgpAQCAtODQwLDYgKzg2OSwxOCBAQAogCQkJCQlpZiAoY29udHJvbGxlckluZGV4ID49IDApCiAJCQkJCQl0ZXh0Rmxvdy5mbG93Q29tcG9zZXIuZ2V0Q29udHJvbGxlckF0KGNvbnRyb2xsZXJJbmRleCkuc2Nyb2xsVG9SYW5nZShhY3RpdmVQb3NpdGlvbixhbmNob3JQb3NpdGlvbik7CQogCQkJCX0KKwkJCQlpZihzdXBlck1hbmFnZXIgJiYgc3VwZXJNYW5hZ2VyIGlzIElFZGl0TWFuYWdlcikKKwkJCQl7CisJCQkJCWlmKGNvbnRyb2xsZXIuY29udGFpbmVyLmhlaWdodCAhPSBjZWxsSGVpZ2h0KQorCQkJCQl7CisJCQkJCQl2YXIgc2V0Rm9ybWF0OlN0cmluZyA9IHNlbGVjdGlvbkZvcm1hdFN0YXRlOworCQkJCQkJdmFyIHRhYmxlOlRhYmxlRWxlbWVudCA9ICh0ZXh0Rmxvdy5wYXJlbnRFbGVtZW50IGFzIFRhYmxlQ2VsbEVsZW1lbnQpLmdldFRhYmxlKCk7CisJCQkJCQl0YWJsZS5tb2RlbENoYW5nZWQoTW9kZWxDaGFuZ2UuRUxFTUVOVF9NT0RJRklFRCwgdGFibGUsIDAsIHRhYmxlLnRleHRMZW5ndGgpOworCQkJCQkJKHN1cGVyTWFuYWdlciBhcyBJRWRpdE1hbmFnZXIpLnVwZGF0ZUFsbENvbnRyb2xsZXJzKCk7CisJCQkJCQlpZihzZXRGb3JtYXQgPT0gU2VsZWN0aW9uRm9ybWF0U3RhdGUuRk9DVVNFRCkKKwkJCQkJCQlzZXRGb2N1cygpOworCQkJCQl9CisJCQkJfQogCQkJfQogCiAJCQlzZWxlY3Rpb25DaGFuZ2VkKHRydWUsIGZhbHNlKTsKQEAgLTEyNTksMTIgKzEzMDAsMTQgQEAKIAkJCWlmICghb3BlcmF0aW9uU3RhdGUpCiAJCQkJcmV0dXJuOwogCisJCQkvKgorCQkJVGhpcyBzaG91bGQgbm90IGJlIG5lY2Vzc2FyeS4uLgogCQkJLy8gbWp6aGFuZyA6IGZpeCBmb3IgdGFibGUKIAkJCXZhciBsZWFmOkZsb3dMZWFmRWxlbWVudCA9IHRleHRGbG93LmZpbmRMZWFmKG9wZXJhdGlvblN0YXRlLmFic29sdXRlU3RhcnQpOwogCQkJdmFyIHBhcmE6UGFyYWdyYXBoRWxlbWVudCA9IGxlYWYuZ2V0UGFyYWdyYXBoKCk7CiAJCQlpZiAoIHBhcmEuaXNJblRhYmxlKCkgKQogCQkJCXJldHVybjsKLQkJCQorCQkJKi8KIAkJCS8vIERlbGV0ZSB0aGUgbmV4dCBjaGFyYWN0ZXIgaWYgaXQncyBhIGNhcmV0IHNlbGVjdGlvbiwgYW5kIGFsbG93IGFkZWphY2VudCBkZWxldGUgbmV4dCdzIHRvIG1lcmdlCiAJCQkvLyBJZiBpdCdzIGEgcmFuZ2Ugc2VsZWN0aW9uLCBkZWxldGUgdGhlIHJhbmdlIGFuZCBkaXNhbGxvdyBtZXJnZQogCQkJdmFyIGRlbGV0ZU9wOkRlbGV0ZVRleHRPcGVyYXRpb247CkBAIC0xMzY5LDEwICsxNDEyLDEyIEBACiAJCQkJfQogCQkJCWlmKG1vdmVQYXJhKQogCQkJCXsKKwkJCQkJLyoKKwkJCQkJc2hvdWxkIG5vdCBiZSBuZWNlc3NhcnkuLi4KIAkJCQkJLy8gbWp6aGFuZzogZml4IGZvciB0YWJsZSBmZWF0dXJlCiAJCQkJCWlmICggcGFyYS5pc0luVGFibGUoKSApCiAJCQkJCQlyZXR1cm47Ci0JCQkJCQorCQkJCQkqLwogCQkJCQl2YXIgc291cmNlOkZsb3dHcm91cEVsZW1lbnQ7CiAJCQkJCXZhciB0YXJnZXQ6Rmxvd0dyb3VwRWxlbWVudDsKIAkJCQkJdmFyIG51bUVsZW1lbnRzVG9Nb3ZlOmludDsKZGlmZiAtLWdpdCBhL3RleHRMYXlvdXQvc3JjL2ZsYXNoeC90ZXh0TGF5b3V0L2VkaXQvSVNlbGVjdGlvbk1hbmFnZXIuYXMgYi90ZXh0TGF5b3V0L3NyYy9mbGFzaHgvdGV4dExheW91dC9lZGl0L0lTZWxlY3Rpb25NYW5hZ2VyLmFzCmluZGV4IGFiZTZmMjkuLjMwZWI0NDYgMTAwNjQ0Ci0tLSBhL3RleHRMYXlvdXQvc3JjL2ZsYXNoeC90ZXh0TGF5b3V0L2VkaXQvSVNlbGVjdGlvbk1hbmFnZXIuYXMKKysrIGIvdGV4dExheW91dC9zcmMvZmxhc2h4L3RleHRMYXlvdXQvZWRpdC9JU2VsZWN0aW9uTWFuYWdlci5hcwpAQCAtMjUsOSArMjUsMTIgQEAKIAlpbXBvcnQgZmxhc2guZXZlbnRzLk1vdXNlRXZlbnQ7CiAJaW1wb3J0IGZsYXNoLmV2ZW50cy5UZXh0RXZlbnQ7CiAJCisJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmVsZW1lbnRzLkNlbGxDb29yZGluYXRlczsKKwlpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQuZWxlbWVudHMuQ2VsbFJhbmdlOworCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5lbGVtZW50cy5UYWJsZUVsZW1lbnQ7CiAJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmVsZW1lbnRzLlRleHRGbG93OwotCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5mb3JtYXRzLlRleHRMYXlvdXRGb3JtYXQ7CiAJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmVsZW1lbnRzLlRleHRSYW5nZTsKKwlpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQuZm9ybWF0cy5UZXh0TGF5b3V0Rm9ybWF0OwogCiAJLyoqIAogCSAqIFRoZSBJU2VsZWN0aW9uTWFuYWdlciBpbnRlcmZhY2UgZGVmaW5lcyB0aGUgaW50ZXJmYWNlIGZvciBoYW5kbGluZyB0ZXh0IHNlbGVjdGlvbi4KQEAgLTY0LDYgKzY3LDIzIEBACiAJCWZ1bmN0aW9uIGdldCB0ZXh0RmxvdygpOlRleHRGbG93OwogCQlmdW5jdGlvbiBzZXQgdGV4dEZsb3coZmxvdzpUZXh0Rmxvdyk6dm9pZDsKIAkJCisJCWZ1bmN0aW9uIGdldCBjdXJyZW50VGFibGUoKTpUYWJsZUVsZW1lbnQ7CisJCWZ1bmN0aW9uIHNldCBjdXJyZW50VGFibGUodGFibGU6VGFibGVFbGVtZW50KTp2b2lkOworCQlmdW5jdGlvbiBoYXNDZWxsUmFuZ2VTZWxlY3Rpb24oKTpCb29sZWFuOworCQkKKwkJZnVuY3Rpb24gc2VsZWN0Q2VsbFJhbmdlKGFuY2hvckNvb3JkczpDZWxsQ29vcmRpbmF0ZXMsYWN0aXZlQ29vcmRzOkNlbGxDb29yZGluYXRlcyk6dm9pZDsKKwkJCisJCWZ1bmN0aW9uIGdldENlbGxSYW5nZSgpOkNlbGxSYW5nZTsKKwkJZnVuY3Rpb24gc2V0Q2VsbFJhbmdlKHJhbmdlOkNlbGxSYW5nZSk6dm9pZDsKKworCQkvKiogQW5jaG9yIHBvaW50IG9mIHRoZSBjdXJyZW50IGNlbGwgc2VsZWN0aW9uLCBhcyBjb29yZGluYXRlcyB3aXRoaW4gdGhlIHRhYmxlLiAqLworCQlmdW5jdGlvbiBnZXQgYW5jaG9yQ2VsbFBvc2l0aW9uKCk6Q2VsbENvb3JkaW5hdGVzOworCQlmdW5jdGlvbiBzZXQgYW5jaG9yQ2VsbFBvc2l0aW9uKHZhbHVlOkNlbGxDb29yZGluYXRlcyk6dm9pZDsKKwkJCisJCS8qKiBBY3RpdmUgZW5kIG9mIHRoZSBjdXJyZW50IGNlbGwgc2VsZWN0aW9uLCBhcyBjb29yZGluYXRlcyB3aXRoaW4gdGhlIHRhYmxlLiAqLworCQlmdW5jdGlvbiBnZXQgYWN0aXZlQ2VsbFBvc2l0aW9uKCk6Q2VsbENvb3JkaW5hdGVzOworCQlmdW5jdGlvbiBzZXQgYWN0aXZlQ2VsbFBvc2l0aW9uKHZhbHVlOkNlbGxDb29yZGluYXRlcyk6dm9pZDsKKwogCQkvKiogCiAJCSAqIFRoZSB0ZXh0IHBvc2l0aW9uIG9mIHRoZSBzdGFydCBvZiB0aGUgc2VsZWN0aW9uLCBhcyBhbiBvZmZzZXQgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIHRleHQgZmxvdy4KIAkJICogIApAQCAtMTEzLDYgKzEzMywzMyBAQAogCQkgKi8KIAkJZnVuY3Rpb24gc2VsZWN0QWxsKCkgOiB2b2lkCiAJCQorCQkvKioKKwkJICogU2VsZWN0cyB0aGUgbGFzdCBwb3NpdGlvbiBpbiB0aGUgZW50aXJlIGZsb3cuCisJCSAqIAorCQkgKiBAcGxheWVydmVyc2lvbiBGbGFzaCAxMAorCQkgKiBAcGxheWVydmVyc2lvbiBBSVIgMS41CisgCQkgKiBAbGFuZ3ZlcnNpb24gMy4wCisJCSAqLworCQlmdW5jdGlvbiBzZWxlY3RMYXN0UG9zaXRpb24oKSA6IHZvaWQKKwkJCisJCS8qKgorCQkgKiBTZWxlY3RzIHRoZSBmaXJzdCBwb3NpdGlvbiBpbiB0aGUgZW50aXJlIGZsb3cuCisJCSAqIAorCQkgKiBAcGxheWVydmVyc2lvbiBGbGFzaCAxMAorCQkgKiBAcGxheWVydmVyc2lvbiBBSVIgMS41CisgCQkgKiBAbGFuZ3ZlcnNpb24gMy4wCisJCSAqLworCQlmdW5jdGlvbiBzZWxlY3RGaXJzdFBvc2l0aW9uKCkgOiB2b2lkCisKKwkJLyoqCisJCSAqIFJlbW92ZXMgYW55IHNlbGVjdGlvbiBmcm9tIHRoZSB0ZXh0IGZsb3cKKwkJICogCisJCSAqIEBwbGF5ZXJ2ZXJzaW9uIEZsYXNoIDEwCisJCSAqIEBwbGF5ZXJ2ZXJzaW9uIEFJUiAxLjUKKwkJICogQGxhbmd2ZXJzaW9uIDMuMAorCQkgKi8KKwkJZnVuY3Rpb24gZGVzZWxlY3QoKSA6IHZvaWQKKwogCQkvKiogCiAJCSAqIFRoZSBhbmNob3IgcG9pbnQgb2YgdGhlIHNlbGVjdGlvbi4gCiAJCSAqIApAQCAtMTQwLDcgKzE4Nyw3IEBACiAJCWZ1bmN0aW9uIGdldCBhY3RpdmVQb3NpdGlvbigpIDogaW50OwogCQkKIAkJLyoqCi0JCSAqIEluZGljYXRlcyB3aGV0aGVyIHRoZXJlIGlzIGEgc2VsZWN0aW9uLiAKKwkJICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlcmUgaXMgYSB0ZXh0IHNlbGVjdGlvbi4gCiAJCSAqIAogCQkgKiA8cD5SZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZXJlIGlzIGVpdGhlciBhIHJhbmdlIHNlbGVjdGlvbiBvciBhIHBvaW50IHNlbGVjdGlvbi4gCiAJCSAqIEJ5IGRlZmF1bHQsIHdoZW4gYSBzZWxlY3Rpb24gbWFuYWdlciBpcyBmaXJzdCBzZXQgdXAsIHRoZXJlIGlzIG5vIHNlbGVjdGlvbiAodGhlIHN0YXJ0IGFuZCBlbmQgYXJlIC0xKS48L3A+CkBAIC0xNTIsNiArMTk5LDM0IEBACiAgCQkgKiBAbGFuZ3ZlcnNpb24gMy4wCiAJCSAqLwogCQlmdW5jdGlvbiBoYXNTZWxlY3Rpb24oKTpCb29sZWFuOworCisJCS8qKgorCQkgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGVyZSBpcyBhIHRleHQgb3IgY2VsbCBzZWxlY3Rpb24uIAorCQkgKiAKKwkJICogPHA+UmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGVyZSBpcyBlaXRoZXIgYSByYW5nZSBzZWxlY3Rpb24gb3IgYSBwb2ludCBzZWxlY3Rpb24uIAorCQkgKiBCeSBkZWZhdWx0LCB3aGVuIGEgc2VsZWN0aW9uIG1hbmFnZXIgaXMgZmlyc3Qgc2V0IHVwLCB0aGVyZSBpcyBubyBzZWxlY3Rpb24gKHRoZSBzdGFydCBhbmQgZW5kIGFyZSAtMSkuPC9wPgorCQkgKiAKKwkJICogQGluY2x1ZGVFeGFtcGxlIGV4YW1wbGVzXFNlbGVjdGlvbk1hbmFnZXJfaGFzU2VsZWN0aW9uLmFzIC1ub3N3ZgorCQkgKiAKKwkJICogQHBsYXllcnZlcnNpb24gRmxhc2ggMTAKKwkJICogQHBsYXllcnZlcnNpb24gQUlSIDEuNQorCQkgKiBAbGFuZ3ZlcnNpb24gMy4wCisJCSAqLworCQlmdW5jdGlvbiBoYXNBbnlTZWxlY3Rpb24oKTpCb29sZWFuOworCisJCS8qKgorCQkgKiBJbmRpY2F0ZXMgdGhlIHR5cGUgb2Ygc2VsZWN0aW9uLiAKKwkJICogCisJCSAqIDxwPlRoZSA8Y29kZT5zZWxlY3Rpb25UeXBlPC9jb2RlPiBkZXNjcmliZXMgdGhlIGtpbmQgb2Ygc2VsZWN0aW9uLiAKKwkJICogSXQgY2FuIGVpdGhlciBiZSA8Y29kZT5TZWxlY3Rpb25UeXBlLlRFWFQ8L2NvZGU+IG9yIDxjb2RlPlNlbGVjdGlvblR5cGUuQ0VMTFM8L2NvZGU+CisJCSAqIAorCQkgKiBAc2VlIGZsYXNoeC50ZXh0TGF5b3V0LmVkaXQuU2VsZWN0aW9uVHlwZQorCQkgKiAKKwkJICogQHBsYXllcnZlcnNpb24gRmxhc2ggMTAKKwkJICogQHBsYXllcnZlcnNpb24gQUlSIDEuNQorCQkgKiBAbGFuZ3ZlcnNpb24gMy4wCisJCSAqLworCQlmdW5jdGlvbiBnZXQgc2VsZWN0aW9uVHlwZSgpIDogU3RyaW5nOwogCQkKIAkJLyoqCiAJCSAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBzZWxlY3Rpb24gY292ZXJzIGEgcmFuZ2Ugb2YgdGV4dC4KQEAgLTIwMSw2ICsyNzYsMTQgQEAKIAkJICovCQogCQlmdW5jdGlvbiByZWZyZXNoU2VsZWN0aW9uKCk6dm9pZDsKIAorCQkvKiogCisJCSAqIENsZWFycyB0aGUgc2VsZWN0aW9uIHNoYXBlcy4gCisJCSAqIAorCQkgKiBAcGxheWVydmVyc2lvbiBGbGFzaCAxMAorCQkgKiBAcGxheWVydmVyc2lvbiBBSVIgMS41CisgCQkgKiBAbGFuZ3ZlcnNpb24gMy4wCisJCSAqLwkKKwkJZnVuY3Rpb24gY2xlYXJTZWxlY3Rpb24oKTp2b2lkOwogCiAJCS8qKiAKIAkJICogR2l2ZXMgdGhlIGZvY3VzIHRvIHRoZSBmaXJzdCBjb250YWluZXIgaW4gdGhlIHNlbGVjdGlvbi4KQEAgLTI1MCw2ICszMzMsMTkgQEAKIAkJICovCiAJCWZ1bmN0aW9uIGdldCBjdXJyZW50U2VsZWN0aW9uRm9ybWF0KCk6U2VsZWN0aW9uRm9ybWF0OwogCisJCS8qKiAKKwkJICogVGhlIGN1cnJlbnQgQ2VsbCBTZWxlY3Rpb25Gb3JtYXQgb2JqZWN0LgorCQkgKiAKKwkJICogPHA+VGhlIGN1cnJlbnQgY2VsbCBTZWxlY3Rpb25Gb3JtYXQgb2JqZWN0IGlzIGNob3NlbiBmcm9tIHRoZSBTZWxlY3Rpb25Gb3JtYXQgb2JqZWN0cyBhc3NpZ25lZCB0byB0aGUgCisJCSAqIDxjb2RlPnVuZm9jdXNlZENlbGxTZWxlY3Rpb25Gb3JtYXQ8L2NvZGU+LCA8Y29kZT5pbmFjdGl2ZUNlbGxTZWxlY3Rpb25Gb3JtYXQ8L2NvZGU+IGFuZCA8Y29kZT5mb2N1c2VkQ2VsbFNlbGVjdGlvbkZvcm1hdDwvY29kZT4gCisJCSAqIHByb3BlcnRpZXMgYmFzZWQgb24gdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIDxjb2RlPndpbmRvd0FjdGl2ZTwvY29kZT4gYW5kIDxjb2RlPmZvY3VzZWQ8L2NvZGU+IHByb3BlcnRpZXMuPC9wPiAKKwkJICogCisJCSAqIEBwbGF5ZXJ2ZXJzaW9uIEZsYXNoIDEwCisJCSAqIEBwbGF5ZXJ2ZXJzaW9uIEFJUiAxLjUKKwkJICogQGxhbmd2ZXJzaW9uIDMuMAorCQkgKi8KKwkJZnVuY3Rpb24gZ2V0IGN1cnJlbnRDZWxsU2VsZWN0aW9uRm9ybWF0KCk6U2VsZWN0aW9uRm9ybWF0OworCiAJCS8qKgogCQkgKiBHZXRzIHRoZSBjaGFyYWN0ZXIgZm9ybWF0IGF0dHJpYnV0ZXMgdGhhdCBhcmUgY29tbW9uIHRvIGFsbCBjaGFyYWN0ZXJzIGluIHRoZSBzcGVjaWZpZWQgdGV4dCByYW5nZSBvciBjdXJyZW50IHNlbGVjdGlvbi4KIAkJICogCkBAIC0zNDYsNyArNDQyLDM4IEBACiAJCSAqLwkJIAkJIAogCQkgZnVuY3Rpb24gZ2V0IGluYWN0aXZlU2VsZWN0aW9uRm9ybWF0KCk6U2VsZWN0aW9uRm9ybWF0OwogCQkgZnVuY3Rpb24gc2V0IGluYWN0aXZlU2VsZWN0aW9uRm9ybWF0KHZhbDpTZWxlY3Rpb25Gb3JtYXQpOnZvaWQ7CQkgCQkgCi0JCQorCisJCSAvKioKKwkJICAqIFRoZSBTZWxlY3Rpb25Gb3JtYXQgb2JqZWN0IHVzZWQgdG8gZHJhdyBjZWxsIHNlbGVjdGlvbnMgaW4gYSBmb2N1c2VkIGNvbnRhaW5lci4gCisJCSAgKiAKKwkJICAqIEBwbGF5ZXJ2ZXJzaW9uIEZsYXNoIDEwCisJCSAgKiBAcGxheWVydmVyc2lvbiBBSVIgMS41CisJCSAgKiBAbGFuZ3ZlcnNpb24gMy4wCisJCSAgKi8JCSAKKwkJIGZ1bmN0aW9uIGdldCBmb2N1c2VkQ2VsbFNlbGVjdGlvbkZvcm1hdCgpOlNlbGVjdGlvbkZvcm1hdDsKKwkJIGZ1bmN0aW9uIHNldCBmb2N1c2VkQ2VsbFNlbGVjdGlvbkZvcm1hdCh2YWw6U2VsZWN0aW9uRm9ybWF0KTp2b2lkOworCQkgCisJCSAvKioKKwkJICAqIFRoZSBTZWxlY3Rpb25Gb3JtYXQgb2JqZWN0IHVzZWQgdG8gZHJhdyBjZWxsIHNlbGVjdGlvbnMgd2hlbiB0aGV5IGFyZSBub3QgaW4gYSBmb2N1c2VkIGNvbnRhaW5lciwgYnV0IGFyZSBpbgorCQkgICogdGhlIGFjdGl2ZSB3aW5kb3cuCisJCSAgKiAKKwkJICAqIEBwbGF5ZXJ2ZXJzaW9uIEZsYXNoIDEwCisJCSAgKiBAcGxheWVydmVyc2lvbiBBSVIgMS41CisJCSAgKiBAbGFuZ3ZlcnNpb24gMy4wCisJCSAgKi8JCSAJCSAKKwkJIGZ1bmN0aW9uIGdldCB1bmZvY3VzZWRDZWxsU2VsZWN0aW9uRm9ybWF0KCk6U2VsZWN0aW9uRm9ybWF0OworCQkgZnVuY3Rpb24gc2V0IHVuZm9jdXNlZENlbGxTZWxlY3Rpb25Gb3JtYXQodmFsOlNlbGVjdGlvbkZvcm1hdCk6dm9pZDsKKwkJIAorCQkgLyoqCisJCSAgKiBUaGUgU2VsZWN0aW9uRm9ybWF0IG9iamVjdCB1c2VkIHRvIGRyYXcgY2VsbCBzZWxlY3Rpb25zIHdoZW4gdGhleSBhcmUgbm90IGluIHRoZSBhY3RpdmUgd2luZG93LgorCQkgICogCisJCSAgKiBAcGxheWVydmVyc2lvbiBGbGFzaCAxMAorCQkgICogQHBsYXllcnZlcnNpb24gQUlSIDEuNQorCQkgICogQGxhbmd2ZXJzaW9uIDMuMAorCQkgICovCQkgCQkgCisJCSBmdW5jdGlvbiBnZXQgaW5hY3RpdmVDZWxsU2VsZWN0aW9uRm9ybWF0KCk6U2VsZWN0aW9uRm9ybWF0OworCQkgZnVuY3Rpb24gc2V0IGluYWN0aXZlQ2VsbFNlbGVjdGlvbkZvcm1hdCh2YWw6U2VsZWN0aW9uRm9ybWF0KTp2b2lkOwkJIAkJIAorCiAJCS8qKgogCQkgKiBFeGVjdXRlcyBhbnkgcGVuZGluZyBGbG93T3BlcmF0aW9ucy4gCiAJCSAqIApAQCAtMzc5LDYgKzUwNiwyNSBAQAogIAkgCSAqIEBsYW5ndmVyc2lvbiAzLjAKIAkJICovCiAJCWZ1bmN0aW9uIG5vdGlmeUluc2VydE9yRGVsZXRlKGFic29sdXRlUG9zaXRpb246aW50LCBsZW5ndGg6aW50KTp2b2lkCQkgCi0JCSAJCisJCSAKKwkJLyoqCisJCSAqIFRoZSBJU2VsZWN0aW9uTWFuYWdlciBvYmplY3QgdXNlZCB0byBmb3IgY2VsbCBzZWxlY3Rpb25zIG5lc3RlZCB3aXRoaW4gdGhlIFRleHRGbG93IG1hbmFnZWQgYnkgdGhpcyBJU2VsZWN0aW9uTWFuYWdlci4KKwkJICogCisJCSAqIEBwbGF5ZXJ2ZXJzaW9uIEZsYXNoIDEwCisJCSAqIEBwbGF5ZXJ2ZXJzaW9uIEFJUiAxLjUKKwkJICogQGxhbmd2ZXJzaW9uIDMuMAorCQkgKi8JCSAJCSAKKwkJZnVuY3Rpb24gZ2V0IHN1Yk1hbmFnZXIoKTpJU2VsZWN0aW9uTWFuYWdlcjsKKwkJZnVuY3Rpb24gc2V0IHN1Yk1hbmFnZXIodmFsdWU6SVNlbGVjdGlvbk1hbmFnZXIpOnZvaWQ7CisJCQorCQkvKioKKwkJICogVGhlIElTZWxlY3Rpb25NYW5hZ2VyIG9iamVjdCB1c2VkIHRvIG1hbmFnZSB0aGUgcGFyZW50IFRleHRGbG93IG9mIHRoaXMgSVNlbGVjdGlvbk1hbmFnZXIgKGkuZS4gZm9yIGNlbGwgSVNlbGVjdGlvbk1hbmFnZXJzKS4KKwkJICogCisJCSAqIEBwbGF5ZXJ2ZXJzaW9uIEZsYXNoIDEwCisJCSAqIEBwbGF5ZXJ2ZXJzaW9uIEFJUiAxLjUKKwkJICogQGxhbmd2ZXJzaW9uIDMuMAorCQkgKi8JCSAJCSAKKwkJZnVuY3Rpb24gZ2V0IHN1cGVyTWFuYWdlcigpOklTZWxlY3Rpb25NYW5hZ2VyOworCQlmdW5jdGlvbiBzZXQgc3VwZXJNYW5hZ2VyKHZhbHVlOklTZWxlY3Rpb25NYW5hZ2VyKTp2b2lkOwogCX0KIH0KZGlmZiAtLWdpdCBhL3RleHRMYXlvdXQvc3JjL2ZsYXNoeC90ZXh0TGF5b3V0L2VkaXQvTW9kZWxFZGl0LmFzIGIvdGV4dExheW91dC9zcmMvZmxhc2h4L3RleHRMYXlvdXQvZWRpdC9Nb2RlbEVkaXQuYXMKaW5kZXggY2RkZGIzYi4uYjE4ZjU1ZiAxMDA2NDQKLS0tIGEvdGV4dExheW91dC9zcmMvZmxhc2h4L3RleHRMYXlvdXQvZWRpdC9Nb2RlbEVkaXQuYXMKKysrIGIvdGV4dExheW91dC9zcmMvZmxhc2h4L3RleHRMYXlvdXQvZWRpdC9Nb2RlbEVkaXQuYXMKQEAgLTUxNiw3ICs1MTYsNyBAQAogCQkKIAkJdmFyIGVsZW1lbnQxTWFyazpFbGVtZW50TWFyayA9IG5ldyBFbGVtZW50TWFyayhlbGVtZW50MSwwKTsKIAkJdmFyIGVsZW1lbnQyTWFyazpFbGVtZW50TWFyayA9IG5ldyBFbGVtZW50TWFyayhlbGVtZW50MiwwKTsKLQkJcGVyZm9ybUludGVybmFsKHRleHRGbG93LCBlbGVtZW50MU1hcmssIGVsZW1lbnQyTWFyayk7CQkKKwkJcGVyZm9ybUludGVybmFsKHRleHRGbG93LCBlbGVtZW50MU1hcmssIGVsZW1lbnQyTWFyayk7CiAJCXZhciByZW1vdmVQYXJlbnRDaGFpbjpJTWVtZW50byA9IFRleHRGbG93RWRpdC5yZW1vdmVFbXB0eVBhcmVudENoYWluKGVsZW1lbnQyKTsKIAogCQlpZiAoY3JlYXRlTWVtZW50bykKZGlmZiAtLWdpdCBhL3RleHRMYXlvdXQvc3JjL2ZsYXNoeC90ZXh0TGF5b3V0L2VkaXQvUGFyYUVkaXQuYXMgYi90ZXh0TGF5b3V0L3NyYy9mbGFzaHgvdGV4dExheW91dC9lZGl0L1BhcmFFZGl0LmFzCmluZGV4IDk3NGViYTIuLjRhZjdlMjMgMTAwNjQ0Ci0tLSBhL3RleHRMYXlvdXQvc3JjL2ZsYXNoeC90ZXh0TGF5b3V0L2VkaXQvUGFyYUVkaXQuYXMKKysrIGIvdGV4dExheW91dC9zcmMvZmxhc2h4L3RleHRMYXlvdXQvZWRpdC9QYXJhRWRpdC5hcwpAQCAtMzAsMTEgKzMwLDEzIEBACiAJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmVsZW1lbnRzLlBhcmFncmFwaEVsZW1lbnQ7CiAJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmVsZW1lbnRzLlNwYW5FbGVtZW50OwogCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5lbGVtZW50cy5TdWJQYXJhZ3JhcGhHcm91cEVsZW1lbnRCYXNlOworCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5lbGVtZW50cy5UYWJsZUxlYWZFbGVtZW50OwogCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5lbGVtZW50cy5UZXh0RmxvdzsKIAlpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQuZm9ybWF0cy5GbG9hdDsKIAlpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQuZm9ybWF0cy5JVGV4dExheW91dEZvcm1hdDsKIAlpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQuZm9ybWF0cy5UZXh0TGF5b3V0Rm9ybWF0OwogCWltcG9ydCBmbGFzaHgudGV4dExheW91dC50bGZfaW50ZXJuYWw7CisJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmVsZW1lbnRzLlRhYmxlRWxlbWVudDsKIAkKIAl1c2UgbmFtZXNwYWNlIHRsZl9pbnRlcm5hbDsKIApAQCAtNjksMTAgKzcxLDE1IEBACiAJCQl7CiAJCQkJLy8gSWYgd2UncmUgYXQgdGhlIHN0YXJ0IGEgc3BhbiwgZ28gdG8gdGhlIHByZXZpb3VzIHNwYW4gaW4gdGhlIHNhbWUgcGFyYWdyYXBoLCBhbmQgaW5zZXJ0IGF0IHRoZSBlbmQgb2YgaXQKIAkJCQlpZiAocGFyYVNlbEJlZ0lkeCA9PSBzaWJsaW5nLmdldEVsZW1lbnRSZWxhdGl2ZVN0YXJ0KHBhcmFncmFwaCkpCi0JCQkJCXNpYmxpbmcgPSBGbG93TGVhZkVsZW1lbnQoc2libGluZykuZ2V0UHJldmlvdXNMZWFmKHBhcmFncmFwaCk7CQotCQkJCXNpYmxpbmdJbmRleCA9IHNpYmxpbmcucGFyZW50LmdldENoaWxkSW5kZXgoc2libGluZykgKyAxOworCQkJCQlzaWJsaW5nID0gRmxvd0xlYWZFbGVtZW50KHNpYmxpbmcpLmdldFByZXZpb3VzTGVhZihwYXJhZ3JhcGgpOworCQkJCWlmKHNpYmxpbmcgaXMgVGFibGVMZWFmRWxlbWVudCkKKwkJCQkJc2libGluZ0luZGV4ID0gc2libGluZy5wYXJlbnQucGFyZW50LmdldENoaWxkSW5kZXgoc2libGluZy5wYXJlbnQpICsgMTsKKwkJCQllbHNlCisJCQkJCXNpYmxpbmdJbmRleCA9IHNpYmxpbmcucGFyZW50LmdldENoaWxkSW5kZXgoc2libGluZykgKyAxOwogCQkJfQogCQkJdmFyIGluc2VydFBhcmVudDpGbG93R3JvdXBFbGVtZW50ID0gc2libGluZy5wYXJlbnQ7CisJCQlpZihpbnNlcnRQYXJlbnQgaXMgVGFibGVFbGVtZW50KQorCQkJCWluc2VydFBhcmVudCA9IGluc2VydFBhcmVudC5wYXJlbnQ7CiAJCQkKIAkJCS8vIElmIHdlIGFyZSBhZGRpbmcgdGV4dCB0byB0aGUgc3RhcnQgb3IgZW5kIG9mIGEgbGluaywgaXQgZG9lc24ndCBhbGxvdyB0aGUgaW5zZXJ0aW9uIHRvIGdyb3VwIHdpdGggdGhlIGxpbmsuCiAJCQkvLyBTbyBpbiB0aGF0IGNhc2UsIHdlIHdpbGwgaW5zZXJ0IHRvIHRoZSBlbGVtZW50IGJlc2lkZSB0aGUgcG9zaXRpb24gdGhhdCBpcyAqbm90KiBwYXJ0IG9mIHRoZSBsaW5rLgpAQCAtOTMsOSArMTAwLDEzIEBACiAJCQkJCWJyZWFrOwogCQkJCX0KIAkJCX0KLQkJCQkKIAkJCS8vIGFkanVzdCB0aGUgZmxvdyBzbyB0aGF0IHdlIGFyZSBpbiBhIHNwYW4gZm9yIHRoZSBpbnNlcnRpb24KIAkJCXZhciBpbnNlcnRTcGFuOlNwYW5FbGVtZW50ID0gc2libGluZyBhcyBTcGFuRWxlbWVudDsKKwkJCQorCQkJLy8gdXNlIHRoZSB0ZXJtaW5hdG9yIHNwYW4gaWYgaXQncyBlbXB0eQorCQkJaWYocGFyYWdyYXBoLnRlcm1pbmF0b3JTcGFuLnRleHRMZW5ndGggPT0gMSAmJiBwYXJhZ3JhcGgudGVybWluYXRvclNwYW4gPT0gaW5zZXJ0U3BhbikKKwkJCQljcmVhdGVOZXdTcGFuID0gZmFsc2U7CisJCQkKIAkJCWlmICghaW5zZXJ0U3BhbiB8fCBjcmVhdGVOZXdTcGFuKQogCQkJewogCQkJCXZhciBuZXdTcGFuOlNwYW5FbGVtZW50ID0gbmV3IFNwYW5FbGVtZW50KCk7CkBAIC0xMTEsNyArMTIyLDE1IEBACiAJCQkJCQkJc2libGluZy5zcGxpdEF0UG9zaXRpb24ocmVsYXRpdmVTdGFydCk7CQkvLyB3ZSdsbCBpbnNlcnQgYmV0d2VlbiB0aGUgdHdvIGVsZW1lbnRzCiAJCQkJCX0KIAkJCQl9Ci0JCQkJaW5zZXJ0UGFyZW50LnJlcGxhY2VDaGlsZHJlbihzaWJsaW5nSW5kZXgsIHNpYmxpbmdJbmRleCwgbmV3U3Bhbik7CisJCQkJdmFyIG5leHRMZWFmOkZsb3dMZWFmRWxlbWVudCA9IHBhcmFncmFwaC5maW5kTGVhZihwYXJhU2VsQmVnSWR4KTsKKwkJCQlpZihuZXh0TGVhZiAmJiBuZXh0TGVhZi50ZXh0TGVuZ3RoID09IDEgJiYgbmV4dExlYWYgPT0gcGFyYWdyYXBoLnRlcm1pbmF0b3JTcGFuKQorCQkJCXsKKwkJCQkJLy8gdXNlIHRoZSB0ZXJtaW5hdG9yIHNwYW4gaW5zdGVhZCBvZiBpbnNlcnRpbmcgYSBuZXcgb25lLgorCQkJCQluZXdTcGFuID0gU3BhbkVsZW1lbnQobmV4dExlYWYpOworCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJaW5zZXJ0UGFyZW50LnJlcGxhY2VDaGlsZHJlbihzaWJsaW5nSW5kZXgsIHNpYmxpbmdJbmRleCwgbmV3U3Bhbik7CisJCQkJfQogCQkJCXZhciBmb3JtYXRFbGVtOkZsb3dMZWFmRWxlbWVudCA9IG5ld1NwYW4uZ2V0UHJldmlvdXNMZWFmKHBhcmFncmFwaCk7CiAJCQkJaWYgKGZvcm1hdEVsZW0gPT0gbnVsbCkKIAkJCQkJbmV3U3Bhbi5mb3JtYXQgPSBuZXdTcGFuLmdldE5leHRMZWFmKHBhcmFncmFwaCkuZm9ybWF0OwpkaWZmIC0tZ2l0IGEvdGV4dExheW91dC9zcmMvZmxhc2h4L3RleHRMYXlvdXQvZWRpdC9TZWxlY3Rpb25NYW5hZ2VyLmFzIGIvdGV4dExheW91dC9zcmMvZmxhc2h4L3RleHRMYXlvdXQvZWRpdC9TZWxlY3Rpb25NYW5hZ2VyLmFzCmluZGV4IGRkNmYxMTcuLjQyZTE1NzkgMTAwNjQ0Ci0tLSBhL3RleHRMYXlvdXQvc3JjL2ZsYXNoeC90ZXh0TGF5b3V0L2VkaXQvU2VsZWN0aW9uTWFuYWdlci5hcworKysgYi90ZXh0TGF5b3V0L3NyYy9mbGFzaHgvdGV4dExheW91dC9lZGl0L1NlbGVjdGlvbk1hbmFnZXIuYXMKQEAgLTIwLDggKzIwLDEwIEBACiB7CiAgICAgaW1wb3J0IGZsYXNoLmRlc2t0b3AuQ2xpcGJvYXJkOwogICAgIGltcG9ydCBmbGFzaC5kZXNrdG9wLkNsaXBib2FyZEZvcm1hdHM7CisgICAgaW1wb3J0IGZsYXNoLmRpc3BsYXkuQml0bWFwRGF0YTsKICAgICBpbXBvcnQgZmxhc2guZGlzcGxheS5EaXNwbGF5T2JqZWN0OwogICAgIGltcG9ydCBmbGFzaC5kaXNwbGF5LkludGVyYWN0aXZlT2JqZWN0OworICAgIGltcG9ydCBmbGFzaC5kaXNwbGF5LlNoYXBlOwogICAgIGltcG9ydCBmbGFzaC5kaXNwbGF5LlN0YWdlOwogICAgIGltcG9ydCBmbGFzaC5lcnJvcnMuSWxsZWdhbE9wZXJhdGlvbkVycm9yOwogICAgIGltcG9ydCBmbGFzaC5ldmVudHMuQ29udGV4dE1lbnVFdmVudDsKQEAgLTMxLDggKzMzLDEwIEBACiAgICAgaW1wb3J0IGZsYXNoLmV2ZW50cy5LZXlib2FyZEV2ZW50OwogICAgIGltcG9ydCBmbGFzaC5ldmVudHMuTW91c2VFdmVudDsKICAgICBpbXBvcnQgZmxhc2guZXZlbnRzLlRleHRFdmVudDsKKyAgICBpbXBvcnQgZmxhc2guZ2VvbS5NYXRyaXg7CiAgICAgaW1wb3J0IGZsYXNoLmdlb20uUG9pbnQ7CiAgICAgaW1wb3J0IGZsYXNoLmdlb20uUmVjdGFuZ2xlOworICAgIGltcG9ydCBmbGFzaC50ZXh0LmVuZ2luZS5UZXh0QmxvY2s7CiAgICAgaW1wb3J0IGZsYXNoLnRleHQuZW5naW5lLlRleHRMaW5lOwogICAgIGltcG9ydCBmbGFzaC50ZXh0LmVuZ2luZS5UZXh0TGluZVZhbGlkaXR5OwogICAgIGltcG9ydCBmbGFzaC50ZXh0LmVuZ2luZS5UZXh0Um90YXRpb247CkBAIC00MCwxNCArNDQsMjAgQEAKICAgICBpbXBvcnQgZmxhc2gudWkuS2V5Ym9hcmQ7CiAgICAgaW1wb3J0IGZsYXNoLnVpLk1vdXNlOwogICAgIGltcG9ydCBmbGFzaC51aS5Nb3VzZUN1cnNvcjsKKyAgICBpbXBvcnQgZmxhc2gudWkuTW91c2VDdXJzb3JEYXRhOworICAgIGltcG9ydCBmbGFzaC51dGlscy5EaWN0aW9uYXJ5OwogICAgIGltcG9ydCBmbGFzaC51dGlscy5nZXRRdWFsaWZpZWRDbGFzc05hbWU7CiAgICAgCiAgICAgaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmNvbXBvc2UuSUZsb3dDb21wb3NlcjsKICAgICBpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQuY29tcG9zZS5UZXh0Rmxvd0xpbmU7CisgICAgaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmNvbXBvc2UuVGV4dEZsb3dUYWJsZUJsb2NrOwogICAgIGltcG9ydCBmbGFzaHgudGV4dExheW91dC5jb250YWluZXIuQ29sdW1uU3RhdGU7CiAgICAgaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmNvbnRhaW5lci5Db250YWluZXJDb250cm9sbGVyOwogICAgIGltcG9ydCBmbGFzaHgudGV4dExheW91dC5kZWJ1Zy5EZWJ1Z2dpbmc7CiAgICAgaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmRlYnVnLmFzc2VydDsKKyAgICBpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQuZWxlbWVudHMuQ2VsbENvbnRhaW5lcjsKKyAgICBpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQuZWxlbWVudHMuQ2VsbENvb3JkaW5hdGVzOworICAgIGltcG9ydCBmbGFzaHgudGV4dExheW91dC5lbGVtZW50cy5DZWxsUmFuZ2U7CiAgICAgaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmVsZW1lbnRzLkNvbmZpZ3VyYXRpb247CiAgICAgaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmVsZW1lbnRzLkZsb3dFbGVtZW50OwogICAgIGltcG9ydCBmbGFzaHgudGV4dExheW91dC5lbGVtZW50cy5GbG93TGVhZkVsZW1lbnQ7CkBAIC01NSw3ICs2NSw5IEBACiAgICAgaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmVsZW1lbnRzLklDb25maWd1cmF0aW9uOwogICAgIGltcG9ydCBmbGFzaHgudGV4dExheW91dC5lbGVtZW50cy5JbmxpbmVHcmFwaGljRWxlbWVudDsKICAgICBpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQuZWxlbWVudHMuUGFyYWdyYXBoRWxlbWVudDsKLSAgICBpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQuZWxlbWVudHMuVGFibGVEYXRhQ2VsbEVsZW1lbnQ7CisgICAgaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmVsZW1lbnRzLlRhYmxlQmxvY2tDb250YWluZXI7CisgICAgaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmVsZW1lbnRzLlRhYmxlQ2VsbEVsZW1lbnQ7CisgICAgaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmVsZW1lbnRzLlRhYmxlQ29sRWxlbWVudDsKICAgICBpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQuZWxlbWVudHMuVGFibGVFbGVtZW50OwogICAgIGltcG9ydCBmbGFzaHgudGV4dExheW91dC5lbGVtZW50cy5UYWJsZVJvd0VsZW1lbnQ7CiAgICAgaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmVsZW1lbnRzLlRleHRGbG93OwpAQCAtMTIyLDIzICsxMzQsMzI1IEBACiAgICAgICogQGxhbmd2ZXJzaW9uIDMuMAogICAgICAqLwogICAgIHB1YmxpYyBjbGFzcyBTZWxlY3Rpb25NYW5hZ2VyIGltcGxlbWVudHMgSVNlbGVjdGlvbk1hbmFnZXIKLSAgICB7ICAgICAgIAorICAgIHsKKwkJc3RhdGljIHRsZl9pbnRlcm5hbCB2YXIgdXNlVGFibGVTZWxlY3Rpb25DdXJzb3JzOkJvb2xlYW4gPSBmYWxzZTsKKwkJLyoqCisJCSAqIEN1cnNvciBmb3Igc2VsZWN0aW9uIG9mIHRhYmxlCisJCSAqKi8KKwkJcHVibGljIHN0YXRpYyB2YXIgU2VsZWN0VGFibGU6U3RyaW5nID0gInNlbGVjdFRhYmxlIjsKKwkJCisJCS8qKgorCQkgKiBDdXJzb3IgZm9yIHNlbGVjdGlvbiBvZiB0YWJsZSByb3cKKwkJICoqLworCQlwdWJsaWMgc3RhdGljIHZhciBTZWxlY3RUYWJsZVJvdzpTdHJpbmcgPSAic2VsZWN0VGFibGVSb3ciOworCQkKKwkJLyoqCisJCSAqIEN1cnNvciBmb3Igc2VsZWN0aW9uIG9mIHRhYmxlIGNvbHVtbgorCQkgKiovCisJCXB1YmxpYyBzdGF0aWMgdmFyIFNlbGVjdFRhYmxlQ29sdW1uOlN0cmluZyA9ICJzZWxlY3RUYWJsZUNvbHVtbiI7CisJCQogICAgICAgICBwcml2YXRlIHZhciBfZm9jdXNlZFNlbGVjdGlvbkZvcm1hdDpTZWxlY3Rpb25Gb3JtYXQ7CiAgICAgICAgIHByaXZhdGUgdmFyIF91bmZvY3VzZWRTZWxlY3Rpb25Gb3JtYXQ6U2VsZWN0aW9uRm9ybWF0OwogICAgICAgICBwcml2YXRlIHZhciBfaW5hY3RpdmVTZWxlY3Rpb25Gb3JtYXQ6U2VsZWN0aW9uRm9ybWF0OworCQlwcml2YXRlIHZhciBfZm9jdXNlZENlbGxTZWxlY3Rpb25Gb3JtYXQ6U2VsZWN0aW9uRm9ybWF0OworCQlwcml2YXRlIHZhciBfdW5mb2N1c2VkQ2VsbFNlbGVjdGlvbkZvcm1hdDpTZWxlY3Rpb25Gb3JtYXQ7CisJCXByaXZhdGUgdmFyIF9pbmFjdGl2ZUNlbGxTZWxlY3Rpb25Gb3JtYXQ6U2VsZWN0aW9uRm9ybWF0OwogICAgICAgICBwcml2YXRlIHZhciBfc2VsRm9ybWF0U3RhdGU6U3RyaW5nID0gU2VsZWN0aW9uRm9ybWF0U3RhdGUuVU5GT0NVU0VEOwogICAgICAgICBwcml2YXRlIHZhciBfaXNBY3RpdmU6Qm9vbGVhbjsKICAgICAgICAgCiAgICAgICAgIC8qKiBUaGUgVGV4dEZsb3cgb2YgdGhlIHNlbGVjdGlvbi4gKi8KICAgICAgICAgcHJpdmF0ZSB2YXIgX3RleHRGbG93OlRleHRGbG93OworCQkKKwkJcHJvdGVjdGVkIHZhciBfc3ViTWFuYWdlcjpJU2VsZWN0aW9uTWFuYWdlcjsKKwkJcHJvdGVjdGVkIHZhciBfc3VwZXJNYW5hZ2VyOklTZWxlY3Rpb25NYW5hZ2VyOworCQkKKwkJcHJpdmF0ZSB2YXIgX2N1cnJlbnRUYWJsZTpUYWJsZUVsZW1lbnQ7CisJCQorCQkvLyB0aGlzIHNob3VsZCBwcm9iYWJseSBiZSBwcm9kdWNlZCBkeW5hbWljYWxseSByYXRoZXIgdGhhbiBrZWVwIGEgcmVmZXJlbmNlLgorCQlwcml2YXRlIHZhciBfY2VsbFJhbmdlOkNlbGxSYW5nZTsKKwkJCisJCS8vVE9ETyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBuZWVkIHByb3BlciBjb21tZW50cyBhbmQgc2hvdWxkIGJlIG1vdmVkIHRvIGEgbG9naWNhbCBsb2NhdGlvbiB3aXRoaW4gdGhlIGNsYXNzLgorCQkKKwkJcHVibGljIGZ1bmN0aW9uIGdldCBjdXJyZW50VGFibGUoKTpUYWJsZUVsZW1lbnQKKwkJeworCQkJcmV0dXJuIF9jdXJyZW50VGFibGU7CisJCX0KKwkJcHVibGljIGZ1bmN0aW9uIHNldCBjdXJyZW50VGFibGUodGFibGU6VGFibGVFbGVtZW50KTp2b2lkCisJCXsKKwkJCV9jdXJyZW50VGFibGUgPSB0YWJsZTsKKwkJfQorCQkKKwkJcHVibGljIGZ1bmN0aW9uIGhhc0NlbGxSYW5nZVNlbGVjdGlvbigpOkJvb2xlYW4KKwkJeworCQkJaWYgKCFfY3VycmVudFRhYmxlKSB7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQkJCisJCQkvL3dlIHNob3VsZCByZWFsbHkgY2hlY2sgdGhlIGFuY2hvckNlbGxQb3NpdGlvbiBhbmQgYWN0aXZlQ2VsbFBvc2l0aW9uIGluc3RlYWQKKwkJCWlmICghX2NlbGxSYW5nZSkgeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJCQorCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJCisJCS8qKgorCQkgKiBTZWxlY3QgYSB0YWJsZSBjZWxsIHRleHQgZmxvdworCQkgKiovCisJCXB1YmxpYyBmdW5jdGlvbiBzZWxlY3RDZWxsVGV4dEZsb3coY2VsbDpUYWJsZUNlbGxFbGVtZW50KTp2b2lkIHsKKwkJCQorCQkJaWYgKGNlbGwgJiYgY2VsbC50YWJsZSkgeworCQkJCXZhciBzZWxlY3Rpb25NYW5hZ2VyOlNlbGVjdGlvbk1hbmFnZXIgPSBjZWxsLnRleHRGbG93LmludGVyYWN0aW9uTWFuYWdlciBhcyBTZWxlY3Rpb25NYW5hZ2VyOworCQkJCQorCQkJCWNsZWFyKCk7CisJCQkJCisJCQkJaWYgKHNlbGVjdGlvbk1hbmFnZXIpIHsKKwkJCQkJc2VsZWN0aW9uTWFuYWdlci5jdXJyZW50VGFibGUgPSBjZWxsLnRhYmxlOworCQkJCQlzZWxlY3Rpb25NYW5hZ2VyLnNlbGVjdEFsbCgpOworCQkJCQkKKwkJCQkJLy8gdGhpcyBzZWVtcyB0byBiZSByZXF1aXJlZCB0byB3b3JrIGJ1dCBpdCBzaG91bGQgbm90IGJlCisJCQkJCXNlbGVjdGlvbk1hbmFnZXIuc2V0Rm9jdXMoKTsgCisJCQkJfQorCQkJfQorCQl9CisJCQorCQkvKioKKwkJICogU2VsZWN0IGEgdGFibGUgY2VsbC4gCisJCSAqKi8KKwkJcHVibGljIGZ1bmN0aW9uIHNlbGVjdENlbGwoY2VsbDpUYWJsZUNlbGxFbGVtZW50KTp2b2lkIHsKKwkJCXZhciBiZWdpbkNvb3JkaW5hdGVzOkNlbGxDb29yZGluYXRlczsKKwkJCXZhciBlbmRDb29yZGluYXRlczpDZWxsQ29vcmRpbmF0ZXM7CisJCQkKKwkJCWlmIChjZWxsKSB7CisJCQkJYmVnaW5Db29yZGluYXRlcyA9IG5ldyBDZWxsQ29vcmRpbmF0ZXMoY2VsbC5yb3dJbmRleCwgY2VsbC5jb2xJbmRleCk7CisJCQkJZW5kQ29vcmRpbmF0ZXMgPSBuZXcgQ2VsbENvb3JkaW5hdGVzKGNlbGwucm93SW5kZXgsIGNlbGwuY29sSW5kZXgpOworCQkJCQorCQkJCWlmIChiZWdpbkNvb3JkaW5hdGVzLmlzVmFsaWQoKSkgeworCQkJCQlzZWxlY3RDZWxsUmFuZ2UoYmVnaW5Db29yZGluYXRlcywgZW5kQ29vcmRpbmF0ZXMpOworCQkJCX0KKwkJCX0KKwkJfQorCQkKKwkJLyoqCisJCSAqIFNlbGVjdCB0YWJsZSBjZWxscyBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgorCQkgKiovCisJCXB1YmxpYyBmdW5jdGlvbiBzZWxlY3RDZWxsQXQodGFibGU6VGFibGVFbGVtZW50LCByb3dJbmRleDppbnQsIGNvbEluZGV4OmludCk6dm9pZCB7CisJCQl2YXIgY2VsbDpUYWJsZUNlbGxFbGVtZW50ID0gdGFibGUuZ2V0Q2VsbEF0KHJvd0luZGV4LCBjb2xJbmRleCk7CisJCQkKKwkJCWlmIChjZWxsKSB7CisJCQkJc2VsZWN0Q2VsbChjZWxsKTsKKwkJCX0KKwkJfQorCQkKKwkJLyoqCisJCSAqIFNlbGVjdCB0YWJsZSBjZWxscyBhdCB0aGUgc3BlY2lmaWVkIGluZGV4CisJCSAqKi8KKwkJcHVibGljIGZ1bmN0aW9uIHNlbGVjdENlbGxzKGNlbGxzOlZlY3Rvci48VGFibGVDZWxsRWxlbWVudD4pOnZvaWQgeworCQkJdmFyIHN0YXJ0WDppbnQgPSBpbnQuTUFYX1ZBTFVFOworCQkJdmFyIHN0YXJ0WTppbnQgPSBpbnQuTUFYX1ZBTFVFOworCQkJdmFyIGVuZFg6aW50ID0gaW50Lk1JTl9WQUxVRTsKKwkJCXZhciBlbmRZOmludCA9IGludC5NSU5fVkFMVUU7CisJCQl2YXIgY2VsbDpUYWJsZUNlbGxFbGVtZW50OworCQkJdmFyIHRhYmxlOlRhYmxlRWxlbWVudDsKKwkJCWZvciBlYWNoKGNlbGwgaW4gY2VsbHMpCisJCQl7CisJCQkJaWYoY2VsbCkKKwkJCQl7CisJCQkJCWlmKHRhYmxlID09IG51bGwpCisJCQkJCQl0YWJsZSA9IGNlbGwuZ2V0VGFibGUoKTsKKwkJCQkJCisJCQkJCXZhciBjb2w6aW50ID0gY2VsbC5jb2xJbmRleDsKKwkJCQkJdmFyIHJvdzppbnQgPSBjZWxsLnJvd0luZGV4OworCQkJCQlpZihjb2wgPCBzdGFydFgpCisJCQkJCQlzdGFydFggPSBjb2w7CisJCQkJCWlmKGNvbCA+IGVuZFgpCisJCQkJCQllbmRYID0gY29sOworCQkJCQlpZihyb3cgPCBzdGFydFkpCisJCQkJCQlzdGFydFkgPSByb3c7CisJCQkJCWlmKHJvdyA+IGVuZFkpCisJCQkJCQllbmRZID0gcm93OworCQkJCX0KKwkJCX0KKwkJCWlmKHN0YXJ0WCA8PSBlbmRYICYmIHN0YXJ0WSA8PSBlbmRZKQorCQkJCXNlbGVjdENlbGxSYW5nZSgKKwkJCQkJbmV3IENlbGxDb29yZGluYXRlcyhzdGFydFksc3RhcnRYLHRhYmxlKSwKKwkJCQkJbmV3IENlbGxDb29yZGluYXRlcyhlbmRZLGVuZFgsdGFibGUpCisJCQkJKTsKKwkJfQorCQkKKwkJLyoqCisJCSAqIFNlbGVjdCB0aGUgc3BlY2lmaWVkIHRhYmxlIHJvdy4gCisJCSAqKi8KKwkJcHVibGljIGZ1bmN0aW9uIHNlbGVjdFJvdyhyb3c6VGFibGVSb3dFbGVtZW50KTp2b2lkIHsKKwkJCXZhciBiZWdpbkNvb3JkaW5hdGVzOkNlbGxDb29yZGluYXRlczsKKwkJCXZhciBlbmRDb29yZGluYXRlczpDZWxsQ29vcmRpbmF0ZXM7CisJCQkKKwkJCWlmIChyb3cpIHsKKwkJCQliZWdpbkNvb3JkaW5hdGVzID0gbmV3IENlbGxDb29yZGluYXRlcyhyb3cucm93SW5kZXgsIDApOworCQkJCWVuZENvb3JkaW5hdGVzID0gbmV3IENlbGxDb29yZGluYXRlcyhyb3cucm93SW5kZXgsIHJvdy5udW1DZWxscyk7CisJCQkJCisJCQkJaWYgKGJlZ2luQ29vcmRpbmF0ZXMuaXNWYWxpZCgpICYmIGVuZENvb3JkaW5hdGVzLmlzVmFsaWQoKSkgeworCQkJCQlzZWxlY3RDZWxsUmFuZ2UoYmVnaW5Db29yZGluYXRlcywgZW5kQ29vcmRpbmF0ZXMpOworCQkJCX0KKwkJCX0KKwkJfQorCQkKKwkJLyoqCisJCSAqIFNlbGVjdCBhIHRhYmxlIHJvdyBhdCB0aGUgc3BlY2lmaWVkIGluZGV4CisJCSAqKi8KKwkJcHVibGljIGZ1bmN0aW9uIHNlbGVjdFJvd0F0KHRhYmxlOlRhYmxlRWxlbWVudCwgaW5kZXg6aW50KTp2b2lkIHsKKwkJCXZhciByb3c6VGFibGVSb3dFbGVtZW50ID0gdGFibGUgPyB0YWJsZS5nZXRSb3dBdChpbmRleCkgOiBudWxsOworCQkJCisJCQlpZiAocm93KSB7CisJCQkJc2VsZWN0Um93KHJvdyk7CisJCQl9CisJCX0KKwkJCisJCS8qKgorCQkgKiBTZWxlY3RzIHRoZSB0YWJsZSByb3dzIHByb3ZpZGVkCisJCSAqKi8KKwkJcHVibGljIGZ1bmN0aW9uIHNlbGVjdFJvd3Mocm93czpBcnJheSk6dm9pZCB7CisJCQl2YXIgY2VsbHM6VmVjdG9yLjxUYWJsZUNlbGxFbGVtZW50PiA9IG5ldyBWZWN0b3IuPFRhYmxlQ2VsbEVsZW1lbnQ+KCk7CisJCQl2YXIgdGFibGU6VGFibGVFbGVtZW50OworCQkJdmFyIGNlbGw6VGFibGVDZWxsRWxlbWVudDsKKwkJCQorCQkJaWYgKHJvd3MgJiYgcm93cy5sZW5ndGgpIHsKKwkJCQkKKwkJCQlmb3IgKHZhciBpOmludDtpPHJvd3MubGVuZ3RoO2krKykgDQorCQkJCXsKKwkJCQkJdmFyIHJvdzpUYWJsZVJvd0VsZW1lbnQgPSByb3dzW2ldIGFzIFRhYmxlUm93RWxlbWVudDsKKwkJCQkJCisJCQkJCWlmIChyb3cpCisJCQkJCXsKKwkJCQkJCWZvciBlYWNoKGNlbGwgaW4gcm93LmNlbGxzKQorCQkJCQkJY2VsbHMucHVzaChjZWxsKTsKKwkJCQkJfQorCQkJCX0KKwkJCQkKKwkJCQlzZWxlY3RDZWxscyhjZWxscyk7CisJCQl9CisJCX0KKwkJCisJCS8qKgorCQkgKiBTZWxlY3QgYSB0YWJsZSBjb2x1bW4uIAorCQkgKiovCisJCXB1YmxpYyBmdW5jdGlvbiBzZWxlY3RDb2x1bW4oY29sdW1uOlRhYmxlQ29sRWxlbWVudCk6dm9pZCB7CisJCQl2YXIgdGFibGU6VGFibGVFbGVtZW50ID0gY29sdW1uLnRhYmxlOworCQkJCisJCQlpZiAoY29sdW1uICYmIHRhYmxlKSB7CisJCQkJc2VsZWN0Q2VsbHModGFibGUuZ2V0Q2VsbHNGb3JDb2x1bW4oY29sdW1uKSk7CisJCQl9CisJCX0KKwkJCisJCS8qKgorCQkgKiBTZWxlY3QgYSB0YWJsZSBjb2x1bW4gYXQgdGhlIHNwZWNpZmllZCBpbmRleCAKKwkJICoqLworCQlwdWJsaWMgZnVuY3Rpb24gc2VsZWN0Q29sdW1uQXQodGFibGU6VGFibGVFbGVtZW50LCBpbmRleDppbnQpOnZvaWQgeworCQkJdmFyIGNvbHVtbjpUYWJsZUNvbEVsZW1lbnQgPSB0YWJsZS5nZXRDb2x1bW5BdChpbmRleCk7CisJCQkKKwkJCWlmIChjb2x1bW4gJiYgdGFibGUpIHsKKwkJCQlyZXR1cm4gc2VsZWN0Q29sdW1uKGNvbHVtbik7CisJCQl9CisJCX0KKwkJCisJCS8qKgorCQkgKiBTZWxlY3RzIHRoZSB0YWJsZSBjb2x1bW5zIHByb3ZpZGVkCisJCSAqKi8KKwkJcHVibGljIGZ1bmN0aW9uIHNlbGVjdENvbHVtbnMoY29sdW1uczpBcnJheSk6dm9pZCB7CisJCQl2YXIgY2VsbHM6VmVjdG9yLjxUYWJsZUNlbGxFbGVtZW50PiA9IG5ldyBWZWN0b3IuPFRhYmxlQ2VsbEVsZW1lbnQ+KCk7CisJCQl2YXIgY2VsbDpUYWJsZUNlbGxFbGVtZW50OworCQkJCisJCQlpZiAoY29sdW1ucyAmJiBjb2x1bW5zLmxlbmd0aCkgeworCQkJCQorCQkJCWZvciAodmFyIGk6aW50O2k8Y29sdW1ucy5sZW5ndGg7aSsrKSAKKwkJCQl7CisJCQkJCXZhciBjb2x1bW46VGFibGVDb2xFbGVtZW50ID0gY29sdW1uc1tpXSBhcyBUYWJsZUNvbEVsZW1lbnQ7CisJCQkJCQorCQkJCQlpZiAoY29sdW1uKQorCQkJCQl7CisJCQkJCQlmb3IgZWFjaChjZWxsIGluIGNvbHVtbi5jZWxscykKKwkJCQkJCQljZWxscy5wdXNoKGNlbGwpOworCQkJCQl9CisJCQkJCQorCQkJCX0KKwkJCQkKKwkJCQlzZWxlY3RDZWxscyhjZWxscyk7CisJCQl9CisJCX0KKwkJCisJCS8qKgorCQkgKiBTZWxlY3QgYWxsIGNlbGxzIGluIGEgdGFibGUuIAorCQkgKiovCisJCXB1YmxpYyBmdW5jdGlvbiBzZWxlY3RUYWJsZSh0YWJsZTpUYWJsZUVsZW1lbnQpOnZvaWQgeworCQkJCisJCQlpZiAodGFibGUpCisJCQl7CisJCQkJdmFyIHN0YXJ0Q29vcmRzOkNlbGxDb29yZGluYXRlcyA9IG5ldyBDZWxsQ29vcmRpbmF0ZXMoMCwwLHRhYmxlKTsKKwkJCQl2YXIgZW5kQ29vcmRzOkNlbGxDb29yZGluYXRlcyA9IG5ldyBDZWxsQ29vcmRpbmF0ZXModGFibGUubnVtUm93cy0xLHRhYmxlLm51bUNvbHVtbnMtMSx0YWJsZSk7CisJCQkJc2VsZWN0Q2VsbFJhbmdlKHN0YXJ0Q29vcmRzLGVuZENvb3Jkcyk7CisJCQl9CisJCQkKKwkJfQorCQkKKwkJLyoqCisJCSAqIFNlbGVjdCBhIHJhbmdlIG9mIHRhYmxlIGNlbGxzLiAKKwkJICoqLworCQlwdWJsaWMgZnVuY3Rpb24gc2VsZWN0Q2VsbFJhbmdlKGFuY2hvckNvb3JkczpDZWxsQ29vcmRpbmF0ZXMsIGFjdGl2ZUNvb3JkczpDZWxsQ29vcmRpbmF0ZXMpOnZvaWQKKwkJeworCQkJdmFyIGJsb2NrczpWZWN0b3IuPFRleHRGbG93VGFibGVCbG9jaz47CisJCQl2YXIgYmxvY2s6VGV4dEZsb3dUYWJsZUJsb2NrOworCQkJdmFyIGNvbnRyb2xsZXI6Q29udGFpbmVyQ29udHJvbGxlcjsKKwkJCQorCQkJaWYgKHNlbGVjdGlvblR5cGUgPT0gU2VsZWN0aW9uVHlwZS5URVhUKSB7CisJCQkJY2xlYXIoKTsKKwkJCX0KKwkJCWNsZWFyQ2VsbFNlbGVjdGlvbnMoKTsKKwkJCQorCQkJaWYgKGFuY2hvckNvb3JkcyAmJiBhY3RpdmVDb29yZHMpIHsKKwkJCQlfY2VsbFJhbmdlID0gbmV3IENlbGxSYW5nZShfY3VycmVudFRhYmxlLCBhbmNob3JDb29yZHMsIGFjdGl2ZUNvb3Jkcyk7CisJCQkJYWN0aXZlQ2VsbFBvc2l0aW9uID0gYWN0aXZlQ29vcmRzOworCQkJCWJsb2NrcyA9IF9jdXJyZW50VGFibGUuZ2V0VGFibGVCbG9ja3NJblJhbmdlKGFuY2hvckNvb3JkcywgYWN0aXZlQ29vcmRzKTsKKwkJCQkKKwkJCQlmb3IgZWFjaChibG9jayBpbiBibG9ja3MpIHsKKwkJCQkJYmxvY2suY29udHJvbGxlci5jbGVhclNlbGVjdGlvblNoYXBlcygpOworCQkJCQlibG9jay5jb250cm9sbGVyLmFkZENlbGxTZWxlY3Rpb25TaGFwZXMoY3VycmVudENlbGxTZWxlY3Rpb25Gb3JtYXQucmFuZ2VDb2xvciwgYmxvY2ssIGFuY2hvckNvb3JkcywgYWN0aXZlQ29vcmRzKTsKKwkJCQl9CisJCQkJaWYoc3ViTWFuYWdlcikKKwkJCQl7CisJCQkJCXN1Yk1hbmFnZXIuc2VsZWN0UmFuZ2UoLTEsLTEpOworCQkJCQlzdWJNYW5hZ2VyID0gbnVsbDsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJX2NlbGxSYW5nZSA9IG51bGw7CisJCQkJYWN0aXZlQ2VsbFBvc2l0aW9uLmNvbHVtbiA9IC0xOworCQkJCWFjdGl2ZUNlbGxQb3NpdGlvbi5yb3cgPSAtMTsKKwkJCX0KKwkJCXNlbGVjdGlvbkNoYW5nZWQoKTsKKwkJfQorCQkKKwkJcHVibGljIGZ1bmN0aW9uIGdldENlbGxSYW5nZSgpOkNlbGxSYW5nZQorCQl7CisJCQkvLyBub3QgcmVhbGx5IGEgZ29vZCBpbXBsZW1lbnRhdGlvbi4gV2UnbGwgZml4IHRoaXMgbGF0ZXIKKwkJCXJldHVybiBfY2VsbFJhbmdlOworCQl9CisJCXB1YmxpYyBmdW5jdGlvbiBzZXRDZWxsUmFuZ2UocmFuZ2U6Q2VsbFJhbmdlKTp2b2lkCisJCXsKKwkJCXNlbGVjdENlbGxSYW5nZShyYW5nZS5hbmNob3JDb29yZGluYXRlcyxyYW5nZS5hY3RpdmVDb29yZGluYXRlcyk7CisJCQkvL19jZWxsUmFuZ2UgPSByYW5nZTsKKwkJCS8vIGRvIHNvbWV0aGluZyBhYm91dCBhY3R1YWxseSBkcmF3aW5nIHRoZSBzZWxlY3Rpb24uCisJCX0KICAgICAgICAgCiAgICAgICAgIC8vIGN1cnJlbnQgcmFuZ2Ugb2Ygc2VsZWN0aW9uCiAgICAgICAgIC8qKiBBbmNob3IgcG9pbnQgb2YgdGhlIGN1cnJlbnQgc2VsZWN0aW9uLCBhcyBhbiBpbmRleCBpbnRvIHRoZSBUZXh0Rmxvdy4gKi8KICAgICAgICAgcHJpdmF0ZSB2YXIgYW5jaG9yTWFyazpNYXJrOwogICAgICAgICAvKiogQWN0aXZlIGVuZCBvZiB0aGUgY3VycmVudCBzZWxlY3Rpb24sIGFzIGFuIGluZGV4IGludG8gdGhlIFRleHRGbG93LiAqLwogICAgICAgICBwcml2YXRlIHZhciBhY3RpdmVNYXJrOk1hcms7Ci0gICAgICAgIAotICAgICAgICAvLyB1c2VkIHRvIHNhdmUgcGVuZGluZyBhdHRyaWJ1dGVzIGF0IGEgcG9pbnQgc2VsZWN0aW9uCisgICAgICAgIHByaXZhdGUgdmFyIF9hbmNob3JDZWxsUG9zaXRpb246Q2VsbENvb3JkaW5hdGVzOworCQlwcml2YXRlIHZhciBfYWN0aXZlQ2VsbFBvc2l0aW9uOkNlbGxDb29yZGluYXRlczsKKworCQkvLyB1c2VkIHRvIHNhdmUgcGVuZGluZyBhdHRyaWJ1dGVzIGF0IGEgcG9pbnQgc2VsZWN0aW9uCiAgICAgICAgIHByaXZhdGUgdmFyIF9wb2ludEZvcm1hdDpJVGV4dExheW91dEZvcm1hdDsKICAgICAgICAgLyoqIAogICAgICAgICAgKiBUaGUgZm9ybWF0IHRoYXQgd2lsbCBiZSBhcHBsaWVkIHRvIGluc2VydGVkIHRleHQuIApAQCAtMTkwLDYgKzUwNCw4IEBACiAgICAgICAgICAgICBfdGV4dEZsb3cgPSBudWxsOwogICAgICAgICAgICAgYW5jaG9yTWFyayA9IGNyZWF0ZU1hcmsoKTsKICAgICAgICAgICAgIGFjdGl2ZU1hcmsgPSBjcmVhdGVNYXJrKCk7CisJCQlhbmNob3JDZWxsUG9zaXRpb24gPSBjcmVhdGVDZWxsTWFyaygpOworCQkJYWN0aXZlQ2VsbFBvc2l0aW9uID0gY3JlYXRlQ2VsbE1hcmsoKTsKICAgICAgICAgICAgIF9wb2ludEZvcm1hdCA9IG51bGw7CiAgICAgICAgICAgICBfaXNBY3RpdmUgPSBmYWxzZTsKICAgICAgICAgICAgIENPTkZJRzo6ZGVidWcgCkBAIC0xOTcsNyArNTEzLDEyIEBACiAgICAgICAgICAgICAgICAgdGhpcy5pZCA9IHNtQ291bnQudG9TdHJpbmcoKTsKICAgICAgICAgICAgICAgICBzbUNvdW50Kys7CiAgICAgICAgICAgICB9CisJCQkKKwkJCU1vdXNlLnJlZ2lzdGVyQ3Vyc29yKFNlbGVjdFRhYmxlLCBjcmVhdGVTZWxlY3RUYWJsZUN1cnNvcigpKTsKKwkJCU1vdXNlLnJlZ2lzdGVyQ3Vyc29yKFNlbGVjdFRhYmxlUm93LCBjcmVhdGVTZWxlY3RUYWJsZVJvd0N1cnNvcigpKTsKKwkJCU1vdXNlLnJlZ2lzdGVyQ3Vyc29yKFNlbGVjdFRhYmxlQ29sdW1uLCBjcmVhdGVTZWxlY3RUYWJsZUNvbHVtbkN1cnNvcigpKTsKICAgICAgICAgfQorCQkKICAgICAgICAgLyoqCiAgICAgICAgICAqIEBjb3B5IElTZWxlY3Rpb25NYW5hZ2VyI2dldFNlbGVjdGlvblN0YXRlKCkKICAgICAgICAgICogCkBAIC0yMTEsNyArNTMyLDEwIEBACiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0U2VsZWN0aW9uU3RhdGUoKTpTZWxlY3Rpb25TdGF0ZQogICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFNlbGVjdGlvblN0YXRlKF90ZXh0RmxvdywgYW5jaG9yTWFyay5wb3NpdGlvbiwgYWN0aXZlTWFyay5wb3NpdGlvbiwgcG9pbnRGb3JtYXQpOworCQkJaWYoc3ViTWFuYWdlcikKKwkJCQlyZXR1cm4gc3ViTWFuYWdlci5nZXRTZWxlY3Rpb25TdGF0ZSgpOworCQkJCisgICAgICAgICAgICByZXR1cm4gbmV3IFNlbGVjdGlvblN0YXRlKF90ZXh0RmxvdywgYW5jaG9yTWFyay5wb3NpdGlvbiwgYWN0aXZlTWFyay5wb3NpdGlvbiwgcG9pbnRGb3JtYXQsIF9jZWxsUmFuZ2UpOwogICAgICAgICB9CiAgICAgICAgICAgICAgICAgCiAgICAgICAgIC8qKgpAQCAtMjM4LDggKzU2Miw0NSBAQAogICAgICAgICAgKiBAbGFuZ3ZlcnNpb24gMy4wCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgZnVuY3Rpb24gaGFzU2VsZWN0aW9uKCk6Qm9vbGVhbgotICAgICAgICB7IHJldHVybiBhbmNob3JNYXJrLnBvc2l0aW9uICE9IC0xOyB9CisgICAgICAgIHsKKwkJCXJldHVybiBzZWxlY3Rpb25UeXBlID09IFNlbGVjdGlvblR5cGUuVEVYVDsKKwkJfQogCisJCS8qKgorCQkgKiAgQGNvcHkgSVNlbGVjdGlvbk1hbmFnZXIjaGFzQW55U2VsZWN0aW9uKCkKKwkJICogCisJCSAqIEBpbmNsdWRlRXhhbXBsZSBleGFtcGxlc1xTZWxlY3Rpb25NYW5hZ2VyX2hhc1NlbGVjdGlvbi5hcyAtbm9zd2YKKwkJICogCisJCSAqIEBwbGF5ZXJ2ZXJzaW9uIEZsYXNoIDEwCisJCSAqIEBwbGF5ZXJ2ZXJzaW9uIEFJUiAxLjUKKwkJICogQGxhbmd2ZXJzaW9uIDMuMAorCQkgKi8KKwkJcHVibGljIGZ1bmN0aW9uIGhhc0FueVNlbGVjdGlvbigpOkJvb2xlYW4KKwkJeworCQkJcmV0dXJuIHNlbGVjdGlvblR5cGUgIT0gU2VsZWN0aW9uVHlwZS5OT05FOworCQl9CisKKwkJLyoqCisJCSAqIEluZGljYXRlcyB0aGUgdHlwZSBvZiBzZWxlY3Rpb24uIAorCQkgKiAKKwkJICogPHA+VGhlIDxjb2RlPnNlbGVjdGlvblR5cGU8L2NvZGU+IGRlc2NyaWJlcyB0aGUga2luZCBvZiBzZWxlY3Rpb24uIAorCQkgKiBJdCBjYW4gZWl0aGVyIGJlIDxjb2RlPlNlbGVjdGlvblR5cGUuVEVYVDwvY29kZT4gb3IgPGNvZGU+U2VsZWN0aW9uVHlwZS5DRUxMUzwvY29kZT4KKwkJICogCisJCSAqIEBzZWUgZmxhc2h4LnRleHRMYXlvdXQuZWRpdC5TZWxlY3Rpb25UeXBlCisJCSAqIAorCQkgKiBAcGxheWVydmVyc2lvbiBGbGFzaCAxMAorCQkgKiBAcGxheWVydmVyc2lvbiBBSVIgMS41CisJCSAqIEBsYW5ndmVyc2lvbiAzLjAKKwkJICovCisJCXB1YmxpYyBmdW5jdGlvbiBnZXQgc2VsZWN0aW9uVHlwZSgpIDogU3RyaW5nCisJCXsKKwkJCWlmKGFuY2hvck1hcmsucG9zaXRpb24gIT0gLTEpCisJCQkJcmV0dXJuIFNlbGVjdGlvblR5cGUuVEVYVDsKKwkJCWVsc2UgaWYoYW5jaG9yQ2VsbFBvc2l0aW9uLmlzVmFsaWQoKSkKKwkJCQlyZXR1cm4gU2VsZWN0aW9uVHlwZS5DRUxMUzsKKwkJCQorCQkJcmV0dXJuIFNlbGVjdGlvblR5cGUuTk9ORTsKKwkJfQogICAgICAgICAvKiogCiAgICAgICAgICAqICBAY29weSBJU2VsZWN0aW9uTWFuYWdlciNpc1JhbmdlU2VsZWN0aW9uKCkKICAgICAgICAgICogCkBAIC0yNzcsNiArNjM4LDggQEAKICAgICAgICAgICAgICAgICAgICAgZmx1c2hQZW5kaW5nT3BlcmF0aW9ucygpOwogICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgIGNsZWFyKCk7CisJCQkJY2xlYXJDZWxsU2VsZWN0aW9ucygpOworCQkJCV9jZWxsUmFuZ2UgPSBudWxsOwogICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgIC8vIElmIHdlIHN3aXRjaCBpbnRvIHJlYWQtb25seSBtb2RlLCBtYWtlIHN1cmUgdGhlIGN1cnNvciBpc24ndCBzaG93aW5nIGEgdGV4dCBzZWxlY3Rpb24gSUJlYW0KICAgICAgICAgICAgICAgICBpZiAoIXZhbHVlKSAvLyBzZWUgV2F0c29uIDI2MzcxNjIKQEAgLTM0OCw3ICs3MTEsMjkgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBmb2N1c2VkU2VsZWN0aW9uRm9ybWF0OwogICAgICAgICAgfQotICAgICAgICAgCisKKwkJIC8qKgorCQkgICogIEBjb3B5IElTZWxlY3Rpb25NYW5hZ2VyI2N1cnJlbnRDZWxsU2VsZWN0aW9uRm9ybWF0CisJCSAgKiAKKwkJICAqIEBwbGF5ZXJ2ZXJzaW9uIEZsYXNoIDEwCisJCSAgKiBAcGxheWVydmVyc2lvbiBBSVIgMS41CisJCSAgKiBAbGFuZ3ZlcnNpb24gMy4wCisJCSAgKiAKKwkJICAqIEBzZWUgZmxhc2h4LnRleHRMYXlvdXQuZWRpdC5TZWxlY3Rpb25Gb3JtYXQKKwkJICAqLworCQkgcHVibGljIGZ1bmN0aW9uIGdldCBjdXJyZW50Q2VsbFNlbGVjdGlvbkZvcm1hdCgpOlNlbGVjdGlvbkZvcm1hdAorCQkgeyAKKwkJCSBpZiAoX3NlbEZvcm1hdFN0YXRlID09IFNlbGVjdGlvbkZvcm1hdFN0YXRlLlVORk9DVVNFRCkKKwkJCSB7CisJCQkJIHJldHVybiB1bmZvY3VzZWRDZWxsU2VsZWN0aW9uRm9ybWF0OworCQkJIH0KKwkJCSBlbHNlIGlmIChfc2VsRm9ybWF0U3RhdGUgPT0gU2VsZWN0aW9uRm9ybWF0U3RhdGUuSU5BQ1RJVkUpCisJCQkgeworCQkJCSByZXR1cm4gaW5hY3RpdmVDZWxsU2VsZWN0aW9uRm9ybWF0OworCQkJIH0KKwkJCSByZXR1cm4gZm9jdXNlZENlbGxTZWxlY3Rpb25Gb3JtYXQ7CisJCSB9CisKICAgICAgICAgLyoqCiAgICAgICAgICAqICBAY29weSBJU2VsZWN0aW9uTWFuYWdlciNmb2N1c2VkU2VsZWN0aW9uRm9ybWF0CiAgICAgICAgICAqIApAQCAtNDIwLDcgKzgwNSw3OSBAQAogICAgICAgICAgeyAKICAgICAgICAgICAgIHJldHVybiBfaW5hY3RpdmVTZWxlY3Rpb25Gb3JtYXQgPyBfaW5hY3RpdmVTZWxlY3Rpb25Gb3JtYXQgOiAoX3RleHRGbG93ID8gX3RleHRGbG93LmNvbmZpZ3VyYXRpb24uaW5hY3RpdmVTZWxlY3Rpb25Gb3JtYXQgOiBudWxsKTsKICAgICAgICAgIH0gICAgICAgCi0gICAgICAgICAKKworCQkgLyoqCisJCSAgKiAgQGNvcHkgSVNlbGVjdGlvbk1hbmFnZXIjZm9jdXNlZENlbGxTZWxlY3Rpb25Gb3JtYXQKKwkJICAqIAorCQkgICogQHBsYXllcnZlcnNpb24gRmxhc2ggMTAKKwkJICAqIEBwbGF5ZXJ2ZXJzaW9uIEFJUiAxLjUKKwkJICAqIEBsYW5ndmVyc2lvbiAzLjAKKwkJICAqIAorCQkgICogQHNlZSBmbGFzaHgudGV4dExheW91dC5lZGl0LlNlbGVjdGlvbkZvcm1hdAorCQkgICovCisJCSBwdWJsaWMgZnVuY3Rpb24gc2V0IGZvY3VzZWRDZWxsU2VsZWN0aW9uRm9ybWF0KHZhbDpTZWxlY3Rpb25Gb3JtYXQpOnZvaWQKKwkJIHsgCisJCQkgX2ZvY3VzZWRDZWxsU2VsZWN0aW9uRm9ybWF0ID0gdmFsOworCQkJIGlmICh0aGlzLl9zZWxGb3JtYXRTdGF0ZSA9PSBTZWxlY3Rpb25Gb3JtYXRTdGF0ZS5GT0NVU0VEKQorCQkJCSByZWZyZXNoU2VsZWN0aW9uKCk7CisJCSB9CisJCSAKKwkJIC8qKgorCQkgICogQHByaXZhdGUgLSBkb2NzIG9uIHNldHRlcgorCQkgICovCisJCSBwdWJsaWMgZnVuY3Rpb24gZ2V0IGZvY3VzZWRDZWxsU2VsZWN0aW9uRm9ybWF0KCk6U2VsZWN0aW9uRm9ybWF0CisJCSB7IAorCQkJIHJldHVybiBfZm9jdXNlZENlbGxTZWxlY3Rpb25Gb3JtYXQgPyBfZm9jdXNlZENlbGxTZWxlY3Rpb25Gb3JtYXQgOiAoX3RleHRGbG93ID8gX3RleHRGbG93LmNvbmZpZ3VyYXRpb24uZm9jdXNlZFNlbGVjdGlvbkZvcm1hdCA6IG51bGwpOworCQkgfSAgICAgICAKKwkJIAorCQkgLyoqCisJCSAgKiAgQGNvcHkgSVNlbGVjdGlvbk1hbmFnZXIjdW5mb2N1c2VkQ2VsbFNlbGVjdGlvbkZvcm1hdAorCQkgICogCisJCSAgKiBAcGxheWVydmVyc2lvbiBGbGFzaCAxMAorCQkgICogQHBsYXllcnZlcnNpb24gQUlSIDEuNQorCQkgICogQGxhbmd2ZXJzaW9uIDMuMAorCQkgICogCisJCSAgKiBAc2VlIGZsYXNoeC50ZXh0TGF5b3V0LmVkaXQuU2VsZWN0aW9uRm9ybWF0CisJCSAgKi8KKwkJIHB1YmxpYyBmdW5jdGlvbiBzZXQgdW5mb2N1c2VkQ2VsbFNlbGVjdGlvbkZvcm1hdCh2YWw6U2VsZWN0aW9uRm9ybWF0KTp2b2lkCisJCSB7IAorCQkJIF91bmZvY3VzZWRDZWxsU2VsZWN0aW9uRm9ybWF0ID0gdmFsOworCQkJIGlmICh0aGlzLl9zZWxGb3JtYXRTdGF0ZSA9PSBTZWxlY3Rpb25Gb3JtYXRTdGF0ZS5VTkZPQ1VTRUQpCisJCQkJIHJlZnJlc2hTZWxlY3Rpb24oKTsKKwkJIH0gICAgICAgICAgCisJCSAKKwkJIC8qKgorCQkgICogIEBwcml2YXRlIC0gZG9jcyBvbiBzZXR0ZXIKKwkJICAqLworCQkgcHVibGljIGZ1bmN0aW9uIGdldCB1bmZvY3VzZWRDZWxsU2VsZWN0aW9uRm9ybWF0KCk6U2VsZWN0aW9uRm9ybWF0CisJCSB7IAorCQkJIHJldHVybiBfdW5mb2N1c2VkQ2VsbFNlbGVjdGlvbkZvcm1hdCA/IF91bmZvY3VzZWRDZWxsU2VsZWN0aW9uRm9ybWF0IDogKF90ZXh0RmxvdyA/IF90ZXh0Rmxvdy5jb25maWd1cmF0aW9uLnVuZm9jdXNlZFNlbGVjdGlvbkZvcm1hdCA6IG51bGwpOworCQkgfQorCQkgCisJCSAvKioKKwkJICAqICBAY29weSBJU2VsZWN0aW9uTWFuYWdlciNpbmFjdGl2ZUNlbGxTZWxlY3Rpb25Gb3JtYXQKKwkJICAqIAorCQkgICogQHBsYXllcnZlcnNpb24gRmxhc2ggMTAKKwkJICAqIEBwbGF5ZXJ2ZXJzaW9uIEFJUiAxLjUKKwkJICAqIEBsYW5ndmVyc2lvbiAzLjAKKwkJICAqIAorCQkgICogQHNlZSBmbGFzaHgudGV4dExheW91dC5lZGl0LlNlbGVjdGlvbkZvcm1hdAorCQkgICovCisJCSBwdWJsaWMgZnVuY3Rpb24gc2V0IGluYWN0aXZlQ2VsbFNlbGVjdGlvbkZvcm1hdCh2YWw6U2VsZWN0aW9uRm9ybWF0KTp2b2lkCisJCSB7IAorCQkJIF9pbmFjdGl2ZUNlbGxTZWxlY3Rpb25Gb3JtYXQgPSB2YWw7CisJCQkgaWYgKHRoaXMuX3NlbEZvcm1hdFN0YXRlID09IFNlbGVjdGlvbkZvcm1hdFN0YXRlLklOQUNUSVZFKQorCQkJCSByZWZyZXNoU2VsZWN0aW9uKCk7CisJCSB9ICAgICAgICAgIAorCQkgCisJCSAvKioKKwkJICAqIEBwcml2YXRlIC0gZG9jcyBvbiBzZXR0ZXIKKwkJICAqLworCQkgcHVibGljIGZ1bmN0aW9uIGdldCBpbmFjdGl2ZUNlbGxTZWxlY3Rpb25Gb3JtYXQoKTpTZWxlY3Rpb25Gb3JtYXQKKwkJIHsgCisJCQkgcmV0dXJuIF9pbmFjdGl2ZUNlbGxTZWxlY3Rpb25Gb3JtYXQgPyBfaW5hY3RpdmVDZWxsU2VsZWN0aW9uRm9ybWF0IDogKF90ZXh0RmxvdyA/IF90ZXh0Rmxvdy5jb25maWd1cmF0aW9uLmluYWN0aXZlU2VsZWN0aW9uRm9ybWF0IDogbnVsbCk7CisJCSB9ICAgICAgIAorCQkgCiAgICAgICAgICAvKiogQHByaXZhdGUgLSByZXR1cm5zIHRoZSBzZWxlY3Rpb25Gb3JtYXRTdGF0ZS4gIEBzZWUgZmxhc2h4LnRleHRMYXlvdXQuZWRpdC5TZWxlY3Rpb25Gb3JtYXRTdGF0ZSAqLwogICAgICAgICAgdGxmX2ludGVybmFsIGZ1bmN0aW9uIGdldCBzZWxlY3Rpb25Gb3JtYXRTdGF0ZSgpOlN0cmluZwogICAgICAgICAgeyByZXR1cm4gX3NlbEZvcm1hdFN0YXRlOyB9CkBAIC01ODQsMTEgKzEwNDEsMTcgQEAKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBmdW5jdGlvbiBzZWxlY3RBbGwoKSA6IHZvaWQKICAgICAgICAgewotICAgICAgICAgICAgc2VsZWN0UmFuZ2UoMCwgaW50Lk1BWF9WQUxVRSk7CisJCQlpZihzdWJNYW5hZ2VyKQorCQkJCXN1Yk1hbmFnZXIuc2VsZWN0QWxsKCk7CisJCQllbHNlCisJCQl7CisJCQkJdmFyIGxhc3RTZWxlY3RhYmxlUG9zOmludCA9IChfdGV4dEZsb3cudGV4dExlbmd0aCA+IDApID8gX3RleHRGbG93LnRleHRMZW5ndGggLSAxIDogMDsKKwkJCQlzZWxlY3RSYW5nZSgwLCBsYXN0U2VsZWN0YWJsZVBvcyk7CisJCQl9CiAgICAgICAgIH0KICAgICAgICAgCiAgICAgICAgIC8qKiAKLSAgICAgICAgICogIEBjb3B5IElTZWxlY3Rpb25NYW5hZ2VyI3NlbGVjdFJhbmdlCisgICAgICAgICAqIEBjb3B5IElTZWxlY3Rpb25NYW5hZ2VyI3NlbGVjdFJhbmdlCiAgICAgICAgICAqIAogICAgICAgICAgKiBAaW5jbHVkZUV4YW1wbGUgZXhhbXBsZXNcU2VsZWN0aW9uTWFuYWdlcl9zZWxlY3RSYW5nZS5hcyAtbm9zd2YKICAgICAgICAgICogCkBAIC02MDEsMjIgKzEwNjQsNzYgQEAKICAgICAgICAgcHVibGljIGZ1bmN0aW9uIHNlbGVjdFJhbmdlKGFuY2hvclBvc2l0aW9uOmludCwgYWN0aXZlUG9zaXRpb246aW50KSA6IHZvaWQKICAgICAgICAgewogICAgICAgICAgICAgZmx1c2hQZW5kaW5nT3BlcmF0aW9ucygpOworCQkJCisJCQlpZihzdWJNYW5hZ2VyKQorCQkJCXN1Yk1hbmFnZXIuc2VsZWN0UmFuZ2UoLTEsLTEpOwogICAgICAgICAgICAgCiAgICAgICAgICAgICAvLyBhbmNob3IgYW5kIGFjdGl2ZSBjYW4gYmUgaW4gYW55IG9yZGVyCiAgICAgICAgICAgICAvLyBUT0RPOiByYW5nZSBjaGVjayBhbmQgY2xhbXAgYW5jaG9yLGFjdGl2ZQogICAgICAgICAgICAgaWYgKGFuY2hvclBvc2l0aW9uICE9IGFuY2hvck1hcmsucG9zaXRpb24gfHwgYWN0aXZlUG9zaXRpb24gIT0gYWN0aXZlTWFyay5wb3NpdGlvbikKICAgICAgICAgICAgIHsgICAKICAgICAgICAgICAgICAgICBjbGVhclNlbGVjdGlvblNoYXBlcygpOworCQkJCWNsZWFyQ2VsbFNlbGVjdGlvbnMoKTsKKwkJCQlfY2VsbFJhbmdlID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaW50ZXJuYWxTZXRTZWxlY3Rpb24oX3RleHRGbG93LCBhbmNob3JQb3NpdGlvbiwgYWN0aXZlUG9zaXRpb24pOworICAgICAgICAgICAgICAgIGludGVybmFsU2V0U2VsZWN0aW9uKF90ZXh0RmxvdywgYW5jaG9yUG9zaXRpb24sIGFjdGl2ZVBvc2l0aW9uLCBfcG9pbnRGb3JtYXQpOwogICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgIC8vIHNlbGVjdGlvbiBjaGFuZ2VkCi0gICAgICAgICAgICAgICAgc2VsZWN0aW9uQ2hhbmdlZCgpOyAgICAgCisgICAgICAgICAgICAgICAgc2VsZWN0aW9uQ2hhbmdlZCgpOwogICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgIGFsbG93T3BlcmF0aW9uTWVyZ2UgPSBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICAKKwkJCisJCS8qKiAKKwkJICogQGNvcHkgSVNlbGVjdGlvbk1hbmFnZXIjc2VsZWN0Rmlyc3RQb3NpdGlvbgorCQkgKiAKKwkJICogQHBsYXllcnZlcnNpb24gRmxhc2ggMTAKKwkJICogQHBsYXllcnZlcnNpb24gQUlSIDEuNQorCQkgKiBAbGFuZ3ZlcnNpb24gMy4wCisJCSAqIAorCQkgKiBAc2VlIGZsYXNoeC50ZXh0TGF5b3V0LmNvbXBvc2UuSUZsb3dDb21wb3NlcgorCQkgKi8KKwkJcHVibGljIGZ1bmN0aW9uIHNlbGVjdEZpcnN0UG9zaXRpb24oKTp2b2lkCisJCXsKKwkJCXNlbGVjdFJhbmdlKDAsIDApOworCQl9CisJCQorCQkvKiogCisJCSAqIEBjb3B5IElTZWxlY3Rpb25NYW5hZ2VyI3NlbGVjdExhc3RQb3NpdGlvbgorCQkgKiAKKwkJICogQHBsYXllcnZlcnNpb24gRmxhc2ggMTAKKwkJICogQHBsYXllcnZlcnNpb24gQUlSIDEuNQorCQkgKiBAbGFuZ3ZlcnNpb24gMy4wCisJCSAqIAorCQkgKiBAc2VlIGZsYXNoeC50ZXh0TGF5b3V0LmNvbXBvc2UuSUZsb3dDb21wb3NlcgorCQkgKi8KKwkJcHVibGljIGZ1bmN0aW9uIHNlbGVjdExhc3RQb3NpdGlvbigpOnZvaWQKKwkJeworCQkJc2VsZWN0UmFuZ2UoaW50Lk1BWF9WQUxVRSwgaW50Lk1BWF9WQUxVRSk7CisJCX0KKworCQkvKiogCisJCSAqIEBjb3B5IElTZWxlY3Rpb25NYW5hZ2VyI2Rlc2VsZWN0CisJCSAqIAorCQkgKiBAcGxheWVydmVyc2lvbiBGbGFzaCAxMAorCQkgKiBAcGxheWVydmVyc2lvbiBBSVIgMS41CisJCSAqIEBsYW5ndmVyc2lvbiAzLjAKKwkJICogCisJCSAqIEBzZWUgZmxhc2h4LnRleHRMYXlvdXQuY29tcG9zZS5JRmxvd0NvbXBvc2VyCisJCSAqLworCQlwdWJsaWMgZnVuY3Rpb24gZGVzZWxlY3QoKTp2b2lkCisJCXsKKwkJCWlmIChoYXNBbnlTZWxlY3Rpb24oKSkKKwkJCXsKKwkJCQljbGVhclNlbGVjdGlvblNoYXBlcygpOworCQkJCWNsZWFyQ2VsbFNlbGVjdGlvbnMoKTsKKwkJCQlhZGRTZWxlY3Rpb25TaGFwZXMoKTsKKwkJCX0KKwkJCXNlbGVjdFJhbmdlKC0xLC0xKTsKKwkJCV9jZWxsUmFuZ2UgPSBudWxsOworCQl9CisKICAgICAgICAgcHJpdmF0ZSBmdW5jdGlvbiBpbnRlcm5hbFNldFNlbGVjdGlvbihyb290OlRleHRGbG93LGFuY2hvclBvc2l0aW9uOmludCxhY3RpdmVQb3NpdGlvbjppbnQsZm9ybWF0OklUZXh0TGF5b3V0Rm9ybWF0ID0gbnVsbCkgOiB2b2lkCiAgICAgICAgIHsKICAgICAgICAgICAgIF90ZXh0RmxvdyA9IHJvb3Q7CkBAIC02MjcsNiArMTE0NCw4IEBACiAgICAgICAgICAgICAgICAgYW5jaG9yUG9zaXRpb24gPSAtMTsKICAgICAgICAgICAgICAgICBhY3RpdmVQb3NpdGlvbiA9IC0xOwogICAgICAgICAgICAgfQorCQkJZWxzZSBpZihzdWJNYW5hZ2VyKQorCQkJCXN1Yk1hbmFnZXIgPSBudWxsOwogICAgICAgICAgICAgCiAgICAgICAgICAgICB2YXIgbGFzdFNlbGVjdGFibGVQb3M6aW50ID0gKF90ZXh0Rmxvdy50ZXh0TGVuZ3RoID4gMCkgPyBfdGV4dEZsb3cudGV4dExlbmd0aCAtIDEgOiAwOwogICAgICAgICAgICAgCkBAIC02NDUsNyArMTE2NCw4IEBACiAgICAgICAgIC8vICB0cmFjZSgiU2VsZWN0aW9uICIsIGFuY2hvck1hcmssICJ0byIsIGFjdGl2ZU1hcmsucG9zaXRpb24pOwogICAgICAgICB9ICAgICAgIAogICAgICAgICAKLSAgICAgICAgLyoqIENsZWFyIGFueSBhY3RpdmUgc2VsZWN0aW9ucy4KKyAgICAgICAgLyoqIAorCQkgKiBDbGVhciBhbnkgYWN0aXZlIHNlbGVjdGlvbnMuCiAgICAgICAgICAqLwogICAgICAgICBwcml2YXRlIGZ1bmN0aW9uIGNsZWFyKCk6IHZvaWQKICAgICAgICAgewpAQCAtNjU5LDcgKzExNzksMzIgQEAKICAgICAgICAgICAgICAgICBhbGxvd09wZXJhdGlvbk1lcmdlID0gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgCisgICAgICAgIC8qKgorCQkgKiBDbGVhciBhbnkgY2VsbCBzZWxlY3Rpb25zCisJCSAqICovCisJCXByaXZhdGUgZnVuY3Rpb24gY2xlYXJDZWxsU2VsZWN0aW9ucygpOnZvaWQKKwkJeworCQkJdmFyIGJsb2NrczpWZWN0b3IuPFRleHRGbG93VGFibGVCbG9jaz47CisJCQl2YXIgYmxvY2s6VGV4dEZsb3dUYWJsZUJsb2NrOworCQkJdmFyIGNvbnRyb2xsZXI6Q29udGFpbmVyQ29udHJvbGxlcjsKKwkJCQorCQkJaWYgKF9jZWxsUmFuZ2UpIHsKKwkJCQlibG9ja3MgPSBfY2VsbFJhbmdlLnRhYmxlLmdldFRhYmxlQmxvY2tzSW5SYW5nZShfY2VsbFJhbmdlLmFuY2hvckNvb3JkaW5hdGVzLCBfY2VsbFJhbmdlLmFjdGl2ZUNvb3JkaW5hdGVzKTsKKwkJCQkKKwkJCQlmb3IgZWFjaCAoYmxvY2sgaW4gYmxvY2tzKSB7CisJCQkJCWlmIChjb250cm9sbGVyICE9IGJsb2NrLmNvbnRyb2xsZXIpIHsKKwkJCQkJCWJsb2NrLmNvbnRyb2xsZXIuY2xlYXJTZWxlY3Rpb25TaGFwZXMoKTsKKwkJCQkJfQorCQkJCQkKKwkJCQkJY29udHJvbGxlciA9IGJsb2NrLmNvbnRyb2xsZXI7CisJCQkJfQorCQkJCQorCQkJfQorCQkJaWYoYmxvY2spCisJCQkJYmxvY2suY29udHJvbGxlci5jbGVhclNlbGVjdGlvblNoYXBlcygpOworCQkJCisJCQkvL19jZWxsUmFuZ2UgPSBudWxsOworCQl9CiAgICAgICAgIHByaXZhdGUgZnVuY3Rpb24gYWRkU2VsZWN0aW9uU2hhcGVzKCk6dm9pZAogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoX3RleHRGbG93LmZsb3dDb21wb3NlcikKQEAgLTY3Nyw3ICsxMjIyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgX3RleHRGbG93LmZsb3dDb21wb3Nlci5nZXRDb250cm9sbGVyQXQoY29udGFpbmVySXRlcisrKS5hZGRTZWxlY3Rpb25TaGFwZXMoY3VycmVudFNlbGVjdGlvbkZvcm1hdCwgYWJzb2x1dGVTdGFydCwgYWJzb2x1dGVFbmQpOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSAKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgCkBAIC02OTMsMjIgKzEyMzgsMzkgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogIEBjb3B5IElTZWxlY3Rpb25NYW5hZ2VyI3JlZnJlc2hTZWxlY3Rpb24oKQotICAgICAgICAgKiAKLSAgICAgICAgICogQHBsYXllcnZlcnNpb24gRmxhc2ggMTAKLSAgICAgICAgICogQHBsYXllcnZlcnNpb24gQUlSIDEuNQotICAgICAgICAgKiBAbGFuZ3ZlcnNpb24gMy4wCi0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBmdW5jdGlvbiByZWZyZXNoU2VsZWN0aW9uKCk6IHZvaWQKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGhhc1NlbGVjdGlvbigpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNsZWFyU2VsZWN0aW9uU2hhcGVzKCk7Ci0gICAgICAgICAgICAgICAgYWRkU2VsZWN0aW9uU2hhcGVzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKwkJCisJCS8qKiAKKwkJICogIEBjb3B5IElTZWxlY3Rpb25NYW5hZ2VyI3JlZnJlc2hTZWxlY3Rpb24oKQorCQkgKiAKKwkJICogQHBsYXllcnZlcnNpb24gRmxhc2ggMTAKKwkJICogQHBsYXllcnZlcnNpb24gQUlSIDEuNQorCQkgKiBAbGFuZ3ZlcnNpb24gMy4wCisJCSAqLworCQlwdWJsaWMgZnVuY3Rpb24gcmVmcmVzaFNlbGVjdGlvbigpOiB2b2lkCisJCXsKKwkJCWlmIChoYXNBbnlTZWxlY3Rpb24oKSkKKwkJCXsKKwkJCQljbGVhclNlbGVjdGlvblNoYXBlcygpOworCQkJCWNsZWFyQ2VsbFNlbGVjdGlvbnMoKTsKKwkJCQlhZGRTZWxlY3Rpb25TaGFwZXMoKTsKKwkJCX0KKwkJfQorCQkKKwkJLyoqIAorCQkgKiAgQGNvcHkgSVNlbGVjdGlvbk1hbmFnZXIjY2xlYXJTZWxlY3Rpb24oKQorCQkgKiAKKwkJICogQHBsYXllcnZlcnNpb24gRmxhc2ggMTAKKwkJICogQHBsYXllcnZlcnNpb24gQUlSIDEuNQorCQkgKiBAbGFuZ3ZlcnNpb24gMy4wCisJCSAqLworCQlwdWJsaWMgZnVuY3Rpb24gY2xlYXJTZWxlY3Rpb24oKTogdm9pZAorCQl7CisJCQlpZiAoaGFzQW55U2VsZWN0aW9uKCkpCisJCQl7CisJCQkJY2xlYXJTZWxlY3Rpb25TaGFwZXMoKTsKKwkJCQljbGVhckNlbGxTZWxlY3Rpb25zKCk7CisJCQl9CisJCX0KICAgICAgICAgCiAgICAgICAgIC8qKiBWZXJpZmllcyB0aGF0IHRoZSBzZWxlY3Rpb24gaXMgaW4gYSBsZWdhbCBzdGF0ZS4gQHByaXZhdGUgKi8KICAgICAgICAgQ09ORklHOjpkZWJ1ZyBwdWJsaWMgZnVuY3Rpb24gZGVidWdDaGVja1NlbGVjdGlvbk1hbmFnZXIoKTppbnQKQEAgLTc0NSw3ICsxMzA3LDEyIEBACiAgICAgICAgICAgICAgICAgX3BvaW50Rm9ybWF0ID0gbnVsbDsKICAgICAgICAgICAgIAogICAgICAgICAgICAgaWYgKGRvRGlzcGF0Y2hFdmVudCAmJiBfdGV4dEZsb3cpCi0gICAgICAgICAgICAgICAgdGV4dEZsb3cuZGlzcGF0Y2hFdmVudChuZXcgU2VsZWN0aW9uRXZlbnQoU2VsZWN0aW9uRXZlbnQuU0VMRUNUSU9OX0NIQU5HRSwgZmFsc2UsIGZhbHNlLCBoYXNTZWxlY3Rpb24oKSA/IGdldFNlbGVjdGlvblN0YXRlKCkgOiBudWxsKSk7CisJCQl7CisJCQkJaWYodGV4dEZsb3cucGFyZW50RWxlbWVudCAmJiB0ZXh0Rmxvdy5wYXJlbnRFbGVtZW50LmdldFRleHRGbG93KCkpCisJCQkJCXRleHRGbG93LnBhcmVudEVsZW1lbnQuZ2V0VGV4dEZsb3coKS5kaXNwYXRjaEV2ZW50KG5ldyBTZWxlY3Rpb25FdmVudChTZWxlY3Rpb25FdmVudC5TRUxFQ1RJT05fQ0hBTkdFLCBmYWxzZSwgZmFsc2UsIGhhc1NlbGVjdGlvbigpID8gZ2V0U2VsZWN0aW9uU3RhdGUoKSA6IG51bGwpKTsKKwkJCQllbHNlCisJCQkJCXRleHRGbG93LmRpc3BhdGNoRXZlbnQobmV3IFNlbGVjdGlvbkV2ZW50KFNlbGVjdGlvbkV2ZW50LlNFTEVDVElPTl9DSEFOR0UsIGZhbHNlLCBmYWxzZSwgaGFzU2VsZWN0aW9uKCkgPyBnZXRTZWxlY3Rpb25TdGF0ZSgpIDogbnVsbCkpOworCQkJfQogICAgICAgICB9CiAKICAgICAgICAgLy8gVE9ETzogdGhpcyByb3V0aW5lIGNvdWxkIGJlIG11Y2ggbW9yZSBlZmZpY2llbnQgLSBpbnN0ZWFkIG9mIGl0ZXJhdGluZyBvdmVyIGFsbCBsaW5lcyBpbiB0aGUgVGV4dEZsb3cgaXQgc2hvdWxkIGl0ZXJhdGUgb3ZlciAKQEAgLTc3MSwxMSArMTMzOCwxNCBAQAogICAgICAgICAgICAgLy9nZXQgdGhlIG5lYXJlc3QgY29sdW1uIHNvIHdlIGNhbiBpZ25vcmUgbGluZXMgd2hpY2ggYXJlbid0IGluIHRoZSBjb2x1bW4gd2UncmUgbG9va2luZyBmb3IuCiAgICAgICAgICAgICAvL2lmIHdlIGRvbid0IGRvIHRoaXMsIHdlIHdvbid0IGJlIGFibGUgdG8gc2VsZWN0IGFjcm9zcyBjb2x1bW4gYm91bmRhcmllcy4KICAgICAgICAgICAgIHZhciBuZWFyZXN0Q29sSWR4OmludCA9IGxvY2F0ZU5lYXJlc3RDb2x1bW4oY29udHJvbGxlciwgbG9jYWxYLCBsb2NhbFksIHRleHRGbG93LmNvbXB1dGVkRm9ybWF0LmJsb2NrUHJvZ3Jlc3Npb24sdGV4dEZsb3cuY29tcHV0ZWRGb3JtYXQuZGlyZWN0aW9uKTsKKworCQkJdmFyIHByZXZMaW5lQm91bmRzOlJlY3RhbmdsZSA9IG51bGw7CisJCQl2YXIgcHJldmlvdXNMaW5lSW5kZXg6aW50ID0gLTE7CisKKwkJCS8qCiAJCQkvL0ZvciB0aGUgdGFibGUgZmVhdHVyZSwgd2UgYXJlIHRyeWluZyB0byBtYWtlIHN1cmUgaWYgdGhlIGN1cnJlbnQgcG9pbnQgaXMgaW4gdGhlIHRhYmxlIGFuZCB3aGljaCBjZWxsIGl0IGlzIGluCi0JCQl2YXIgbmVhcmVzdENlbGw6VGFibGVEYXRhQ2VsbEVsZW1lbnQgPSBsb2NhdGVOZWFyZXN0Q2VsbChjb250cm9sbGVyLCBsb2NhbFgsIGxvY2FsWSwgdGV4dEZsb3cuY29tcHV0ZWRGb3JtYXQuYmxvY2tQcm9ncmVzc2lvbix0ZXh0Rmxvdy5jb21wdXRlZEZvcm1hdC5kaXJlY3Rpb24pOworCQkJdmFyIG5lYXJlc3RDZWxsOlRhYmxlQ2VsbEVsZW1lbnQgPSBsb2NhdGVOZWFyZXN0Q2VsbChjb250cm9sbGVyLCBsb2NhbFgsIGxvY2FsWSwgdGV4dEZsb3cuY29tcHV0ZWRGb3JtYXQuYmxvY2tQcm9ncmVzc2lvbix0ZXh0Rmxvdy5jb21wdXRlZEZvcm1hdC5kaXJlY3Rpb24pOwogICAgICAgICAgICAgCi0gICAgICAgICAgICB2YXIgcHJldkxpbmVCb3VuZHM6UmVjdGFuZ2xlID0gbnVsbDsKLSAgICAgICAgICAgIHZhciBwcmV2aW91c0xpbmVJbmRleDppbnQgPSAtMTsKIAkJCQogCQkJaWYobmVhcmVzdENlbGwpCiAJCQl7CkBAIC03OTAsNyArMTM2MCw3IEBACiAJCQkJCXJldHVybiBjZWxsUGFyYS5nZXRBYnNvbHV0ZVN0YXJ0KCkgKyBjZWxsUGFyYS50ZXh0TGVuZ3RoIC0gMTsKIAkJCQl9CiAJCQl9Ci0gICAgICAgICAgICAKKyAgICAgICAgICAgICovCiAgICAgICAgICAgICB2YXIgbGFzdExpbmVJbmRleEluQ29sdW1uOmludCA9IC0xOwogICAgICAgICAgICAgCiAgICAgICAgICAgICAvLyBNYXRjaGluZyBUZXh0Rmxvd0xpbmUgYW5kIFRleHRMaW5lIC0gdGhleSBhcmUgbm90IG5lY2Vzc2FyaWx5IHZhbGlkCkBAIC04NDUsNiArMTQxNSw3IEBACiAgICAgICAgICAgICAgICAgICAgIC8vY3VycmVudCBsaW5lLC4gT3RoZXJ3aXNlLCBpZiB0aGUgY2xpY2sncyBwZXJwZW5kaWN1bGFyIGNvb3JkaW5hdGUgaXMgYmVsb3cgdGhlIG1pZCBwb2ludCBiZXR3ZWVuIHRoZSBjdXJyZW50CiAgICAgICAgICAgICAgICAgICAgIC8vbGluZSBvciBiZWxvdyBpdCwgdGhlbiB3ZSB3YW50IHRvIHVzZSB0aGUgbGluZSBiZWxvdyAoaWUgdGhlIHByZXZpb3VzIGxpbmUsIGJ1dCBsb2dpY2FsbHkgdGhlIG9uZSBhZnRlciB0aGUgY3VycmVudCkKICAgICAgICAgICAgICAgICAgICAgdmFyIGluUHJldkxpbmU6Qm9vbGVhbiA9IG1pZFBlcnBDb29yICE9IC0xICYmIChpc1RUQiA/IHBlcnBDb29yIDwgbWlkUGVycENvb3IgOiBwZXJwQ29vciA+IG1pZFBlcnBDb29yKTsKKwkJCQkJLyoKIAkJCQkJaWYocnRsaW5lLnBhcmFncmFwaC5pc0luVGFibGUoKSkKIAkJCQkJewogCQkJCQkJLy9pZiBydGxpbmUgaXMgdGhlIGxhc3QgbGluZSBvZiB0aGUgY2VsbCBhbmQgdGhlIGlzUHJldkxpbmUgaXMgdHJ1ZSwgZmluZCB0aGUgY2VsbCBvZiB0aGUgY29sdW1uIGluIG5leHQgcm93CkBAIC04NTIsMTAgKzE0MjMsMTAgQEAKIAkJCQkJCWlmICggaW5QcmV2TGluZSAmJiB0ZXN0SW5kZXggIT0gbGFzdExpbmVJbmRleEluQ29sdW1uICkKIAkJCQkJCXsKIAkJCQkJCQl2YXIgcnRQYXJhOlBhcmFncmFwaEVsZW1lbnQgPSBydGxpbmUucGFyYWdyYXBoOwotCQkJCQkJCXZhciBydENlbGw6VGFibGVEYXRhQ2VsbEVsZW1lbnQgPSBydFBhcmEuZ2V0VGFibGVEYXRhQ2VsbEVsZW1lbnQoKTsKKwkJCQkJCQl2YXIgcnRDZWxsOlRhYmxlQ2VsbEVsZW1lbnQgPSBydFBhcmEuZ2V0UGFyZW50Q2VsbEVsZW1lbnQoKTsKIAkJCQkJCQkvL2dldCB0aGUgbGFzdCBlbGVtZW50IG9mIHRoZSBjZWxsCiAJCQkJCQkJdmFyIGxhc3RFbGVtZW50OkZsb3dFbGVtZW50ID0gcnRDZWxsLmdldExhc3RMZWFmKCk7Ci0JCQkJCQkJdmFyIHJ0TGFzdFRiTGluZTpUZXh0Rmxvd0xpbmUgPSBsYXN0RWxlbWVudC5nZXRQYXJhZ3JhcGgoKS5nZXRUZXh0QmxvY2soKS5sYXN0TGluZS51c2VyRGF0YTsKKwkJCQkJCQl2YXIgcnRMYXN0VGJMaW5lOlRleHRGbG93TGluZSA9IGxhc3RFbGVtZW50ID8gbGFzdEVsZW1lbnQuZ2V0UGFyYWdyYXBoKCkuZ2V0VGV4dEJsb2NrKCkubGFzdExpbmUudXNlckRhdGEgOiBudWxsOwogCQkJCQkJCWlmKCBydGxpbmUgPT0gcnRMYXN0VGJMaW5lICkKIAkJCQkJCQl7CiAJCQkJCQkJCS8vdGVtcHJvcmF5IGNvZGVzLCBuZWVkIHRvIGJlIHVwZGF0ZWQgd2hlbiB0aGUgY29sdW1uIGFwaXMgYXJlIHJlYWR5CkBAIC04NjQsNyArMTQzNSw3IEBACiAJCQkJCQkJCXZhciBuZXh0Um93OlRhYmxlUm93RWxlbWVudCA9IHJ0Um93LmdldE5leHRTaWJsaW5nKCkgYXMgVGFibGVSb3dFbGVtZW50OwogCQkJCQkJCQlpZiAoIG5leHRSb3cgJiYgcnRDZWxsICkKIAkJCQkJCQkJewotCQkJCQkJCQkJdmFyIG5leHRDZWxsOlRhYmxlRGF0YUNlbGxFbGVtZW50ID0gbmV4dFJvdy5nZXRDaGlsZEF0KHJ0Q2VsbC5jb2xJbmRleCkgYXMgVGFibGVEYXRhQ2VsbEVsZW1lbnQ7CisJCQkJCQkJCQl2YXIgbmV4dENlbGw6VGFibGVDZWxsRWxlbWVudCA9IG5leHRSb3cuZ2V0Q2hpbGRBdChydENlbGwuY29sSW5kZXgpIGFzIFRhYmxlQ2VsbEVsZW1lbnQ7CiAJCQkJCQkJCQlsaW5lSW5kZXggPSB0ZXh0Rmxvdy5mbG93Q29tcG9zZXIuZmluZExpbmVJbmRleEF0UG9zaXRpb24obmV4dENlbGwuZ2V0Rmlyc3RMZWFmKCkuZ2V0UGFyYWdyYXBoKCkuZ2V0QWJzb2x1dGVTdGFydCgpKTsKIAkJCQkJCQkJfQogCQkJCQkJCX0KQEAgLTg3NSw2ICsxNDQ2LDcgQEAKIAkJCQkJCQlsaW5lSW5kZXggPSB0ZXN0SW5kZXg7CiAJCQkJCX0KIAkJCQkJZWxzZQorCQkJCQkqLwogICAgICAgICAgICAgICAgICAgICAJbGluZUluZGV4ID0gaW5QcmV2TGluZSAmJiB0ZXN0SW5kZXggIT0gbGFzdExpbmVJbmRleEluQ29sdW1uID8gdGVzdEluZGV4KzEgOiB0ZXN0SW5kZXg7CiAJCQkJCWJyZWFrOwogICAgICAgICAgICAgICAgIH0KQEAgLTg5NSw3OSArMTQ2Nyw4NyBAQAogICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgLy9HZXQgYSB2YWxpZCB0ZXh0TGluZSAtLSBjaGVjayB0byBtYWtlIHN1cmUgbGluZSBpcyB2YWxpZCwgcmVnZW5lcmF0ZSBpZiBuZWNlc3NhcnksIG1ha2Ugc3VyZSBpdCBoYXMgY29ycmVjdCBjb250YWluZXIgcmVsYXRpdmUgY29vcmRpbmF0ZXMKICAgICAgICAgICAgIHZhciB0ZXh0Rmxvd0xpbmU6VGV4dEZsb3dMaW5lID0gdGV4dEZsb3cuZmxvd0NvbXBvc2VyLmdldExpbmVBdChsaW5lSW5kZXgpOwotICAgICAgICAgICAgdmFyIHRleHRMaW5lOlRleHRMaW5lID0gdGV4dEZsb3dMaW5lLmdldFRleHRMaW5lKHRydWUpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBhZGp1c3QgbG9jYWxYLGxvY2FsWSB0byBiZSByZWxhdGl2ZSB0byB0aGUgdGV4dExpbmUuICAKLSAgICAgICAgICAgIC8vIENhbid0IHVzZSBsb2NhbFRvR2xvYmFsL2dsb2JhbFRvTG9jYWwgYmVjYXVzZSB0ZXh0TGluZSBtYXkgbm90IGJlIG9uIHRoZSBkaXNwbGF5IGxpc3QgZHVlIHRvIHZpcnR1YWxpemF0aW9uCi0gICAgICAgICAgICAvLyB3ZSBtYXkgbmVlZCB0byBicmluZyB0aGlzIGJhY2sgaWYgdGV4dGxpbmUncyBjYW4gYmUgcm90YXRlZCBvciBwbGFjZWQgYnkgYW55IG1lY2hhbmlzbSBvdGhlciB0aGFuIGEgdHJhbnNsYXRpb24KLSAgICAgICAgICAgIC8vIGJ1dCB0aGVuIHdlJ2xsIG5lZWQgdG8gcHJvdmlzaW9uYWxseSBwbGFjZSBhIHZpcnR1YWxpemVkIFRleHRMaW5lIGluIGl0cyBwYXJlbnQgY29udGFpbmVyCi0gICAgICAgICAgICBsb2NhbFggLT0gdGV4dExpbmUueDsKLSAgICAgICAgICAgIGxvY2FsWSAtPSB0ZXh0TGluZS55OwotICAgICAgICAgICAgLyogdmFyIGxvY2FsUG9pbnQ6UG9pbnQgPSBEaXNwbGF5T2JqZWN0KGNvbnRyb2xsZXIuY29udGFpbmVyKS5sb2NhbFRvR2xvYmFsKG5ldyBQb2ludChsb2NhbFgsbG9jYWxZKSk7Ci0gICAgICAgICAgICBsb2NhbFBvaW50ID0gdGV4dExpbmUuZ2xvYmFsVG9Mb2NhbChsb2NhbFBvaW50KTsKLSAgICAgICAgICAgIGxvY2FsWCA9IGxvY2FsUG9pbnQueDsKLSAgICAgICAgICAgIGxvY2FsWSA9IGxvY2FsUG9pbnQueTsgKi8KLSAgICAgICAgICAgIAotICAgICAgICAgICAgCi0gICAgICAgICAgICB2YXIgc3RhcnRPbk5leHRMaW5lSWZOZWNlc3Nhcnk6Qm9vbGVhbiA9IGZhbHNlOwotICAgICAgICAgICAgCi0gICAgICAgICAgICB2YXIgbGFzdEF0b206aW50ID0gLTE7Ci0gICAgICAgICAgICBpZiAoaXNEaXJlY3Rpb25SVEwpIHsKLSAgICAgICAgICAgICAgICBsYXN0QXRvbSA9IHRleHRMaW5lLmF0b21Db3VudCAtIDE7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmICgodGV4dEZsb3dMaW5lLmFic29sdXRlU3RhcnQgKyB0ZXh0Rmxvd0xpbmUudGV4dExlbmd0aCkgPj0gdGV4dEZsb3dMaW5lLnBhcmFncmFwaC5nZXRBYnNvbHV0ZVN0YXJ0KCkgKyB0ZXh0Rmxvd0xpbmUucGFyYWdyYXBoLnRleHRMZW5ndGgpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRleHRMaW5lLmF0b21Db3VudCA+IDEpIGxhc3RBdG9tID0gdGV4dExpbmUuYXRvbUNvdW50IC0gMjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB2YXIgbGFzdExpbmVQb3NJblBhcjppbnQgPSB0ZXh0Rmxvd0xpbmUuYWJzb2x1dGVTdGFydCArIHRleHRGbG93TGluZS50ZXh0TGVuZ3RoIC0gMTsKLSAgICAgICAgICAgICAgICAgICAgdmFyIGxhc3RDaGFyOlN0cmluZyA9IHRleHRMaW5lLnRleHRCbG9jay5jb250ZW50LnJhd1RleHQuY2hhckF0KGxhc3RMaW5lUG9zSW5QYXIpOwotICAgICAgICAgICAgICAgICAgICBpZiAobGFzdENoYXIgPT0gIiAiKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGV4dExpbmUuYXRvbUNvdW50ID4gMSkgbGFzdEF0b20gPSB0ZXh0TGluZS5hdG9tQ291bnQgLSAyOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRPbk5leHRMaW5lSWZOZWNlc3NhcnkgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRleHRMaW5lLmF0b21Db3VudCA+IDApIGxhc3RBdG9tID0gdGV4dExpbmUuYXRvbUNvdW50IC0gMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHZhciBsYXN0QXRvbVJlY3Q6UmVjdGFuZ2xlID0gKGxhc3RBdG9tID4gMCkgPyB0ZXh0TGluZS5nZXRBdG9tQm91bmRzKGxhc3RBdG9tKSA6IG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIGlmICghaXNUVEIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGxvY2FsWCA8IDApCi0gICAgICAgICAgICAgICAgICAgIGxvY2FsWCA9IDA7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAobG9jYWxYID4gKGxhc3RBdG9tUmVjdC54ICsgbGFzdEF0b21SZWN0LndpZHRoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdGFydE9uTmV4dExpbmVJZk5lY2Vzc2FyeSkgCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGV4dEZsb3dMaW5lLmFic29sdXRlU3RhcnQgKyB0ZXh0Rmxvd0xpbmUudGV4dExlbmd0aCAtIDE7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsYXN0QXRvbVJlY3QueCArIGxhc3RBdG9tUmVjdC53aWR0aCA+IDApCi0gICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFggPSBsYXN0QXRvbVJlY3QueCArIGxhc3RBdG9tUmVjdC53aWR0aDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7ICAgCi0gICAgICAgICAgICAgICAgaWYgKGxvY2FsWSA8IDApIAotICAgICAgICAgICAgICAgICAgICBsb2NhbFkgPSAwOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKGxvY2FsWSA+IChsYXN0QXRvbVJlY3QueSArIGxhc3RBdG9tUmVjdC5oZWlnaHQpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0T25OZXh0TGluZUlmTmVjZXNzYXJ5KSAKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0ZXh0Rmxvd0xpbmUuYWJzb2x1dGVTdGFydCArIHRleHRGbG93TGluZS50ZXh0TGVuZ3RoIC0gMTsgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmIChsYXN0QXRvbVJlY3QueSArIGxhc3RBdG9tUmVjdC5oZWlnaHQgPiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxZID0gbGFzdEF0b21SZWN0LnkgKyBsYXN0QXRvbVJlY3QuaGVpZ2h0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotCQkJcmVzdWx0ID0gY29tcHV0ZVNlbGVjdGlvbkluZGV4SW5MaW5lKHRleHRGbG93LCB0ZXh0TGluZSwgbG9jYWxYLCBsb2NhbFkpOworCQkJaWYodGV4dEZsb3dMaW5lIGlzIFRleHRGbG93VGFibGVCbG9jaykKKwkJCXsKKwkJCQlyZXN1bHQgPSBUZXh0Rmxvd1RhYmxlQmxvY2sodGV4dEZsb3dMaW5lKS5hYnNvbHV0ZVN0YXJ0OworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXZhciB0ZXh0TGluZTpUZXh0TGluZSA9IHRleHRGbG93TGluZS5nZXRUZXh0TGluZSh0cnVlKTsKKwkJCQkKKwkJCQkvLyBhZGp1c3QgbG9jYWxYLGxvY2FsWSB0byBiZSByZWxhdGl2ZSB0byB0aGUgdGV4dExpbmUuICAKKwkJCQkvLyBDYW4ndCB1c2UgbG9jYWxUb0dsb2JhbC9nbG9iYWxUb0xvY2FsIGJlY2F1c2UgdGV4dExpbmUgbWF5IG5vdCBiZSBvbiB0aGUgZGlzcGxheSBsaXN0IGR1ZSB0byB2aXJ0dWFsaXphdGlvbgorCQkJCS8vIHdlIG1heSBuZWVkIHRvIGJyaW5nIHRoaXMgYmFjayBpZiB0ZXh0bGluZSdzIGNhbiBiZSByb3RhdGVkIG9yIHBsYWNlZCBieSBhbnkgbWVjaGFuaXNtIG90aGVyIHRoYW4gYSB0cmFuc2xhdGlvbgorCQkJCS8vIGJ1dCB0aGVuIHdlJ2xsIG5lZWQgdG8gcHJvdmlzaW9uYWxseSBwbGFjZSBhIHZpcnR1YWxpemVkIFRleHRMaW5lIGluIGl0cyBwYXJlbnQgY29udGFpbmVyCisJCQkJbG9jYWxYIC09IHRleHRMaW5lLng7CisJCQkJbG9jYWxZIC09IHRleHRMaW5lLnk7CisJCQkJLyogdmFyIGxvY2FsUG9pbnQ6UG9pbnQgPSBEaXNwbGF5T2JqZWN0KGNvbnRyb2xsZXIuY29udGFpbmVyKS5sb2NhbFRvR2xvYmFsKG5ldyBQb2ludChsb2NhbFgsbG9jYWxZKSk7CisJCQkJbG9jYWxQb2ludCA9IHRleHRMaW5lLmdsb2JhbFRvTG9jYWwobG9jYWxQb2ludCk7CisJCQkJbG9jYWxYID0gbG9jYWxQb2ludC54OworCQkJCWxvY2FsWSA9IGxvY2FsUG9pbnQueTsgKi8KKwkJCQkKKwkJCQkKKwkJCQl2YXIgc3RhcnRPbk5leHRMaW5lSWZOZWNlc3Nhcnk6Qm9vbGVhbiA9IGZhbHNlOworCQkJCQorCQkJCXZhciBsYXN0QXRvbTppbnQgPSAtMTsKKwkJCQlpZiAoaXNEaXJlY3Rpb25SVEwpIHsKKwkJCQkJbGFzdEF0b20gPSB0ZXh0TGluZS5hdG9tQ291bnQgLSAxOworCQkJCX0gZWxzZSB7CisJCQkJCWlmICgodGV4dEZsb3dMaW5lLmFic29sdXRlU3RhcnQgKyB0ZXh0Rmxvd0xpbmUudGV4dExlbmd0aCkgPj0gdGV4dEZsb3dMaW5lLnBhcmFncmFwaC5nZXRBYnNvbHV0ZVN0YXJ0KCkgKyB0ZXh0Rmxvd0xpbmUucGFyYWdyYXBoLnRleHRMZW5ndGgpIHsKKwkJCQkJCWlmICh0ZXh0TGluZS5hdG9tQ291bnQgPiAxKSBsYXN0QXRvbSA9IHRleHRMaW5lLmF0b21Db3VudCAtIDI7CisJCQkJCX0gZWxzZSB7CisJCQkJCQl2YXIgbGFzdExpbmVQb3NJblBhcjppbnQgPSB0ZXh0Rmxvd0xpbmUuYWJzb2x1dGVTdGFydCArIHRleHRGbG93TGluZS50ZXh0TGVuZ3RoIC0gMTsKKwkJCQkJCXZhciBsYXN0Q2hhcjpTdHJpbmcgPSB0ZXh0TGluZS50ZXh0QmxvY2suY29udGVudC5yYXdUZXh0LmNoYXJBdChsYXN0TGluZVBvc0luUGFyKTsKKwkJCQkJCWlmIChsYXN0Q2hhciA9PSAiICIpIHsKKwkJCQkJCQlpZiAodGV4dExpbmUuYXRvbUNvdW50ID4gMSkgbGFzdEF0b20gPSB0ZXh0TGluZS5hdG9tQ291bnQgLSAyOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlzdGFydE9uTmV4dExpbmVJZk5lY2Vzc2FyeSA9IHRydWU7CisJCQkJCQkJaWYgKHRleHRMaW5lLmF0b21Db3VudCA+IDApIGxhc3RBdG9tID0gdGV4dExpbmUuYXRvbUNvdW50IC0gMTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQl2YXIgbGFzdEF0b21SZWN0OlJlY3RhbmdsZSA9IChsYXN0QXRvbSA+IDApID8gdGV4dExpbmUuZ2V0QXRvbUJvdW5kcyhsYXN0QXRvbSkgOiBuZXcgUmVjdGFuZ2xlKDAsIDAsIDAsIDApOworCQkJCQorCQkJCWlmICghaXNUVEIpCisJCQkJeworCQkJCQlpZiAobG9jYWxYIDwgMCkKKwkJCQkJCWxvY2FsWCA9IDA7CisJCQkJCWVsc2UgaWYgKGxvY2FsWCA+IChsYXN0QXRvbVJlY3QueCArIGxhc3RBdG9tUmVjdC53aWR0aCkpCisJCQkJCXsKKwkJCQkJCWlmIChzdGFydE9uTmV4dExpbmVJZk5lY2Vzc2FyeSkgCisJCQkJCQkJcmV0dXJuIHRleHRGbG93TGluZS5hYnNvbHV0ZVN0YXJ0ICsgdGV4dEZsb3dMaW5lLnRleHRMZW5ndGggLSAxOworCQkJCQkJaWYgKGxhc3RBdG9tUmVjdC54ICsgbGFzdEF0b21SZWN0LndpZHRoID4gMCkKKwkJCQkJCQlsb2NhbFggPSBsYXN0QXRvbVJlY3QueCArIGxhc3RBdG9tUmVjdC53aWR0aDsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlCisJCQkJeyAgIAorCQkJCQlpZiAobG9jYWxZIDwgMCkgCisJCQkJCQlsb2NhbFkgPSAwOworCQkJCQllbHNlIGlmIChsb2NhbFkgPiAobGFzdEF0b21SZWN0LnkgKyBsYXN0QXRvbVJlY3QuaGVpZ2h0KSkKKwkJCQkJeworCQkJCQkJaWYgKHN0YXJ0T25OZXh0TGluZUlmTmVjZXNzYXJ5KSAKKwkJCQkJCQlyZXR1cm4gdGV4dEZsb3dMaW5lLmFic29sdXRlU3RhcnQgKyB0ZXh0Rmxvd0xpbmUudGV4dExlbmd0aCAtIDE7ICAgIAorCQkJCQkJaWYgKGxhc3RBdG9tUmVjdC55ICsgbGFzdEF0b21SZWN0LmhlaWdodCA+IDApCisJCQkJCQkJbG9jYWxZID0gbGFzdEF0b21SZWN0LnkgKyBsYXN0QXRvbVJlY3QuaGVpZ2h0OworCQkJCQl9CisJCQkJfQorCQkJCQorCQkJCXJlc3VsdCA9IGNvbXB1dGVTZWxlY3Rpb25JbmRleEluTGluZSh0ZXh0RmxvdywgdGV4dExpbmUsIGxvY2FsWCwgbG9jYWxZKTsKKwkJCX0KKwogICAgICAgICAgICAgLy8gdHJhY2UoImNvbXB1dGVTZWxlY3Rpb25JbmRleEluQ29udGFpbmVyOigiLG9yaWdYLG9yaWdZLCIpIix0ZXh0Rmxvdy5mbG93Q29tcG9zZXIuZ2V0Q29udHJvbGxlckluZGV4KGNvbnRyb2xsZXIpLnRvU3RyaW5nKCksbGluZUluZGV4LnRvU3RyaW5nKCkscmVzdWx0LnRvU3RyaW5nKCkpOwogICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCAhPSAtMSA/IHJlc3VsdCA6IGZpcnN0Q2hhclZpc2libGUgKyBsZW5ndGg7ICAgCiAgICAgICAgIH0KLQkJCi0JCXN0YXRpYyBwcml2YXRlIGZ1bmN0aW9uIGxvY2F0ZU5lYXJlc3RDZWxsKGNvbnRhaW5lcjpDb250YWluZXJDb250cm9sbGVyLCBsb2NhbFg6TnVtYmVyLCBsb2NhbFk6TnVtYmVyLCB3bTpTdHJpbmcsIGRpcmVjdGlvbjpTdHJpbmcpOlRhYmxlRGF0YUNlbGxFbGVtZW50CisJCS8qCisJCXN0YXRpYyBwcml2YXRlIGZ1bmN0aW9uIGxvY2F0ZU5lYXJlc3RDZWxsKGNvbnRhaW5lcjpDb250YWluZXJDb250cm9sbGVyLCBsb2NhbFg6TnVtYmVyLCBsb2NhbFk6TnVtYmVyLCB3bTpTdHJpbmcsIGRpcmVjdGlvbjpTdHJpbmcpOlRhYmxlQ2VsbEVsZW1lbnQKIAkJewogCQkJdmFyIGNlbGxJZHg6aW50ID0gMDsKIAkJCS8vaWYgd2Ugb25seSBoYXZlIDEgY29sdW1uLCBubyBuZWVkIHRvIHBlcmZvcm0gY2FsY3VsYXRpb24uLi4KIAkJCXZhciBjb2x1bW5TdGF0ZTpDb2x1bW5TdGF0ZSA9IGNvbnRhaW5lci5jb2x1bW5TdGF0ZTsKIAkJCQogCQkJdmFyIGlzRm91bmQ6Qm9vbGVhbiA9IGZhbHNlOwotCQkJdmFyIGN1ckNlbGw6VGFibGVEYXRhQ2VsbEVsZW1lbnQgPSBudWxsOworCQkJdmFyIGN1ckNlbGw6VGFibGVDZWxsRWxlbWVudCA9IG51bGw7CiAJCQkKIAkJCS8vd2UgbmVlZCB0byBjb21wYXJlIHRoZSBjdXJyZW50IGNvbHVtbiB0byB0aGUgbmV4dENvbG1uCiAJCQl3aGlsZShjZWxsSWR4IDwgY29sdW1uU3RhdGUuY2VsbENvdW50IC0gMSkKQEAgLTk4NCw3ICsxNTY0LDcgQEAKIAkJCX0KIAkJCXJldHVybiBpc0ZvdW5kPyBjdXJDZWxsIDogbnVsbDsKIAkJfQotICAgICAgICAKKyAgICAgICAgKi8KICAgICAgICAgc3RhdGljIHByaXZhdGUgZnVuY3Rpb24gbG9jYXRlTmVhcmVzdENvbHVtbihjb250YWluZXI6Q29udGFpbmVyQ29udHJvbGxlciwgbG9jYWxYOk51bWJlciwgbG9jYWxZOk51bWJlciwgd206U3RyaW5nLCBkaXJlY3Rpb246U3RyaW5nKTppbnQKICAgICAgICAgewogICAgICAgICAgICAgdmFyIGNvbElkeDppbnQgPSAwOwpAQCAtMTE0MSw5ICsxNzIxLDggQEAKICAgICAgICAgICAgIGVsc2UgIC8vIExlZnQgdG8gcmlnaHQgY2FzZSwgcmlnaHQgaXMgImVuZCIgdW5pY29kZQogICAgICAgICAgICAgICAgIHBhcmFTZWxlY3Rpb25JZHggPSBsZWFuUmlnaHQgPyB0ZXh0TGluZS5nZXRBdG9tVGV4dEJsb2NrRW5kSW5kZXgoZWxlbUlkeCkgOiB0ZXh0TGluZS5nZXRBdG9tVGV4dEJsb2NrQmVnaW5JbmRleChlbGVtSWR4KTsKIAotICAgICAgICAgICAgLy93ZSBhZ2FpbiBuZWVkIHRvIGRvIHNvbWUgZml4dXAgaGVyZS4gIFVuZm9ydHVuYXRlbHksIHdlIGRvbid0IGhhdmUgdGhlIGluZGV4IGludG8gdGhlIHBhcmFncmFwaCB1bnRpbAotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gcnRsaW5lLnBhcmFncmFwaC5nZXRBYnNvbHV0ZVN0YXJ0KCkgKyBwYXJhU2VsZWN0aW9uSWR4OworCQkJLy93ZSBhZ2FpbiBuZWVkIHRvIGRvIHNvbWUgZml4dXAgaGVyZS4gIFVuZm9ydHVuYXRlbHksIHdlIGRvbid0IGhhdmUgdGhlIGluZGV4IGludG8gdGhlIHBhcmFncmFwaCB1bnRpbAorICAgICAgICAgICAgcmV0dXJuIHJ0bGluZS5wYXJhZ3JhcGguZ2V0VGV4dEJsb2NrQWJzb2x1dGVTdGFydCh0ZXh0TGluZS50ZXh0QmxvY2spICsgcGFyYVNlbGVjdGlvbklkeDsKICAgICAgICAgfQogICAgICAgICAKICAgICAgICAgc3RhdGljIHByaXZhdGUgZnVuY3Rpb24gY2hlY2tGb3JEaXNwbGF5ZWQoY29udGFpbmVyOkRpc3BsYXlPYmplY3QpOkJvb2xlYW4KQEAgLTExNjQsNiArMTc0MywxNDIgQEAKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgICAvLyBub3Qgb24gdGhlIHN0YWdlCiAKICAgICAgICAgfQorCQkvKiogQHByaXZhdGUgLSBmaW5kIGEgY29udHJvbGxlciBhbmQgYWRqdXN0cyB0aGUgeCBhbmQgeSB2YWx1ZXMgb2YgbG9jYWxQb2ludCBpZiBuZWNlc3NhcnkgKi8KKwkJcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gZmluZENvbnRyb2xsZXIodGV4dEZsb3c6VGV4dEZsb3csIHRhcmdldDpPYmplY3QsIGN1cnJlbnRUYXJnZXQ6T2JqZWN0LCBsb2NhbFBvaW50OlBvaW50KTpDb250YWluZXJDb250cm9sbGVyCisJCXsKKwkJCXZhciBsb2NhbFg6TnVtYmVyID0gbG9jYWxQb2ludC54OworCQkJdmFyIGxvY2FsWTpOdW1iZXIgPSBsb2NhbFBvaW50Lnk7CisJCQl2YXIgY29udHJvbGxlcjpDb250YWluZXJDb250cm9sbGVyOworCQkJdmFyIGNvbnRhaW5lclBvaW50OlBvaW50OyAvLyBzY3JhdGNoCisJCQkKKwkJCXZhciBnbG9iYWxQb2ludDpQb2ludCA9IERpc3BsYXlPYmplY3QodGFyZ2V0KS5sb2NhbFRvR2xvYmFsKG5ldyBQb2ludChsb2NhbFgsIGxvY2FsWSkpOworCisJCQlmb3IgKHZhciBpZHg6aW50ID0gMDsgaWR4IDwgdGV4dEZsb3cuZmxvd0NvbXBvc2VyLm51bUNvbnRyb2xsZXJzOyBpZHgrKykKKwkJCXsKKwkJCQl2YXIgdGVzdENvbnRyb2xsZXI6Q29udGFpbmVyQ29udHJvbGxlciA9IHRleHRGbG93LmZsb3dDb21wb3Nlci5nZXRDb250cm9sbGVyQXQoaWR4KTsgCisJCQkJaWYgKHRlc3RDb250cm9sbGVyLmNvbnRhaW5lciA9PSB0YXJnZXQgfHwgdGVzdENvbnRyb2xsZXIuY29udGFpbmVyID09IGN1cnJlbnRUYXJnZXQpCisJCQkJeworCQkJCQljb250cm9sbGVyID0gdGVzdENvbnRyb2xsZXI7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWlmIChjb250cm9sbGVyKQorCQkJeyAgIAorCQkJCWlmICh0YXJnZXQgIT0gY29udHJvbGxlci5jb250YWluZXIpCisJCQkJeworCQkJCQljb250YWluZXJQb2ludCA9IERpc3BsYXlPYmplY3QoY29udHJvbGxlci5jb250YWluZXIpLmdsb2JhbFRvTG9jYWwoZ2xvYmFsUG9pbnQpOworCQkJCQlsb2NhbFBvaW50LnggPSBjb250YWluZXJQb2ludC54OworCQkJCQlsb2NhbFBvaW50LnkgPSBjb250YWluZXJQb2ludC55OworCQkJCX0KKwkJCQlyZXR1cm4gY29udHJvbGxlcjsgICAgICAgICAKKwkJCX0gCisJCQkKKwkJCS8vdGhlIHBvaW50IGlzIHNvbWVwbGFjZSBlbHNlIG9uIHN0YWdlLiAgTWFwIHRoZSB0YXJnZXQgCisJCQkvL3RvIHRoZSB0ZXh0Rmxvdy5jb250YWluZXIuCisJCQlDT05GSUc6OmRlYnVnIHsgYXNzZXJ0KHRleHRGbG93LmZsb3dDb21wb3NlciAmJiB0ZXh0Rmxvdy5mbG93Q29tcG9zZXIubnVtQ29udHJvbGxlcnMsImZpbmRDb250cm9sbGVyOiBpbnZhbGlkIHRleHRGbG93Iik7IH0KKwkJCQorCQkJCisJCQkKKwkJCS8vIHJlc3VsdCBvZiB0aGUgc2VhcmNoCisJCQl2YXIgY29udHJvbGxlckNhbmRpZGF0ZTpDb250YWluZXJDb250cm9sbGVyID0gbnVsbDsKKwkJCXZhciBjYW5kaWRhdGVMb2NhbFg6TnVtYmVyOworCQkJdmFyIGNhbmRpZGF0ZUxvY2FsWTpOdW1iZXI7CisJCQl2YXIgcmVsRGlzdGFuY2U6TnVtYmVyID0gTnVtYmVyLk1BWF9WQUxVRTsKKwkJCQorCQkJZm9yICh2YXIgY29udGFpbmVySW5kZXg6aW50ID0gMDsgY29udGFpbmVySW5kZXggPCB0ZXh0Rmxvdy5mbG93Q29tcG9zZXIubnVtQ29udHJvbGxlcnM7IGNvbnRhaW5lckluZGV4KyspCisJCQl7CisJCQkJdmFyIGN1ckNvbnRhaW5lckNvbnRyb2xsZXI6Q29udGFpbmVyQ29udHJvbGxlciA9IHRleHRGbG93LmZsb3dDb21wb3Nlci5nZXRDb250cm9sbGVyQXQoY29udGFpbmVySW5kZXgpOworCQkJCQorCQkJCS8vIGRpc3BsYXllZD8/CisJCQkJaWYgKCFjaGVja0ZvckRpc3BsYXllZChjdXJDb250YWluZXJDb250cm9sbGVyLmNvbnRhaW5lciBhcyBEaXNwbGF5T2JqZWN0KSkKKwkJCQkJY29udGludWU7CisJCQkJCisJCQkJLy8gaGFuZGxlIG1lYXN1cmVkIGNvbnRhaW5lcnM/PworCQkJCXZhciBib3VuZHM6UmVjdGFuZ2xlID0gY3VyQ29udGFpbmVyQ29udHJvbGxlci5nZXRDb250ZW50Qm91bmRzKCk7CisJCQkJdmFyIGNvbnRhaW5lcldpZHRoOk51bWJlciA9IGlzTmFOKGN1ckNvbnRhaW5lckNvbnRyb2xsZXIuY29tcG9zaXRpb25XaWR0aCkgPyBjdXJDb250YWluZXJDb250cm9sbGVyLmdldFRvdGFsUGFkZGluZ0xlZnQoKStib3VuZHMud2lkdGggOiBjdXJDb250YWluZXJDb250cm9sbGVyLmNvbXBvc2l0aW9uV2lkdGg7CisJCQkJdmFyIGNvbnRhaW5lckhlaWdodDpOdW1iZXIgPSBpc05hTihjdXJDb250YWluZXJDb250cm9sbGVyLmNvbXBvc2l0aW9uSGVpZ2h0KSA/IGN1ckNvbnRhaW5lckNvbnRyb2xsZXIuZ2V0VG90YWxQYWRkaW5nVG9wKCkrYm91bmRzLmhlaWdodCA6IGN1ckNvbnRhaW5lckNvbnRyb2xsZXIuY29tcG9zaXRpb25IZWlnaHQ7CisJCQkJCisJCQkJY29udGFpbmVyUG9pbnQgPSBEaXNwbGF5T2JqZWN0KGN1ckNvbnRhaW5lckNvbnRyb2xsZXIuY29udGFpbmVyKS5nbG9iYWxUb0xvY2FsKGdsb2JhbFBvaW50KTsKKwkJCQkKKwkJCQkvLyByZW1vdmUgc2Nyb2xsUmVjdCBlZmZlY3RzIGZvciB0aGUgZGlzdGFuY2UgdGVzdCBidXQgYWRkIGl0IGJhY2sgaW4gZm9yIHRoZSByZXN1bHQKKwkJCQl2YXIgYWRqdXN0WDpOdW1iZXIgPSAwOworCQkJCXZhciBhZGp1c3RZOk51bWJlciA9IDA7CisJCQkJCisJCQkJaWYgKGN1ckNvbnRhaW5lckNvbnRyb2xsZXIuaGFzU2Nyb2xsUmVjdCkKKwkJCQl7CisJCQkJCWNvbnRhaW5lclBvaW50LnggLT0gKGFkanVzdFggPSBjdXJDb250YWluZXJDb250cm9sbGVyLmNvbnRhaW5lci5zY3JvbGxSZWN0LngpOworCQkJCQljb250YWluZXJQb2ludC55IC09IChhZGp1c3RZID0gY3VyQ29udGFpbmVyQ29udHJvbGxlci5jb250YWluZXIuc2Nyb2xsUmVjdC55KTsKKwkJCQl9CisJCQkJCisJCQkJaWYgKChjb250YWluZXJQb2ludC54ID49IDApICYmIChjb250YWluZXJQb2ludC54IDw9IGNvbnRhaW5lcldpZHRoKSAmJgorCQkJCQkoY29udGFpbmVyUG9pbnQueSA+PSAwKSAmJiAoY29udGFpbmVyUG9pbnQueSA8PSBjb250YWluZXJIZWlnaHQpKQorCQkJCXsKKwkJCQkJY29udHJvbGxlckNhbmRpZGF0ZSA9IGN1ckNvbnRhaW5lckNvbnRyb2xsZXI7CisJCQkJCWNhbmRpZGF0ZUxvY2FsWCA9IGNvbnRhaW5lclBvaW50LngrYWRqdXN0WDsKKwkJCQkJY2FuZGlkYXRlTG9jYWxZID0gY29udGFpbmVyUG9pbnQueSthZGp1c3RZOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJCisJCQkJLy8gZmlndXJlIG1pbmltdW0gZGlzdGFuY2Ugb2YgY29udGFpbmVyUG9pbnQgdG8gY3VyQ29udGFpbmVyQ29udHJvbGxlciAtIDggY2FzZXMKKwkJCQl2YXIgcmVsRGlzdGFuY2VYOk51bWJlciA9IDA7CisJCQkJdmFyIHJlbERpc3RhbmNlWTpOdW1iZXIgPSAwOworCQkJCQorCQkJCWlmIChjb250YWluZXJQb2ludC54IDwgMCkKKwkJCQl7CisJCQkJCXJlbERpc3RhbmNlWCA9IGNvbnRhaW5lclBvaW50Lng7CisJCQkJCWlmIChjb250YWluZXJQb2ludC55IDwgMCkKKwkJCQkJCXJlbERpc3RhbmNlWSA9IGNvbnRhaW5lclBvaW50Lnk7CisJCQkJCWVsc2UgaWYgKGNvbnRhaW5lclBvaW50LnkgPiBjb250YWluZXJIZWlnaHQpCisJCQkJCQlyZWxEaXN0YW5jZVkgPSBjb250YWluZXJQb2ludC55LWNvbnRhaW5lckhlaWdodDsKKwkJCQl9CisJCQkJZWxzZSBpZiAoY29udGFpbmVyUG9pbnQueCA+IGNvbnRhaW5lcldpZHRoKQorCQkJCXsKKwkJCQkJcmVsRGlzdGFuY2VYID0gY29udGFpbmVyUG9pbnQueC1jb250YWluZXJXaWR0aDsKKwkJCQkJaWYgKGNvbnRhaW5lclBvaW50LnkgPCAwKQorCQkJCQkJcmVsRGlzdGFuY2VZID0gY29udGFpbmVyUG9pbnQueTsKKwkJCQkJZWxzZSBpZiAoY29udGFpbmVyUG9pbnQueSA+IGNvbnRhaW5lckhlaWdodCkKKwkJCQkJCXJlbERpc3RhbmNlWSA9IGNvbnRhaW5lclBvaW50LnktY29udGFpbmVySGVpZ2h0OworCQkJCX0KKwkJCQllbHNlIGlmIChjb250YWluZXJQb2ludC55IDwgMCkKKwkJCQkJcmVsRGlzdGFuY2VZID0gLWNvbnRhaW5lclBvaW50Lnk7CisJCQkJZWxzZQorCQkJCQlyZWxEaXN0YW5jZVkgPSBjb250YWluZXJQb2ludC55LWNvbnRhaW5lckhlaWdodDsKKwkJCQl2YXIgdGVtcERpc3Q6TnVtYmVyID0gcmVsRGlzdGFuY2VYKnJlbERpc3RhbmNlWCArIHJlbERpc3RhbmNlWSpyZWxEaXN0YW5jZVk7ICAgIC8vIGNvdWxkIGRvIHNxcnQgYnV0IHdoeSBib3RoZXIgLSB0aGVyZSBpcyBubyBNYXRoLmh5cG90IGZ1bmN0aW9uCisJCQkJaWYgKHRlbXBEaXN0IDw9IHJlbERpc3RhbmNlKQorCQkJCXsKKwkJCQkJcmVsRGlzdGFuY2UgPSB0ZW1wRGlzdDsKKwkJCQkJY29udHJvbGxlckNhbmRpZGF0ZSA9IGN1ckNvbnRhaW5lckNvbnRyb2xsZXI7CisJCQkJCWNhbmRpZGF0ZUxvY2FsWCA9IGNvbnRhaW5lclBvaW50LngrYWRqdXN0WDsKKwkJCQkJY2FuZGlkYXRlTG9jYWxZID0gY29udGFpbmVyUG9pbnQueSthZGp1c3RZOworCQkJCX0KKwkJCX0KKwkJCWxvY2FsUG9pbnQueCA9IGNhbmRpZGF0ZUxvY2FsWDsKKwkJCWxvY2FsUG9pbnQueSA9IGNhbmRpZGF0ZUxvY2FsWTsKKwkJCXJldHVybiBjb250cm9sbGVyQ2FuZGlkYXRlOworCisJCX0KKwkJLyoqIEBwcml2YXRlIC0gZ2l2ZW4gYSB0YXJnZXQgYW5kIGxvY2F0aW9uIGNvbXB1dGUgdGhlIENlbGxDb29yZGluYXRlcyAqLworCQlzdGF0aWMgdGxmX2ludGVybmFsIGZ1bmN0aW9uIGNvbXB1dGVDZWxsQ29vcmRpbmF0ZXModGV4dEZsb3c6VGV4dEZsb3csIHRhcmdldDpPYmplY3QsIGN1cnJlbnRUYXJnZXQ6T2JqZWN0LCBsb2NhbFg6TnVtYmVyLCBsb2NhbFk6TnVtYmVyKTpDZWxsQ29vcmRpbmF0ZXMKKwkJeworCQkJdmFyIHJzbHQ6Q2VsbENvb3JkaW5hdGVzOworCQkJdmFyIGNvbnRhaW5lclBvaW50OlBvaW50OyAvLyBzY3JhdGNoCisJCQkKKworCQkJaWYgKHRhcmdldCBpcyBUZXh0TGluZSkKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCWlmKHRhcmdldCBpcyBDZWxsQ29udGFpbmVyKQorCQkJeworCQkJCXZhciBjZWxsOlRhYmxlQ2VsbEVsZW1lbnQgPSAodGFyZ2V0IGFzIENlbGxDb250YWluZXIpLmVsZW1lbnQ7CisJCQkJcmV0dXJuIG5ldyBDZWxsQ29vcmRpbmF0ZXMoY2VsbC5yb3dJbmRleCwgY2VsbC5jb2xJbmRleCwgY2VsbC5nZXRUYWJsZSgpKTsKKwkJCX0KKwkJCXZhciBsb2NhbFBvaW50OlBvaW50ID0gbmV3IFBvaW50KGxvY2FsWCwgbG9jYWxZKTsKKwkJCXZhciBjb250cm9sbGVyOkNvbnRhaW5lckNvbnRyb2xsZXIgPSBmaW5kQ29udHJvbGxlcih0ZXh0RmxvdywgdGFyZ2V0LCBjdXJyZW50VGFyZ2V0LCBsb2NhbFBvaW50KTsKKwkJCWlmKCFjb250cm9sbGVyKQorCQkJCXJldHVybiBudWxsOworCQkJCisJCQlyZXR1cm4gY29udHJvbGxlci5maW5kQ2VsbEF0UG9zaXRpb24obG9jYWxQb2ludCk7CisJCX0KKwogICAgICAgICAvKiogQHByaXZhdGUgLSBnaXZlbiBhIHRhcmdldCBhbmQgbG9jYXRpb24gY29tcHV0ZSB0aGUgc2VsZWN0aW9uSW5kZXggKi8KICAgICAgICAgc3RhdGljIHRsZl9pbnRlcm5hbCBmdW5jdGlvbiBjb21wdXRlU2VsZWN0aW9uSW5kZXgodGV4dEZsb3c6VGV4dEZsb3csIHRhcmdldDpPYmplY3QsIGN1cnJlbnRUYXJnZXQ6T2JqZWN0LCBsb2NhbFg6TnVtYmVyLGxvY2FsWTpOdW1iZXIpOmludAogICAgICAgICB7ICAgICAgICAgICAKQEAgLTExOTYsMTEyICsxOTExLDkgQEAKICAgICAgICAgICAgICAgICByc2x0ID0gY29tcHV0ZVNlbGVjdGlvbkluZGV4SW5MaW5lKHRleHRGbG93LCBUZXh0TGluZSh0YXJnZXQpLCBsb2NhbFgsIGxvY2FsWSk7CiAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIGNvbnRyb2xsZXI6Q29udGFpbmVyQ29udHJvbGxlcjsKLSAgICAgICAgICAgICAgICBmb3IgKHZhciBpZHg6aW50ID0gMDsgaWR4IDwgdGV4dEZsb3cuZmxvd0NvbXBvc2VyLm51bUNvbnRyb2xsZXJzOyBpZHgrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHZhciB0ZXN0Q29udHJvbGxlcjpDb250YWluZXJDb250cm9sbGVyID0gdGV4dEZsb3cuZmxvd0NvbXBvc2VyLmdldENvbnRyb2xsZXJBdChpZHgpOyAKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRlc3RDb250cm9sbGVyLmNvbnRhaW5lciA9PSB0YXJnZXQgfHwgdGVzdENvbnRyb2xsZXIuY29udGFpbmVyID09IGN1cnJlbnRUYXJnZXQpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIgPSB0ZXN0Q29udHJvbGxlcjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChjb250cm9sbGVyKQotICAgICAgICAgICAgICAgIHsgICAKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldCAhPSBjb250cm9sbGVyLmNvbnRhaW5lcikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyUG9pbnQgPSBEaXNwbGF5T2JqZWN0KHRhcmdldCkubG9jYWxUb0dsb2JhbChuZXcgUG9pbnQobG9jYWxYLCBsb2NhbFkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lclBvaW50ID0gRGlzcGxheU9iamVjdChjb250cm9sbGVyLmNvbnRhaW5lcikuZ2xvYmFsVG9Mb2NhbChjb250YWluZXJQb2ludCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFggPSBjb250YWluZXJQb2ludC54OwotICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxZID0gY29udGFpbmVyUG9pbnQueTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByc2x0ID0gY29tcHV0ZVNlbGVjdGlvbkluZGV4SW5Db250YWluZXIodGV4dEZsb3csIGNvbnRyb2xsZXIsIGxvY2FsWCwgbG9jYWxZKTsgICAgICAgICAgCi0gICAgICAgICAgICAgICAgfSAKLSAgICAgICAgICAgICAgICBlbHNlIAotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy90aGUgcG9pbnQgaXMgc29tZXBsYWNlIGVsc2Ugb24gc3RhZ2UuICBNYXAgdGhlIHRhcmdldCAKLSAgICAgICAgICAgICAgICAgICAgLy90byB0aGUgdGV4dEZsb3cuY29udGFpbmVyLgotICAgICAgICAgICAgICAgICAgICBDT05GSUc6OmRlYnVnIHsgYXNzZXJ0KHRleHRGbG93LmZsb3dDb21wb3NlciAmJiB0ZXh0Rmxvdy5mbG93Q29tcG9zZXIubnVtQ29udHJvbGxlcnMsImNvbXB1dGVTZWxlY3Rpb25JbmRleDogaW52YWxpZCB0ZXh0RmxvdyIpOyB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgLy8gcmVzdWx0IG9mIHRoZSBzZWFyY2gKLSAgICAgICAgICAgICAgICAgICAgdmFyIGNvbnRyb2xsZXJDYW5kaWRhdGU6Q29udGFpbmVyQ29udHJvbGxlciA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIHZhciBjYW5kaWRhdGVMb2NhbFg6TnVtYmVyOwotICAgICAgICAgICAgICAgICAgICB2YXIgY2FuZGlkYXRlTG9jYWxZOk51bWJlcjsKLSAgICAgICAgICAgICAgICAgICAgdmFyIHJlbERpc3RhbmNlOk51bWJlciA9IE51bWJlci5NQVhfVkFMVUU7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBjb250YWluZXJJbmRleDppbnQgPSAwOyBjb250YWluZXJJbmRleCA8IHRleHRGbG93LmZsb3dDb21wb3Nlci5udW1Db250cm9sbGVyczsgY29udGFpbmVySW5kZXgrKykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGN1ckNvbnRhaW5lckNvbnRyb2xsZXI6Q29udGFpbmVyQ29udHJvbGxlciA9IHRleHRGbG93LmZsb3dDb21wb3Nlci5nZXRDb250cm9sbGVyQXQoY29udGFpbmVySW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBkaXNwbGF5ZWQ/PwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGVja0ZvckRpc3BsYXllZChjdXJDb250YWluZXJDb250cm9sbGVyLmNvbnRhaW5lciBhcyBEaXNwbGF5T2JqZWN0KSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlIG1lYXN1cmVkIGNvbnRhaW5lcnM/PwotICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGJvdW5kczpSZWN0YW5nbGUgPSBjdXJDb250YWluZXJDb250cm9sbGVyLmdldENvbnRlbnRCb3VuZHMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb250YWluZXJXaWR0aDpOdW1iZXIgPSBpc05hTihjdXJDb250YWluZXJDb250cm9sbGVyLmNvbXBvc2l0aW9uV2lkdGgpID8gY3VyQ29udGFpbmVyQ29udHJvbGxlci5nZXRUb3RhbFBhZGRpbmdMZWZ0KCkrYm91bmRzLndpZHRoIDogY3VyQ29udGFpbmVyQ29udHJvbGxlci5jb21wb3NpdGlvbldpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbnRhaW5lckhlaWdodDpOdW1iZXIgPSBpc05hTihjdXJDb250YWluZXJDb250cm9sbGVyLmNvbXBvc2l0aW9uSGVpZ2h0KSA/IGN1ckNvbnRhaW5lckNvbnRyb2xsZXIuZ2V0VG90YWxQYWRkaW5nVG9wKCkrYm91bmRzLmhlaWdodCA6IGN1ckNvbnRhaW5lckNvbnRyb2xsZXIuY29tcG9zaXRpb25IZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lclBvaW50ID0gRGlzcGxheU9iamVjdCh0YXJnZXQpLmxvY2FsVG9HbG9iYWwobmV3IFBvaW50KGxvY2FsWCwgbG9jYWxZKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXJQb2ludCA9IERpc3BsYXlPYmplY3QoY3VyQ29udGFpbmVyQ29udHJvbGxlci5jb250YWluZXIpLmdsb2JhbFRvTG9jYWwoY29udGFpbmVyUG9pbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgc2Nyb2xsUmVjdCBlZmZlY3RzIGZvciB0aGUgZGlzdGFuY2UgdGVzdCBidXQgYWRkIGl0IGJhY2sgaW4gZm9yIHRoZSByZXN1bHQKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhZGp1c3RYOk51bWJlciA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YXIgYWRqdXN0WTpOdW1iZXIgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VyQ29udGFpbmVyQ29udHJvbGxlci5oYXNTY3JvbGxSZWN0KQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lclBvaW50LnggLT0gKGFkanVzdFggPSBjdXJDb250YWluZXJDb250cm9sbGVyLmNvbnRhaW5lci5zY3JvbGxSZWN0LngpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lclBvaW50LnkgLT0gKGFkanVzdFkgPSBjdXJDb250YWluZXJDb250cm9sbGVyLmNvbnRhaW5lci5zY3JvbGxSZWN0LnkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGNvbnRhaW5lclBvaW50LnggPj0gMCkgJiYgKGNvbnRhaW5lclBvaW50LnggPD0gY29udGFpbmVyV2lkdGgpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnRhaW5lclBvaW50LnkgPj0gMCkgJiYgKGNvbnRhaW5lclBvaW50LnkgPD0gY29udGFpbmVySGVpZ2h0KSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyQ2FuZGlkYXRlID0gY3VyQ29udGFpbmVyQ29udHJvbGxlcjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5kaWRhdGVMb2NhbFggPSBjb250YWluZXJQb2ludC54K2FkanVzdFg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuZGlkYXRlTG9jYWxZID0gY29udGFpbmVyUG9pbnQueSthZGp1c3RZOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBmaWd1cmUgbWluaW11bSBkaXN0YW5jZSBvZiBjb250YWluZXJQb2ludCB0byBjdXJDb250YWluZXJDb250cm9sbGVyIC0gOCBjYXNlcwotICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlbERpc3RhbmNlWDpOdW1iZXIgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlbERpc3RhbmNlWTpOdW1iZXIgPSAwOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGFpbmVyUG9pbnQueCA8IDApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsRGlzdGFuY2VYID0gY29udGFpbmVyUG9pbnQueDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGFpbmVyUG9pbnQueSA8IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbERpc3RhbmNlWSA9IGNvbnRhaW5lclBvaW50Lnk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY29udGFpbmVyUG9pbnQueSA+IGNvbnRhaW5lckhlaWdodCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsRGlzdGFuY2VZID0gY29udGFpbmVyUG9pbnQueS1jb250YWluZXJIZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjb250YWluZXJQb2ludC54ID4gY29udGFpbmVyV2lkdGgpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsRGlzdGFuY2VYID0gY29udGFpbmVyUG9pbnQueC1jb250YWluZXJXaWR0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGFpbmVyUG9pbnQueSA8IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbERpc3RhbmNlWSA9IGNvbnRhaW5lclBvaW50Lnk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY29udGFpbmVyUG9pbnQueSA+IGNvbnRhaW5lckhlaWdodCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsRGlzdGFuY2VZID0gY29udGFpbmVyUG9pbnQueS1jb250YWluZXJIZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjb250YWluZXJQb2ludC55IDwgMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxEaXN0YW5jZVkgPSAtY29udGFpbmVyUG9pbnQueTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxEaXN0YW5jZVkgPSBjb250YWluZXJQb2ludC55LWNvbnRhaW5lckhlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ZW1wRGlzdDpOdW1iZXIgPSByZWxEaXN0YW5jZVgqcmVsRGlzdGFuY2VYICsgcmVsRGlzdGFuY2VZKnJlbERpc3RhbmNlWTsgICAgLy8gY291bGQgZG8gc3FydCBidXQgd2h5IGJvdGhlciAtIHRoZXJlIGlzIG5vIE1hdGguaHlwb3QgZnVuY3Rpb24KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wRGlzdCA8PSByZWxEaXN0YW5jZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxEaXN0YW5jZSA9IHRlbXBEaXN0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXJDYW5kaWRhdGUgPSBjdXJDb250YWluZXJDb250cm9sbGVyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbmRpZGF0ZUxvY2FsWCA9IGNvbnRhaW5lclBvaW50LngrYWRqdXN0WDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5kaWRhdGVMb2NhbFkgPSBjb250YWluZXJQb2ludC55K2FkanVzdFk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICAgICAgICAgIHJzbHQgPSBjb250cm9sbGVyQ2FuZGlkYXRlID8gY29tcHV0ZVNlbGVjdGlvbkluZGV4SW5Db250YWluZXIodGV4dEZsb3csIGNvbnRyb2xsZXJDYW5kaWRhdGUsIGNhbmRpZGF0ZUxvY2FsWCwgY2FuZGlkYXRlTG9jYWxZKSA6IC0xOwotICAgICAgICAgICAgICAgIH0KKwkJCQl2YXIgbG9jYWxQb2ludDpQb2ludCA9IG5ldyBQb2ludChsb2NhbFgsbG9jYWxZKTsKKyAgICAgICAgICAgICAgICB2YXIgY29udHJvbGxlcjpDb250YWluZXJDb250cm9sbGVyID0gZmluZENvbnRyb2xsZXIodGV4dEZsb3csIHRhcmdldCwgY3VycmVudFRhcmdldCwgbG9jYWxQb2ludCk7CisJCQkJcnNsdCA9IGNvbnRyb2xsZXIgPyBjb21wdXRlU2VsZWN0aW9uSW5kZXhJbkNvbnRhaW5lcih0ZXh0RmxvdywgY29udHJvbGxlciwgbG9jYWxQb2ludC54LCBsb2NhbFBvaW50LnkpIDogLTE7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAKICAgICAgICAgICAgIGlmIChyc2x0ID49IHRleHRGbG93LnRleHRMZW5ndGgpCkBAIC0xMzM5LDcgKzE5NTEsNTAgQEAKICAgICAgICAgICovIAogICAgICAgICBwdWJsaWMgZnVuY3Rpb24gbW91c2VEb3duSGFuZGxlcihldmVudDpNb3VzZUV2ZW50KTp2b2lkCiAgICAgICAgIHsKLSAgICAgICAgICAgIGhhbmRsZU1vdXNlRXZlbnRGb3JTZWxlY3Rpb24oZXZlbnQsIGV2ZW50LnNoaWZ0S2V5KTsKKwkJCWlmKHN1Yk1hbmFnZXIpCisJCQkJc3ViTWFuYWdlci5zZWxlY3RSYW5nZSgtMSwtMSk7CisJCQkKKwkJCXZhciBjZWxsOlRhYmxlQ2VsbEVsZW1lbnQgPSBfdGV4dEZsb3cucGFyZW50RWxlbWVudCBhcyBUYWJsZUNlbGxFbGVtZW50OworCQkJdmFyIGNvb3JkczpDZWxsQ29vcmRpbmF0ZXM7CisJCQlpZighY2VsbCkKKwkJCQljb29yZHMgPSBjb21wdXRlQ2VsbENvb3JkaW5hdGVzKHRleHRGbG93LGV2ZW50LnRhcmdldCxldmVudC5jdXJyZW50VGFyZ2V0LGV2ZW50LmxvY2FsWCwgZXZlbnQubG9jYWxZKTsKKwkJCWlmKGNlbGwgfHwgY29vcmRzKQorCQkJeworCQkJCWlmKGNvb3JkcykKKwkJCQkJY2VsbCA9IGNvb3Jkcy50YWJsZS5maW5kQ2VsbChjb29yZHMpOworCQkJCQorCQkJCXN1cGVyTWFuYWdlciA9IGNlbGwuZ2V0VGV4dEZsb3coKS5pbnRlcmFjdGlvbk1hbmFnZXI7CisJCQkJaWYoZXZlbnQuc2hpZnRLZXkgJiYgY2VsbC5nZXRUYWJsZSgpID09IHN1cGVyTWFuYWdlci5jdXJyZW50VGFibGUpCisJCQkJeworCQkJCQkvLyBleHBhbmQgY2VsbCBzZWxlY3Rpb24gaWYgYXBwbGljYWJsZQorCQkJCQljb29yZHMgPSBuZXcgQ2VsbENvb3JkaW5hdGVzKGNlbGwucm93SW5kZXgsY2VsbC5jb2xJbmRleCk7CisJCQkJCWlmKAorCQkJCQkJIUNlbGxDb29yZGluYXRlcy5hcmVFcXVhbChjb29yZHMsc3VwZXJNYW5hZ2VyLmFuY2hvckNlbGxQb3NpdGlvbikgfHwKKwkJCQkJCXN1cGVyTWFuYWdlci5hY3RpdmVDZWxsUG9zaXRpb24uaXNWYWxpZCgpCisJCQkJCSl7CisJCQkJCQlzdXBlck1hbmFnZXIuc2VsZWN0Q2VsbFJhbmdlKHN1cGVyTWFuYWdlci5hbmNob3JDZWxsUG9zaXRpb24sY29vcmRzKTsKKwkJCQkJCXN1cGVyTWFuYWdlci5zdWJNYW5hZ2VyID0gbnVsbDsKKwkJCQkJCWFsbG93T3BlcmF0aW9uTWVyZ2UgPSBmYWxzZTsKKwkJCQkJCWV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOworCQkJCQkJcmV0dXJuOworCQkJCQl9CisJCQkJfQorCQkJCWlmKHN1cGVyTWFuYWdlciA9PSB0aGlzKQorCQkJCXsKKwkJCQkJaWYoY2VsbC50ZXh0Rmxvdy5pbnRlcmFjdGlvbk1hbmFnZXIpCisJCQkJCXsKKwkJCQkJCWNlbGwudGV4dEZsb3cuaW50ZXJhY3Rpb25NYW5hZ2VyLm1vdXNlRG93bkhhbmRsZXIoZXZlbnQpOworCQkJCQl9CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQkJc3VwZXJNYW5hZ2VyLmN1cnJlbnRUYWJsZSA9IGNlbGwuZ2V0VGFibGUoKTsKKwkJCQlzdXBlck1hbmFnZXIuZGVzZWxlY3QoKTsKKwkJCQkvL3N1cGVyTWFuYWdlci5zZXRTZWxlY3Rpb25TdGF0ZShuZXcgU2VsZWN0aW9uU3RhdGUoc3VwZXJNYW5hZ2VyLnRleHRGbG93LC0xLC0xKSApOworCQkJCXN1cGVyTWFuYWdlci5hbmNob3JDZWxsUG9zaXRpb24uY29sdW1uID0gY2VsbC5jb2xJbmRleDsKKwkJCQlzdXBlck1hbmFnZXIuYW5jaG9yQ2VsbFBvc2l0aW9uLnJvdyA9IGNlbGwucm93SW5kZXg7CisJCQkJc3VwZXJNYW5hZ2VyLnN1Yk1hbmFnZXIgPSB0aGlzOworCQkJfQorICAgICAgICAgICAgaGFuZGxlTW91c2VFdmVudEZvclNlbGVjdGlvbihldmVudCwgZXZlbnQuc2hpZnRLZXksIGNlbGwgIT0gbnVsbCk7CiAgICAgICAgIH0KICAgICAgICAgCiAgICAgICAgIC8qKgpAQCAtMTM0OCwxNyArMjAwMyw1NiBAQAogICAgICAgICAgKiBAcGxheWVydmVyc2lvbiBBSVIgMS41CiAgICAgICAgICAqIEBsYW5ndmVyc2lvbiAzLjAKICAgICAgICAgICovIAotICAgICAgICBwdWJsaWMgZnVuY3Rpb24gbW91c2VNb3ZlSGFuZGxlcihldmVudDpNb3VzZUV2ZW50KTp2b2lkCi0gICAgICAgIHsKKyAgICAgICAgcHVibGljIGZ1bmN0aW9uIG1vdXNlTW92ZUhhbmRsZXIoZXZlbnQ6TW91c2VFdmVudCk6dm9pZCB7CiAgICAgICAgICAgICB2YXIgd21vZGU6U3RyaW5nID0gdGV4dEZsb3cuY29tcHV0ZWRGb3JtYXQuYmxvY2tQcm9ncmVzc2lvbjsgICAgICAgICAgICAKLSAgICAgICAgICAgIGlmICh3bW9kZSAhPSBCbG9ja1Byb2dyZXNzaW9uLlJMKSAKLSAgICAgICAgICAgICAgICBzZXRNb3VzZUN1cnNvcihNb3VzZUN1cnNvci5JQkVBTSk7ICAgICAgICAgIAorCQkJCisJCQlpZiAod21vZGUgIT0gQmxvY2tQcm9ncmVzc2lvbi5STCkgeworICAgICAgICAgICAgICAgIHNldE1vdXNlQ3Vyc29yKE1vdXNlQ3Vyc29yLklCRUFNKTsKKwkJCX0KKwkJCQorCQkJCiAgICAgICAgICAgICBpZiAoZXZlbnQuYnV0dG9uRG93bikKLSAgICAgICAgICAgICAgICBoYW5kbGVNb3VzZUV2ZW50Rm9yU2VsZWN0aW9uKGV2ZW50LCB0cnVlKTsKKwkJCXsKKwkJCQl2YXIgY2VsbDpUYWJsZUNlbGxFbGVtZW50ID0gX3RleHRGbG93LnBhcmVudEVsZW1lbnQgYXMgVGFibGVDZWxsRWxlbWVudDsKKwkJCQkKKwkJCQkvLyBpZiB0aGUgZXZlbnQgaXMgb3duZWQgYnkgYSBjZWxsLCB3ZSBuZWVkIHRvIGNoZWNrIGlmIHRoZSBtb3VzZSBpcyBub3cgYWJvdmUgYW5vdGhlciBjZWxsIHRvIHNlbGVjdCBhIGNlbGwgcmFuZ2UuCisJCQkJaWYgKGNlbGwpIHsKKwkJCQkJCisJCQkJCWRvIHsKKwkJCQkJCXZhciBjZWxsQ29vcmRzOkNlbGxDb29yZGluYXRlcyA9IG5ldyBDZWxsQ29vcmRpbmF0ZXMoY2VsbC5yb3dJbmRleCwgY2VsbC5jb2xJbmRleCwgY2VsbC5nZXRUYWJsZSgpKTsKKwkJCQkJCXZhciBjb29yZHM6Q2VsbENvb3JkaW5hdGVzID0gY29tcHV0ZUNlbGxDb29yZGluYXRlcyhjZWxsLmdldFRleHRGbG93KCksIGV2ZW50LnRhcmdldCwgZXZlbnQuY3VycmVudFRhcmdldCwgZXZlbnQubG9jYWxYLCBldmVudC5sb2NhbFkpOworCQkJCQkJaWYoIWNvb3JkcykKKwkJCQkJCQlicmVhazsKKwkJCQkJCWlmKENlbGxDb29yZGluYXRlcy5hcmVFcXVhbChjZWxsQ29vcmRzLCBjb29yZHMpICYmCisJCQkJCQkJKCFzdXBlck1hbmFnZXIuYWN0aXZlQ2VsbFBvc2l0aW9uLmlzVmFsaWQoKSB8fCBDZWxsQ29vcmRpbmF0ZXMuYXJlRXF1YWwoY29vcmRzLCBzdXBlck1hbmFnZXIuYWN0aXZlQ2VsbFBvc2l0aW9uKSkKKwkJCQkJCSkKKwkJCQkJCQlicmVhazsKKwkJCQkJCWlmKGNvb3Jkcy50YWJsZSAhPSBjZWxsQ29vcmRzLnRhYmxlKQorCQkJCQkJCWJyZWFrOworCQkJCQkJCisJCQkJCQlzdXBlck1hbmFnZXIgPSBjZWxsLmdldFRleHRGbG93KCkuaW50ZXJhY3Rpb25NYW5hZ2VyOworCQkJCQkJaWYoCisJCQkJCQkJIUNlbGxDb29yZGluYXRlcy5hcmVFcXVhbChjb29yZHMsIHN1cGVyTWFuYWdlci5hY3RpdmVDZWxsUG9zaXRpb24pCisJCQkJCQkpeworCQkJCQkJCWFsbG93T3BlcmF0aW9uTWVyZ2UgPSBmYWxzZTsKKwkJCQkJCQlzdXBlck1hbmFnZXIuc2VsZWN0Q2VsbFJhbmdlKHN1cGVyTWFuYWdlci5hbmNob3JDZWxsUG9zaXRpb24sIGNvb3Jkcyk7CisJCQkJCQkJZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CisJCQkJCQkJcmV0dXJuOworCQkJCQkJfQorCisJCQkJCQkKKwkJCQkJfXdoaWxlKDApOworCQkJCX0KKwkJCQlpZihzdXBlck1hbmFnZXIgJiYgc3VwZXJNYW5hZ2VyLmdldENlbGxSYW5nZSgpKQorCQkJCQlyZXR1cm47CisJCQkJCisJCQkJaGFuZGxlTW91c2VFdmVudEZvclNlbGVjdGlvbihldmVudCwgdHJ1ZSwgX3RleHRGbG93LnBhcmVudEVsZW1lbnQgIT0gbnVsbCk7CisKKwkJCX0KICAgICAgICAgfQogICAgICAgICAKICAgICAgICAgLyoqIEBwcml2YXRlICovCi0gICAgICAgIHRsZl9pbnRlcm5hbCBmdW5jdGlvbiBoYW5kbGVNb3VzZUV2ZW50Rm9yU2VsZWN0aW9uKGV2ZW50Ok1vdXNlRXZlbnQsIGFsbG93RXh0ZW5kOkJvb2xlYW4pOnZvaWQKKyAgICAgICAgdGxmX2ludGVybmFsIGZ1bmN0aW9uIGhhbmRsZU1vdXNlRXZlbnRGb3JTZWxlY3Rpb24oZXZlbnQ6TW91c2VFdmVudCwgYWxsb3dFeHRlbmQ6Qm9vbGVhbixzdG9wUHJvcG9nYXRlOkJvb2xlYW49ZmFsc2UpOnZvaWQKICAgICAgICAgewogICAgICAgICAgICAgdmFyIHN0YXJ0U2VsZWN0aW9uQWN0aXZlOkJvb2xlYW4gPSBoYXNTZWxlY3Rpb24oKTsKICAgICAgICAgICAgIApAQCAtMTM3MSw2ICsyMDY1LDggQEAKICAgICAgICAgICAgICAgICAgICAgYWRkU2VsZWN0aW9uU2hhcGVzKCk7CiAgICAgICAgICAgICB9ICAgICAgIAogICAgICAgICAgICAgYWxsb3dPcGVyYXRpb25NZXJnZSA9IGZhbHNlOworCQkJaWYoc3RvcFByb3BvZ2F0ZSkKKwkJCQlldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgfQogICAgICAgICAKICAgICAgICAgLyoqIApAQCAtMTQ3OSwxMCArMjE3NSw2MCBAQAogICAgICAgICB7CiAgICAgICAgICAgICBfbW91c2VPdmVyU2VsZWN0aW9uQXJlYSA9IHRydWU7CiAgICAgICAgICAgICB2YXIgd21vZGU6U3RyaW5nID0gdGV4dEZsb3cuY29tcHV0ZWRGb3JtYXQuYmxvY2tQcm9ncmVzc2lvbjsKLSAgICAgICAgICAgIGlmICh3bW9kZSAhPSBCbG9ja1Byb2dyZXNzaW9uLlJMKSAKLSAgICAgICAgICAgICAgICBzZXRNb3VzZUN1cnNvcihNb3VzZUN1cnNvci5JQkVBTSk7ICAKLSAgICAgICAgICAgIGVsc2UgCi0gICAgICAgICAgICAgICAgc2V0TW91c2VDdXJzb3IoTW91c2VDdXJzb3IuQVVUTyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQkJCisgICAgICAgICAgICBpZiAod21vZGUgIT0gQmxvY2tQcm9ncmVzc2lvbi5STCkgeworCQkJCXZhciBjZWxsOlRhYmxlQ2VsbEVsZW1lbnQgPSBfdGV4dEZsb3cucGFyZW50RWxlbWVudCBhcyBUYWJsZUNlbGxFbGVtZW50OworCQkJCQorCQkJCS8vIHNldCB0aGUgY3Vyc29yIGlmIGFyb3VuZCB0aGUgZWRnZSBvZiB0aGUgdGFibGUKKwkJCQlpZiAoY2VsbCkgeworCQkJCQl2YXIgbGVmdEVkZ2U6aW50ID0gNTsKKwkJCQkJdmFyIHRvcEVkZ2U6aW50ID0gNTsKKwkJCQkJdmFyIGdsb2JhbFBvaW50OlBvaW50ID0gbmV3IFBvaW50KGV2ZW50LnN0YWdlWCwgZXZlbnQuc3RhZ2VZKTsKKwkJCQkJdmFyIGNlbGxDb250YWluZXI6Q2VsbENvbnRhaW5lciA9IGV2ZW50LmN1cnJlbnRUYXJnZXQgYXMgQ2VsbENvbnRhaW5lcjsKKwkJCQkJdmFyIHBvaW50OlBvaW50OworCQkJCQkKKwkJCQkJaWYgKGNlbGxDb250YWluZXIpIHsKKwkJCQkJCXZhciBjZWxsQ29udGFpbmVyUG9pbnQ6UG9pbnQgPSBjZWxsQ29udGFpbmVyLmxvY2FsVG9HbG9iYWwobmV3IFBvaW50KTsKKwkJCQkJCXBvaW50ID0gZ2xvYmFsUG9pbnQuc3VidHJhY3QoY2VsbENvbnRhaW5lclBvaW50KTsKKwkJCQkJfQorCQkJCQlpZih1c2VUYWJsZVNlbGVjdGlvbkN1cnNvcnMpCisJCQkJCXsKKwkJCQkJCS8vIHNldCBjdXJzb3IgZm9yIHJvdywgdGFibGUgb3IgY29sdW1uCisJCQkJCQlpZiAoY2VsbC5jb2xJbmRleD09MCAmJiBwb2ludC54PGxlZnRFZGdlICYmIHBvaW50Lnk+dG9wRWRnZSkKKwkJCQkJCXsKKwkJCQkJCQlldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKKwkJCQkJCQlldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKKwkJCQkJCQlzZXRNb3VzZUN1cnNvcihTZWxlY3RUYWJsZVJvdyk7CisJCQkJCQl9CisJCQkJCQllbHNlIGlmIChjZWxsLnJvd0luZGV4PT0wICYmIGNlbGwuY29sSW5kZXg9PTAgJiYKKwkJCQkJCQlwb2ludC54PGxlZnRFZGdlICYmIHBvaW50Lnk8dG9wRWRnZSkKKwkJCQkJCXsKKwkJCQkJCQlldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKKwkJCQkJCQlldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKKwkJCQkJCQlzZXRNb3VzZUN1cnNvcihTZWxlY3RUYWJsZSk7CisJCQkJCQl9CisJCQkJCQllbHNlIGlmIChjZWxsLnJvd0luZGV4PT0wICYmIHBvaW50Lng+bGVmdEVkZ2UgJiYgcG9pbnQueTx0b3BFZGdlKQorCQkJCQkJeworCQkJCQkJCWV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOworCQkJCQkJCWV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOworCQkJCQkJCXNldE1vdXNlQ3Vyc29yKFNlbGVjdFRhYmxlQ29sdW1uKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UgeworCQkJCQkJCXNldE1vdXNlQ3Vyc29yKE1vdXNlQ3Vyc29yLklCRUFNKTsKKwkJCQkJCX0KKwkJCQkJCQorCQkJCQl9CisJCQkJCWVsc2UgeworCQkJCQkJc2V0TW91c2VDdXJzb3IoTW91c2VDdXJzb3IuSUJFQU0pOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UgeworICAgICAgICAgICAgICAgIAlzZXRNb3VzZUN1cnNvcihNb3VzZUN1cnNvci5JQkVBTSk7CisJCQkJfQorCQkJfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgc2V0TW91c2VDdXJzb3IoTW91c2VDdXJzb3IuQVVUTyk7CisJCQl9CiAgICAgICAgIH0KIAogICAgICAgICAvKiogCkBAIC0xODczLDYgKzI2MTksOSBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZSBpZiAoZXZlbnQua2V5Q29kZSA9PSBLZXlib2FyZC5FU0NBUEUpCiAgICAgICAgICAgICAgICAgaGFuZGxlS2V5RXZlbnQoZXZlbnQpOworCQkJaWYoX3RleHRGbG93LnBhcmVudEVsZW1lbnQpCisJCQkJZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CisJCQkKICAgICAgICAgfQogCiAgICAgICAgIC8qKiAKQEAgLTIwOTgsOSArMjg0NywyNiBAQAogICAgICAgICB7CiAgICAgICAgICAgICB2YXIgaWR4OmludCA9IG1hcmtzLmluZGV4T2YobWFyayk7CiAgICAgICAgICAgICBpZiAoaWR4ICE9IC0xKQotICAgICAgICAgICAgICAgIG1hcmtzLnNwbGljZShpZHgsaWR4KzEpOworICAgICAgICAgICAgICAgIG1hcmtzLnNwbGljZShpZHgsMSk7CiAgICAgICAgIH0KLSAgICAgICAgCisKKwkJcHJpdmF0ZSB2YXIgY2VsbE1hcmtzOkFycmF5ID0gW107CisJCQorCQkvKiogQHByaXZhdGUgKi8KKwkJdGxmX2ludGVybmFsIGZ1bmN0aW9uIGNyZWF0ZUNlbGxNYXJrKCk6Q2VsbENvb3JkaW5hdGVzCisJCXsKKwkJCXZhciBtYXJrOkNlbGxDb29yZGluYXRlcyA9IG5ldyBDZWxsQ29vcmRpbmF0ZXMoLTEsLTEpOworCQkJY2VsbE1hcmtzLnB1c2gobWFyayk7CisJCQlyZXR1cm4gbWFyazsKKwkJfQorCQkvKiogQHByaXZhdGUgKi8KKwkJdGxmX2ludGVybmFsIGZ1bmN0aW9uIHJlbW92ZUNlbGxNYXJrKG1hcms6Q2VsbENvb3JkaW5hdGVzKTp2b2lkCisJCXsKKwkJCXZhciBpZHg6aW50ID0gY2VsbE1hcmtzLmluZGV4T2YobWFyayk7CisJCQlpZiAoaWR4ICE9IC0xKQorCQkJCW1hcmtzLnNwbGljZShpZHgsMSk7CisJCX0KKwogICAgICAgICAvKiogCiAgICAgICAgICAqIEBjb3B5IElTZWxlY3Rpb25NYW5hZ2VyI25vdGlmeUluc2VydE9yRGVsZXRlKCkKICAgICAgICAgICogCkBAIC0yMTI2LDUgKzI4OTIsMTM4IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CisKKwkJLyoqCisJCSAqIFRoZSBJU2VsZWN0aW9uTWFuYWdlciBvYmplY3QgdXNlZCB0byBmb3IgY2VsbCBzZWxlY3Rpb25zIG5lc3RlZCB3aXRoaW4gdGhlIFRleHRGbG93IG1hbmFnZWQgYnkgdGhpcyBJU2VsZWN0aW9uTWFuYWdlci4KKwkJICogCisJCSAqIEBwbGF5ZXJ2ZXJzaW9uIEZsYXNoIDEwCisJCSAqIEBwbGF5ZXJ2ZXJzaW9uIEFJUiAxLjUKKwkJICogQGxhbmd2ZXJzaW9uIDMuMAorCQkgKi8JCSAJCSAKKwkJcHVibGljIGZ1bmN0aW9uIGdldCBzdWJNYW5hZ2VyKCk6SVNlbGVjdGlvbk1hbmFnZXINCisJCXsKKwkJCXJldHVybiBfc3ViTWFuYWdlcjsKKwkJfQorCQlwdWJsaWMgZnVuY3Rpb24gc2V0IHN1Yk1hbmFnZXIodmFsdWU6SVNlbGVjdGlvbk1hbmFnZXIpOnZvaWQNCisJCXsKKwkJCWlmKF9zdWJNYW5hZ2VyKQorCQkJCV9zdWJNYW5hZ2VyLnNlbGVjdFJhbmdlKC0xLC0xKTsKKwkJCV9zdWJNYW5hZ2VyID0gdmFsdWU7CisJCX0KKwkJLyoqCisJCSAqIFRoZSBJU2VsZWN0aW9uTWFuYWdlciBvYmplY3QgdXNlZCB0byBtYW5hZ2UgdGhlIHBhcmVudCBUZXh0RmxvdyBvZiB0aGlzIElTZWxlY3Rpb25NYW5hZ2VyIChpLmUuIGZvciBjZWxsIElTZWxlY3Rpb25NYW5hZ2VycykuCisJCSAqIAorCQkgKiBAcGxheWVydmVyc2lvbiBGbGFzaCAxMAorCQkgKiBAcGxheWVydmVyc2lvbiBBSVIgMS41CisJCSAqIEBsYW5ndmVyc2lvbiAzLjAKKwkJICovCQkgCQkgCisKKwkJcHVibGljIGZ1bmN0aW9uIGdldCBzdXBlck1hbmFnZXIoKTpJU2VsZWN0aW9uTWFuYWdlcg0KKwkJeworCQkJcmV0dXJuIF9zdXBlck1hbmFnZXI7CisJCX0KKworCQlwdWJsaWMgZnVuY3Rpb24gc2V0IHN1cGVyTWFuYWdlcih2YWx1ZTpJU2VsZWN0aW9uTWFuYWdlcik6dm9pZA0KKwkJeworCQkJX3N1cGVyTWFuYWdlciA9IHZhbHVlOworCQl9CisKKwkJLyoqIEFuY2hvciBwb2ludCBvZiB0aGUgY3VycmVudCBjZWxsIHNlbGVjdGlvbiwgYXMgY29vcmRpbmF0ZXMgd2l0aGluIHRoZSB0YWJsZS4gKi8KKwkJcHVibGljIGZ1bmN0aW9uIGdldCBhbmNob3JDZWxsUG9zaXRpb24oKTpDZWxsQ29vcmRpbmF0ZXMNCisJCXsKKwkJCXJldHVybiBfYW5jaG9yQ2VsbFBvc2l0aW9uOworCQl9CisJCXB1YmxpYyBmdW5jdGlvbiBzZXQgYW5jaG9yQ2VsbFBvc2l0aW9uKHZhbHVlOkNlbGxDb29yZGluYXRlcyk6dm9pZA0KKwkJeworCQkJX2FuY2hvckNlbGxQb3NpdGlvbiA9IHZhbHVlOworCQl9CisKKwkJLyoqIEFjdGl2ZSBlbmQgb2YgdGhlIGN1cnJlbnQgY2VsbCBzZWxlY3Rpb24sIGFzIGNvb3JkaW5hdGVzIHdpdGhpbiB0aGUgdGFibGUuICovCisJCXB1YmxpYyBmdW5jdGlvbiBnZXQgYWN0aXZlQ2VsbFBvc2l0aW9uKCk6Q2VsbENvb3JkaW5hdGVzDQorCQl7CisJCQlyZXR1cm4gX2FjdGl2ZUNlbGxQb3NpdGlvbjsKKwkJfQorCQlwdWJsaWMgZnVuY3Rpb24gc2V0IGFjdGl2ZUNlbGxQb3NpdGlvbih2YWx1ZTpDZWxsQ29vcmRpbmF0ZXMpOnZvaWQNCisJCXsKKwkJCV9hY3RpdmVDZWxsUG9zaXRpb24gPSB2YWx1ZTsKKwkJfQorCQkKKwkJcHVibGljIHZhciBzZWxlY3RUYWJsZUN1cnNvclBvaW50czpWZWN0b3IuPE51bWJlcj4gPSBuZXcgPE51bWJlcj5bMSwzLCAxMSwzLCAxMSwwLCAxMiwwLCAxNiw0LCAxMiw4LCAxMSw4LCAxMSw1LCAxLDUsIDEsM107CisJCXB1YmxpYyB2YXIgc2VsZWN0VGFibGVDdXJzb3JEcmF3Q29tbWFuZHM6VmVjdG9yLjxpbnQ+ID0gbmV3IDxpbnQ+WzEsMiwyLDIsMiwyLDIsMiwyLDJdOworCQkKKwkJCisJCS8qKgorCQkgKiBDcmVhdGUgYSBzZWxlY3QgdGFibGUgY3Vyc29yCisJCSAqLworCQlwdWJsaWMgZnVuY3Rpb24gY3JlYXRlU2VsZWN0VGFibGVDdXJzb3IoKTpNb3VzZUN1cnNvckRhdGEgeworCQkJdmFyIGN1cnNvckRhdGE6VmVjdG9yLjxCaXRtYXBEYXRhPiA9IG5ldyBWZWN0b3IuPEJpdG1hcERhdGE+KCk7CisJCQl2YXIgY3Vyc29yU2hhcGU6U2hhcGUgPSBuZXcgU2hhcGUoKTsKKwkJCWN1cnNvclNoYXBlLmdyYXBoaWNzLmJlZ2luRmlsbCgweDAsIDEpOworCQkJY3Vyc29yU2hhcGUuZ3JhcGhpY3MubGluZVN0eWxlKDAsIDB4RkZGRkZGLCAxLCB0cnVlKTsKKwkJCWN1cnNvclNoYXBlLmdyYXBoaWNzLmRyYXdQYXRoKCBzZWxlY3RUYWJsZUN1cnNvckRyYXdDb21tYW5kcywgc2VsZWN0VGFibGVDdXJzb3JQb2ludHMpOworCQkJY3Vyc29yU2hhcGUuZ3JhcGhpY3MuZW5kRmlsbCgpOworCQkJdmFyIHRyYW5zZm9ybWVyOk1hdHJpeCA9IG5ldyBNYXRyaXgoKTsKKwkJCXZhciBjdXJzb3JGcmFtZTpCaXRtYXBEYXRhID0gbmV3IEJpdG1hcERhdGEoMzIsIDMyLCB0cnVlLCAwKTsKKwkJCXZhciBhbmdsZTppbnQgPSA4OworCQkJdmFyIHJvdGF0aW9uOk51bWJlciA9IDAuNzg1Mzk4MTYzOworCQkJdHJhbnNmb3JtZXIudHJhbnNsYXRlKC1hbmdsZSwtYW5nbGUpOworCQkJdHJhbnNmb3JtZXIucm90YXRlKHJvdGF0aW9uKTsKKwkJCXRyYW5zZm9ybWVyLnRyYW5zbGF0ZShhbmdsZSwgYW5nbGUpOworCQkJY3Vyc29yRnJhbWUuZHJhdyhjdXJzb3JTaGFwZSwgdHJhbnNmb3JtZXIpOworCQkJY3Vyc29yRGF0YS5wdXNoKGN1cnNvckZyYW1lKTsKKwkJCXZhciBtb3VzZUN1cnNvckRhdGE6TW91c2VDdXJzb3JEYXRhID0gbmV3IE1vdXNlQ3Vyc29yRGF0YSgpOworCQkJbW91c2VDdXJzb3JEYXRhLmRhdGEgPSBjdXJzb3JEYXRhOworCQkJbW91c2VDdXJzb3JEYXRhLmhvdFNwb3QgPSBuZXcgUG9pbnQoMTYsIDEwKTsKKwkJCW1vdXNlQ3Vyc29yRGF0YS5mcmFtZVJhdGUgPSAxOworCQkJcmV0dXJuIG1vdXNlQ3Vyc29yRGF0YTsKKwkJfQorCQkKKwkJLyoqCisJCSAqIENyZWF0ZSBhIHNlbGVjdCByb3cgY3Vyc29yCisJCSAqLworCQlwdWJsaWMgZnVuY3Rpb24gY3JlYXRlU2VsZWN0VGFibGVSb3dDdXJzb3IoKTpNb3VzZUN1cnNvckRhdGEgeworCQkJdmFyIGN1cnNvckRhdGE6VmVjdG9yLjxCaXRtYXBEYXRhPiA9IG5ldyBWZWN0b3IuPEJpdG1hcERhdGE+KCk7CisJCQl2YXIgY3Vyc29yU2hhcGU6U2hhcGUgPSBuZXcgU2hhcGUoKTsKKwkJCWN1cnNvclNoYXBlLmdyYXBoaWNzLmJlZ2luRmlsbCgweDAsIDEpOworCQkJY3Vyc29yU2hhcGUuZ3JhcGhpY3MubGluZVN0eWxlKDAsIDB4RkZGRkZGLCAxLCB0cnVlKTsKKwkJCWN1cnNvclNoYXBlLmdyYXBoaWNzLmRyYXdQYXRoKHNlbGVjdFRhYmxlQ3Vyc29yRHJhd0NvbW1hbmRzLCBzZWxlY3RUYWJsZUN1cnNvclBvaW50cyk7CisJCQljdXJzb3JTaGFwZS5ncmFwaGljcy5lbmRGaWxsKCk7CisJCQl2YXIgdHJhbnNmb3JtZXI6TWF0cml4ID0gbmV3IE1hdHJpeCgpOworCQkJdmFyIGN1cnNvckZyYW1lOkJpdG1hcERhdGEgPSBuZXcgQml0bWFwRGF0YSgzMiwgMzIsIHRydWUsIDApOworCQkJY3Vyc29yRnJhbWUuZHJhdyhjdXJzb3JTaGFwZSwgdHJhbnNmb3JtZXIpOworCQkJY3Vyc29yRGF0YS5wdXNoKGN1cnNvckZyYW1lKTsKKwkJCXZhciBtb3VzZUN1cnNvckRhdGE6TW91c2VDdXJzb3JEYXRhID0gbmV3IE1vdXNlQ3Vyc29yRGF0YSgpOworCQkJbW91c2VDdXJzb3JEYXRhLmRhdGEgPSBjdXJzb3JEYXRhOworCQkJbW91c2VDdXJzb3JEYXRhLmhvdFNwb3QgPSBuZXcgUG9pbnQoMTYsIDQpOworCQkJbW91c2VDdXJzb3JEYXRhLmZyYW1lUmF0ZSA9IDE7CisJCQlyZXR1cm4gbW91c2VDdXJzb3JEYXRhOworCQl9CisJCQorCQkvKioKKwkJICogQ3JlYXRlIGEgc2VsZWN0IHRhYmxlIGNvbHVtbiBjdXJzb3IKKwkJICovCisJCXB1YmxpYyBmdW5jdGlvbiBjcmVhdGVTZWxlY3RUYWJsZUNvbHVtbkN1cnNvcigpOk1vdXNlQ3Vyc29yRGF0YSB7CisJCQl2YXIgY3Vyc29yRGF0YTpWZWN0b3IuPEJpdG1hcERhdGE+ID0gbmV3IFZlY3Rvci48Qml0bWFwRGF0YT4oKTsKKwkJCXZhciBjdXJzb3JTaGFwZTpTaGFwZSA9IG5ldyBTaGFwZSgpOworCQkJY3Vyc29yU2hhcGUuZ3JhcGhpY3MuYmVnaW5GaWxsKDB4MCwgMSApOworCQkJY3Vyc29yU2hhcGUuZ3JhcGhpY3MubGluZVN0eWxlKDAsIDB4RkZGRkZGLCAxLCB0cnVlICk7CisJCQljdXJzb3JTaGFwZS5ncmFwaGljcy5kcmF3UGF0aChzZWxlY3RUYWJsZUN1cnNvckRyYXdDb21tYW5kcywgc2VsZWN0VGFibGVDdXJzb3JQb2ludHMpOworCQkJY3Vyc29yU2hhcGUuZ3JhcGhpY3MuZW5kRmlsbCgpOworCQkJdmFyIHRyYW5zZm9ybWVyOk1hdHJpeCA9IG5ldyBNYXRyaXgoKTsKKwkJCXZhciBjdXJzb3JGcmFtZTpCaXRtYXBEYXRhID0gbmV3IEJpdG1hcERhdGEoMzIsIDMyLCB0cnVlLCAwKTsKKwkJCXZhciBhbmdsZTppbnQgPSAxNjsKKwkJCXZhciByb3RhdGlvbjpOdW1iZXIgPSAwLjc4NTM5ODE2MzsKKwkJCXRyYW5zZm9ybWVyLnRyYW5zbGF0ZSgtYW5nbGUsLWFuZ2xlKTsKKwkJCXRyYW5zZm9ybWVyLnJvdGF0ZShyb3RhdGlvbiAqIDIpOworCQkJdHJhbnNmb3JtZXIudHJhbnNsYXRlKGFuZ2xlLCBhbmdsZSk7CisJCQljdXJzb3JGcmFtZS5kcmF3KGN1cnNvclNoYXBlLCB0cmFuc2Zvcm1lcik7CisJCQljdXJzb3JEYXRhLnB1c2goY3Vyc29yRnJhbWUpOworCQkJdmFyIG1vdXNlQ3Vyc29yRGF0YTpNb3VzZUN1cnNvckRhdGEgPSBuZXcgTW91c2VDdXJzb3JEYXRhKCk7CisJCQltb3VzZUN1cnNvckRhdGEuZGF0YSA9IGN1cnNvckRhdGE7CisJCQltb3VzZUN1cnNvckRhdGEuaG90U3BvdCA9IG5ldyBQb2ludCgyOCwgMTYpOworCQkJbW91c2VDdXJzb3JEYXRhLmZyYW1lUmF0ZSA9IDE7CisJCQlyZXR1cm4gbW91c2VDdXJzb3JEYXRhOworCQl9CisKICAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXh0TGF5b3V0L3NyYy9mbGFzaHgvdGV4dExheW91dC9lZGl0L1NlbGVjdGlvblN0YXRlLmFzIGIvdGV4dExheW91dC9zcmMvZmxhc2h4L3RleHRMYXlvdXQvZWRpdC9TZWxlY3Rpb25TdGF0ZS5hcwppbmRleCA0ZDUwMGU0Li4zNzlmMDIzIDEwMDY0NAotLS0gYS90ZXh0TGF5b3V0L3NyYy9mbGFzaHgvdGV4dExheW91dC9lZGl0L1NlbGVjdGlvblN0YXRlLmFzCisrKyBiL3RleHRMYXlvdXQvc3JjL2ZsYXNoeC90ZXh0TGF5b3V0L2VkaXQvU2VsZWN0aW9uU3RhdGUuYXMKQEAgLTI3LDYgKzI3LDggQEAKIAl1c2UgbmFtZXNwYWNlIHRsZl9pbnRlcm5hbDsKIAkKIAlpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQudGxmX2ludGVybmFsOworCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5lbGVtZW50cy5DZWxsUmFuZ2U7CisKIAl1c2UgbmFtZXNwYWNlIHRsZl9pbnRlcm5hbDsKIAkvKioKIAkgKiBUaGUgU2VsZWN0aW9uU3RhdGUgY2xhc3MgcmVwcmVzZW50cyBhIHNlbGVjdGlvbiBpbiBhIHRleHQgZmxvdy4gIApAQCAtNDksNiArNTEsOCBAQAogCQkvKiogRm9ybWF0IHRoYXQgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgY2FyZXQgcG9zaXRpb24gJiB3aWxsIGJlIGFwcGxpZWQgdG8gaW5zZXJ0ZWQgdGV4dCAqLwogCQlwcml2YXRlIHZhciBfcG9pbnRGb3JtYXQ6SVRleHRMYXlvdXRGb3JtYXQ7CiAJCQorCQlwcml2YXRlIHZhciBfY2VsbFJhbmdlOkNlbGxSYW5nZTsKKwkJCiAJCXByaXZhdGUgdmFyIF9zZWxlY3Rpb25NYW5hZ2VyT3BlcmF0aW9uU3RhdGU6Qm9vbGVhbjsKIAogCQkvKiogCkBAIC03MiwxMSArNzYsMTIgQEAKIAkJICogQHBsYXllcnZlcnNpb24gQUlSIDEuNQogIAkgCSAqIEBsYW5ndmVyc2lvbiAzLjAKIAkJICovCQkKLQkJcHVibGljIGZ1bmN0aW9uIFNlbGVjdGlvblN0YXRlKHJvb3Q6VGV4dEZsb3csYW5jaG9yUG9zaXRpb246aW50LGFjdGl2ZVBvc2l0aW9uOmludCxmb3JtYXQ6SVRleHRMYXlvdXRGb3JtYXQgPSBudWxsKQorCQlwdWJsaWMgZnVuY3Rpb24gU2VsZWN0aW9uU3RhdGUocm9vdDpUZXh0RmxvdyxhbmNob3JQb3NpdGlvbjppbnQsYWN0aXZlUG9zaXRpb246aW50LGZvcm1hdDpJVGV4dExheW91dEZvcm1hdCA9IG51bGwsY2VsbFJhbmdlOkNlbGxSYW5nZSA9IG51bGwpCiAJCXsKIAkJCXN1cGVyKHJvb3QsIGFuY2hvclBvc2l0aW9uLCBhY3RpdmVQb3NpdGlvbik7CiAJCQlpZiAoZm9ybWF0KQogCQkJCV9wb2ludEZvcm1hdCA9IGZvcm1hdDsKKwkJCV9jZWxsUmFuZ2UgPSBjZWxsUmFuZ2U7CiAJCX0KIAkJCiAJCS8qKiAKQEAgLTEyNiw1ICsxMzEsMjAgQEAKIAkJLyoqIEBwcml2YXRlICovCiAJCXRsZl9pbnRlcm5hbCBmdW5jdGlvbiBjbG9uZSgpOlNlbGVjdGlvblN0YXRlCiAJCXsgcmV0dXJuIG5ldyBTZWxlY3Rpb25TdGF0ZSh0ZXh0RmxvdyxhbmNob3JQb3NpdGlvbixhY3RpdmVQb3NpdGlvbixwb2ludEZvcm1hdCk7IH0KKworCQkvKiogUmFuZ2Ugb2YgdGFibGUgY2VsbHMgaW4gc2VsZWN0aW9uIChudWxsIGlmIG5vIGNlbGxzIHNlbGVjdGVkKSovCisJCXB1YmxpYyBmdW5jdGlvbiBnZXQgY2VsbFJhbmdlKCk6Q2VsbFJhbmdlDQorCQl7CisJCQlyZXR1cm4gX2NlbGxSYW5nZTsKKwkJfQorCisJCS8qKgorCQkgKiBAcHJpdmF0ZQorCQkgKi8NCisJCXB1YmxpYyBmdW5jdGlvbiBzZXQgY2VsbFJhbmdlKHZhbHVlOkNlbGxSYW5nZSk6dm9pZA0KKwkJeworCQkJX2NlbGxSYW5nZSA9IHZhbHVlOworCQl9CisKIAl9CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGV4dExheW91dC9zcmMvZmxhc2h4L3RleHRMYXlvdXQvZWRpdC9TZWxlY3Rpb25UeXBlLmFzIGIvdGV4dExheW91dC9zcmMvZmxhc2h4L3RleHRMYXlvdXQvZWRpdC9TZWxlY3Rpb25UeXBlLmFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxODhiYjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXh0TGF5b3V0L3NyYy9mbGFzaHgvdGV4dExheW91dC9lZGl0L1NlbGVjdGlvblR5cGUuYXMKQEAgLTAsMCArMSwzMCBAQAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisvLyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisvLyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorLy8gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisvLyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKy8vICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworcGFja2FnZSBmbGFzaHgudGV4dExheW91dC5lZGl0Cit7CisJcHVibGljIGNsYXNzIFNlbGVjdGlvblR5cGUKKwl7CisJCXB1YmxpYyBzdGF0aWMgY29uc3QgVEVYVDpTdHJpbmcgPSAidGV4dCI7CisJCXB1YmxpYyBzdGF0aWMgY29uc3QgQ0VMTFM6U3RyaW5nID0gImNlbGxzIjsKKwkJcHVibGljIHN0YXRpYyBjb25zdCBOT05FOlN0cmluZyA9ICJub25lIjsKKwkJcHVibGljIGZ1bmN0aW9uIFNlbGVjdGlvblR5cGUoKQorCQl7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS90ZXh0TGF5b3V0L3NyYy9mbGFzaHgvdGV4dExheW91dC9lZGl0L1RleHRGbG93RWRpdC5hcyBiL3RleHRMYXlvdXQvc3JjL2ZsYXNoeC90ZXh0TGF5b3V0L2VkaXQvVGV4dEZsb3dFZGl0LmFzCmluZGV4IDM0N2FhNTMuLjIzNWNkMDggMTAwNjQ0Ci0tLSBhL3RleHRMYXlvdXQvc3JjL2ZsYXNoeC90ZXh0TGF5b3V0L2VkaXQvVGV4dEZsb3dFZGl0LmFzCisrKyBiL3RleHRMYXlvdXQvc3JjL2ZsYXNoeC90ZXh0TGF5b3V0L2VkaXQvVGV4dEZsb3dFZGl0LmFzCkBAIC0xMTE0LDEwICsxMTE0LDE0IEBACiAJCS8qKiBpZiBwYXJlbnQgaXMgYSBzaW5nbGV0b24gZWxlbWVudCwgZGVsZXRlcyBpdCwgdGhlbiByZXBlYXRzIGRlbGV0aW9uIG9mIHNpbmdsZXRvbnMgdXAgdGhlIHBhcmVudCBjaGFpbi4gIFVzZWQgYWZ0ZXIgcGFyYWdyYXBoIG1lcmdlLiAqLwogCQl0bGZfaW50ZXJuYWwgc3RhdGljIGZ1bmN0aW9uIHJlbW92ZUVtcHR5UGFyZW50Q2hhaW4ocGFyZW50OkZsb3dHcm91cEVsZW1lbnQpOklNZW1lbnRvCiAJCXsKKwkJCWlmKHBhcmVudCBpcyBQYXJhZ3JhcGhFbGVtZW50KQorCQkJCVBhcmFncmFwaEVsZW1lbnQocGFyZW50KS5yZW1vdmVFbXB0eVRlcm1pbmF0b3IoKTsKIAkJCXZhciBtZW1lbnRvTGlzdDpNZW1lbnRvTGlzdCA9IG5ldyBNZW1lbnRvTGlzdChwYXJlbnQuZ2V0VGV4dEZsb3coKSk7CiAJCQl3aGlsZShwYXJlbnQgJiYgKHBhcmVudC5udW1DaGlsZHJlbiA9PSAwKSkKIAkJCXsKIAkJCQl2YXIgZ3JhbmRQYXJlbnQ6Rmxvd0dyb3VwRWxlbWVudCA9IHBhcmVudC5wYXJlbnQ7CisJCQkJaWYoZ3JhbmRQYXJlbnQgaXMgUGFyYWdyYXBoRWxlbWVudCkKKwkJCQkJUGFyYWdyYXBoRWxlbWVudChncmFuZFBhcmVudCkucmVtb3ZlRW1wdHlUZXJtaW5hdG9yKCk7CiAJCQkJaWYoZ3JhbmRQYXJlbnQpCiAJCQkJewogCQkJCQl2YXIgcGFyZW50SWR4OmludCA9IGdyYW5kUGFyZW50LmdldENoaWxkSW5kZXgocGFyZW50KTsKZGlmZiAtLWdpdCBhL3RleHRMYXlvdXQvc3JjL2ZsYXNoeC90ZXh0TGF5b3V0L2VsZW1lbnRzL0JhY2tncm91bmRNYW5hZ2VyLmFzIGIvdGV4dExheW91dC9zcmMvZmxhc2h4L3RleHRMYXlvdXQvZWxlbWVudHMvQmFja2dyb3VuZE1hbmFnZXIuYXMKaW5kZXggYWRlZTM2My4uYjI5YWNjZiAxMDA2NDQKLS0tIGEvdGV4dExheW91dC9zcmMvZmxhc2h4L3RleHRMYXlvdXQvZWxlbWVudHMvQmFja2dyb3VuZE1hbmFnZXIuYXMKKysrIGIvdGV4dExheW91dC9zcmMvZmxhc2h4L3RleHRMYXlvdXQvZWxlbWVudHMvQmFja2dyb3VuZE1hbmFnZXIuYXMKQEAgLTMyLDYgKzMyLDcgQEAKIAlpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQuY29tcG9zZS5QYXJjZWxMaXN0OwogCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5jb21wb3NlLlN0YW5kYXJkRmxvd0NvbXBvc2VyOwogCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5jb21wb3NlLlRleHRGbG93TGluZTsKKwlpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQuY29tcG9zZS5UZXh0Rmxvd1RhYmxlQmxvY2s7CiAJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmNvbnRhaW5lci5Db250YWluZXJDb250cm9sbGVyOwogCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5jb250YWluZXIuVGV4dENvbnRhaW5lck1hbmFnZXI7CiAJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmRlYnVnLmFzc2VydDsKQEAgLTQ1LDcgKzQ2LDYgQEAKIAkKIAl1c2UgbmFtZXNwYWNlIHRsZl9pbnRlcm5hbDsKIAkKLQlbRXhjbHVkZUNsYXNzXQogCS8qKiBAcHJpdmF0ZSBNYW5hZ2VzIGJvdW5kcyBjYWxjdWxhdGlvbiBhbmQgcmVuZGVyaW5nIG9mIGJhY2tncm91bmRDb2xvciBjaGFyYWN0ZXIgZm9ybWF0LiAqLwogCXB1YmxpYyBjbGFzcyBCYWNrZ3JvdW5kTWFuYWdlcgogCXsKQEAgLTEwOSw2ICsxMDksMzQgQEAKIAkJCX0KIAkJfQogCQkKKwkJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjb2xsZWN0VGFibGVCbG9jayhfdGV4dEZsb3c6VGV4dEZsb3csYmxvY2s6VGV4dEZsb3dUYWJsZUJsb2NrLGNvbnRyb2xsZXI6Q29udGFpbmVyQ29udHJvbGxlcik6dm9pZAorCQl7CisJCQkvLyBhZGQgYmxvY2sgcmVjdCBmb3IgZWFjaCBjZWxsIGluIHRhYmxlIGJsb2NrCisJCQkKKwkJCXZhciBiYjpCYWNrZ3JvdW5kTWFuYWdlcjsKKwkJCXZhciByOlJlY3RhbmdsZTsKKwkJCXZhciBjb21wb3NlcjpJRmxvd0NvbXBvc2VyOworCisJCQl2YXIgY2VsbHM6VmVjdG9yLjxUYWJsZUNlbGxFbGVtZW50PiA9IGJsb2NrLmdldFRhYmxlQ2VsbHMoKTsKKwkJCWZvciBlYWNoKHZhciBjZWxsOlRhYmxlQ2VsbEVsZW1lbnQgaW4gY2VsbHMpeworCQkJCWlmKEJhY2tncm91bmRNYW5hZ2VyLmhhc0JvcmRlck9yQmFja2dyb3VuZChjZWxsKSkKKwkJCQl7CisJCQkJCWlmKCFfdGV4dEZsb3cuYmFja2dyb3VuZE1hbmFnZXIpCisJCQkJCQlfdGV4dEZsb3cuZ2V0QmFja2dyb3VuZE1hbmFnZXIoKTsKKwkJCQkJYmIgPSBfdGV4dEZsb3cuYmFja2dyb3VuZE1hbmFnZXI7CisKKwkJCQkJYmIuYWRkQmxvY2tFbGVtZW50KGNlbGwpOworCisJCQkJCXZhciByb3c6VGFibGVSb3dFbGVtZW50ID0gY2VsbC5nZXRSb3coKTsKKwkJCQkJciA9IG5ldyBSZWN0YW5nbGUoY2VsbC54LCBjZWxsLnkgKyBibG9jay55LCBjZWxsLndpZHRoLCByb3cuY29tcG9zZWRIZWlnaHQpOworCQkJCQliYi5hZGRCbG9ja1JlY3QoY2VsbCwgciwgY29udHJvbGxlcik7CisKKwkJCQl9CisJCQl9CisJCQlibG9jay55OworCQkJCisJCX0KKwkJCiAJCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY29sbGVjdEJsb2NrKF90ZXh0RmxvdzpUZXh0RmxvdywgZWxlbTpGbG93R3JvdXBFbGVtZW50LCBfcGFyY2VsTGlzdDpQYXJjZWxMaXN0ID0gbnVsbCwgdGFibGVDb21wb3NlTm90RnJvbUJlZ2lubmluZzpCb29sZWFuID0gZmFsc2UsIHRhYmxlT3V0T2ZWaWV3OkJvb2xlYW4gPSBmYWxzZSk6dm9pZAogCQl7CiAJCQl2YXIgYmI6QmFja2dyb3VuZE1hbmFnZXI7CkBAIC0xMTgsNjEgKzE0Niw4IEBACiAKIAkJCWlmKGVsZW0pCiAJCQl7Ci0JCQkJLy9UaGUgaGVpZ2h0IG9mIFRhYmxlRGF0YUNlbGxFbGVtZW50IGNhbiBvbmx5IGJlIGlkZW50aWZpZWQgYWZ0ZXIgYWxsIHRoZSBjZWxscyBpbiB0aGUgcm93IGFyZSBjb21wb3NlZC4KLQkJCQkvL1NvLCBwaWNrIGl0IG91dCBvZiB0aGUgY29tbW9uIHByb2Nlc3MgCi0JCQkJaWYoZWxlbSBpcyBUYWJsZVJvd0VsZW1lbnQpCi0JCQkJewotCQkJCQl2YXIgdGFiUm93OlRhYmxlUm93RWxlbWVudCA9IGVsZW0gYXMgVGFibGVSb3dFbGVtZW50OwotCQkJCQkvL2ZvciB0YWJsZSBjZWxscwotCQkJCQl2YXIgY2VsbDpUYWJsZURhdGFDZWxsRWxlbWVudDsKLQkJCQkJdmFyIGNlbGxQYXJjZWw6UGFyY2VsOwotCQkJCQlmb3IodmFyIGNJZHg6TnVtYmVyID0gMDsgY0lkeCA8IGVsZW0ubnVtQ2hpbGRyZW47IGNJZHgrKykKLQkJCQkJewotCQkJCQkJY2VsbCA9IGVsZW0uZ2V0Q2hpbGRBdChjSWR4KSBhcyBUYWJsZURhdGFDZWxsRWxlbWVudDsKLQkJCQkJCWlmKEJhY2tncm91bmRNYW5hZ2VyLmhhc0JvcmRlck9yQmFja2dyb3VuZChjZWxsKSB8fCBCYWNrZ3JvdW5kTWFuYWdlci5oYXNCb3JkZXJPckJhY2tncm91bmQoZWxlbSkpCi0JCQkJCQl7Ci0JCQkJCQkJLy9tYXJrIHRoZSBwYXJhZ3JhcGggdGhhdCBoYXMgYm9yZGVyIG9yIGJhY2tncm91bmQKLQkJCQkJCQlpZighX3RleHRGbG93LmJhY2tncm91bmRNYW5hZ2VyKQotCQkJCQkJCQlfdGV4dEZsb3cuZ2V0QmFja2dyb3VuZE1hbmFnZXIoKTsKLQkJCQkJCQliYiA9IF90ZXh0Rmxvdy5iYWNrZ3JvdW5kTWFuYWdlcjsKLQkJCQkJCQkKLQkJCQkJCQkvL0JhY2tncm91bmRNYW5hZ2VyIHNob3VsZCBub3QgYmUgbnVsbCBoZXJlCi0JCQkJCQkJQ09ORklHOjpkZWJ1ZyB7IGFzc2VydChfdGV4dEZsb3cuYmFja2dyb3VuZE1hbmFnZXIgIT0gbnVsbCAsIkJhY2tncm91bmRNYW5hZ2VyIHNob3VsZCBub3QgYmUgbnVsbCIpOyB9Ci0JCQkJCQkJCi0JCQkJCQkJYmIuYWRkQmxvY2tFbGVtZW50KGNlbGwpOwotCQkJCQkJCQotCQkJCQkJCWNlbGxQYXJjZWwgPSBfcGFyY2VsTGlzdC5nZXRQYXJjZWxBdChjZWxsLnBhcmNlbEluZGV4KTsKLQkJCQkJCQlpZihjZWxsUGFyY2VsKQotCQkJCQkJCXsKLQkJCQkJCQkJciA9IG5ldyBSZWN0YW5nbGUoY2VsbC54LCBjZWxsLnksIGNlbGwud2lkdGgsIHRhYlJvdy5oZWlnaHQpOwotCQkJCQkJCQliYi5hZGRCbG9ja1JlY3QoY2VsbCwgciwgY2VsbFBhcmNlbC5jb250cm9sbGVyKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCS8vZm9yIHRhYmxlIHJvd3MKLQkJCQkJLyppZihCYWNrZ3JvdW5kTWFuYWdlci5oYXNCb3JkZXJPckJhY2tncm91bmQoZWxlbSkpCi0JCQkJCXsKLQkJCQkJCS8vbWFyayB0aGUgcGFyYWdyYXBoIHRoYXQgaGFzIGJvcmRlciBvciBiYWNrZ3JvdW5kCi0JCQkJCQlpZighX3RleHRGbG93LmJhY2tncm91bmRNYW5hZ2VyKQotCQkJCQkJCV90ZXh0Rmxvdy5nZXRCYWNrZ3JvdW5kTWFuYWdlcigpOwotCQkJCQkJYmIgPSBfdGV4dEZsb3cuYmFja2dyb3VuZE1hbmFnZXI7Ci0JCQkJCQkKLQkJCQkJCS8vQmFja2dyb3VuZE1hbmFnZXIgc2hvdWxkIG5vdCBiZSBudWxsIGhlcmUKLQkJCQkJCUNPTkZJRzo6ZGVidWcgeyBhc3NlcnQoX3RleHRGbG93LmJhY2tncm91bmRNYW5hZ2VyICE9IG51bGwgLCJCYWNrZ3JvdW5kTWFuYWdlciBzaG91bGQgbm90IGJlIG51bGwiKTsgfQotCQkJCQkJCi0JCQkJCQliYi5hZGRCbG9ja0VsZW1lbnQoZWxlbSk7Ci0JCQkJCQkKLQkJCQkJCXZhciBwYXJlbnRUYWJsZTpUYWJsZUVsZW1lbnQgPSBlbGVtLnBhcmVudCBhcyBUYWJsZUVsZW1lbnQ7Ci0JCQkJCQl2YXIgcm93UGFyY2VsOlBhcmNlbCA9IF9wYXJjZWxMaXN0LmdldFBhcmNlbEF0KHRhYlJvdy5wYXJjZWxJbmRleCk7Ci0JCQkJCQlpZihwYXJlbnRUYWJsZSAmJiByb3dQYXJjZWwpewotCQkJCQkJCXIgPSBuZXcgUmVjdGFuZ2xlKHBhcmVudFRhYmxlLnggKyByb3dQYXJjZWwueCwgdGFiUm93LnkgKyByb3dQYXJjZWwueSwgcGFyZW50VGFibGUuY29tcHV0ZWRXaWR0aCwgdGFiUm93LmhlaWdodCk7Ci0JCQkJCQkJYmIuYWRkQmxvY2tSZWN0KGVsZW0sIHIsIHJvd1BhcmNlbC5jb250cm9sbGVyKTsKLQkJCQkJCX0KLQkJCQkJfSovCi0JCQkJfQotCQkJCS8vZm9yIHRoZSBvdGhlciBlbGVtZW50cwotCQkJCWVsc2UgaWYoQmFja2dyb3VuZE1hbmFnZXIuaGFzQm9yZGVyT3JCYWNrZ3JvdW5kKGVsZW0pKQorCisJCQkJaWYoQmFja2dyb3VuZE1hbmFnZXIuaGFzQm9yZGVyT3JCYWNrZ3JvdW5kKGVsZW0pKQogCQkJCXsKIAkJCQkJLy9tYXJrIHRoZSBwYXJhZ3JhcGggdGhhdCBoYXMgYm9yZGVyIG9yIGJhY2tncm91bmQKIAkJCQkJaWYoIV90ZXh0Rmxvdy5iYWNrZ3JvdW5kTWFuYWdlcikKQEAgLTE4OSw2MSArMTY0LDkgQEAKIAkJCQkJewogCQkJCQkJaWYoZWxlbSBpcyBUYWJsZUVsZW1lbnQpCiAJCQkJCQl7CisJCQkJCQkJLy8gRG8gd2UgbmVlZCB0byBkbyBhbnl0aGluZyBmb3IgdGFibGUgZWxlbWVudHM/IE5vdCBzdXJlLi4uCiAJCQkJCQkJdmFyIHRhYjpUYWJsZUVsZW1lbnQgPSBlbGVtIGFzIFRhYmxlRWxlbWVudDsKLQkJCQkJCQl2YXIgcGFyY2VsOlBhcmNlbDsKLQkJCQkJCQlpZih0YWIubnVtQWNyb3NzUGFyY2VscyA9PSAwKQotCQkJCQkJCXsKLQkJCQkJCQkJciA9IG5ldyBSZWN0YW5nbGUoKTsKLQkJCQkJCQkJcGFyY2VsID0gX3BhcmNlbExpc3QuZ2V0UGFyY2VsQXQodGFiLm9yaWdpblBhcmNlbEluZGV4KTsKLQkJCQkJCQkJaWYocGFyY2VsKQotCQkJCQkJCQl7Ci0JCQkJCQkJCQlpZih0YWJsZUNvbXBvc2VOb3RGcm9tQmVnaW5uaW5nKQotCQkJCQkJCQkJewotCQkJCQkJCQkJCXIueCA9IHBhcmNlbC54OwotCQkJCQkJCQkJCXIueSA9IHBhcmNlbC55OwotCQkJCQkJCQkJfQotCQkJCQkJCQkJZWxzZQotCQkJCQkJCQkJewotCQkJCQkJCQkJCXIueCA9IHRhYi54OwotCQkJCQkJCQkJCXIueSA9IHRhYi55OwotCQkJCQkJCQkJfQotCQkJCQkJCQkJci53aWR0aCA9IHRhYi5jb21wdXRlZFdpZHRoOwotCQkJCQkJCQkJci5oZWlnaHQgPSB0YWIuaGVpZ2h0OwotCQkJCQkJCQkJYmIuYWRkQmxvY2tSZWN0KGVsZW0sIHIsIHBhcmNlbC5jb250cm9sbGVyKTsKLQkJCQkJCQkJfQotCQkJCQkJCX1lbHNlCi0JCQkJCQkJewotCQkJCQkJCQlmb3IodmFyIHRJZHg6TnVtYmVyID0gMDsgdElkeCA8PSB0YWIubnVtQWNyb3NzUGFyY2VsczsgdElkeCsrKQotCQkJCQkJCQl7Ci0JCQkJCQkJCQlyID0gbmV3IFJlY3RhbmdsZSgpOwotCQkJCQkJCQkJcGFyY2VsID0gX3BhcmNlbExpc3QuZ2V0UGFyY2VsQXQodGFiLm9yaWdpblBhcmNlbEluZGV4ICsgdElkeCk7Ci0JCQkJCQkJCQlpZihwYXJjZWwpCi0JCQkJCQkJCQl7Ci0JCQkJCQkJCQkJaWYodElkeCA9PSAwICYmICF0YWJsZUNvbXBvc2VOb3RGcm9tQmVnaW5uaW5nKQotCQkJCQkJCQkJCXsKLQkJCQkJCQkJCQkJci54ID0gdGFiLng7Ci0JCQkJCQkJCQkJCXIueSA9IHRhYi55OwotCQkJCQkJCQkJCQlyLndpZHRoID0gdGFiLmNvbXB1dGVkV2lkdGg7Ci0JCQkJCQkJCQkJCXIuaGVpZ2h0ID0gdGFiLmhlaWdodEFycmF5W3RJZHhdOwotCQkJCQkJCQkJCQliYi5hZGRCbG9ja1JlY3QoZWxlbSwgciwgcGFyY2VsLmNvbnRyb2xsZXIsIEJhY2tncm91bmRNYW5hZ2VyLkJPVFRPTV9FWENMVURFRCk7Ci0JCQkJCQkJCQkJfWVsc2UgaWYgKHRJZHggPT0gdGFiLm51bUFjcm9zc1BhcmNlbHMgJiYgIXRhYmxlT3V0T2ZWaWV3KQotCQkJCQkJCQkJCXsKLQkJCQkJCQkJCQkJci54ID0gcGFyY2VsLnggKyB0YWIuY29tcHV0ZWRGb3JtYXQubWFyZ2luTGVmdDsKLQkJCQkJCQkJCQkJci55ID0gcGFyY2VsLnk7Ci0JCQkJCQkJCQkJCXIud2lkdGggPSB0YWIuY29tcHV0ZWRXaWR0aDsKLQkJCQkJCQkJCQkJci5oZWlnaHQgPSB0YWIudG90YWxSb3dEZXB0aDsKLQkJCQkJCQkJCQkJYmIuYWRkQmxvY2tSZWN0KGVsZW0sIHIsIHBhcmNlbC5jb250cm9sbGVyLCBCYWNrZ3JvdW5kTWFuYWdlci5UT1BfRVhDTFVERUQpOwotCQkJCQkJCQkJCX1lbHNlCi0JCQkJCQkJCQkJewotCQkJCQkJCQkJCQlyLnggPSBwYXJjZWwueCArIHRhYi5jb21wdXRlZEZvcm1hdC5tYXJnaW5MZWZ0OwotCQkJCQkJCQkJCQlyLnkgPSBwYXJjZWwueTsKLQkJCQkJCQkJCQkJci53aWR0aCA9IHRhYi5jb21wdXRlZFdpZHRoOwotCQkJCQkJCQkJCQlyLmhlaWdodCA9IHRhYi5oZWlnaHRBcnJheVt0SWR4XTsKLQkJCQkJCQkJCQkJYmIuYWRkQmxvY2tSZWN0KGVsZW0sIHIsIHBhcmNlbC5jb250cm9sbGVyLCBCYWNrZ3JvdW5kTWFuYWdlci5UT1BfQU5EX0JPVFRPTV9FWENMVURFRCk7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQorCiAJCQkJCQl9CiAJCQkJCQllbHNlIC8vZm9yIGVsZW1lbnRzIGxpa2UgUGFyYWdyYXBoRWxlbWVudCwgRGl2RWxlbWVudCwgTGlzdEl0ZW1FbGVtZW50LCBMaXN0RWxlbWVudCwgVGV4dEZsb3cKIAkJCQkJCXsJCkBAIC00NjEsOCArMzg0LDkgQEAKIAkJCQkJLy9kcmF3IGJhY2tncm91bmQKIAkJCQkJaWYoc3R5bGUuYmFja2dyb3VuZENvbG9yICE9IEJhY2tncm91bmRDb2xvci5UUkFOU1BBUkVOVCkKIAkJCQkJewotCQkJCQkJZy5saW5lU3R5bGUoMCwgc3R5bGUuYmFja2dyb3VuZENvbG9yLCBzdHlsZS5iYWNrZ3JvdW5kQWxwaGEsIHRydWUpOwotCQkJCQkJZy5iZWdpbkZpbGwoc3R5bGUuYmFja2dyb3VuZENvbG9yKTsKKwkJCQkJCS8vIFRoZSB2YWx1ZSAwIGluZGljYXRlcyBoYWlybGluZSB0aGlja25lc3M7IAorCQkJCQkJZy5saW5lU3R5bGUoTmFOLCBzdHlsZS5iYWNrZ3JvdW5kQ29sb3IsIHN0eWxlLmJhY2tncm91bmRBbHBoYSwgdHJ1ZSk7CisJCQkJCQlnLmJlZ2luRmlsbChzdHlsZS5iYWNrZ3JvdW5kQ29sb3IsIHN0eWxlLmJhY2tncm91bmRBbHBoYSk7CiAJCQkJCQlnLmRyYXdSZWN0KHJlYy54LCByZWMueSwgcmVjLndpZHRoLCByZWMuaGVpZ2h0KTsKIAkJCQkJCWcuZW5kRmlsbCgpOwogCQkJCQl9CkBAIC01NzcsOCArNTAxLDkgQEAKIAkJCQkJCQkvL2RyYXcgYmFja2dyb3VuZAogCQkJCQkJCWlmKHN0eWxlLmJhY2tncm91bmRDb2xvciAhPSBCYWNrZ3JvdW5kQ29sb3IuVFJBTlNQQVJFTlQpCiAJCQkJCQkJewotCQkJCQkJCQlnLmxpbmVTdHlsZSgwLCBzdHlsZS5iYWNrZ3JvdW5kQ29sb3IsIHN0eWxlLmJhY2tncm91bmRBbHBoYSwgdHJ1ZSk7Ci0JCQkJCQkJCWcuYmVnaW5GaWxsKHN0eWxlLmJhY2tncm91bmRDb2xvcik7CisJCQkJCQkJCS8vIFRoZSB2YWx1ZSAwIGluZGljYXRlcyBoYWlybGluZSB0aGlja25lc3M7IE5hTiByZW1vdmVzIGxpbmUKKwkJCQkJCQkJZy5saW5lU3R5bGUoTmFOLCBzdHlsZS5iYWNrZ3JvdW5kQ29sb3IsIHN0eWxlLmJhY2tncm91bmRBbHBoYSwgdHJ1ZSk7CisJCQkJCQkJCWcuYmVnaW5GaWxsKHN0eWxlLmJhY2tncm91bmRDb2xvciwgc3R5bGUuYmFja2dyb3VuZEFscGhhKTsKIAkJCQkJCQkJZy5kcmF3UmVjdChyZWMueCwgcmVjLnksIHJlYy53aWR0aCwgcmVjLmhlaWdodCk7CiAJCQkJCQkJCWcuZW5kRmlsbCgpOwogCQkJCQkJCX0KQEAgLTYxOCw3ICs1NDMsMTEgQEAKIAkJCQkvL2RyYXcgYmFja2dyb3VuZCBmb3Igc3BhbgkKIAkJCQlmb3IodmFyIGNoaWxkSWR4OmludCA9IDA7IGNoaWxkSWR4PGNvbnRyb2xsZXIudGV4dExpbmVzLmxlbmd0aDsgKytjaGlsZElkeCkKIAkJCQl7Ci0JCQkJCXZhciB0bDpUZXh0TGluZSA9IGNvbnRyb2xsZXIudGV4dExpbmVzW2NoaWxkSWR4XTsKKwkJCQkJdmFyIGxpbmU6KiA9IGNvbnRyb2xsZXIudGV4dExpbmVzW2NoaWxkSWR4XTsKKwkJCQkJLy8gc2tpcCBUZXh0Rmxvd1RhYmxlQmxvY2tzCisJCQkJCWlmKCEobGluZSBpcyBUZXh0TGluZSkpCisJCQkJCQljb250aW51ZTsKKwkJCQkJdmFyIHRsOlRleHRMaW5lID0gbGluZTsKIAkJCQkJdmFyIGVudHJ5OkFycmF5ID0gX2xpbmVEaWN0W3RsXTsKIAkJCiAJCQkJCWlmIChlbnRyeSkKZGlmZiAtLWdpdCBhL3RleHRMYXlvdXQvc3JjL2ZsYXNoeC90ZXh0TGF5b3V0L2VsZW1lbnRzL0NlbGxDb250YWluZXIuYXMgYi90ZXh0TGF5b3V0L3NyYy9mbGFzaHgvdGV4dExheW91dC9lbGVtZW50cy9DZWxsQ29udGFpbmVyLmFzCmluZGV4IDMzNmRhNWEuLjI1NmM0OTUgMTAwNjQ0Ci0tLSBhL3RleHRMYXlvdXQvc3JjL2ZsYXNoeC90ZXh0TGF5b3V0L2VsZW1lbnRzL0NlbGxDb250YWluZXIuYXMKKysrIGIvdGV4dExheW91dC9zcmMvZmxhc2h4L3RleHRMYXlvdXQvZWxlbWVudHMvQ2VsbENvbnRhaW5lci5hcwpAQCAtMjAsMTMgKzIwLDM3IEBACiB7CiAJaW1wb3J0IGZsYXNoLmRpc3BsYXkuU3ByaXRlOwogCQotCXB1YmxpYyBjbGFzcyBDZWxsQ29udGFpbmVyIGV4dGVuZHMgU3ByaXRlCisJLy9pbXBvcnQgbXguY29yZS5JSU1FU3VwcG9ydDsKKwkKKwlwdWJsaWMgY2xhc3MgQ2VsbENvbnRhaW5lciBleHRlbmRzIFNwcml0ZS8vIGltcGxlbWVudHMgSUlNRVN1cHBvcnQKIAl7Ci0JCXB1YmxpYyB2YXIgdXNlckRhdGE6T2JqZWN0PW51bGw7Ci0JCQotCQlwdWJsaWMgZnVuY3Rpb24gQ2VsbENvbnRhaW5lcigpCisJCXByaXZhdGUgdmFyIF9pbWVNb2RlOlN0cmluZzsKKwkJcHJpdmF0ZSB2YXIgX2VuYWJsZUlNRTpCb29sZWFuOworCQlwdWJsaWMgdmFyIGVsZW1lbnQ6VGFibGVDZWxsRWxlbWVudDsKKworCQlwdWJsaWMgZnVuY3Rpb24gQ2VsbENvbnRhaW5lcihpbWVFbmFibGVkOkJvb2xlYW4gPSB0cnVlKQogCQl7Ci0JCQlzdXBlcigpOworCQkJX2VuYWJsZUlNRSA9IGltZUVuYWJsZWQ7CisJCX0KKwkJCisJCXB1YmxpYyBmdW5jdGlvbiBnZXQgZW5hYmxlSU1FKCk6Qm9vbGVhbgorCQl7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJCisJCXB1YmxpYyBmdW5jdGlvbiBzZXQgZW5hYmxlSU1FKHZhbHVlOkJvb2xlYW4pOnZvaWQKKwkJeworCQkJX2VuYWJsZUlNRSA9IHZhbHVlOworCQl9CisJCQorCQlwdWJsaWMgZnVuY3Rpb24gZ2V0IGltZU1vZGUoKTpTdHJpbmcKKwkJeworCQkJcmV0dXJuIF9pbWVNb2RlOworCQl9CisJCQorCQlwdWJsaWMgZnVuY3Rpb24gc2V0IGltZU1vZGUodmFsdWU6U3RyaW5nKTp2b2lkCisJCXsKKwkJCV9pbWVNb2RlID0gdmFsdWU7CiAJCX0KIAl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvdGV4dExheW91dC9zcmMvZmxhc2h4L3RleHRMYXlvdXQvZWxlbWVudHMvQ2VsbENvb3JkaW5hdGVzLmFzIGIvdGV4dExheW91dC9zcmMvZmxhc2h4L3RleHRMYXlvdXQvZWxlbWVudHMvQ2VsbENvb3JkaW5hdGVzLmFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyOGExMDAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXh0TGF5b3V0L3NyYy9mbGFzaHgvdGV4dExheW91dC9lbGVtZW50cy9DZWxsQ29vcmRpbmF0ZXMuYXMKQEAgLTAsMCArMSw4OSBAQAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisvLyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisvLyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorLy8gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisvLyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKy8vICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworcGFja2FnZSBmbGFzaHgudGV4dExheW91dC5lbGVtZW50cworeworCS8qKgorCSAqIERlc2NyaWJlcyB0aGUgbG9jYXRpb24gb2YgdGFibGUgY2VsbCBieSByb3cgYW5kIGNvbHVtbiAKKwkgKiovCisJcHVibGljIGNsYXNzIENlbGxDb29yZGluYXRlcworCXsKKwkJcHJpdmF0ZSB2YXIgX2NvbHVtbjppbnQ7CisJCXByaXZhdGUgdmFyIF9yb3c6aW50OworCQkKKwkJLyoqCisJCSAqIEBjb25zdHJ1Y3RvcgorCQkgKiovCisJCXB1YmxpYyBmdW5jdGlvbiBDZWxsQ29vcmRpbmF0ZXMocm93OmludCwgY29sdW1uOmludCwgdGFibGU6VGFibGVFbGVtZW50ID0gbnVsbCkKKwkJeworCQkJX3JvdyA9IHJvdzsKKwkJCV9jb2x1bW4gPSBjb2x1bW47CisJCQl0aGlzLnRhYmxlID0gdGFibGU7CisJCX0KKworCQkvKioKKwkJICogVGhlIGNvbHVtbiB0aGUgY2VsbCBiZWxvbmdzIHRvCisJCSAqKi8KKwkJcHVibGljIGZ1bmN0aW9uIGdldCBjb2x1bW4oKTppbnQNCisJCQl7cmV0dXJuIF9jb2x1bW47fQorCQkKKwkJLyoqCisJCSAqIEBwcml2YXRlCisJCSAqKi8KKwkJcHVibGljIGZ1bmN0aW9uIHNldCBjb2x1bW4odmFsdWU6aW50KTp2b2lkDQorCQkJe19jb2x1bW4gPSB2YWx1ZTt9CisKKwkJLyoqCisJCSAqIFRoZSByb3cgdGhlIGNlbGwgYmVsb25ncyB0bworCQkgKiovCisJCXB1YmxpYyBmdW5jdGlvbiBnZXQgcm93KCk6aW50DQorCQkJe3JldHVybiBfcm93O30KKwkJCisJCS8qKgorCQkgKiBAcHJpdmF0ZQorCQkgKiovCisJCXB1YmxpYyBmdW5jdGlvbiBzZXQgcm93KHZhbHVlOmludCk6dm9pZA0KKwkJCXtfcm93ID0gdmFsdWU7fQorCQkKKwkJLyoqCisJCSAqIENoZWNrcyBpZiB0d28gY29vcmRpYXRlcyBhcmUgaW4gdGhlIHNhbWUgbG9jYXRpb24KKwkJICoqLworCQlwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGFyZUVxdWFsKGNvb3JkczE6Q2VsbENvb3JkaW5hdGVzLCBjb29yZHMyOkNlbGxDb29yZGluYXRlcyk6Qm9vbGVhbgorCQl7CisJCQlyZXR1cm4gY29vcmRzMS5yb3cgPT0gY29vcmRzMi5yb3cgJiYgY29vcmRzMS5jb2x1bW4gPT0gY29vcmRzMi5jb2x1bW47CisJCX0KKwkJCisJCS8qKgorCQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGNvbHVtbiBhbmQgcm93IGFyZSBncmVhdGVyIHRoYW4gLTEKKwkJICoqLworCQlwdWJsaWMgZnVuY3Rpb24gaXNWYWxpZCgpOkJvb2xlYW4KKwkJeworCQkJcmV0dXJuIGNvbHVtbiA+IC0xICYmIHJvdyA+IC0xOworCQl9CisJCQorCQkvKioKKwkJICogQ3JlYXRlcyBhIG5ldyBDZWxsQ29vcmRpbmF0ZXMgd2l0aCB0aGUgc2FtZSByb3cgYW5kIGNvbHVtbiB2YWx1ZXMKKwkJICoqLworCQlwdWJsaWMgZnVuY3Rpb24gY2xvbmUoKTpDZWxsQ29vcmRpbmF0ZXMKKwkJeworCQkJcmV0dXJuIG5ldyBDZWxsQ29vcmRpbmF0ZXMocm93LCBjb2x1bW4pOworCQl9CisKKwkJcHVibGljIHZhciB0YWJsZTpUYWJsZUVsZW1lbnQ7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RleHRMYXlvdXQvc3JjL2ZsYXNoeC90ZXh0TGF5b3V0L2VsZW1lbnRzL0NlbGxSYW5nZS5hcyBiL3RleHRMYXlvdXQvc3JjL2ZsYXNoeC90ZXh0TGF5b3V0L2VsZW1lbnRzL0NlbGxSYW5nZS5hcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTgzMDAzCi0tLSAvZGV2L251bGwKKysrIGIvdGV4dExheW91dC9zcmMvZmxhc2h4L3RleHRMYXlvdXQvZWxlbWVudHMvQ2VsbFJhbmdlLmFzCkBAIC0wLDAgKzEsMTUwIEBACisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKy8vICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKy8vICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisvLyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKy8vICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorLy8gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3BhY2thZ2UgZmxhc2h4LnRleHRMYXlvdXQuZWxlbWVudHMKK3sKKwlpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQudGxmX2ludGVybmFsOworCQorCXVzZSBuYW1lc3BhY2UgdGxmX2ludGVybmFsOworCQorCS8qKgorCSAqIEEgcmVhZCBvbmx5IGNsYXNzIHRoYXQgZGVzY3JpYmVzIGEgcmFuZ2Ugb2YgY29udGlndW91cyB0YWJsZSBjZWxscy4gU3VjaCBhIHJhbmdlIG9jY3VycyB3aGVuIHlvdSBzZWxlY3QgYQorCSAqIHNlY3Rpb24gb2YgdGFibGUgY2VsbHMuIFRoZSByYW5nZSBjb25zaXN0cyBvZiB0aGUgYW5jaG9yIHBvaW50IG9mIHRoZSBzZWxlY3Rpb24sIDxjb2RlPmFuY2hvclBvc2l0aW9uPC9jb2RlPiwKKwkgKiBhbmQgdGhlIHBvaW50IHRoYXQgaXMgdG8gYmUgbW9kaWZpZWQgYnkgYWN0aW9ucywgPGNvZGU+YWN0aXZlUG9zaXRpb248L2NvZGU+LiAgQXMgYmxvY2sgc2VsZWN0aW9ucyBhcmUgCisJICogbW9kaWZpZWQgYW5kIGV4dGVuZGVkIDxjb2RlPmFuY2hvclBvc2l0aW9uPC9jb2RlPiByZW1haW5zIGZpeGVkIGFuZCA8Y29kZT5hY3RpdmVQb3NpdGlvbjwvY29kZT4gaXMgbW9kaWZpZWQuICAKKwkgKiBUaGUgYW5jaG9yIHBvc2l0aW9uIG1heSBiZSBwbGFjZWQgaW4gdGhlIHRleHQgYmVmb3JlIG9yIGFmdGVyIHRoZSBhY3RpdmUgcG9zaXRpb24uCisJICogQHBsYXllcnZlcnNpb24gRmxhc2ggMTAKKwkgKiBAcGxheWVydmVyc2lvbiBBSVIgMS41CisJICogQGxhbmd2ZXJzaW9uIDMuMAorCSAqCisJICogQHNlZSBmbGFzaHgudGV4dExheW91dC5lbGVtZW50cy5UZXh0RmxvdyBUZXh0RmxvdworCSAqIEBzZWUgZmxhc2h4LnRleHRMYXlvdXQuZWRpdC5TZWxlY3Rpb25TdGF0ZSBTZWxlY3Rpb25TdGF0ZQorCSAqLworCXB1YmxpYyBjbGFzcyBDZWxsUmFuZ2UKKwl7CisJCQorCQlwcml2YXRlIHZhciBfdGFibGU6VGFibGVFbGVtZW50CisJCQorCQkvLyBjdXJyZW50IHJhbmdlIG9mIHNlbGVjdGlvbgorCQlwcml2YXRlIHZhciBfYW5jaG9yQ29vcmRzOkNlbGxDb29yZGluYXRlczsKKwkJcHJpdmF0ZSB2YXIgX2FjdGl2ZUNvb3JkczpDZWxsQ29vcmRpbmF0ZXM7CisJCQorCQkvKioKKwkJICogTGltaXRzIHRoZSByb3cgYW5kIGNvbHVtbiB2YWx1ZXMgdG8gMCBvciB0aGUgbnVtYmVyIG9mIHJvd3Mgb3IgY29sdW1uLiAKKwkJICoqLworCQlwcml2YXRlIGZ1bmN0aW9uIGNsYW1wVG9SYW5nZShjb29yZHM6Q2VsbENvb3JkaW5hdGVzKTpDZWxsQ29vcmRpbmF0ZXMKKwkJeworCQkJaWYoY29vcmRzID09IG51bGwpCisJCQkJcmV0dXJuIG51bGw7CisJCQlpZiAoY29vcmRzLnJvdyA8IDApCisJCQkJY29vcmRzLnJvdyA9IDA7CisJCQlpZiAoY29vcmRzLmNvbHVtbiA8IDApCisJCQkJY29vcmRzLmNvbHVtbiA9IDA7CisJCQlpZihfdGFibGUgPT0gbnVsbCkKKwkJCQlyZXR1cm4gY29vcmRzOworCQkJCisJCQlpZiAoY29vcmRzLnJvdyA+PSBfdGFibGUubnVtUm93cykKKwkJCQljb29yZHMucm93ID0gX3RhYmxlLm51bVJvd3MtMTsKKwkJCWlmIChjb29yZHMuY29sdW1uID49IF90YWJsZS5udW1Db2x1bW5zKQorCQkJCWNvb3Jkcy5jb2x1bW4gPSBfdGFibGUubnVtQ29sdW1ucy0xOworCQkJcmV0dXJuIGNvb3JkczsKKwkJfQorCisJCXB1YmxpYyBmdW5jdGlvbiBDZWxsUmFuZ2UodGFibGU6VGFibGVFbGVtZW50LCBhbmNob3JDb29yZHM6Q2VsbENvb3JkaW5hdGVzLCBhY3RpdmVDb29yZHM6Q2VsbENvb3JkaW5hdGVzKQorCQl7CisJCQlfdGFibGUgPSB0YWJsZTsKKwkJCV9hbmNob3JDb29yZHMgPSBjbGFtcFRvUmFuZ2UoYW5jaG9yQ29vcmRzKTsKKwkJCV9hY3RpdmVDb29yZHMgPSBjbGFtcFRvUmFuZ2UoYWN0aXZlQ29vcmRzKTsKKwkJCQorCQl9CisJCQorCQkvKiogCisJCSAqIFVwZGF0ZSB0aGUgcmFuZ2Ugd2l0aCBuZXcgYW5jaG9yIG9yIGFjdGl2ZSBwb3NpdGlvbiB2YWx1ZXMuCisJCSAqCisJCSAqIEBwbGF5ZXJ2ZXJzaW9uIEZsYXNoIDEwCisJCSAqIEBwbGF5ZXJ2ZXJzaW9uIEFJUiAxLjUKKwkJICogQGxhbmd2ZXJzaW9uIDMuMAorCQkgKiAgQHBhcmFtIG5ld0FuY2hvclBvc2l0aW9uCXRoZSBhbmNob3IgaW5kZXggb2YgdGhlIHNlbGVjdGlvbi4KKwkJICogIEBwYXJhbSBuZXdBY3RpdmVQb3NpdGlvbgl0aGUgYWN0aXZlIGluZGV4IG9mIHRoZSBzZWxlY3Rpb24uCisJCSAqICBAcmV0dXJuIHRydWUgaWYgc2VsZWN0aW9uIGlzIGNoYW5nZWQuCisJCSAqLworCQlwdWJsaWMgZnVuY3Rpb24gdXBkYXRlUmFuZ2UobmV3QW5jaG9yQ29vcmRpbmF0ZXM6Q2VsbENvb3JkaW5hdGVzLCBuZXdBY3RpdmVDb29yZGluYXRlczpDZWxsQ29vcmRpbmF0ZXMpOkJvb2xlYW4KKwkJeworCQkJY2xhbXBUb1JhbmdlKG5ld0FuY2hvckNvb3JkaW5hdGVzKTsKKwkJCWNsYW1wVG9SYW5nZShuZXdBY3RpdmVDb29yZGluYXRlcyk7CisJCQkKKwkJCWlmICghQ2VsbENvb3JkaW5hdGVzLmFyZUVxdWFsKF9hbmNob3JDb29yZHMsIG5ld0FuY2hvckNvb3JkaW5hdGVzKSB8fCAhQ2VsbENvb3JkaW5hdGVzLmFyZUVxdWFsKF9hY3RpdmVDb29yZHMsIG5ld0FjdGl2ZUNvb3JkaW5hdGVzKSkKKwkJCXsKKwkJCQlfYW5jaG9yQ29vcmRzID0gbmV3QW5jaG9yQ29vcmRpbmF0ZXM7CisJCQkJX2FjdGl2ZUNvb3JkcyA9IG5ld0FjdGl2ZUNvb3JkaW5hdGVzOworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJLyoqIFRoZSBUYWJsZUVsZW1lbnQgb2YgdGhlIHNlbGVjdGlvbi4KKwkJICovCisJCXB1YmxpYyBmdW5jdGlvbiBnZXQgdGFibGUoKTpUYWJsZUVsZW1lbnQNCisJCXsKKwkJCXJldHVybiBfdGFibGU7CisJCX0KKworCQkvKioKKwkJICogQHByaXZhdGUKKwkJICovDQorCQlwdWJsaWMgZnVuY3Rpb24gc2V0IHRhYmxlKHZhbHVlOlRhYmxlRWxlbWVudCk6dm9pZA0KKwkJeworCQkJX3RhYmxlID0gdmFsdWU7CisJCX0KKworCQkvKiogCisJCSAqIEFuY2hvciBwb2ludCBvZiB0aGUgY3VycmVudCBzZWxlY3Rpb24sIGFzIGEgQ2VsbENvb3JkaW5hdGVzIGluIHRoZSBUYWJsZUVsZW1lbnQuIAorCQkgKi8KKwkJcHVibGljIGZ1bmN0aW9uIGdldCBhbmNob3JDb29yZGluYXRlcygpOkNlbGxDb29yZGluYXRlcw0KKwkJeworCQkJcmV0dXJuIF9hbmNob3JDb29yZHM7CisJCX0KKworCQkvKioKKwkJICogQHByaXZhdGUKKwkJICovDQorCQlwdWJsaWMgZnVuY3Rpb24gc2V0IGFuY2hvckNvb3JkaW5hdGVzKHZhbHVlOkNlbGxDb29yZGluYXRlcyk6dm9pZA0KKwkJeworCQkJX2FuY2hvckNvb3JkcyA9IHZhbHVlOworCQl9CisKKwkJLyoqIAorCQkgKiBBY3RpdmUgZW5kIG9mIHRoZSBjdXJyZW50IHNlbGVjdGlvbiwgYXMgYSBDZWxsQ29vcmRpbmF0ZXMgaW4gdGhlIFRhYmxlRWxlbWVudC4gCisJCSAqLworCQlwdWJsaWMgZnVuY3Rpb24gZ2V0IGFjdGl2ZUNvb3JkaW5hdGVzKCk6Q2VsbENvb3JkaW5hdGVzDQorCQl7CisJCQlyZXR1cm4gX2FjdGl2ZUNvb3JkczsKKwkJfQorCisJCS8qKgorCQkgKiBAcHJpdmF0ZQorCQkgKi8NCisJCXB1YmxpYyBmdW5jdGlvbiBzZXQgYWN0aXZlQ29vcmRpbmF0ZXModmFsdWU6Q2VsbENvb3JkaW5hdGVzKTp2b2lkDQorCQl7CisJCQlfYWN0aXZlQ29vcmRzID0gdmFsdWU7CisJCX0KKworCisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RleHRMYXlvdXQvc3JjL2ZsYXNoeC90ZXh0TGF5b3V0L2VsZW1lbnRzL0Zsb3dFbGVtZW50LmFzIGIvdGV4dExheW91dC9zcmMvZmxhc2h4L3RleHRMYXlvdXQvZWxlbWVudHMvRmxvd0VsZW1lbnQuYXMKaW5kZXggNmVmNTA1My4uMTJiYTI4OCAxMDA2NDQKLS0tIGEvdGV4dExheW91dC9zcmMvZmxhc2h4L3RleHRMYXlvdXQvZWxlbWVudHMvRmxvd0VsZW1lbnQuYXMKKysrIGIvdGV4dExheW91dC9zcmMvZmxhc2h4L3RleHRMYXlvdXQvZWxlbWVudHMvRmxvd0VsZW1lbnQuYXMKQEAgLTgwNSw2ICs4MDUsMTQgQEAKIAkJeyBzZXRTdHlsZShzdHlsZVByb3AsdW5kZWZpbmVkKTsgfQogCQkKIAkJLyoqCisJCSAqIENhbGxlZCB3aGVuIGFuIGVsZW1lbnQgaXMgcmVtb3ZlZC4gVXNlZCBmb3IgY29udGFpbmVyIGVsZW1lbnRzIHRvIHJ1biBhbnkgY2xlYW4gdXAgY29kZS4gCisJCSAqKi8KKwkJdGxmX2ludGVybmFsIGZ1bmN0aW9uIHJlbW92ZWQoKTp2b2lkCisJCXsKKwkJCS8vIG92ZXJyaWRlIGluIHN1YiBjbGFzc2VzCisJCX0KKwkJCisJCS8qKgogCQkgKiBDYWxsZWQgd2hlbmV2ZXIgdGhlIG1vZGVsIGlzIG1vZGlmaWVkLiAgVXBkYXRlcyB0aGUgVGV4dEZsb3cgYW5kIG5vdGlmaWVzIHRoZSBzZWxlY3Rpb24gbWFuYWdlciAtIGlmIGl0IGlzIHNldC4KIAkJICogVGhpcyBtZXRob2QgaGFzIHRvIGJlIGNhbGxlZCB3aGlsZSB0aGUgZWxlbWVudCBpcyBzdGlsbCBpbiB0aGUgZmxvdwogCQkgKiBAcGFyYW0gY2hhbmdlVHlwZSAtIHR5cGUgb2YgY2hhbmdlCkBAIC0xMDI0LDYgKzEwMzIsMjQgQEAKIAkJfQogCQkKIAkJCisJCXB1YmxpYyBmdW5jdGlvbiBpc0luVGFibGUoKTpCb29sZWFuCisJCXsKKwkJCXZhciB0ZjpUZXh0RmxvdyA9IGdldFRleHRGbG93KCk7CisJCQlyZXR1cm4gdGYgJiYgdGYucGFyZW50RWxlbWVudCAmJiB0Zi5wYXJlbnRFbGVtZW50IGlzIFRhYmxlQ2VsbEVsZW1lbnQ7CisJCX0KKwkJCisJCXB1YmxpYyBmdW5jdGlvbiBnZXRQYXJlbnRDZWxsRWxlbWVudCgpOlRhYmxlQ2VsbEVsZW1lbnQKKwkJeworCQkJdmFyIHRmOlRleHRGbG93ID0gZ2V0VGV4dEZsb3coKTsKKwkJCQorCQkJaWYoIXRmKQorCQkJCXJldHVybiBudWxsOworCQkJaWYodGYucGFyZW50RWxlbWVudCAmJiB0Zi5wYXJlbnRFbGVtZW50IGlzIFRhYmxlQ2VsbEVsZW1lbnQpCisJCQkJcmV0dXJuIHRmLnBhcmVudEVsZW1lbnQgYXMgVGFibGVDZWxsRWxlbWVudDsKKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJCiAJCS8qKiAKIAkJICogUmV0dXJucyB0aGUgRmxvd0VsZW1lbnQgb2JqZWN0IHRoYXQgY29udGFpbnMgdGhpcyBGbG93RWxlbWVudCBvYmplY3QsIGlmIHRoaXMgZWxlbWVudCBpcyBjb250YWluZWQgd2l0aGluIAogCQkgKiBhbiBlbGVtZW50IG9mIGEgcGFydGljdWxhciB0eXBlLiAKZGlmZiAtLWdpdCBhL3RleHRMYXlvdXQvc3JjL2ZsYXNoeC90ZXh0TGF5b3V0L2VsZW1lbnRzL0Zsb3dHcm91cEVsZW1lbnQuYXMgYi90ZXh0TGF5b3V0L3NyYy9mbGFzaHgvdGV4dExheW91dC9lbGVtZW50cy9GbG93R3JvdXBFbGVtZW50LmFzCmluZGV4IGIwMmEyMmQuLjYyNTY3ZGQgMTAwNjQ0Ci0tLSBhL3RleHRMYXlvdXQvc3JjL2ZsYXNoeC90ZXh0TGF5b3V0L2VsZW1lbnRzL0Zsb3dHcm91cEVsZW1lbnQuYXMKKysrIGIvdGV4dExheW91dC9zcmMvZmxhc2h4L3RleHRMYXlvdXQvZWxlbWVudHMvRmxvd0dyb3VwRWxlbWVudC5hcwpAQCAtNTgyLDcgKzU4Miw3IEBACiAJCX0KIAkJCiAJCS8qKiBAcHJpdmF0ZSAqLwotCQl0bGZfaW50ZXJuYWwgZnVuY3Rpb24gY3JlYXRlQ29udGVudEFzR3JvdXAoKTpHcm91cEVsZW1lbnQKKwkJdGxmX2ludGVybmFsIGZ1bmN0aW9uIGNyZWF0ZUNvbnRlbnRBc0dyb3VwKHBvczppbnQ9MCk6R3JvdXBFbGVtZW50CiAJCXsKIAkJCUNPTkZJRzo6ZGVidWcgeyBhc3NlcnQoZmFsc2UsImludmFsaWQgY2FsbCB0byBjcmVhdGVDb250ZW50QXNHcm91cCIpOyB9CiAJCQlyZXR1cm4gbnVsbDsKQEAgLTYyNiw3ICs2MjYsNyBAQAogCQkgKi8KIAkJdGxmX2ludGVybmFsIGZ1bmN0aW9uIGNhbk93bkZsb3dFbGVtZW50KGVsZW06Rmxvd0VsZW1lbnQpOkJvb2xlYW4KIAkJewotCQkJcmV0dXJuICEoZWxlbSBpcyBUZXh0RmxvdykgJiYgIShlbGVtIGlzIEZsb3dMZWFmRWxlbWVudCkgJiYgIShlbGVtIGlzIFN1YlBhcmFncmFwaEdyb3VwRWxlbWVudEJhc2UpICYmICEoZWxlbSBpcyBMaXN0SXRlbUVsZW1lbnQpOworCQkJcmV0dXJuICEoZWxlbSBpcyBUZXh0RmxvdykgJiYgIShlbGVtIGlzIEZsb3dMZWFmRWxlbWVudCkgJiYgIShlbGVtIGlzIFN1YlBhcmFncmFwaEdyb3VwRWxlbWVudEJhc2UpICYmICEoZWxlbSBpcyBMaXN0SXRlbUVsZW1lbnQpICYmICEoZWxlbSBpcyBUYWJsZUVsZW1lbnQpOwogCQl9CiAJCQogCQkvKiogQHByaXZhdGUgKi8JCkBAIC02ODcsNiArNjg3LDcgQEAKIAkJCQl7CiAJCQkJCWNoaWxkID0gdGhpcy5nZXRDaGlsZEF0KGJlZ2luQ2hpbGRJbmRleCk7CiAJCQkJCXRoaXMubW9kZWxDaGFuZ2VkKE1vZGVsQ2hhbmdlLkVMRU1FTlRfUkVNT1ZBTCwgY2hpbGQsIGNoaWxkLnBhcmVudFJlbGF0aXZlU3RhcnQsIGNoaWxkLnRleHRMZW5ndGgpOworCQkJCQljaGlsZC5yZW1vdmVkKCk7CiAJCQkJCWxlbiArPSBjaGlsZC50ZXh0TGVuZ3RoOwogCQkJCQkKIAkJCQkJY2hpbGQuc2V0UGFyZW50QW5kUmVsYXRpdmVTdGFydChudWxsLDApOwpAQCAtNzcwLDggKzc3MSwxMCBAQAogCQkJCQkJCQlyZWxTdGFydElkeCA9IGJlZ2luQ2hpbGRJbmRleCA9PSBfbnVtQ2hpbGRyZW4gPyB0ZXh0TGVuZ3RoIDogZ2V0Q2hpbGRBdChiZWdpbkNoaWxkSW5kZXgpLnBhcmVudFJlbGF0aXZlU3RhcnQ7CiAJCQkJCQkJfQogCQkJCQkJfQotCQkJCQkJaWYgKCFjYW5Pd25GbG93RWxlbWVudChuZXdDaGlsZCkpCi0JCQkJCQkJdGhyb3cgQXJndW1lbnRFcnJvcihHbG9iYWxTZXR0aW5ncy5yZXNvdXJjZVN0cmluZ0Z1bmN0aW9uKCJpbnZhbGlkQ2hpbGRUeXBlIikpOworCQkJCQkJCisJCQkJCQlpZiAoIWNhbk93bkZsb3dFbGVtZW50KG5ld0NoaWxkKSkgeworCQkJCQkJCXRocm93IEFyZ3VtZW50RXJyb3IoR2xvYmFsU2V0dGluZ3MucmVzb3VyY2VTdHJpbmdGdW5jdGlvbigiaW52YWxpZENoaWxkVHlwZSIpICsgIi4gIiArIGRlZmF1bHRUeXBlTmFtZSArICIgY2Fubm90IG93biAiICsgbmV3Q2hpbGQuZGVmYXVsdFR5cGVOYW1lKTsKKwkJCQkJCX0KIAkJCQkJCQogCQkJCQkJLy8gbWFuYWdlIGFzIGFuIGFycmF5IG9yIGEgc2luZ2xlIGNoaWxkCiAJCQkJCQlpZiAoY2hpbGRyZW5Ub0FkZCA9PSAwKQpAQCAtOTg4LDYgKzk5MSw3IEBACiAJCQkJcGFyZW50LnJlcGxhY2VDaGlsZHJlbihteWlkeCsxLG15aWR4KzEsbmV3U2libGluZyk7CiAJCQl9CiAKKwkJCW5ld1NpYmxpbmcubm9ybWFsaXplUmFuZ2UoMCxuZXdTaWJsaW5nLnRleHRMZW5ndGgpOwogCQkJcmV0dXJuIG5ld1NpYmxpbmc7CiAJCX0KIApkaWZmIC0tZ2l0IGEvdGV4dExheW91dC9zcmMvZmxhc2h4L3RleHRMYXlvdXQvZWxlbWVudHMvRmxvd0xlYWZFbGVtZW50LmFzIGIvdGV4dExheW91dC9zcmMvZmxhc2h4L3RleHRMYXlvdXQvZWxlbWVudHMvRmxvd0xlYWZFbGVtZW50LmFzCmluZGV4IDIyYmZlNDAuLjg5NGEzNjIgMTAwNjQ0Ci0tLSBhL3RleHRMYXlvdXQvc3JjL2ZsYXNoeC90ZXh0TGF5b3V0L2VsZW1lbnRzL0Zsb3dMZWFmRWxlbWVudC5hcworKysgYi90ZXh0TGF5b3V0L3NyYy9mbGFzaHgvdGV4dExheW91dC9lbGVtZW50cy9GbG93TGVhZkVsZW1lbnQuYXMKQEAgLTMzNyw2ICszMzcsOCBAQAogCQl7CiAJCQlpZiAoIV9ibG9ja0VsZW1lbnQpCiAJCQkJY3JlYXRlQ29udGVudEVsZW1lbnQoKTsKKwkJCWlmKCFfYmxvY2tFbGVtZW50KQorCQkJCXJldHVybiBudWxsOwogCQkJdmFyIGVmOkVsZW1lbnRGb3JtYXQgPSBfYmxvY2tFbGVtZW50LmVsZW1lbnRGb3JtYXQ7CiAJCQlpZiAoIWVmKQogCQkJCXJldHVybiBudWxsOwpkaWZmIC0tZ2l0IGEvdGV4dExheW91dC9zcmMvZmxhc2h4L3RleHRMYXlvdXQvZWxlbWVudHMvUGFyYWdyYXBoRWxlbWVudC5hcyBiL3RleHRMYXlvdXQvc3JjL2ZsYXNoeC90ZXh0TGF5b3V0L2VsZW1lbnRzL1BhcmFncmFwaEVsZW1lbnQuYXMKaW5kZXggZjQ1NzlmYy4uNTFiODI4MyAxMDA2NDQKLS0tIGEvdGV4dExheW91dC9zcmMvZmxhc2h4L3RleHRMYXlvdXQvZWxlbWVudHMvUGFyYWdyYXBoRWxlbWVudC5hcworKysgYi90ZXh0TGF5b3V0L3NyYy9mbGFzaHgvdGV4dExheW91dC9lbGVtZW50cy9QYXJhZ3JhcGhFbGVtZW50LmFzCkBAIC0zMSw5ICszMSw5IEBACiAJaW1wb3J0IGZsYXNoLnRleHQuZW5naW5lLlRleHRMaW5lOwogCWltcG9ydCBmbGFzaC50ZXh0LmVuZ2luZS5UZXh0TGluZVZhbGlkaXR5OwogCWltcG9ydCBmbGFzaC50ZXh0LmVuZ2luZS5UZXh0Um90YXRpb247CisJaW1wb3J0IGZsYXNoLnV0aWxzLkRpY3Rpb25hcnk7CiAJaW1wb3J0IGZsYXNoLnV0aWxzLmdldFF1YWxpZmllZENsYXNzTmFtZTsKIAkKLQlpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQudGxmX2ludGVybmFsOwogCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5jb21wb3NlLlRleHRGbG93TGluZTsKIAlpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQuY29udGFpbmVyLkNvbnRhaW5lckNvbnRyb2xsZXI7CiAJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmRlYnVnLkRlYnVnZ2luZzsKQEAgLTUwLDYgKzUwLDcgQEAKIAlpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQuZm9ybWF0cy5UZXh0SnVzdGlmeTsKIAlpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQuZm9ybWF0cy5UZXh0TGF5b3V0Rm9ybWF0OwogCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5wcm9wZXJ0eS5Qcm9wZXJ0eTsKKwlpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQudGxmX2ludGVybmFsOwogCWltcG9ydCBmbGFzaHgudGV4dExheW91dC51dGlscy5DaGFyYWN0ZXJVdGlsOwogCWltcG9ydCBmbGFzaHgudGV4dExheW91dC51dGlscy5Mb2NhbGVVdGlsOwogCQpAQCAtNzksNyArODAsOCBAQAogCSAKIAlwdWJsaWMgZmluYWwgY2xhc3MgUGFyYWdyYXBoRWxlbWVudCBleHRlbmRzIFBhcmFncmFwaEZvcm1hdHRlZEVsZW1lbnQKIAl7Ci0JCXByaXZhdGUgdmFyIF90ZXh0QmxvY2s6VGV4dEJsb2NrOworCQkvL3ByaXZhdGUgdmFyIF90ZXh0QmxvY2s6VGV4dEJsb2NrOworCQlwcml2YXRlIHZhciBfdGV4dEJsb2NrQ2hpbGRyZW46RGljdGlvbmFyeTsKIAkJcHJpdmF0ZSB2YXIgX3Rlcm1pbmF0b3JTcGFuOlNwYW5FbGVtZW50OwogCQkKIAkJcHJpdmF0ZSB2YXIgX2ludGVyYWN0aXZlQ2hpbGRyZW5Db3VudDppbnQ7CkBAIC05NSw2ICs5Nyw3IEBACiAJCQlzdXBlcigpOwogCQkJX3Rlcm1pbmF0b3JTcGFuID0gbnVsbDsKIAkJCV9pbnRlcmFjdGl2ZUNoaWxkcmVuQ291bnQgPSAwIDsKKwkJCV90ZXh0QmxvY2tDaGlsZHJlbiA9IG5ldyBEaWN0aW9uYXJ5KCk7CiAJCX0KIAkJdGxmX2ludGVybmFsIGZ1bmN0aW9uIGdldCBpbnRlcmFjdGl2ZUNoaWxkcmVuQ291bnQoKTppbnQKIAkJewpAQCAtMTA2LDI2ICsxMDksODMgQEAKIAkJewogCQkJQ09ORklHOjpkZWJ1ZyB7IGFzc2VydChfdGV4dEJsb2NrID09IG51bGwsImNyZWF0ZVRleHRCbG9jayBjYWxsZWQgd2hlbiB0aGVyZSBpcyBhbHJlYWR5IGEgdGV4dGJsb2NrIik7IH0KIAkJCWNvbXB1dGVkRm9ybWF0OwkvLyByZWNyZWF0ZSB0aGUgZm9ybWF0IEJFRk9SRSB0aGUgX3RleHRCbG9jayBpcyBjcmVhdGVkCi0JCQlfdGV4dEJsb2NrID0gbmV3IFRleHRCbG9jaygpOworCQkJdmFyIHRiczpWZWN0b3IuPFRleHRCbG9jaz4gPSBnZXRUZXh0QmxvY2tzKCk7CisJCQkvL3Ricy5sZW5ndGggPSAwOworCQkJdmFyIHRhYmxlQ291bnQ6aW50ID0gMDsKKwkJCWlmKHRicy5sZW5ndGggPT0gMCAmJiAhKGdldENoaWxkQXQoMCkgaXMgVGFibGVFbGVtZW50KSApCisJCQkJdGJzLnB1c2gobmV3IFRleHRCbG9jaygpKTsKKwkJCS8vZ2V0VGV4dEJsb2NrcygpWzBdID0gbmV3IFRleHRCbG9jaygpOwogCQkJQ09ORklHOjpkZWJ1ZyB7IERlYnVnZ2luZy50cmFjZUZURUNhbGwoX3RleHRCbG9jayxudWxsLCJuZXcgVGV4dEJsb2NrKCkiKTsgfQogCQkJZm9yICh2YXIgaTppbnQgPSAwOyBpIDwgbnVtQ2hpbGRyZW47IGkrKykKIAkJCXsKIAkJCQl2YXIgY2hpbGQ6Rmxvd0VsZW1lbnQgPSBnZXRDaGlsZEF0KGkpOworCQkJCWlmKGNoaWxkIGlzIFRhYmxlRWxlbWVudCkKKwkJCQkJdGFibGVDb3VudCsrOworLy8JCQkJCXRicy5wdXNoKG5ldyBUZXh0QmxvY2soKSk7CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJLy9jaGlsZC5yZWxlYXNlQ29udGVudEVsZW1lbnQoKTsKKwkJCQkJLy9jaGlsZC5jcmVhdGVDb250ZW50RWxlbWVudCgpOworCQkJCX0KKwkJCX0KKwkJCXdoaWxlKHRhYmxlQ291bnQgPj0gdGJzLmxlbmd0aCkKKwkJCQl0YnMucHVzaChuZXcgVGV4dEJsb2NrKCkpOworCQkJCisJCQlmb3IgKGkgPSAwOyBpIDwgbnVtQ2hpbGRyZW47IGkrKykKKwkJCXsKKwkJCQljaGlsZCA9IGdldENoaWxkQXQoaSk7CiAJCQkJY2hpbGQuY3JlYXRlQ29udGVudEVsZW1lbnQoKTsKIAkJCX0KLQkJCXVwZGF0ZVRleHRCbG9jaygpOworCQkJdGJzLmxlbmd0aCA9IHRhYmxlQ291bnQgKyAxOworCQkJdmFyIHRiOlRleHRCbG9jazsKKwkJCWZvciBlYWNoKHRiIGluIHRicyl7CisJCQkJdXBkYXRlVGV4dEJsb2NrKHRiKTsKKwkJCX0KIAkJfQotCQkKLQkJLyoqIEBwcml2YXRlICovCi0JCQotCQl0bGZfaW50ZXJuYWwgZnVuY3Rpb24gcmVsZWFzZVRleHRCbG9jaygpOnZvaWQKKwkJcHJpdmF0ZSBmdW5jdGlvbiB1cGRhdGVUZXh0QmxvY2tEaWN0KCk6dm9pZAogCQl7Ci0JCQlpZiAoIV90ZXh0QmxvY2spCi0JCQkJcmV0dXJuOwotCQkJCQotCQkJaWYgKF90ZXh0QmxvY2suZmlyc3RMaW5lKQkvLyBBIFRleHRCbG9jayBtYXkgaGF2ZSBubyBmaXJzdExpbmUgaWYgaXQgaGFzIHByZXZpb3VzbHkgYmVlbiByZWxlYXNlZC4KKwkJCXZhciB0YnM6VmVjdG9yLjxUZXh0QmxvY2s+ID0gZ2V0VGV4dEJsb2NrcygpOworCQkJaWYodGJzLmxlbmd0aCA9PSAwKQorCQkJCXJldHVybjsvL25vdGhpbmcgdG8gZG8KKwkJCXZhciB0YklkeDppbnQgPSAwOworCQkJdmFyIHRiOlRleHRCbG9jayA9IHRic1t0YklkeF07CisJCQl2YXIgaXRlbXM6QXJyYXkgPSBbXTsKKwkJCXZhciBjaGlsZDpGbG93RWxlbWVudDsKKwkJCWZvciAodmFyIGk6aW50ID0gMDsgaSA8IG51bUNoaWxkcmVuOyBpKyspCiAJCQl7Ci0JCQkJZm9yICh2YXIgdGV4dExpbmVUZXN0OlRleHRMaW5lID0gX3RleHRCbG9jay5maXJzdExpbmU7IHRleHRMaW5lVGVzdCAhPSBudWxsOyB0ZXh0TGluZVRlc3QgPSB0ZXh0TGluZVRlc3QubmV4dExpbmUpCisJCQkJY2hpbGQgPSBnZXRDaGlsZEF0KGkpOworCQkJCWlmKGNoaWxkIGlzIFRhYmxlRWxlbWVudCkKKwkJCQl7CisJCQkJCV90ZXh0QmxvY2tDaGlsZHJlblt0Yl0gPSBpdGVtczsKKwkJCQkJdGIgPSB0YnNbKyt0YklkeF07CisJCQkJCWl0ZW1zID0gW107CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQlpdGVtcy5wdXNoKGNoaWxkKTsKKwkJCX0KKwkJCV90ZXh0QmxvY2tDaGlsZHJlblt0Yl0gPSBpdGVtczsKKwkJfQorCQlwcml2YXRlIGZ1bmN0aW9uIHJlbW92ZVRleHRCbG9jayh0YjpUZXh0QmxvY2spOnZvaWQKKwkJeworCQkJdmFyIHRiczpWZWN0b3IuPFRleHRCbG9jaz4gPSBnZXRUZXh0QmxvY2tzKCk7CisJCQlpZih0YnMpCisJCQl7CisJCQkJdmFyIGlkeDppbnQgPSBnZXRUZXh0QmxvY2tzKCkuaW5kZXhPZih0Yik7CisJCQkJaWYoaWR4ID4gLTEpCisJCQkJeworCQkJCQl0YnMuc3BsaWNlKGlkeCwxKTsKKwkJCQkJZGVsZXRlIF90ZXh0QmxvY2tDaGlsZHJlblt0Yl07CisJCQkJfQorCQkJfQorCQl9CisJCXByaXZhdGUgZnVuY3Rpb24gcmVsZWFzZVRleHRCbG9ja0ludGVybmFsKHRiOlRleHRCbG9jayk6dm9pZAorCQl7CisJCQlpZiAoIXRiKQorCQkJCXJldHVybjsKKwkJCQorCQkJaWYgKHRiLmZpcnN0TGluZSkJLy8gQSBUZXh0QmxvY2sgbWF5IGhhdmUgbm8gZmlyc3RMaW5lIGlmIGl0IGhhcyBwcmV2aW91c2x5IGJlZW4gcmVsZWFzZWQuCisJCQl7CisJCQkJZm9yICh2YXIgdGV4dExpbmVUZXN0OlRleHRMaW5lID0gdGIuZmlyc3RMaW5lOyB0ZXh0TGluZVRlc3QgIT0gbnVsbDsgdGV4dExpbmVUZXN0ID0gdGV4dExpbmVUZXN0Lm5leHRMaW5lKQogCQkJCXsJCiAJCQkJCWlmKHRleHRMaW5lVGVzdC5udW1DaGlsZHJlbiAhPSAwKQogCQkJCQl7CQpAQCAtMTM4LDU1ICsxOTgsMTcxIEBACiAJCQkJCX0KIAkJCQl9CiAJCQkJCi0JCQkJQ09ORklHOjpkZWJ1ZyB7IERlYnVnZ2luZy50cmFjZUZURUNhbGwobnVsbCxfdGV4dEJsb2NrLCJyZWxlYXNlTGluZXMiLF90ZXh0QmxvY2suZmlyc3RMaW5lLCBfdGV4dEJsb2NrLmxhc3RMaW5lKTsgfQkJCQkKLQkJCQlfdGV4dEJsb2NrLnJlbGVhc2VMaW5lcyhfdGV4dEJsb2NrLmZpcnN0TGluZSwgX3RleHRCbG9jay5sYXN0TGluZSk7CQorCQkJCUNPTkZJRzo6ZGVidWcgeyBEZWJ1Z2dpbmcudHJhY2VGVEVDYWxsKG51bGwsdGIsInJlbGVhc2VMaW5lcyIsdGIuZmlyc3RMaW5lLCB0Yi5sYXN0TGluZSk7IH0JCQkJCisJCQkJdGIucmVsZWFzZUxpbmVzKHRiLmZpcnN0TGluZSwgdGIubGFzdExpbmUpOwkKIAkJCX0JCi0KLQkJCV90ZXh0QmxvY2suY29udGVudCA9IG51bGw7Ci0JCQlmb3IgKHZhciBpOmludCA9IDA7IGkgPCBudW1DaGlsZHJlbjsgaSsrKQorCQkJdmFyIGl0ZW1zOkFycmF5ID0gX3RleHRCbG9ja0NoaWxkcmVuW3RiXTsKKwkJCXZhciBsZW46aW50ID0gaXRlbXMubGVuZ3RoOworCQkJZm9yICh2YXIgaTppbnQgPSAwOyBpIDwgbGVuOyBpKyspCiAJCQl7Ci0JCQkJdmFyIGNoaWxkOkZsb3dFbGVtZW50ID0gZ2V0Q2hpbGRBdChpKTsKKwkJCQl2YXIgY2hpbGQ6Rmxvd0VsZW1lbnQgPSBpdGVtc1tpXTsKIAkJCQljaGlsZC5yZWxlYXNlQ29udGVudEVsZW1lbnQoKTsKIAkJCX0KLQkJCV90ZXh0QmxvY2sgPSBudWxsOworCQkJaXRlbXMubGVuZ3RoID0gMDsKKwkJCXRiLmNvbnRlbnQgPSBudWxsOworCQkJcmVtb3ZlVGV4dEJsb2NrKHRiKTsKKwkJfQorCQkvKiogQHByaXZhdGUgKi8KKwkJdGxmX2ludGVybmFsIGZ1bmN0aW9uIHJlbGVhc2VUZXh0QmxvY2sodGI6VGV4dEJsb2NrPW51bGwpOnZvaWQKKwkJeworCQkJdXBkYXRlVGV4dEJsb2NrRGljdCgpOworCQkJaWYodGIpCisJCQl7CisJCQkJcmVsZWFzZVRleHRCbG9ja0ludGVybmFsKHRiKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQl2YXIgdGJzOlZlY3Rvci48VGV4dEJsb2NrPiA9IGdldFRleHRCbG9ja3MoKTsKKwkJCWZvciBlYWNoKHZhciB0ZXh0QmxvY2s6VGV4dEJsb2NrIGluIHRicykKKwkJCXsKKwkJCQlyZWxlYXNlVGV4dEJsb2NrSW50ZXJuYWwodGV4dEJsb2NrKTsKKwkJCX0KKwkJCS8vX3RleHRCbG9jayA9IG51bGw7CiAJCQlpZiAoX2NvbXB1dGVkRm9ybWF0KQogCQkJCV9jb21wdXRlZEZvcm1hdCA9IG51bGw7CiAJCX0KLQkJCisJCXByaXZhdGUgdmFyIF90ZXh0QmxvY2tzOlZlY3Rvci48VGV4dEJsb2NrPjsKKwkJdGxmX2ludGVybmFsIGZ1bmN0aW9uIGdldFRleHRCbG9ja3MoKTpWZWN0b3IuPFRleHRCbG9jaz4KKwkJeworCQkJaWYoX3RleHRCbG9ja3MgPT0gbnVsbCkKKwkJCQlfdGV4dEJsb2NrcyA9IG5ldyBWZWN0b3IuPFRleHRCbG9jaz4oKTsKKwkJCXJldHVybiBfdGV4dEJsb2NrczsKKwkJfQogCQkvKiogVGV4dEJsb2NrIHdoZXJlIHRoZSB0ZXh0IG9mIHRoZSBwYXJhZ3JhcGggaXMga2VwdC4gQHByaXZhdGUgKi8KIAkJdGxmX2ludGVybmFsIGZ1bmN0aW9uIGdldFRleHRCbG9jaygpOlRleHRCbG9jawotCQl7IAotCQkJaWYgKCFfdGV4dEJsb2NrKQorCQl7CisJCQlpZiAoIWdldFRleHRCbG9ja3MoKS5sZW5ndGgpCiAJCQkJY3JlYXRlVGV4dEJsb2NrKCk7Ci0JCQlyZXR1cm4gX3RleHRCbG9jazsgCisJCQkKKwkJCXJldHVybiBnZXRUZXh0QmxvY2tzKClbMF07IAorCQl9CisJCS8qKiBMYXN0IFRleHRCbG9jayB3aGVyZSB0aGUgdGV4dCBvZiB0aGUgcGFyYWdyYXBoIGlzIGtlcHQuIEBwcml2YXRlICovCisJCXRsZl9pbnRlcm5hbCBmdW5jdGlvbiBnZXRMYXN0VGV4dEJsb2NrKCk6VGV4dEJsb2NrCisJCXsKKwkJCXZhciB0YnM6VmVjdG9yLjxUZXh0QmxvY2s+ID0gZ2V0VGV4dEJsb2NrcygpOworCQkJaWYoIXRicy5sZW5ndGgpCisJCQkJY3JlYXRlVGV4dEJsb2NrKCk7CisJCQkKKwkJCXJldHVybiB0YnNbdGJzLmxlbmd0aC0xXTsKKwkJfQorCisJCS8qKiBHZXQgVGV4dEJsb2NrIGF0IHNwZWNpZmllZCBwb3NpdGlvbi4gQHByaXZhdGUgKi8KKwkJdGxmX2ludGVybmFsIGZ1bmN0aW9uIGdldFRleHRCbG9ja0F0UG9zaXRpb24ocG9zOmludCk6VGV4dEJsb2NrCisJCXsKKwkJCXZhciBjdXJQb3M6aW50ID0gMDsKKwkJCXZhciBwb3NTaGlmdDppbnQgPSAwOworCQkJdmFyIHRhYmxlczpWZWN0b3IuPFRhYmxlRWxlbWVudD4gPSBnZXRUYWJsZXMoKTsKKwkJCWlmKCF0YWJsZXMubGVuZ3RoKQorCQkJCXJldHVybiBnZXRUZXh0QmxvY2soKTsKKwkJCQorCQkJZm9yIGVhY2godmFyIHRhYmxlOlRhYmxlRWxlbWVudCBpbiB0YWJsZXMpCisJCQl7CisJCQkJaWYodGFibGUuZ2V0RWxlbWVudFJlbGF0aXZlU3RhcnQodGhpcykgPCBwb3MpCisJCQkJCXBvc1NoaWZ0Kys7CisJCQl9CisJCQl2YXIgdGJzOlZlY3Rvci48VGV4dEJsb2NrPiA9IGdldFRleHRCbG9ja3MoKTsKKwkJCWZvciBlYWNoKHZhciB0YjpUZXh0QmxvY2sgaW4gdGJzKQorCQkJeworCQkJCWlmKHRiLmNvbnRlbnQgPT0gbnVsbCkKKwkJCQkJcmV0dXJuIHRiOworCQkJCWN1clBvcyArPSB0Yi5jb250ZW50LnJhd1RleHQubGVuZ3RoOworCQkJCWlmKGN1clBvcyArIHBvc1NoaWZ0ID4gcG9zKQorCQkJCXsKKwkJCQkJaWYoZ2V0VGV4dEJsb2NrU3RhcnQodGIpID4gcG9zKQorCQkJCQkJcmV0dXJuIG51bGw7CisJCQkJCXJldHVybiB0YjsKKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gbnVsbDsKIAkJfQogCQkKKwkJdGxmX2ludGVybmFsIGZ1bmN0aW9uIGdldFRleHRCbG9ja0Fic29sdXRlU3RhcnQodGI6VGV4dEJsb2NrKTppbnQKKwkJeworCQkJdmFyIHN0YXJ0OmludCA9IGdldFRleHRCbG9ja1N0YXJ0KHRiKTsKKwkJCWlmKHN0YXJ0IDwgMCkKKwkJCQlzdGFydCA9IDA7CisJCQlyZXR1cm4gZ2V0QWJzb2x1dGVTdGFydCgpICsgc3RhcnQ7CisJCX0KKwkJdGxmX2ludGVybmFsIGZ1bmN0aW9uIGdldFRleHRCbG9ja1N0YXJ0KHRiOlRleHRCbG9jayk6aW50CisJCXsKKwkJCXZhciBpOmludDsKKwkJCXZhciBjdXJQb3M6aW50ID0gMDsKKwkJCXZhciB0YnM6VmVjdG9yLjxUZXh0QmxvY2s+ID0gZ2V0VGV4dEJsb2NrcygpOworCQkJaWYodGJzLmxlbmd0aCA9PSAwKQorCQkJCXJldHVybiAtMTsKKwkJCXZhciB0YWJsZXM6VmVjdG9yLjxUYWJsZUVsZW1lbnQ+ID0gZ2V0VGFibGVzKCk7CisJCQlmb3IgZWFjaCh2YXIgY3VyVEI6VGV4dEJsb2NrIGluIHRicykKKwkJCXsKKwkJCQlmb3IgZWFjaCh2YXIgdGFibGU6VGFibGVFbGVtZW50IGluIHRhYmxlcykKKwkJCQl7CisJCQkJCWlmKHRhYmxlLmdldEVsZW1lbnRSZWxhdGl2ZVN0YXJ0KHRoaXMpIDw9IGN1clBvcykKKwkJCQkJeworCQkJCQkJY3VyUG9zKys7CisJCQkJCQl0YWJsZXMuc3BsaWNlKHRhYmxlcy5pbmRleE9mKHRhYmxlKSwxKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlpZih0YiA9PSBjdXJUQikKKwkJCQkJcmV0dXJuIGN1clBvczsKKwkJCQlpZih0Yi5jb250ZW50KQorCQkJCQljdXJQb3MgKz0gY3VyVEIuY29udGVudC5yYXdUZXh0Lmxlbmd0aDsKKwkJCX0KKwkJCQorCQkJcmV0dXJuIC0xOworCQl9CisJCQorCQlwcml2YXRlIGZ1bmN0aW9uIGdldFRhYmxlcygpOlZlY3Rvci48VGFibGVFbGVtZW50PgorCQl7CisJCQl2YXIgdGFibGVzOlZlY3Rvci48VGFibGVFbGVtZW50PiA9IG5ldyBWZWN0b3IuPFRhYmxlRWxlbWVudD4oKTsKKwkJCWZvciAodmFyIGk6aW50ID0gMDsgaSA8IG51bUNoaWxkcmVuOyBpKyspCisJCQl7CisJCQkJdmFyIGNoaWxkOkZsb3dFbGVtZW50ID0gZ2V0Q2hpbGRBdChpKTsKKwkJCQlpZihjaGlsZCBpcyBUYWJsZUVsZW1lbnQpCisJCQkJCXRhYmxlcy5wdXNoKGNoaWxkIGFzIFRhYmxlRWxlbWVudCk7CisJCQl9CisJCQlyZXR1cm4gdGFibGVzOworCQl9CisKIAkJLyoqIFRleHRCbG9jayB3aGVyZSB0aGUgdGV4dCBvZiB0aGUgcGFyYWdyYXBoIGlzIGtlcHQsIG9yIG51bGwgaWYgd2UgY3VycmVudGx5IGRvbid0IGhhdmUgb25lLiBAcHJpdmF0ZSAqLwogCQl0bGZfaW50ZXJuYWwgZnVuY3Rpb24gcGVla1RleHRCbG9jaygpOlRleHRCbG9jawogCQl7IAotCQkJcmV0dXJuIF90ZXh0QmxvY2s7IAorCQkJcmV0dXJuIGdldFRleHRCbG9ja3MoKS5sZW5ndGggPT0gMCA/IG51bGwgOiBnZXRUZXh0QmxvY2tzKClbMF07CiAJCX0KIAkJCiAJCS8qKiBAcHJpdmF0ZSAqLwogCQl0bGZfaW50ZXJuYWwgZnVuY3Rpb24gcmVsZWFzZUxpbmVDcmVhdGlvbkRhdGEoKTp2b2lkCiAJCXsKIAkJCUNPTkZJRzo6ZGVidWcgeyBhc3NlcnQoQ29uZmlndXJhdGlvbi5wbGF5ZXJFbmFibGVzQXJnb0ZlYXR1cmVzLCJiYWQgY2FsbCB0byByZWxlYXNlTGluZUNyZWF0aW9uRGF0YSIpOyB9Ci0JCQlpZiAoX3RleHRCbG9jaykKLQkJCQlfdGV4dEJsb2NrWyJyZWxlYXNlTGluZUNyZWF0aW9uRGF0YSJdKCk7CisJCQl2YXIgdGJzOlZlY3Rvci48VGV4dEJsb2NrPiA9IGdldFRleHRCbG9ja3MoKTsKKwkJCWZvciBlYWNoKHZhciB0YjpUZXh0QmxvY2sgaW4gdGJzKQorCQkJeworCQkJCXRiWyJyZWxlYXNlTGluZUNyZWF0aW9uRGF0YSJdKCk7CisJCQl9CiAJCX0KIAkJCiAJCS8qKiBAcHJpdmF0ZSAqLwotCQl0bGZfaW50ZXJuYWwgb3ZlcnJpZGUgZnVuY3Rpb24gY3JlYXRlQ29udGVudEFzR3JvdXAoKTpHcm91cEVsZW1lbnQKLQkJeyAJCQkKLQkJCXZhciBncm91cDpHcm91cEVsZW1lbnQgPSBfdGV4dEJsb2NrLmNvbnRlbnQgYXMgR3JvdXBFbGVtZW50OworCQl0bGZfaW50ZXJuYWwgb3ZlcnJpZGUgZnVuY3Rpb24gY3JlYXRlQ29udGVudEFzR3JvdXAocG9zOmludD0wKTpHcm91cEVsZW1lbnQKKwkJeworCQkJdmFyIHRiOlRleHRCbG9jayA9IGdldFRleHRCbG9ja0F0UG9zaXRpb24ocG9zKTsKKwkJCWlmKCF0YikKKwkJCQl0YiA9IGdldFRleHRCbG9ja0F0UG9zaXRpb24ocG9zLTEpOworCQkJdmFyIGdyb3VwOkdyb3VwRWxlbWVudCA9IHRiLmNvbnRlbnQgYXMgR3JvdXBFbGVtZW50OwogCQkJaWYgKCFncm91cCkKIAkJCXsKLQkJCQl2YXIgb3JpZ2luYWxDb250ZW50OkNvbnRlbnRFbGVtZW50ID0gX3RleHRCbG9jay5jb250ZW50OworCQkJCXZhciBvcmlnaW5hbENvbnRlbnQ6Q29udGVudEVsZW1lbnQgPSB0Yi5jb250ZW50OwogCQkJCQogCQkJCWdyb3VwID0gbmV3IEdyb3VwRWxlbWVudCgpOwogCQkJCUNPTkZJRzo6ZGVidWcgeyBEZWJ1Z2dpbmcudHJhY2VGVEVDYWxsKGdyb3VwLG51bGwsIm5ldyBHcm91cEVsZW1lbnQoKSIpOyB9Ci0JCQkJX3RleHRCbG9jay5jb250ZW50ID0gZ3JvdXA7Ci0JCQkJQ09ORklHOjpkZWJ1ZyB7IERlYnVnZ2luZy50cmFjZUZURUFzc2lnbihfdGV4dEJsb2NrLCJjb250ZW50Iixncm91cCk7IH0KKwkJCQl0Yi5jb250ZW50ID0gZ3JvdXA7CisJCQkJQ09ORklHOjpkZWJ1ZyB7IERlYnVnZ2luZy50cmFjZUZURUFzc2lnbih0YiwiY29udGVudCIsZ3JvdXApOyB9CiAKIAkJCQlpZiAob3JpZ2luYWxDb250ZW50KQogCQkJCXsKQEAgLTE5OSw3ICszNzUsNyBAQAogCQkJCX0KIAkJCQkKIAkJCQkvLyBOb3cgd2UndmUgZ290IHRvIGZvcmNlIGRhbWFnZSB0aGUgZW50aXJlIHBhcmFncmFwaCwgYmVjYXVzZSB3ZSByZXN0cnVjdHVyZWQgaXQgaW4gRlRFLgotCQkJCWlmIChfdGV4dEJsb2NrLmZpcnN0TGluZSAmJiB0ZXh0TGVuZ3RoKQorCQkJCWlmICh0Yi5maXJzdExpbmUgJiYgdGV4dExlbmd0aCkKIAkJCQl7CiAJCQkJCXZhciB0ZXh0RmxvdzpUZXh0RmxvdyA9IGdldFRleHRGbG93KCk7CiAJCQkJCWlmICh0ZXh0RmxvdykKQEAgLTIxMiw3ICszODgsMTUgQEAKICAJCS8qKiBAcHJpdmF0ZSAqLwogCQl0bGZfaW50ZXJuYWwgb3ZlcnJpZGUgZnVuY3Rpb24gcmVtb3ZlQmxvY2tFbGVtZW50KGNoaWxkOkZsb3dFbGVtZW50LCBibG9jazpDb250ZW50RWxlbWVudCk6dm9pZAogCQl7Ci0JCQlpZiAobnVtQ2hpbGRyZW4gPT0gMSkKKwkJCXZhciB0YjpUZXh0QmxvY2sgPSBnZXRUZXh0QmxvY2tBdFBvc2l0aW9uKGNoaWxkLmdldEVsZW1lbnRSZWxhdGl2ZVN0YXJ0KHRoaXMpKTsKKwkJCWlmKCF0YikKKwkJCQl0YiA9IGdldFRleHRCbG9jaygpOworCQkJCisJCQlpZih0Yi5jb250ZW50ID09IG51bGwpCisJCQkJcmV0dXJuOworCQkJdmFyIHJlbGF0aXZlU3RhcnQ6aW50ID0gY2hpbGQuZ2V0RWxlbWVudFJlbGF0aXZlU3RhcnQodGhpcyk7CisKKwkJCWlmIChnZXRDaGlsZHJlbkluVGV4dEJsb2NrKHJlbGF0aXZlU3RhcnQpLmxlbmd0aCA8IDIpCiAJCQl7CiAJCQkJaWYgKGJsb2NrIGlzIEdyb3VwRWxlbWVudCkKIAkJCQl7CkBAIC0yMjEsMTggKzQwNSwyMCBAQAogCQkJCQlDT05GSUc6OmRlYnVnIHsgYXNzZXJ0KF90ZXh0QmxvY2suY29udGVudCBpcyBHcm91cEVsZW1lbnQsInJlbW92ZUJsb2NrRWxlbWVudDogYmFkIGNvbnRlbnQiKTsgfQogCQkJCQlDT05GSUc6OmRlYnVnIHsgYXNzZXJ0KEdyb3VwRWxlbWVudChfdGV4dEJsb2NrLmNvbnRlbnQpLmVsZW1lbnRDb3VudCA9PSAxLCJyZW1vdmVCbG9ja0VsZW1lbnQ6IGJhZCBlbGVtZW50IGNvdW50Iik7IH0KIAkJCQkJQ09ORklHOjpkZWJ1ZyB7IGFzc2VydChHcm91cEVsZW1lbnQoX3RleHRCbG9jay5jb250ZW50KS5nZXRFbGVtZW50QXQoMCkgPT0gYmxvY2ssInJlbW92ZUJsb2NrRWxlbWVudDogYmFkIGdyb3VwIGNvbnRlbnQiKTsgfQotCQkJCQlHcm91cEVsZW1lbnQoX3RleHRCbG9jay5jb250ZW50KS5yZXBsYWNlRWxlbWVudHMoMCwxLG51bGwpOworCQkJCQlHcm91cEVsZW1lbnQodGIuY29udGVudCkucmVwbGFjZUVsZW1lbnRzKDAsMSxudWxsKTsKIAkJCQkJQ09ORklHOjpkZWJ1ZyB7IERlYnVnZ2luZy50cmFjZUZURUNhbGwobnVsbCxfdGV4dEJsb2NrLmNvbnRlbnQsInJlcGxhY2VFbGVtZW50cyIsMCwxLG51bGwpOyB9CiAJCQkJfQotCQkJCV90ZXh0QmxvY2suY29udGVudCA9IG51bGw7CisJCQkJdGIuY29udGVudCA9IG51bGw7CiAJCQkJQ09ORklHOjpkZWJ1ZyB7IERlYnVnZ2luZy50cmFjZUZURUFzc2lnbihfdGV4dEJsb2NrLCJjb250ZW50IixudWxsKTsgfQogCQkJfQotCQkJZWxzZQorCQkJZWxzZSBpZihibG9jay5ncm91cEVsZW1lbnQpCiAJCQl7Ci0JCQkJdmFyIGlkeDppbnQgPSB0aGlzLmdldENoaWxkSW5kZXgoY2hpbGQpOwotCQkJCXZhciBncm91cDpHcm91cEVsZW1lbnQgPSBHcm91cEVsZW1lbnQoX3RleHRCbG9jay5jb250ZW50KTsKKwkJCQl2YXIgaWR4OmludCA9IGdldENoaWxkSW5kZXhJbkJsb2NrKGNoaWxkKTsKKwkJCQl2YXIgZ3JvdXA6R3JvdXBFbGVtZW50ID0gR3JvdXBFbGVtZW50KHRiLmNvbnRlbnQpOwogCQkJCUNPTkZJRzo6ZGVidWcgeyBhc3NlcnQoZ3JvdXAuZWxlbWVudENvdW50ID09IG51bUNoaWxkcmVuLCJNaXNtYXRjaGVkIGdyb3VwIGFuZCBlbGVtZW50Q291bnQiKTsgfQogCQkJCWdyb3VwLnJlcGxhY2VFbGVtZW50cyhpZHgsaWR4KzEsbnVsbCk7CisJCQkJaWYoZ3JvdXAuZWxlbWVudENvdW50ID09IDApCisJCQkJCXJldHVybjsKIAkJCQlDT05GSUc6OmRlYnVnIHsgRGVidWdnaW5nLnRyYWNlRlRFQ2FsbChudWxsLGdyb3VwLCJyZXBsYWNlRWxlbWVudHMiLGlkeCxpZHgrMSxudWxsKTsgfQogCQkJCWlmIChudW1DaGlsZHJlbiA9PSAyKQkvLyBpdHMgZ29pbmcgdG8gYmUgb25lIHNvIHVuZ3JvdXAKIAkJCQl7CkBAIC0yNDMsMTggKzQyOSwyMiBAQAogCQkJCQl7CiAJCQkJCQlncm91cC5yZXBsYWNlRWxlbWVudHMoMCwxLG51bGwpOwogCQkJCQkJQ09ORklHOjpkZWJ1ZyB7IERlYnVnZ2luZy50cmFjZUZURUNhbGwobnVsbCxncm91cCwicmVwbGFjZUVsZW1lbnRzIiwwLDEsbnVsbCk7IH0KLQkJCQkJCV90ZXh0QmxvY2suY29udGVudCA9IGVsZW07Ci0JCQkJCQlDT05GSUc6OmRlYnVnIHsgRGVidWdnaW5nLnRyYWNlRlRFQXNzaWduKF90ZXh0QmxvY2ssImNvbnRlbnQiLGVsZW0pOyB9CisJCQkJCQl0Yi5jb250ZW50ID0gZWxlbTsKKwkJCQkJCUNPTkZJRzo6ZGVidWcgeyBEZWJ1Z2dpbmcudHJhY2VGVEVBc3NpZ24odGIsImNvbnRlbnQiLGVsZW0pOyB9CiAJCQkJCX0KIAkJCQl9CiAJCQl9CisJCQllbHNlIHsKKwkJCQkvL3RyYWNlKCIxIik7CisJCQkJLy90Yi5jb250ZW50ID0gbnVsbDsKKwkJCX0KIAkJfQogCQkKIAkJCiAJCS8qKiBAcHJpdmF0ZSAqLwogCQl0bGZfaW50ZXJuYWwgb3ZlcnJpZGUgZnVuY3Rpb24gaGFzQmxvY2tFbGVtZW50KCk6Qm9vbGVhbgogCQl7Ci0JCQlyZXR1cm4gX3RleHRCbG9jayAhPSBudWxsOworCQkJcmV0dXJuIGdldFRleHRCbG9ja3MoKS5sZW5ndGggPiAwOwogCQl9CiAJCQogCQkvKiogQHByaXZhdGUgKi8KQEAgLTI2NCw5ICs0NTQsNDggQEAKIAkJfQogCQkKIAkJLyoqIEBwcml2YXRlICovCisJCXByaXZhdGUgZnVuY3Rpb24gZ2V0Q2hpbGRyZW5JblRleHRCbG9jayhwb3M6aW50KTpBcnJheQorCQl7CisJCQl2YXIgcmV0VmFsOkFycmF5ID0gW107CisJCQlpZihudW1DaGlsZHJlbiA9PSAwKQorCQkJCXJldHVybiByZXRWYWw7CisJCQlpZihudW1DaGlsZHJlbiA9PSAxKQorCQkJeworCQkJCXJldFZhbC5wdXNoKGdldENoaWxkQXQoMCkpOworCQkJCXJldHVybiByZXRWYWwKKwkJCX0KKwkJCXZhciBjaGxkcm46QXJyYXkgPSBteG1sQ2hpbGRyZW4uc2xpY2UoKTsKKwkJCWZvcih2YXIgaTppbnQgPSAwOyBpPGNobGRybi5sZW5ndGg7aSsrKQorCQkJeworCQkJCWlmKGNobGRybltpXSBpcyBUYWJsZUVsZW1lbnQpCisJCQkJeworCQkJCQlpZihjaGxkcm5baV0ucGFyZW50UmVsYXRpdmVTdGFydCA8IHBvcykKKwkJCQkJeworCQkJCQkJcmV0VmFsLmxlbmd0aCA9IDA7CisJCQkJCQljb250aW51ZTsKKwkJCQkJfQorCQkJCQlpZihjaGxkcm5baV0ucGFyZW50UmVsYXRpdmVTdGFydCA+PSBwb3MpCisJCQkJCQlicmVhazsKKwkJCQl9CisJCQkJcmV0VmFsLnB1c2goY2hsZHJuW2ldKTsJCQorCQkJfQorCQkJcmV0dXJuIHJldFZhbDsKKwkJfQorCQkKKwkJLyoqIEBwcml2YXRlICovCiAJCXRsZl9pbnRlcm5hbCBvdmVycmlkZSBmdW5jdGlvbiBpbnNlcnRCbG9ja0VsZW1lbnQoY2hpbGQ6Rmxvd0VsZW1lbnQsIGJsb2NrOkNvbnRlbnRFbGVtZW50KTp2b2lkCiAJCXsKLQkJCWlmIChfdGV4dEJsb2NrID09IG51bGwpCisJCQl2YXIgcmVsYXRpdmVTdGFydDppbnQgPSBjaGlsZC5nZXRFbGVtZW50UmVsYXRpdmVTdGFydCh0aGlzKTsKKwkJCXZhciB0YjpUZXh0QmxvY2sgPSBnZXRUZXh0QmxvY2tBdFBvc2l0aW9uKHJlbGF0aXZlU3RhcnQpOworCQkJaWYoIXRiKQorCQkJCXRiID0gZ2V0VGV4dEJsb2NrQXRQb3NpdGlvbihyZWxhdGl2ZVN0YXJ0LTEpOworCQkJCisJCQlpZighdGIpCisJCQl7CisJCQkJY2hpbGQucmVsZWFzZUNvbnRlbnRFbGVtZW50KCk7CisJCQkJcmV0dXJuOworCQkJfQorCQkJaWYgKGdldFRleHRCbG9ja3MoKS5sZW5ndGggPT0gMCkKIAkJCXsKIAkJCQljaGlsZC5yZWxlYXNlQ29udGVudEVsZW1lbnQoKTsKIAkJCQljcmVhdGVUZXh0QmxvY2soKTsJLy8gZG9lcyB0aGUgd2hvbGUgdHJlZQpAQCAtMjc0LDcgKzUwMyw3IEBACiAJCQl9CiAJCQl2YXIgZ2M6VmVjdG9yLjxDb250ZW50RWxlbWVudD47CS8vIHNjcmF0Y2ggdmFyCiAJCQl2YXIgZ3JvdXA6R3JvdXBFbGVtZW50OwkJCS8vIHNjcmF0Y2gKLQkJCWlmIChudW1DaGlsZHJlbiA9PSAxKQorCQkJaWYgKGdldENoaWxkcmVuSW5UZXh0QmxvY2socmVsYXRpdmVTdGFydCkubGVuZ3RoIDwgMikKIAkJCXsKIAkJCQlpZiAoYmxvY2sgaXMgR3JvdXBFbGVtZW50KQogCQkJCXsKQEAgLTI4NSwxOSArNTE0LDIzIEBACiAJCQkJCUNPTkZJRzo6ZGVidWcgeyBEZWJ1Z2dpbmcudHJhY2VGVEVDYWxsKG51bGwsZ2MsInB1c2giLGJsb2NrKTsgfQogCQkJCQlncm91cCA9IG5ldyBHcm91cEVsZW1lbnQoZ2MpOwogCQkJCQlDT05GSUc6OmRlYnVnIHsgRGVidWdnaW5nLnRyYWNlRlRFQ2FsbChncm91cCxudWxsLCJuZXcgR3JvdXBFbGVtZW50IixnYyk7IH0KLQkJCQkJX3RleHRCbG9jay5jb250ZW50ID0gZ3JvdXA7CisJCQkJCXRiLmNvbnRlbnQgPSBncm91cDsKIAkJCQkJQ09ORklHOjpkZWJ1ZyB7IERlYnVnZ2luZy50cmFjZUZURUFzc2lnbihfdGV4dEJsb2NrLCJjb250ZW50Iixncm91cCk7IH0KIAkJCQl9CiAJCQkJZWxzZQogCQkJCXsKLQkJCQkJX3RleHRCbG9jay5jb250ZW50ID0gYmxvY2s7CisJCQkJCWlmKGJsb2NrLmdyb3VwRWxlbWVudCkKKwkJCQkJeworCQkJCQkJYmxvY2suZ3JvdXBFbGVtZW50LmVsZW1lbnRDb3VudDsKKwkJCQkJfQorCQkJCQl0Yi5jb250ZW50ID0gYmxvY2s7CiAJCQkJCUNPTkZJRzo6ZGVidWcgeyBEZWJ1Z2dpbmcudHJhY2VGVEVBc3NpZ24oX3RleHRCbG9jaywiY29udGVudCIsYmxvY2spOyAgfQogCQkJCX0KIAkJCX0KIAkJCWVsc2UKIAkJCXsKLQkJCQlncm91cCA9IGNyZWF0ZUNvbnRlbnRBc0dyb3VwKCk7Ci0JCQkJdmFyIGlkeDppbnQgPSB0aGlzLmdldENoaWxkSW5kZXgoY2hpbGQpOworCQkJCWdyb3VwID0gY3JlYXRlQ29udGVudEFzR3JvdXAocmVsYXRpdmVTdGFydCk7CisJCQkJdmFyIGlkeDppbnQgPSBnZXRDaGlsZEluZGV4SW5CbG9jayhjaGlsZCk7CiAJCQkJZ2MgPSBuZXcgVmVjdG9yLjxDb250ZW50RWxlbWVudD4oKTsKIAkJCQlDT05GSUc6OmRlYnVnIHsgRGVidWdnaW5nLnRyYWNlRlRFQ2FsbChnYyxudWxsLCJuZXcgVmVjdG9yLjxDb250ZW50RWxlbWVudD4iKSB9CiAJCQkJZ2MucHVzaChibG9jayk7CkBAIC0zMDcsNiArNTQwLDIxIEBACiAJCQl9CiAJCX0KIAkJCisJCXByaXZhdGUgZnVuY3Rpb24gZ2V0Q2hpbGRJbmRleEluQmxvY2soZWxlbTpGbG93RWxlbWVudCk6aW50CisJCXsKKwkJCXZhciByZWxJZHg6aW50ID0gMDsKKwkJCWZvciAodmFyIGk6aW50ID0gMDsgaSA8IG51bUNoaWxkcmVuOyBpKyspCisJCQl7CisJCQkJdmFyIGNoaWxkOkZsb3dFbGVtZW50ID0gZ2V0Q2hpbGRBdChpKTsKKwkJCQlpZihjaGlsZCA9PSBlbGVtKQorCQkJCQlyZXR1cm4gcmVsSWR4OworCQkJCXJlbElkeCsrOworCQkJCWlmKGNoaWxkIGlzIFRhYmxlRWxlbWVudCkKKwkJCQkJcmVsSWR4ID0gMDsKKwkJCX0KKwkJCXJldHVybiAtMTsKKwkJfQorCQkKIAkJLyoqIEBwcml2YXRlICovCiAJCW92ZXJyaWRlIHByb3RlY3RlZCBmdW5jdGlvbiBnZXQgYWJzdHJhY3QoKTpCb29sZWFuCiAJCXsgcmV0dXJuIGZhbHNlOwl9CQpAQCAtMzE1LDI0ICs1NjMsNjMgQEAKIAkJdGxmX2ludGVybmFsIG92ZXJyaWRlIGZ1bmN0aW9uIGdldCBkZWZhdWx0VHlwZU5hbWUoKTpTdHJpbmcKIAkJeyByZXR1cm4gInAiOyB9CiAKKwkJdGxmX2ludGVybmFsIGZ1bmN0aW9uIHJlbW92ZUVtcHR5VGVybWluYXRvcigpOnZvaWQKKwkJeworCQkJaWYobnVtQ2hpbGRyZW4gPT0gMSAmJiBfdGVybWluYXRvclNwYW4gJiYgX3Rlcm1pbmF0b3JTcGFuLnRleHRMZW5ndGggPT0gMSkKKwkJCXsKKwkJCQlfdGVybWluYXRvclNwYW4ucmVtb3ZlUGFyYVRlcm1pbmF0b3IoKTsKKwkJCQlzdXBlci5yZXBsYWNlQ2hpbGRyZW4oMCwgMSk7CisJCQkJdGhpcy5fdGVybWluYXRvclNwYW4gPSBudWxsOworCQkJfQorCQl9CiAJCS8qKiBAcHJpdmF0ZSAqLwogCQlwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gcmVwbGFjZUNoaWxkcmVuKGJlZ2luQ2hpbGRJbmRleDppbnQsZW5kQ2hpbGRJbmRleDppbnQsLi4ucmVzdCk6dm9pZAogCQl7CiAJCQl2YXIgYXBwbHlQYXJhbXM6QXJyYXk7Ci0JCQkKLQkJCS8vIG1ha2VzIGEgbWVhc3VyYWJsZSBkaWZmZXJlbmNlIC0gcmVzdC5sZW5ndGggemVybyBhbmQgb25lIGFyZSB0aGUgY29tbW9uIGNhc2VzCi0JCQlpZiAocmVzdC5sZW5ndGggPT0gMSkKLQkJCQlhcHBseVBhcmFtcyA9IFtiZWdpbkNoaWxkSW5kZXgsIGVuZENoaWxkSW5kZXgsIHJlc3RbMF1dOwotCQkJZWxzZQotCQkJewotCQkJCWFwcGx5UGFyYW1zID0gW2JlZ2luQ2hpbGRJbmRleCwgZW5kQ2hpbGRJbmRleF07Ci0JCQkJaWYgKHJlc3QubGVuZ3RoICE9IDApCi0JCQkJCWFwcGx5UGFyYW1zID0gYXBwbHlQYXJhbXMuY29uY2F0LmFwcGx5KGFwcGx5UGFyYW1zLCByZXN0KTsKLQkJCX0KIAotCQkJc3VwZXIucmVwbGFjZUNoaWxkcmVuLmFwcGx5KHRoaXMsIGFwcGx5UGFyYW1zKTsKKwkJCWRveworCQkJCWlmKF90ZXJtaW5hdG9yU3BhbikKKwkJCQl7CisJCQkJCXZhciB0ZXJtSWR4OmludCA9IGdldENoaWxkSW5kZXgoX3Rlcm1pbmF0b3JTcGFuKTsKKwkJCQkJaWYodGVybUlkeCAhPTAgJiYgX3Rlcm1pbmF0b3JTcGFuLnRleHRMZW5ndGggPT0gMSkKKwkJCQkJeworCQkJCQkJc3VwZXIucmVwbGFjZUNoaWxkcmVuKHRlcm1JZHgsIHRlcm1JZHgrMSk7CisJCQkJCQlfdGVybWluYXRvclNwYW4gPSBudWxsOworCQkJCQkJaWYoYmVnaW5DaGlsZEluZGV4ID49IHRlcm1JZHgpCisJCQkJCQl7CisJCQkJCQkJYmVnaW5DaGlsZEluZGV4LS07CisJCQkJCQkJaWYocmVzdC5sZW5ndGggPT0gMCkgLy8gZGVsZXRlIG9mIHRlcm1pbmF0b3Igd2FzIGFscmVhZHkgZG9uZS4KKwkJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCQlpZihlbmRDaGlsZEluZGV4ID49IHRlcm1JZHggJiYgYmVnaW5DaGlsZEluZGV4ICE9IGVuZENoaWxkSW5kZXgpCisJCQkJCQkJZW5kQ2hpbGRJbmRleC0tOworCQkJCQl9CisJCQkJfQorCQkJCQorCQkJCS8vIG1ha2VzIGEgbWVhc3VyYWJsZSBkaWZmZXJlbmNlIC0gcmVzdC5sZW5ndGggemVybyBhbmQgb25lIGFyZSB0aGUgY29tbW9uIGNhc2VzCisJCQkJaWYgKHJlc3QubGVuZ3RoID09IDEpCisJCQkJCWFwcGx5UGFyYW1zID0gW2JlZ2luQ2hpbGRJbmRleCwgZW5kQ2hpbGRJbmRleCwgcmVzdFswXV07CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJYXBwbHlQYXJhbXMgPSBbYmVnaW5DaGlsZEluZGV4LCBlbmRDaGlsZEluZGV4XTsKKwkJCQkJaWYgKHJlc3QubGVuZ3RoICE9IDApCisJCQkJCQlhcHBseVBhcmFtcyA9IGFwcGx5UGFyYW1zLmNvbmNhdC5hcHBseShhcHBseVBhcmFtcywgcmVzdCk7CisJCQkJfQorCQkJCQorCQkJCXN1cGVyLnJlcGxhY2VDaGlsZHJlbi5hcHBseSh0aGlzLCBhcHBseVBhcmFtcyk7CisJCQkJCisJCQl9d2hpbGUoZmFsc2UpOwogCQkJCiAJCQllbnN1cmVUZXJtaW5hdG9yQWZ0ZXJSZXBsYWNlKCk7CisJCQkvLyBlbnN1cmUgY29ycmVjdCB0ZXh0IGJsb2NrcworCQkJY3JlYXRlVGV4dEJsb2NrKCk7CisJCX0KKwkJCisJCXB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBzcGxpdEF0UG9zaXRpb24ocmVsYXRpdmVQb3NpdGlvbjppbnQpOkZsb3dFbGVtZW50CisJCXsKKwkJCS8vIG5lZWQgdG8gaGFuZGxlIG11bHRpcGxlIFRleHRCbG9ja3MKKwkJCS8vIG1heWJlIG5vdC4gSXQgbWlnaHQgYmUgaGFuZGxlZCBpbiByZXBsYWNlQ2hpbGRyZW4oKS4KKwkJCXJldHVybiBzdXBlci5zcGxpdEF0UG9zaXRpb24ocmVsYXRpdmVQb3NpdGlvbik7CiAJCX0KIAkJLyoqIEBwcml2YXRlICovCiAJCXRsZl9pbnRlcm5hbCBmdW5jdGlvbiBlbnN1cmVUZXJtaW5hdG9yQWZ0ZXJSZXBsYWNlKCk6dm9pZApAQCAtMzQwLDI3ICs2MjcsNDMgQEAKIAkJCXZhciBuZXdMYXN0TGVhZjpGbG93TGVhZkVsZW1lbnQgPSBnZXRMYXN0TGVhZigpOwogCQkJaWYgKF90ZXJtaW5hdG9yU3BhbiAhPSBuZXdMYXN0TGVhZikKIAkJCXsKLQkJCQlpZiAoX3Rlcm1pbmF0b3JTcGFuKQorCQkJCWlmIChuZXdMYXN0TGVhZiAmJiBfdGVybWluYXRvclNwYW4pCiAJCQkJewogCQkJCQlfdGVybWluYXRvclNwYW4ucmVtb3ZlUGFyYVRlcm1pbmF0b3IoKTsKKwkJCQkJaWYoX3Rlcm1pbmF0b3JTcGFuLnRleHRMZW5ndGggPT0gMCkKKwkJCQkJeworCQkJCQkJdmFyIHRlcm1JZHg6aW50ID0gZ2V0Q2hpbGRJbmRleChfdGVybWluYXRvclNwYW4pOworCQkJCQkJc3VwZXIucmVwbGFjZUNoaWxkcmVuKHRlcm1JZHgsIHRlcm1JZHgrMSk7CisJCQkJCX0KIAkJCQkJdGhpcy5fdGVybWluYXRvclNwYW4gPSBudWxsOwogCQkJCX0KIAkJCQkKLQkJCQlpZiAobmV3TGFzdExlYWYpCisJCQkJaWYgKG5ld0xhc3RMZWFmIGlzIFNwYW5FbGVtZW50KQogCQkJCXsKLQkJCQkJaWYgKG5ld0xhc3RMZWFmIGlzIFNwYW5FbGVtZW50KQotCQkJCQl7Ci0JCQkJCQkobmV3TGFzdExlYWYgYXMgU3BhbkVsZW1lbnQpLmFkZFBhcmFUZXJtaW5hdG9yKCk7Ci0JCQkJCQl0aGlzLl90ZXJtaW5hdG9yU3BhbiA9IG5ld0xhc3RMZWFmIGFzIFNwYW5FbGVtZW50OwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJdmFyIHM6U3BhbkVsZW1lbnQgPSBuZXcgU3BhbkVsZW1lbnQoKTsKLQkJCQkJCXN1cGVyLnJlcGxhY2VDaGlsZHJlbihudW1DaGlsZHJlbixudW1DaGlsZHJlbixzKTsKLQkJCQkJCXMuZm9ybWF0ID0gbmV3TGFzdExlYWYuZm9ybWF0OwotCQkJCQkJcy5hZGRQYXJhVGVybWluYXRvcigpOwotCQkJCQkJdGhpcy5fdGVybWluYXRvclNwYW4gPSBzOwotCQkJCQl9CisJCQkJCShuZXdMYXN0TGVhZiBhcyBTcGFuRWxlbWVudCkuYWRkUGFyYVRlcm1pbmF0b3IoKTsKKwkJCQkJdGhpcy5fdGVybWluYXRvclNwYW4gPSBuZXdMYXN0TGVhZiBhcyBTcGFuRWxlbWVudDsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJdmFyIHM6U3BhbkVsZW1lbnQgPSBuZXcgU3BhbkVsZW1lbnQoKTsKKwkJCQkJc3VwZXIucmVwbGFjZUNoaWxkcmVuKG51bUNoaWxkcmVuLG51bUNoaWxkcmVuLHMpOworCQkJCQlzLmZvcm1hdCA9IG5ld0xhc3RMZWFmID8gbmV3TGFzdExlYWYuZm9ybWF0IDogX3Rlcm1pbmF0b3JTcGFuLmZvcm1hdDsKKwkJCQkJcy5hZGRQYXJhVGVybWluYXRvcigpOworCQkJCQl0aGlzLl90ZXJtaW5hdG9yU3BhbiA9IHM7CisJCQkJfQorCQkJfQorCQkJLy9tZXJnZSB0ZXJtaW5hdG9yIHNwYW4gdG8gcHJldmlvdXMgaWYgcG9zc2libGUKKwkJCWlmKF90ZXJtaW5hdG9yU3BhbiAmJiBfdGVybWluYXRvclNwYW4udGV4dExlbmd0aCA9PSAxKQorCQkJeworCQkJCXZhciBwcmV2OkZsb3dMZWFmRWxlbWVudCA9IF90ZXJtaW5hdG9yU3Bhbi5nZXRQcmV2aW91c0xlYWYodGhpcyk7CisJCQkJaWYocHJldiAmJiBwcmV2IGlzIFNwYW5FbGVtZW50KQorCQkJCXsKKwkJCQkJX3Rlcm1pbmF0b3JTcGFuLnJlbW92ZVBhcmFUZXJtaW5hdG9yKCk7CisJCQkJCXRlcm1JZHggPSBnZXRDaGlsZEluZGV4KF90ZXJtaW5hdG9yU3Bhbik7CisJCQkJCXN1cGVyLnJlcGxhY2VDaGlsZHJlbih0ZXJtSWR4LCB0ZXJtSWR4KzEpOworCQkJCQlzID0gcHJldiBhcyBTcGFuRWxlbWVudDsKKwkJCQkJcy5hZGRQYXJhVGVybWluYXRvcigpOworCQkJCQl0aGlzLl90ZXJtaW5hdG9yU3BhbiA9IHM7CiAJCQkJfQogCQkJfQogCQl9CkBAIC0zODcsNyArNjkwLDcgQEAKIAkJCQkJCWNoaWxkLmJpbmRhYmxlRWxlbWVudCA9IHRydWU7CiAJCQkJCQogCQkJCQkvLyBOb3RlOiBjYWxsaW5nIHN1cGVyLnJlcGxhY2VDaGlsZHJlbiBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdG8gdHJhbnNmZXIgcGFyYSB0ZXJtaW5hdG9yIGVhY2ggdGltZQotCQkJCQlzdXBlci5yZXBsYWNlQ2hpbGRyZW4obnVtQ2hpbGRyZW4sIG51bUNoaWxkcmVuLCBjaGlsZCBhcyBGbG93RWxlbWVudCk7IAorCQkJCQlzdXBlci5yZXBsYWNlQ2hpbGRyZW4obnVtQ2hpbGRyZW4sIG51bUNoaWxkcmVuLCBjaGlsZCBhcyBGbG93RWxlbWVudCk7CiAJCQkJfQogCQkJCWVsc2UgaWYgKGNoaWxkIGlzIFN0cmluZykKIAkJCQl7CkBAIC00MDQsNiArNzA3LDkgQEAKIAkJCQogCQkJLy8gTm93IGVuc3VyZSBwYXJhIHRlcm1pbmF0b3IKIAkJCWVuc3VyZVRlcm1pbmF0b3JBZnRlclJlcGxhY2UoKTsKKwkJCQorCQkJLy8gcmVjcmVhdGUgdGV4dCBibG9ja3MgdG8gaGFuZGxlIHBvc3NpYmxlIFRhYmxlRWxlbWVudCBjaGFuZ2VzCisJCQljcmVhdGVUZXh0QmxvY2soKTsKIAkJfQogCQkKIAkJLyoqIEBwcml2YXRlCkBAIC00MTEsMTcgKzcxNywyNiBAQAogCQlwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gZ2V0VGV4dChyZWxhdGl2ZVN0YXJ0OmludD0wLCByZWxhdGl2ZUVuZDppbnQ9LTEsIHBhcmFncmFwaFNlcGFyYXRvcjpTdHJpbmc9IlxuIik6U3RyaW5nCiAJCXsKIAkJCS8vIE9wdGltaXphdGlvbiBmb3IgZ2V0dGluZyB0ZXh0IG9mIHRoZSBlbnRpcmUgcGFyYWdyYXBoCi0JCQlpZiAocmVsYXRpdmVTdGFydCA9PSAwICYmIChyZWxhdGl2ZUVuZCA9PSAtMSB8fCByZWxhdGl2ZUVuZCA+PSB0ZXh0TGVuZ3RoLTEpICYmIF90ZXh0QmxvY2spCisJCQlpZiAocmVsYXRpdmVTdGFydCA9PSAwICYmIChyZWxhdGl2ZUVuZCA9PSAtMSB8fCByZWxhdGl2ZUVuZCA+PSB0ZXh0TGVuZ3RoLTEpICYmIGdldFRleHRCbG9ja3MoKS5sZW5ndGgpCiAJCQl7Ci0JCQkJaWYgKF90ZXh0QmxvY2suY29udGVudCAmJiBfdGV4dEJsb2NrLmNvbnRlbnQucmF3VGV4dCkKKwkJCQl2YXIgdGI6VGV4dEJsb2NrOworCQkJCXZhciB0YnM6VmVjdG9yLjxUZXh0QmxvY2s+ID0gZ2V0VGV4dEJsb2NrcygpOworCQkJCXZhciB0ZXh0OlN0cmluZyA9ICIiOworCQkJCWZvciBlYWNoKHRiIGluIHRicykKIAkJCQl7Ci0JCQkJCXZhciB0ZXh0OlN0cmluZyA9IF90ZXh0QmxvY2suY29udGVudC5yYXdUZXh0OwotCQkJCQlyZXR1cm4gdGV4dC5zdWJzdHJpbmcoMCwgdGV4dC5sZW5ndGggLSAxKTsKKwkJCQkJdGV4dCA9IHRleHQgKyBnZXRUZXh0SW5CbG9jayh0Yik7CiAJCQkJfQotCQkJCXJldHVybiAiIjsJCS8vIGNvbnRlbnQgaXMgbnVsbAorCQkJCWlmKHRiLmNvbnRlbnQgJiYgdGIuY29udGVudC5yYXdUZXh0KQorCQkJCQlyZXR1cm4gdGV4dC5zdWJzdHJpbmcoMCwgdGV4dC5sZW5ndGggLSAxKTsKKwkJCQlyZXR1cm4gdGV4dDsKIAkJCX0KIAkJCXJldHVybiBzdXBlci5nZXRUZXh0KHJlbGF0aXZlU3RhcnQsIHJlbGF0aXZlRW5kLCBwYXJhZ3JhcGhTZXBhcmF0b3IpOwogCQl9CisJCXByaXZhdGUgZnVuY3Rpb24gZ2V0VGV4dEluQmxvY2sodGI6VGV4dEJsb2NrKTpTdHJpbmd7CisJCQlpZighdGIuY29udGVudCB8fCAhdGIuY29udGVudC5yYXdUZXh0KQorCQkJCXJldHVybiAiIjsKKwkJCXJldHVybiB0Yi5jb250ZW50LnJhd1RleHQ7CisJCX0KIAkJCiAJCS8qKiBSZXR1cm5zIHRoZSBwYXJhZ3JhcGggdGhhdCBmb2xsb3dzIHRoaXMgb25lLCBvciBudWxsIGlmIHRoZXJlIGFyZSBubyBtb3JlIHBhcmFncmFwaHMuIAogCQkgKgpAQCAtNDc4LDM5ICs3OTMsNDYgQEAKIAkJIAogCQlwdWJsaWMgZnVuY3Rpb24gZmluZFByZXZpb3VzQXRvbUJvdW5kYXJ5KHJlbGF0aXZlUG9zaXRpb246aW50KTppbnQKIAkJeworCQkJdmFyIHRiOlRleHRCbG9jayA9IGdldFRleHRCbG9ja0F0UG9zaXRpb24ocmVsYXRpdmVQb3NpdGlvbik7CisJCQl2YXIgdGJTdGFydDppbnQgPSBnZXRUZXh0QmxvY2tTdGFydCh0Yik7CisJCQl2YXIgdGV4dEJsb2NrUG9zOmludCA9IHJlbGF0aXZlUG9zaXRpb24gLSB0YlN0YXJ0OwogCQkJaWYgKENvbnRhaW5lckNvbnRyb2xsZXIudGxmX2ludGVybmFsOjp1c2VzRGlzY3JldGlvbmFyeUh5cGhlbnMpCiAJCQl7Ci0JCQkJdmFyIHRleHRCbG9jazpUZXh0QmxvY2sgPSBnZXRUZXh0QmxvY2soKTsKLQkJCQl2YXIgdGw6VGV4dExpbmUgPSB0ZXh0QmxvY2suZ2V0VGV4dExpbmVBdENoYXJJbmRleChyZWxhdGl2ZVBvc2l0aW9uKTsKLQkJCQl2YXIgY3VycmVudEF0b21JbmRleDppbnQgPSB0bC5nZXRBdG9tSW5kZXhBdENoYXJJbmRleChyZWxhdGl2ZVBvc2l0aW9uKTsKKwkJCQl2YXIgdGw6VGV4dExpbmUgPSB0Yi5nZXRUZXh0TGluZUF0Q2hhckluZGV4KHRleHRCbG9ja1Bvcyk7CisJCQkJdmFyIGN1cnJlbnRBdG9tSW5kZXg6aW50ID0gdGwuZ2V0QXRvbUluZGV4QXRDaGFySW5kZXgodGV4dEJsb2NrUG9zKTsKICAgICAgICAgICAgICAgICAvL3RyYWNlKCJyZWxwb3MiLCByZWxhdGl2ZVBvc2l0aW9uLCAiYXRvbUluZGV4IiwgY3VycmVudEF0b21JbmRleCk7CiAgICAgICAgICAgICAgICAgdmFyIGlzUlRMOkJvb2xlYW4gPSB0bC5nZXRBdG9tQmlkaUxldmVsKGN1cnJlbnRBdG9tSW5kZXgpID09IDE7CiAgICAgICAgICAgICAgICAgaWYgKGlzUlRMKQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICB2YXIgZm9vOmludCA9IGdldFRleHRCbG9jaygpLmZpbmRQcmV2aW91c0F0b21Cb3VuZGFyeShyZWxhdGl2ZVBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICAgICB2YXIgZm9vOmludCA9IHRiLmZpbmRQcmV2aW91c0F0b21Cb3VuZGFyeSh0ZXh0QmxvY2tQb3MpOwogICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50QXRvbUluZGV4ID09IDApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGVuIGN1cnNvciBpcyBsZWZ0IG9mIGFsbCBjaGFyYWN0ZXJzIChlbmQgb2YgbGluZSkKICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXRvbUluZGV4IGlzIDAsIHNvIGNvbXBlbnNhdGUKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRsLmF0b21Db3VudCA+IDApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgtLXJlbGF0aXZlUG9zaXRpb24pCisgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoLS10ZXh0QmxvY2tQb3MpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRsLmdldEF0b21JbmRleEF0Q2hhckluZGV4KHJlbGF0aXZlUG9zaXRpb24pICE9IGN1cnJlbnRBdG9tSW5kZXgpCisJCQkJCQkJICAgLS1yZWxhdGl2ZVBvc2l0aW9uOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0bC5nZXRBdG9tSW5kZXhBdENoYXJJbmRleCh0ZXh0QmxvY2tQb3MpICE9IGN1cnJlbnRBdG9tSW5kZXgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgtLXJlbGF0aXZlUG9zaXRpb24pCisgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgtLXJlbGF0aXZlUG9zaXRpb24gJiYgLS10ZXh0QmxvY2tQb3MpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0bC5nZXRBdG9tSW5kZXhBdENoYXJJbmRleChyZWxhdGl2ZVBvc2l0aW9uKSAhPSBjdXJyZW50QXRvbUluZGV4KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRsLmdldEF0b21JbmRleEF0Q2hhckluZGV4KHRleHRCbG9ja1BvcykgIT0gY3VycmVudEF0b21JbmRleCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoQ2hhcmFjdGVyVXRpbC5pc0xvd1N1cnJvZ2F0ZShnZXRUZXh0KHJlbGF0aXZlUG9zaXRpb24sIHJlbGF0aXZlUG9zaXRpb24gKyAxKS5jaGFyQ29kZUF0KDApKSkKLSAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmVQb3NpdGlvbi0tOworCQkJCSAgIHsKKwkJCQkJICAgcmVsYXRpdmVQb3NpdGlvbi0tOworCQkJCQkgICB0ZXh0QmxvY2tQb3MtLTsKKwkJCQkgICB9CisJCQkJICAgCiAgICAgICAgICAgICAgICAgICAgLy90cmFjZSgicHJldmlvdXMiLCByZWxhdGl2ZVBvc2l0aW9uLCBmb28pOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlCkBAIC01MjEsMjEgKzg0MywyNiBAQAogICAgIAkJCQkJaWYgKCF0bCkKICAgICAJCQkJCQlyZXR1cm4gLTE7CiAgICAgCQkJCQkvLyBuZWVkIHRoaXMgd2hlbiAweDIwMjggbGluZSBzZXBhcmF0b3IgaW4gdXNlCi0gICAgCQkJCQlpZiAodGwudGV4dEJsb2NrQmVnaW5JbmRleCArIHRsLnJhd1RleHRMZW5ndGggPT0gcmVsYXRpdmVQb3NpdGlvbikKLSAgICAJCQkJCQlyZXR1cm4gdGwudGV4dEJsb2NrQmVnaW5JbmRleCArIHRsLnJhd1RleHRMZW5ndGggLSAxOwotICAgIAkJCQkJcmV0dXJuIHRsLnRleHRCbG9ja0JlZ2luSW5kZXggKyB0bC5yYXdUZXh0TGVuZ3RoOworICAgIAkJCQkJaWYgKHRsLnRleHRCbG9ja0JlZ2luSW5kZXggKyB0bC5yYXdUZXh0TGVuZ3RoID09IHRleHRCbG9ja1BvcykKKyAgICAJCQkJCQlyZXR1cm4gdGwudGV4dEJsb2NrQmVnaW5JbmRleCArIHRsLnJhd1RleHRMZW5ndGggLSAxICsgdGJTdGFydDsKKyAgICAJCQkJCXJldHVybiB0bC50ZXh0QmxvY2tCZWdpbkluZGV4ICsgdGwucmF3VGV4dExlbmd0aCArIHRiU3RhcnQ7CiAgICAgCQkJCX0KLSAgICAJCQkJd2hpbGUgKC0tcmVsYXRpdmVQb3NpdGlvbikKKyAgICAJCQkJd2hpbGUgKC0tcmVsYXRpdmVQb3NpdGlvbiAmJiAtLXRleHRCbG9ja1BvcykKICAgICAJCQkJewotICAgIAkJCQkJaWYgKHRsLmdldEF0b21JbmRleEF0Q2hhckluZGV4KHJlbGF0aXZlUG9zaXRpb24pIDwgY3VycmVudEF0b21JbmRleCkKKyAgICAJCQkJCWlmICh0bC5nZXRBdG9tSW5kZXhBdENoYXJJbmRleCh0ZXh0QmxvY2tQb3MpIDwgY3VycmVudEF0b21JbmRleCkKICAgICAJCQkJCQlicmVhazsKICAgICAJCQkJfQogICAgICAgICAgICAgICAgICAgICBpZiAoQ2hhcmFjdGVyVXRpbC5pc0xvd1N1cnJvZ2F0ZShnZXRUZXh0KHJlbGF0aXZlUG9zaXRpb24sIHJlbGF0aXZlUG9zaXRpb24gKyAxKS5jaGFyQ29kZUF0KDApKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aXZlUG9zaXRpb24tLTsKKwkJCQkJeworCQkJCQkJcmVsYXRpdmVQb3NpdGlvbi0tOworCQkJCQkJdGV4dEJsb2NrUG9zLS07CisJCQkJCX0KICAgICAgICAgICAgICAgICB9CiAJCQkJcmV0dXJuIHJlbGF0aXZlUG9zaXRpb247CiAJCQl9Ci0gICAgICAgICAgICB2YXIgcG9zOmludCA9IGdldFRleHRCbG9jaygpLmZpbmRQcmV2aW91c0F0b21Cb3VuZGFyeShyZWxhdGl2ZVBvc2l0aW9uKTsKKyAgICAgICAgICAgIHZhciBwb3M6aW50ID0gdGIuZmluZFByZXZpb3VzQXRvbUJvdW5kYXJ5KHRleHRCbG9ja1Bvcyk7CisJCQlpZihwb3MgPj0gMCkKKwkJCQlwb3MgKz0gdGJTdGFydDsKICAgICAgICAgICAgIC8vdHJhY2UoInByZXZpb3VzIiwgcmVsYXRpdmVQb3NpdGlvbiwgcG9zKTsKIAkJCXJldHVybiBwb3M7CiAJCX0KQEAgLTU2MCwzNCArODg3LDQxIEBACiAJCSAKIAkJcHVibGljIGZ1bmN0aW9uIGZpbmROZXh0QXRvbUJvdW5kYXJ5KHJlbGF0aXZlUG9zaXRpb246aW50KTppbnQKIAkJeworCQkJdmFyIHRiOlRleHRCbG9jayA9IGdldFRleHRCbG9ja0F0UG9zaXRpb24ocmVsYXRpdmVQb3NpdGlvbik7CisJCQl2YXIgdGJTdGFydDppbnQgPSBnZXRUZXh0QmxvY2tTdGFydCh0Yik7CisJCQl2YXIgdGV4dEJsb2NrUG9zOmludCA9IHJlbGF0aXZlUG9zaXRpb24gLSB0YlN0YXJ0OwogCQkJaWYgKENvbnRhaW5lckNvbnRyb2xsZXIudGxmX2ludGVybmFsOjp1c2VzRGlzY3JldGlvbmFyeUh5cGhlbnMpCiAJCQl7Ci0JCQkJdmFyIHRleHRCbG9jazpUZXh0QmxvY2sgPSBnZXRUZXh0QmxvY2soKTsKLQkJCQl2YXIgdGw6VGV4dExpbmUgPSB0ZXh0QmxvY2suZ2V0VGV4dExpbmVBdENoYXJJbmRleChyZWxhdGl2ZVBvc2l0aW9uKTsKLQkJCQl2YXIgY3VycmVudEF0b21JbmRleDppbnQgPSB0bC5nZXRBdG9tSW5kZXhBdENoYXJJbmRleChyZWxhdGl2ZVBvc2l0aW9uKTsKKwkJCQl2YXIgdGw6VGV4dExpbmUgPSB0Yi5nZXRUZXh0TGluZUF0Q2hhckluZGV4KHRleHRCbG9ja1Bvcyk7CisJCQkJdmFyIGN1cnJlbnRBdG9tSW5kZXg6aW50ID0gdGwuZ2V0QXRvbUluZGV4QXRDaGFySW5kZXgodGV4dEJsb2NrUG9zKTsKICAgICAgICAgICAgICAgICAvL3RyYWNlKCJyZWxwb3MiLCByZWxhdGl2ZVBvc2l0aW9uLCAiYXRvbUluZGV4IiwgY3VycmVudEF0b21JbmRleCk7CiAgICAgICAgICAgICAgICAgdmFyIGlzUlRMOkJvb2xlYW4gPSB0bC5nZXRBdG9tQmlkaUxldmVsKGN1cnJlbnRBdG9tSW5kZXgpID09IDE7CiAgICAgICAgICAgICAgICAgaWYgKGlzUlRMKQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdmFyIGZvbzppbnQgPSBnZXRUZXh0QmxvY2soKS5maW5kTmV4dEF0b21Cb3VuZGFyeShyZWxhdGl2ZVBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGZvbzppbnQgPSB0Yi5maW5kTmV4dEF0b21Cb3VuZGFyeSh0ZXh0QmxvY2tQb3MpOwogICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudEF0b21JbmRleCA9PSAwKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKytyZWxhdGl2ZVBvc2l0aW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCsrdGV4dEJsb2NrUG9zKQogICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0bC5nZXRBdG9tSW5kZXhBdENoYXJJbmRleChyZWxhdGl2ZVBvc2l0aW9uKSAhPSBjdXJyZW50QXRvbUluZGV4KQorCQkJCQkJCSsrcmVsYXRpdmVQb3NpdGlvbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGwuZ2V0QXRvbUluZGV4QXRDaGFySW5kZXgodGV4dEJsb2NrUG9zKSAhPSBjdXJyZW50QXRvbUluZGV4KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgrK3JlbGF0aXZlUG9zaXRpb24pCisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKyt0ZXh0QmxvY2tQb3MpCiAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRsLmdldEF0b21JbmRleEF0Q2hhckluZGV4KHJlbGF0aXZlUG9zaXRpb24pICE9IGN1cnJlbnRBdG9tSW5kZXgpCisJCQkJCQkJKytyZWxhdGl2ZVBvc2l0aW9uOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0bC5nZXRBdG9tSW5kZXhBdENoYXJJbmRleCh0ZXh0QmxvY2tQb3MpICE9IGN1cnJlbnRBdG9tSW5kZXgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGlmIChDaGFyYWN0ZXJVdGlsLmlzSGlnaFN1cnJvZ2F0ZShnZXRUZXh0KHJlbGF0aXZlUG9zaXRpb24sIHJlbGF0aXZlUG9zaXRpb24gKyAxKS5jaGFyQ29kZUF0KDApKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aXZlUG9zaXRpb24rKzsKKwkJCQkJeworCQkJCQkJcmVsYXRpdmVQb3NpdGlvbisrOworCQkJCQkJdGV4dEJsb2NrUG9zKys7CisJCQkJCX0KICAgICAgICAgICAgICAgICAgICAgLy90cmFjZSgibmV4dCIsIHJlbGF0aXZlUG9zaXRpb24sIGZvbyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UKQEAgLTU5NywxOSArOTMxLDI1IEBACiAgICAgCQkJCQl0bCA9IHRsLm5leHRMaW5lOwogICAgIAkJCQkJaWYgKCF0bCkKICAgICAJCQkJCQlyZXR1cm4gLTE7Ci0gICAgCQkJCQlyZXR1cm4gdGwudGV4dEJsb2NrQmVnaW5JbmRleDsKKyAgICAJCQkJCXJldHVybiB0bC50ZXh0QmxvY2tCZWdpbkluZGV4ICsgdGJTdGFydDsKICAgICAJCQkJfQotICAgIAkJCQl3aGlsZSAoKytyZWxhdGl2ZVBvc2l0aW9uKQorICAgIAkJCQl3aGlsZSAoKyt0ZXh0QmxvY2tQb3MpCiAgICAgCQkJCXsKLSAgICAJCQkJCWlmICh0bC5nZXRBdG9tSW5kZXhBdENoYXJJbmRleChyZWxhdGl2ZVBvc2l0aW9uKSA+IGN1cnJlbnRBdG9tSW5kZXgpCisJCQkJCQkrK3JlbGF0aXZlUG9zaXRpb247CisgICAgCQkJCQlpZiAodGwuZ2V0QXRvbUluZGV4QXRDaGFySW5kZXgodGV4dEJsb2NrUG9zKSA+IGN1cnJlbnRBdG9tSW5kZXgpCiAgICAgCQkJCQkJYnJlYWs7CiAgICAgCQkJCX0KICAgICAgICAgICAgICAgICAgICAgaWYgKENoYXJhY3RlclV0aWwuaXNIaWdoU3Vycm9nYXRlKGdldFRleHQocmVsYXRpdmVQb3NpdGlvbiwgcmVsYXRpdmVQb3NpdGlvbiArIDEpLmNoYXJDb2RlQXQoMCkpKQotICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmVQb3NpdGlvbisrOworCQkJCQl7CisJCQkJCQlyZWxhdGl2ZVBvc2l0aW9uKys7CisJCQkJCQl0ZXh0QmxvY2tQb3MrKzsKKwkJCQkJfQogICAgICAgICAgICAgICAgIH0KIAkJCQlyZXR1cm4gcmVsYXRpdmVQb3NpdGlvbjsKIAkJCX0KLQkJCXZhciBwb3M6aW50ID0gZ2V0VGV4dEJsb2NrKCkuZmluZE5leHRBdG9tQm91bmRhcnkocmVsYXRpdmVQb3NpdGlvbik7CisJCQl2YXIgcG9zOmludCA9IHRiLmZpbmROZXh0QXRvbUJvdW5kYXJ5KHRleHRCbG9ja1Bvcyk7CisJCQlpZihwb3MgPj0gMCkKKwkJCQlwb3MgKz0gdGJTdGFydDsKICAgICAgICAgICAgIC8vdHJhY2UoIm5leHQiLCByZWxhdGl2ZVBvc2l0aW9uLCBwb3MpOwogICAgICAgICAgICAgcmV0dXJuIHBvczsKIAkJfQpAQCAtNjE3LDcgKzk1NywyNyBAQAogCQkvKiogQHByaXZhdGUgKi8KIAkJcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIGdldENoYXJBdFBvc2l0aW9uKHJlbGF0aXZlUG9zaXRpb246aW50KTpTdHJpbmcKIAkJewotCQkJcmV0dXJuIGdldFRleHRCbG9jaygpLmNvbnRlbnQucmF3VGV4dC5jaGFyQXQocmVsYXRpdmVQb3NpdGlvbik7CisJCQl2YXIgZm91bmRUQjpUZXh0QmxvY2sgPSBnZXRUZXh0QmxvY2tBdFBvc2l0aW9uKHJlbGF0aXZlUG9zaXRpb24pOworCQkJaWYoIWZvdW5kVEIpCisJCQkJcmV0dXJuICJcdTAwMTYiOworCQkJdmFyIHRhYmxlczpWZWN0b3IuPFRhYmxlRWxlbWVudD4gPSBnZXRUYWJsZXMoKTsKKwkJCXZhciBwb3M6aW50ID0gcmVsYXRpdmVQb3NpdGlvbjsKKwkJCWZvciBlYWNoKHZhciB0YWJsZTpUYWJsZUVsZW1lbnQgaW4gdGFibGVzKQorCQkJeworCQkJCWlmKHRhYmxlLmdldEVsZW1lbnRSZWxhdGl2ZVN0YXJ0KHRoaXMpIDwgcG9zKQorCQkJCQlyZWxhdGl2ZVBvc2l0aW9uLS07CisJCQl9CisJCQl2YXIgdGJzOlZlY3Rvci48VGV4dEJsb2NrPiA9IGdldFRleHRCbG9ja3MoKTsKKwkJCWZvciBlYWNoKHZhciB0YjpUZXh0QmxvY2sgaW4gdGJzKQorCQkJeworCQkJCWlmKGZvdW5kVEIgPT0gdGIpCisJCQkJCWJyZWFrOworCQkJCWlmKHRiKQorCQkJCQlyZWxhdGl2ZVBvc2l0aW9uIC09IHRiLmNvbnRlbnQucmF3VGV4dC5sZW5ndGg7CisJCQkJZWxzZQorCQkJCQlyZWxhdGl2ZVBvc2l0aW9uIC09IDE7dGhpcy5nZXRUZXh0KCkKKwkJCX0KKwkJCXJldHVybiBmb3VuZFRCLmNvbnRlbnQucmF3VGV4dC5jaGFyQXQocmVsYXRpdmVQb3NpdGlvbik7CiAJCX0gCiAKIAkJLyoqIApAQCAtNjUwLDcgKzEwMTAsMTMgQEAKIAkJCQl9CiAJCQkJcmV0dXJuIHJlbGF0aXZlUG9zaXRpb247CiAJCQl9Ci0JCQlyZXR1cm4gZ2V0VGV4dEJsb2NrKCkuZmluZFByZXZpb3VzV29yZEJvdW5kYXJ5KHJlbGF0aXZlUG9zaXRpb24pOworCQkJdmFyIGJsb2NrOlRleHRCbG9jayA9IGdldFRleHRCbG9ja0F0UG9zaXRpb24ocmVsYXRpdmVQb3NpdGlvbik7CisJCQlpZihibG9jayA9PSBudWxsKQorCQkJCWJsb2NrID0gZ2V0VGV4dEJsb2NrQXRQb3NpdGlvbigtLXJlbGF0aXZlUG9zaXRpb24pOworCQkJdmFyIHBvczppbnQgPSBnZXRUZXh0QmxvY2tTdGFydChibG9jayk7CisJCQlpZihwb3MgPCAwKQorCQkJCXBvcyA9IDA7CisJCQlyZXR1cm4gcmVsYXRpdmVQb3NpdGlvbiA9PSBwb3MgPyBwb3MgOiBwb3MgKyBibG9jay5maW5kUHJldmlvdXNXb3JkQm91bmRhcnkocmVsYXRpdmVQb3NpdGlvbiAtIHBvcyk7CiAJCX0KIAogCQkvKiogCkBAIC02ODMsNyArMTA0OSwxMyBAQAogCQkJCX0KIAkJCQlyZXR1cm4gcmVsYXRpdmVQb3NpdGlvbjsKIAkJCX0KLQkJCXJldHVybiBnZXRUZXh0QmxvY2soKS5maW5kTmV4dFdvcmRCb3VuZGFyeShyZWxhdGl2ZVBvc2l0aW9uKTsKKwkJCXZhciBibG9jazpUZXh0QmxvY2sgPSBnZXRUZXh0QmxvY2tBdFBvc2l0aW9uKHJlbGF0aXZlUG9zaXRpb24pOworCQkJaWYoYmxvY2sgPT0gbnVsbCkKKwkJCQlibG9jayA9IGdldFRleHRCbG9ja0F0UG9zaXRpb24oLS1yZWxhdGl2ZVBvc2l0aW9uKTsKKwkJCXZhciBwb3M6aW50ID0gZ2V0VGV4dEJsb2NrU3RhcnQoYmxvY2spOworCQkJaWYocG9zIDwgMCkKKwkJCQlwb3MgPSAwOworCQkJcmV0dXJuIHBvcyArIGJsb2NrLmZpbmROZXh0V29yZEJvdW5kYXJ5KHJlbGF0aXZlUG9zaXRpb24gLSBwb3MpOwogCQl9CiAJCQogCQlzdGF0aWMgcHJpdmF0ZSB2YXIgX2RlZmF1bHRUYWJTdG9wczpWZWN0b3IuPFRhYlN0b3A+OwpAQCAtNjk3LDggKzEwNjksMTAgQEAKIAkJCQlfZGVmYXVsdFRhYlN0b3BzW2ldID0gbmV3IFRhYlN0b3AoVGV4dEFsaWduLlNUQVJULCBkZWZhdWx0VGFiV2lkdGggKiBpKTsKIAkJfQogCQkKLQkJcHJpdmF0ZSBmdW5jdGlvbiB1cGRhdGVUZXh0QmxvY2soKTp2b2lkCisJCXByaXZhdGUgZnVuY3Rpb24gdXBkYXRlVGV4dEJsb2NrKHRleHRCbG9jazpUZXh0QmxvY2s9bnVsbCk6dm9pZAogCQl7CisJCQlpZighdGV4dEJsb2NrKQorCQkJCXRleHRCbG9jayA9IGdldFRleHRCbG9jaygpOwogCQkJLy8gZmluZCB0aGUgYW5jZXN0b3Igd2l0aCBhIGNvbnRhaW5lciBhbmQgdXNlIGl0cyBmb3JtYXQgZm9yIHZhcmlvdXMgc2V0dGluZ3MKIAkJCXZhciBjb250YWluZXJFbGVtZW50OkNvbnRhaW5lckZvcm1hdHRlZEVsZW1lbnQgPSBnZXRBbmNlc3RvcldpdGhDb250YWluZXIoKTsKIAkJCWlmICghY29udGFpbmVyRWxlbWVudCkKQEAgLTc0NiwxMCArMTEyMCwxMCBAQAogCQkJCX0KIAogCQkJCUNPTkZJRzo6ZGVidWcgeyBEZWJ1Z2dpbmcudHJhY2VGVEVDYWxsKHNwYWNlSnVzdGlmaWVyLG51bGwsIm5ldyBTcGFjZUp1c3RpZmllciIsX2NvbXB1dGVkRm9ybWF0LmxvY2FsZSxsaW5lSnVzdCxzcGFjZUp1c3RpZmllci5sZXR0ZXJTcGFjaW5nKTsgfQotCQkJCV90ZXh0QmxvY2sudGV4dEp1c3RpZmllciA9IHNwYWNlSnVzdGlmaWVyOwotCQkJCUNPTkZJRzo6ZGVidWcgeyBEZWJ1Z2dpbmcudHJhY2VGVEVBc3NpZ24oX3RleHRCbG9jaywidGV4dEp1c3RpZmllciIsc3BhY2VKdXN0aWZpZXIpOyB9Ci0JCQkJX3RleHRCbG9jay5iYXNlbGluZVplcm8gPSBnZXRMZWFkaW5nQmFzaXModGhpcy5nZXRFZmZlY3RpdmVMZWFkaW5nTW9kZWwoKSk7Ci0JCQkJQ09ORklHOjpkZWJ1ZyB7IERlYnVnZ2luZy50cmFjZUZURUFzc2lnbihfdGV4dEJsb2NrLCJiYXNlbGluZVplcm8iLF90ZXh0QmxvY2suYmFzZWxpbmVaZXJvKTsgIH0KKwkJCQl0ZXh0QmxvY2sudGV4dEp1c3RpZmllciA9IHNwYWNlSnVzdGlmaWVyOworCQkJCUNPTkZJRzo6ZGVidWcgeyBEZWJ1Z2dpbmcudHJhY2VGVEVBc3NpZ24odGV4dEJsb2NrLCJ0ZXh0SnVzdGlmaWVyIixzcGFjZUp1c3RpZmllcik7IH0KKwkJCQl0ZXh0QmxvY2suYmFzZWxpbmVaZXJvID0gZ2V0TGVhZGluZ0Jhc2lzKHRoaXMuZ2V0RWZmZWN0aXZlTGVhZGluZ01vZGVsKCkpOworCQkJCUNPTkZJRzo6ZGVidWcgeyBEZWJ1Z2dpbmcudHJhY2VGVEVBc3NpZ24odGV4dEJsb2NrLCJiYXNlbGluZVplcm8iLHRleHRCbG9jay5iYXNlbGluZVplcm8pOyAgfQogCQkJfQogCQkJZWxzZQogCQkJewpAQCAtNzU4LDIxICsxMTMyLDIxIEBACiAJCQkJCWVhc3RBc2lhbkp1c3RpZmllci5jb21wb3NlVHJhaWxpbmdJZGVvZ3JhcGhpY1NwYWNlcyA9IHRydWU7CiAJCQkJfQogCQkJCUNPTkZJRzo6ZGVidWcgeyBEZWJ1Z2dpbmcudHJhY2VGVEVDYWxsKGVhc3RBc2lhbkp1c3RpZmllcixudWxsLCJuZXcgRWFzdEFzaWFuSnVzdGlmaWVyIixfY29tcHV0ZWRGb3JtYXQubG9jYWxlLGxpbmVKdXN0LG1ha2VKdXN0UnVsZVN0eWxlKTsgfQotCQkJCV90ZXh0QmxvY2sudGV4dEp1c3RpZmllciA9IGVhc3RBc2lhbkp1c3RpZmllciBhcyBFYXN0QXNpYW5KdXN0aWZpZXI7Ci0JCQkJQ09ORklHOjpkZWJ1ZyB7IERlYnVnZ2luZy50cmFjZUZURUFzc2lnbihfdGV4dEJsb2NrLCJ0ZXh0SnVzdGlmaWVyIixlYXN0QXNpYW5KdXN0aWZpZXIpOyAgfQotCQkJCV90ZXh0QmxvY2suYmFzZWxpbmVaZXJvID0gZ2V0TGVhZGluZ0Jhc2lzKHRoaXMuZ2V0RWZmZWN0aXZlTGVhZGluZ01vZGVsKCkpOwotCQkJCUNPTkZJRzo6ZGVidWcgeyBEZWJ1Z2dpbmcudHJhY2VGVEVBc3NpZ24oX3RleHRCbG9jaywiYmFzZWxpbmVaZXJvIixfdGV4dEJsb2NrLmJhc2VsaW5lWmVybyk7ICB9CisJCQkJdGV4dEJsb2NrLnRleHRKdXN0aWZpZXIgPSBlYXN0QXNpYW5KdXN0aWZpZXIgYXMgRWFzdEFzaWFuSnVzdGlmaWVyOworCQkJCUNPTkZJRzo6ZGVidWcgeyBEZWJ1Z2dpbmcudHJhY2VGVEVBc3NpZ24odGV4dEJsb2NrLCJ0ZXh0SnVzdGlmaWVyIixlYXN0QXNpYW5KdXN0aWZpZXIpOyAgfQorCQkJCXRleHRCbG9jay5iYXNlbGluZVplcm8gPSBnZXRMZWFkaW5nQmFzaXModGhpcy5nZXRFZmZlY3RpdmVMZWFkaW5nTW9kZWwoKSk7CisJCQkJQ09ORklHOjpkZWJ1ZyB7IERlYnVnZ2luZy50cmFjZUZURUFzc2lnbih0ZXh0QmxvY2ssImJhc2VsaW5lWmVybyIsdGV4dEJsb2NrLmJhc2VsaW5lWmVybyk7ICB9CiAJCQl9CiAJCQkKLQkJCV90ZXh0QmxvY2suYmlkaUxldmVsID0gX2NvbXB1dGVkRm9ybWF0LmRpcmVjdGlvbiA9PSBEaXJlY3Rpb24uTFRSID8gMCA6IDE7Ci0JCQlDT05GSUc6OmRlYnVnIHsgRGVidWdnaW5nLnRyYWNlRlRFQXNzaWduKF90ZXh0QmxvY2ssImJpZGlMZXZlbCIsX3RleHRCbG9jay5iaWRpTGV2ZWwpOyAgfQorCQkJdGV4dEJsb2NrLmJpZGlMZXZlbCA9IF9jb21wdXRlZEZvcm1hdC5kaXJlY3Rpb24gPT0gRGlyZWN0aW9uLkxUUiA/IDAgOiAxOworCQkJQ09ORklHOjpkZWJ1ZyB7IERlYnVnZ2luZy50cmFjZUZURUFzc2lnbih0ZXh0QmxvY2ssImJpZGlMZXZlbCIsdGV4dEJsb2NrLmJpZGlMZXZlbCk7ICB9CiAKLQkJCV90ZXh0QmxvY2subGluZVJvdGF0aW9uID0gY29udGFpbmVyRWxlbWVudEZvcm1hdC5ibG9ja1Byb2dyZXNzaW9uID09IEJsb2NrUHJvZ3Jlc3Npb24uUkwgPyBUZXh0Um90YXRpb24uUk9UQVRFXzkwIDogVGV4dFJvdGF0aW9uLlJPVEFURV8wOwotCQkJQ09ORklHOjpkZWJ1ZyB7IERlYnVnZ2luZy50cmFjZUZURUFzc2lnbihfdGV4dEJsb2NrLCJsaW5lUm90YXRpb24iLF90ZXh0QmxvY2subGluZVJvdGF0aW9uKTsgIH0KKwkJCXRleHRCbG9jay5saW5lUm90YXRpb24gPSBjb250YWluZXJFbGVtZW50Rm9ybWF0LmJsb2NrUHJvZ3Jlc3Npb24gPT0gQmxvY2tQcm9ncmVzc2lvbi5STCA/IFRleHRSb3RhdGlvbi5ST1RBVEVfOTAgOiBUZXh0Um90YXRpb24uUk9UQVRFXzA7CisJCQlDT05GSUc6OmRlYnVnIHsgRGVidWdnaW5nLnRyYWNlRlRFQXNzaWduKHRleHRCbG9jaywibGluZVJvdGF0aW9uIix0ZXh0QmxvY2subGluZVJvdGF0aW9uKTsgIH0KIAkJCQogCQkJaWYgKF9jb21wdXRlZEZvcm1hdC50YWJTdG9wcyAmJiBfY29tcHV0ZWRGb3JtYXQudGFiU3RvcHMubGVuZ3RoICE9IDApCiAJCQl7Ci0JCQkJLy9jcmVhdGUgYSB2ZWN0b3Igb2YgVGFiU3RvcHMgYW5kIGFzc2lnbiBpdCB0byB0YWJTdG9wcyBpbiBfdGV4dEJsb2NrCisJCQkJLy9jcmVhdGUgYSB2ZWN0b3Igb2YgVGFiU3RvcHMgYW5kIGFzc2lnbiBpdCB0byB0YWJTdG9wcyBpbiB0ZXh0QmxvY2sKIAkJCQl2YXIgdGFiU3RvcHM6VmVjdG9yLjxUYWJTdG9wPiA9IG5ldyBWZWN0b3IuPFRhYlN0b3A+KCk7CiAJCQkJQ09ORklHOjpkZWJ1ZyB7IERlYnVnZ2luZy50cmFjZUZURUNhbGwodGFiU3RvcHMsbnVsbCwibmV3IFZlY3Rvci48VGFiU3RvcD4oKSIpOyB9CiAJCQkJZm9yIGVhY2godmFyIHRzYTpUYWJTdG9wRm9ybWF0IGluIF9jb21wdXRlZEZvcm1hdC50YWJTdG9wcykKQEAgLTc4Niw4ICsxMTYwLDggQEAKIAkJCQkJdGFiU3RvcHMucHVzaCh0YWJTdG9wKTsKIAkJCQkJQ09ORklHOjpkZWJ1ZyB7IERlYnVnZ2luZy50cmFjZUZURUNhbGwobnVsbCx0YWJTdG9wcywicHVzaCIsdGFiU3RvcCk7IH0KIAkJCQl9Ci0JCQkJX3RleHRCbG9jay50YWJTdG9wcyA9IHRhYlN0b3BzOwotCQkJCUNPTkZJRzo6ZGVidWcgeyBEZWJ1Z2dpbmcudHJhY2VGVEVBc3NpZ24oX3RleHRCbG9jaywidGFiU3RvcHMiLHRhYlN0b3BzKTsgIH0KKwkJCQl0ZXh0QmxvY2sudGFiU3RvcHMgPSB0YWJTdG9wczsKKwkJCQlDT05GSUc6OmRlYnVnIHsgRGVidWdnaW5nLnRyYWNlRlRFQXNzaWduKHRleHRCbG9jaywidGFiU3RvcHMiLHRhYlN0b3BzKTsgIH0KIAkJCX0gCiAJCQllbHNlIGlmIChHbG9iYWxTZXR0aW5ncy5lbmFibGVEZWZhdWx0VGFiU3RvcHMgJiYgIUNvbmZpZ3VyYXRpb24ucGxheWVyRW5hYmxlc0FyZ29GZWF0dXJlcykKIAkJCXsKQEAgLTc5NSwxMyArMTE2OSwxMyBAQAogCQkJCS8vCWlzIHRydWUsIFRMRiB3aWxsIHNldCB1cCBkZWZhdWx0IHRhYlN0b3BzIGluIHRoZSBjYXNlIHdoZXJlIHRoZXJlIGFyZSBubyB0YWJzIGRlZmluZWQuIAogCQkJCWlmIChfZGVmYXVsdFRhYlN0b3BzID09IG51bGwpCiAJCQkJCWluaXRpYWxpemVEZWZhdWx0VGFiU3RvcHMoKTsKLQkJCQlfdGV4dEJsb2NrLnRhYlN0b3BzID0gX2RlZmF1bHRUYWJTdG9wczsKLQkJCQlDT05GSUc6OmRlYnVnIHsgRGVidWdnaW5nLnRyYWNlRlRFQXNzaWduKF90ZXh0QmxvY2ssInRhYlN0b3BzIixfZGVmYXVsdFRhYlN0b3BzKTsgIH0KKwkJCQl0ZXh0QmxvY2sudGFiU3RvcHMgPSBfZGVmYXVsdFRhYlN0b3BzOworCQkJCUNPTkZJRzo6ZGVidWcgeyBEZWJ1Z2dpbmcudHJhY2VGVEVBc3NpZ24odGV4dEJsb2NrLCJ0YWJTdG9wcyIsX2RlZmF1bHRUYWJTdG9wcyk7ICB9CiAJCQl9CiAJCQllbHNlCiAJCQl7Ci0JCQkJX3RleHRCbG9jay50YWJTdG9wcyA9IG51bGw7Ci0JCQkJQ09ORklHOjpkZWJ1ZyB7IERlYnVnZ2luZy50cmFjZUZURUFzc2lnbihfdGV4dEJsb2NrLCJ0YWJTdG9wcyIsbnVsbCk7ICB9CisJCQkJdGV4dEJsb2NrLnRhYlN0b3BzID0gbnVsbDsKKwkJCQlDT05GSUc6OmRlYnVnIHsgRGVidWdnaW5nLnRyYWNlRlRFQXNzaWduKHRleHRCbG9jaywidGFiU3RvcHMiLG51bGwpOyAgfQogCQkJfQkJIAogCQl9CiAJCQpAQCAtODExLDggKzExODUsMTAgQEAKIAkJCWlmICghX2NvbXB1dGVkRm9ybWF0KQogCQkJewogCQkJCXN1cGVyLmNvbXB1dGVkRm9ybWF0OwotCQkJCWlmIChfdGV4dEJsb2NrKQotCQkJCQl1cGRhdGVUZXh0QmxvY2soKTsKKwkJCQl2YXIgdGJzOlZlY3Rvci48VGV4dEJsb2NrPiA9IGdldFRleHRCbG9ja3MoKTsKKwkJCQlmb3IgZWFjaCh2YXIgdGI6VGV4dEJsb2NrIGluIHRicykKKwkJCQkJdXBkYXRlVGV4dEJsb2NrKHRiKTsKKwkJCQkJCiAJCQl9CiAJCQlyZXR1cm4gX2NvbXB1dGVkRm9ybWF0OwogCQl9CkBAIC04MjAsNyArMTE5Niw3IEBACiAJCS8qKiBAcHJpdmF0ZSAqLwogCQl0bGZfaW50ZXJuYWwgb3ZlcnJpZGUgZnVuY3Rpb24gY2FuT3duRmxvd0VsZW1lbnQoZWxlbTpGbG93RWxlbWVudCk6Qm9vbGVhbgogCQl7Ci0JCQlyZXR1cm4gZWxlbSBpcyBGbG93TGVhZkVsZW1lbnQgfHwgZWxlbSBpcyBTdWJQYXJhZ3JhcGhHcm91cEVsZW1lbnRCYXNlOworCQkJcmV0dXJuIGVsZW0gaXMgRmxvd0xlYWZFbGVtZW50IHx8IGVsZW0gaXMgU3ViUGFyYWdyYXBoR3JvdXBFbGVtZW50QmFzZSB8fCBlbGVtIGlzIFRhYmxlRWxlbWVudDsKIAkJfQogCQkKIAkJLyoqIEBwcml2YXRlICovCkBAIC04ODQsMzIgKzEyNjAsNiBAQAogCQkJfQogCQl9CiAJCQotCQkvLyBtanpoYW5nIDogbmV3IEFQSSBmb3IgdGFibGUgZmVhdHVyZSwgdG8gZGlzY3VzcwotCQlwdWJsaWMgZnVuY3Rpb24gaXNJblRhYmxlKCk6Qm9vbGVhbgotCQl7Ci0JCQl2YXIgcGFyZW50OkZsb3dFbGVtZW50ID0gdGhpcy5wYXJlbnQ7Ci0JCQl3aGlsZSAoIHBhcmVudCApCi0JCQl7Ci0JCQkJaWYgKCAocGFyZW50IGlzIFRhYmxlRGF0YUNlbGxFbGVtZW50KSApCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCXBhcmVudCA9IHBhcmVudC5wYXJlbnQ7Ci0JCQl9Ci0JCQkJCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCXB1YmxpYyBmdW5jdGlvbiBnZXRUYWJsZURhdGFDZWxsRWxlbWVudCgpOlRhYmxlRGF0YUNlbGxFbGVtZW50Ci0JCXsKLQkJCXZhciBwYXJlbnQ6Rmxvd0VsZW1lbnQgPSB0aGlzLnBhcmVudDsKLQkJCXdoaWxlICggcGFyZW50ICkKLQkJCXsKLQkJCQlpZiAoIChwYXJlbnQgaXMgVGFibGVEYXRhQ2VsbEVsZW1lbnQpICkKLQkJCQkJcmV0dXJuIHBhcmVudCBhcyBUYWJsZURhdGFDZWxsRWxlbWVudDsKLQkJCQlwYXJlbnQgPSBwYXJlbnQucGFyZW50OwotCQkJfQotCQkJCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQogCQkvKiogQHByaXZhdGUgKi8KIAkJdGxmX2ludGVybmFsIGZ1bmN0aW9uIGdldEVmZmVjdGl2ZUxlYWRpbmdNb2RlbCgpOlN0cmluZwogCQl7CkBAIC05MzgsMTkgKzEyODgsMjAgQEAKIAkJLyoqIEBwcml2YXRlICovCiAJCUNPTkZJRzo6ZGVidWcgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIGRlYnVnQ2hlY2tGbG93RWxlbWVudChkZXB0aDppbnQgPSAwLCBleHRyYURhdGE6U3RyaW5nID0gIiIpOmludAogCQl7Ci0JCQl2YXIgcnNsdDppbnQgPSBzdXBlci5kZWJ1Z0NoZWNrRmxvd0VsZW1lbnQoZGVwdGgsIiBmdGU6IitnZXREZWJ1Z0lkZW50aXR5KF90ZXh0QmxvY2spKyIgIitleHRyYURhdGEpOworCQkJdmFyIHRiOlRleHRCbG9jayA9IGdldFRleHRCbG9jaygpOworCQkJdmFyIHJzbHQ6aW50ID0gc3VwZXIuZGVidWdDaGVja0Zsb3dFbGVtZW50KGRlcHRoLCIgZnRlOiIrZ2V0RGVidWdJZGVudGl0eSh0YikrIiAiK2V4dHJhRGF0YSk7CiAJCQkKIAkJCS8vIG5vdyBjaGVjayB0aGUgY2hhcmFjdGVyIGNvdW50IGFuZCB0aGVuIHRoZSBsYXN0IGNoYXJhY3RlciAKIAkJCQotCQkJaWYgKF90ZXh0QmxvY2spCisJCQlpZiAodGIpCiAJCQl7Ci0JCQkJdmFyIGNvbnRlbnRMZW5ndGg6aW50ID0gX3RleHRCbG9jay5jb250ZW50ICYmIF90ZXh0QmxvY2suY29udGVudC5yYXdUZXh0ID8gX3RleHRCbG9jay5jb250ZW50LnJhd1RleHQubGVuZ3RoIDogMDsKKwkJCQl2YXIgY29udGVudExlbmd0aDppbnQgPSB0Yi5jb250ZW50ICYmIHRiLmNvbnRlbnQucmF3VGV4dCA/IHRiLmNvbnRlbnQucmF3VGV4dC5sZW5ndGggOiAwOwogCQkJCXJzbHQgKz0gYXNzZXJ0KGNvbnRlbnRMZW5ndGggPT0gdGV4dExlbmd0aCwiQmFkIHBhcmFncmFwaCBsZW5ndGggbW9kZToiK3RleHRMZW5ndGgudG9TdHJpbmcoKSsiIF90ZXh0QmxvY2s6IiArIGNvbnRlbnRMZW5ndGgudG9TdHJpbmcoKSk7CiAKLQkJCQl2YXIgZ3JvdXBFbGVtZW50Okdyb3VwRWxlbWVudCA9IF90ZXh0QmxvY2suY29udGVudCBhcyBHcm91cEVsZW1lbnQ7CisJCQkJdmFyIGdyb3VwRWxlbWVudDpHcm91cEVsZW1lbnQgPSB0Yi5jb250ZW50IGFzIEdyb3VwRWxlbWVudDsKIAkJCQlpZiAoZ3JvdXBFbGVtZW50KQogCQkJCQlhc3NlcnQoZ3JvdXBFbGVtZW50LmVsZW1lbnRDb3VudCA9PSBudW1DaGlsZHJlbiwiTWlzbWF0Y2hlZCBncm91cCBhbmQgZWxlbWVudENvdW50Iik7IAotCQkJCWVsc2UgaWYgKF90ZXh0QmxvY2suY29udGVudCkKKwkJCQllbHNlIGlmICh0Yi5jb250ZW50KQogCQkJCQlhc3NlcnQoMSA9PSBudW1DaGlsZHJlbiwiTWlzbWF0Y2hlZCBncm91cCBhbmQgZWxlbWVudENvdW50Iik7IAogCQkJCWVsc2UgCiAJCQkJCWFzc2VydCgwID09IG51bUNoaWxkcmVuLCJNaXNtYXRjaGVkIGdyb3VwIGFuZCBlbGVtZW50Q291bnQiKTsgCkBAIC0xMDEzLDUgKzEzNjQsMTEgQEAKIAkJewogCQkJcmV0dXJuIF9pbnRlcmFjdGl2ZUNoaWxkcmVuQ291bnQgIT0gMCA7CiAJCX0KKworCQl0bGZfaW50ZXJuYWwgZnVuY3Rpb24gZ2V0IHRlcm1pbmF0b3JTcGFuKCk6U3BhbkVsZW1lbnQNCisJCXsKKwkJCXJldHVybiBfdGVybWluYXRvclNwYW47CisJCX0KKwogCX0KIH0KZGlmZiAtLWdpdCBhL3RleHRMYXlvdXQvc3JjL2ZsYXNoeC90ZXh0TGF5b3V0L2VsZW1lbnRzL1NwYW5FbGVtZW50LmFzIGIvdGV4dExheW91dC9zcmMvZmxhc2h4L3RleHRMYXlvdXQvZWxlbWVudHMvU3BhbkVsZW1lbnQuYXMKaW5kZXggYzE2YWRmZi4uOWUzNzA1OCAxMDA2NDQKLS0tIGEvdGV4dExheW91dC9zcmMvZmxhc2h4L3RleHRMYXlvdXQvZWxlbWVudHMvU3BhbkVsZW1lbnQuYXMKKysrIGIvdGV4dExheW91dC9zcmMvZmxhc2h4L3RleHRMYXlvdXQvZWxlbWVudHMvU3BhbkVsZW1lbnQuYXMKQEAgLTM5NSw2ICszOTUsOCBAQAogCQkJCQlhc3NlcnQoX2Jsb2NrRWxlbWVudC5yYXdUZXh0LmNoYXJBdChfYmxvY2tFbGVtZW50LnJhd1RleHQubGVuZ3RoLTEpICE9IFNwYW5FbGVtZW50LmtQYXJhZ3JhcGhUZXJtaW5hdG9yLCJhZGRpbmcgcGFyYSB0ZXJtaW5hdG9yIHR3aWNlIik7CiAJCQl9CiAKKwkJCWlmKF90ZXh0ICYmIF90ZXh0LnN1YnN0cigtMSkgPT0gU3BhbkVsZW1lbnQua1BhcmFncmFwaFRlcm1pbmF0b3IpLy8gdGVybWluYXRvciBleGlzdHMuIEJhaWwgb3V0LgorCQkJCXJldHVybjsKIAkJCXJlcGxhY2VUZXh0SW50ZXJuYWwodGV4dExlbmd0aCx0ZXh0TGVuZ3RoLFNwYW5FbGVtZW50LmtQYXJhZ3JhcGhUZXJtaW5hdG9yKTsKIAkJCQogCQkJQ09ORklHOjpkZWJ1ZyAKQEAgLTQxNCw2ICs0MTYsOSBAQAogCQkJCWFzc2VydChfdGV4dCAmJiBfdGV4dC5sZW5ndGggJiYgX3RleHQuY2hhckF0KF90ZXh0Lmxlbmd0aC0xKSA9PSBTcGFuRWxlbWVudC5rUGFyYWdyYXBoVGVybWluYXRvciwKIAkJCQkJImF0dGVtcHRpbmcgdG8gcmVtb3ZlIHBhcmEgdGVybWluYXRvciB3aGVuIGl0IGRvZXNuJ3QgZXhpc3QiKTsKIAkJCX0KKwkJCWlmKCFfdGV4dCB8fCBfdGV4dC5zdWJzdHIoLTEpICE9IFNwYW5FbGVtZW50LmtQYXJhZ3JhcGhUZXJtaW5hdG9yKS8vIG5vIHRlcm1pbmF0b3IgZXhpc3RzLiBCYWlsIG91dC4KKwkJCQlyZXR1cm47CisKIAkJCXJlcGxhY2VUZXh0SW50ZXJuYWwodGV4dExlbmd0aC0xLHRleHRMZW5ndGgsIiIpOwogCQkJbW9kZWxDaGFuZ2VkKE1vZGVsQ2hhbmdlLlRFWFRfREVMRVRFRCx0aGlzLHRleHRMZW5ndGggPiAwID8gdGV4dExlbmd0aC0xIDogMCwxKTsKIAkJfQpAQCAtNDY0LDcgKzQ2OSw3IEBACiAJCQkJewogCQkJCQkvLyBvcHRpbWl6ZWQgdmVyc2lvbiBsZXZlcmFnZXMgcGxheWVyIEFQSXMKIAkJCQkJLy8gVE9ETzogSmVmZiB0byBhZGQgc3BsaXQgb24gVGV4dEVsZW1lbnQgc28gd2UgZG9uJ3QgaGF2ZSB0byBnbyBmaW5kIGEgZ3JvdXAgZXZlcnkgdGltZQotCQkJCQl2YXIgZ3JvdXA6R3JvdXBFbGVtZW50ID0gcGFyZW50LmNyZWF0ZUNvbnRlbnRBc0dyb3VwKCk7CisJCQkJCXZhciBncm91cDpHcm91cEVsZW1lbnQgPSBwYXJlbnQuY3JlYXRlQ29udGVudEFzR3JvdXAoZ2V0RWxlbWVudFJlbGF0aXZlU3RhcnQocGFyZW50KSk7CiAJCQkJCQogCQkJCQl2YXIgZWxlbWVudEluZGV4OmludCA9IGdyb3VwLmdldEVsZW1lbnRJbmRleChfYmxvY2tFbGVtZW50KTsKIAkJCQkJCmRpZmYgLS1naXQgYS90ZXh0TGF5b3V0L3NyYy9mbGFzaHgvdGV4dExheW91dC9lbGVtZW50cy9TdWJQYXJhZ3JhcGhHcm91cEVsZW1lbnRCYXNlLmFzIGIvdGV4dExheW91dC9zcmMvZmxhc2h4L3RleHRMYXlvdXQvZWxlbWVudHMvU3ViUGFyYWdyYXBoR3JvdXBFbGVtZW50QmFzZS5hcwppbmRleCBjNjVlMTM4Li4yYWZmZGEzIDEwMDY0NAotLS0gYS90ZXh0TGF5b3V0L3NyYy9mbGFzaHgvdGV4dExheW91dC9lbGVtZW50cy9TdWJQYXJhZ3JhcGhHcm91cEVsZW1lbnRCYXNlLmFzCisrKyBiL3RleHRMYXlvdXQvc3JjL2ZsYXNoeC90ZXh0TGF5b3V0L2VsZW1lbnRzL1N1YlBhcmFncmFwaEdyb3VwRWxlbWVudEJhc2UuYXMKQEAgLTE5MCw3ICsxOTAsNyBAQAogCQl9CiAJCQogCQkvKiogQHByaXZhdGUgKi8KLQkJdGxmX2ludGVybmFsIG92ZXJyaWRlIGZ1bmN0aW9uIGNyZWF0ZUNvbnRlbnRBc0dyb3VwKCk6R3JvdXBFbGVtZW50CisJCXRsZl9pbnRlcm5hbCBvdmVycmlkZSBmdW5jdGlvbiBjcmVhdGVDb250ZW50QXNHcm91cChwb3M6aW50PTApOkdyb3VwRWxlbWVudAogCQl7IHJldHVybiBncm91cEVsZW1lbnQ7IH0KIAogCQkvKiogQHByaXZhdGUgKi8KZGlmZiAtLWdpdCBhL3RleHRMYXlvdXQvc3JjL2ZsYXNoeC90ZXh0TGF5b3V0L2VsZW1lbnRzL1RhYmxlQmxvY2tDb250YWluZXIuYXMgYi90ZXh0TGF5b3V0L3NyYy9mbGFzaHgvdGV4dExheW91dC9lbGVtZW50cy9UYWJsZUJsb2NrQ29udGFpbmVyLmFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1YWVmMDUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXh0TGF5b3V0L3NyYy9mbGFzaHgvdGV4dExheW91dC9lbGVtZW50cy9UYWJsZUJsb2NrQ29udGFpbmVyLmFzCkBAIC0wLDAgKzEsMzEgQEAKK3BhY2thZ2UgZmxhc2h4LnRleHRMYXlvdXQuZWxlbWVudHMKK3sKKwlpbXBvcnQgZmxhc2guZGlzcGxheS5TcHJpdGU7CisJCisJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmNvbXBvc2UuVGV4dEZsb3dUYWJsZUJsb2NrOworCQorCS8qKgorCSAqIFRoZSBzcHJpdGUgdGhhdCBjb250YWlucyB0aGUgdGFibGUgY2VsbHMuIAorCSAqKi8KKwlwdWJsaWMgY2xhc3MgVGFibGVCbG9ja0NvbnRhaW5lciBleHRlbmRzIFNwcml0ZQorCXsKKwkJCisJCXB1YmxpYyBmdW5jdGlvbiBUYWJsZUJsb2NrQ29udGFpbmVyKCkKKwkJeworCQkJc3VwZXIoKTsKKwkJfQorCQkKKwkJLyoqCisJCSAqIEEgcmVmZXJlbmNlIHRvIHRoZSBUZXh0Rmxvd1RhYmxlQmxvY2sKKwkJICoqLworCQlwdWJsaWMgdmFyIHVzZXJEYXRhOlRleHRGbG93VGFibGVCbG9jazsKKwkJcHVibGljIGZ1bmN0aW9uIGdldFRhYmxlV2lkdGgoKTpOdW1iZXIKKwkJeworCQkJaWYoIXVzZXJEYXRhKQorCQkJCXJldHVybiBOYU47CisJCQlpZighdXNlckRhdGEucGFyZW50VGFibGUpCisJCQkJcmV0dXJuIE5hTjsKKwkJCXJldHVybiB1c2VyRGF0YS5wYXJlbnRUYWJsZS53aWR0aDsKKwkJfQorCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXh0TGF5b3V0L3NyYy9mbGFzaHgvdGV4dExheW91dC9lbGVtZW50cy9UYWJsZUNlbGxFbGVtZW50LmFzIGIvdGV4dExheW91dC9zcmMvZmxhc2h4L3RleHRMYXlvdXQvZWxlbWVudHMvVGFibGVDZWxsRWxlbWVudC5hcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTdkNGM5Ci0tLSAvZGV2L251bGwKKysrIGIvdGV4dExheW91dC9zcmMvZmxhc2h4L3RleHRMYXlvdXQvZWxlbWVudHMvVGFibGVDZWxsRWxlbWVudC5hcwpAQCAtMCwwICsxLDQ2MSBAQAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisvLyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisvLyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorLy8gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisvLyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKy8vICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworcGFja2FnZSBmbGFzaHgudGV4dExheW91dC5lbGVtZW50cworeworCWltcG9ydCBmbGFzaC5kaXNwbGF5LkdyYXBoaWNzOworCWltcG9ydCBmbGFzaC5kaXNwbGF5LlNoYXBlOworCWltcG9ydCBmbGFzaC5kaXNwbGF5LlNwcml0ZTsKKwlpbXBvcnQgZmxhc2guZXZlbnRzLk1vdXNlRXZlbnQ7CisJaW1wb3J0IGZsYXNoLmdlb20uUG9pbnQ7CisJaW1wb3J0IGZsYXNoLnRleHQuZW5naW5lLkdyYXBoaWNFbGVtZW50OworCWltcG9ydCBmbGFzaC51dGlscy5nZXREZWZpbml0aW9uQnlOYW1lOworCWltcG9ydCBmbGFzaC51dGlscy5nZXRRdWFsaWZpZWRDbGFzc05hbWU7CisJCisJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmNvbXBvc2UuRmxvd0RhbWFnZVR5cGU7CisJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmNvbXBvc2UuVGV4dEZsb3dMaW5lOworCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5jb250YWluZXIuQ29udGFpbmVyQ29udHJvbGxlcjsKKwlpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQuZWRpdC5FZGl0TWFuYWdlcjsKKwlpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQuZWRpdC5JRWRpdE1hbmFnZXI7CisJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmVkaXQuSVNlbGVjdGlvbk1hbmFnZXI7CisJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmV2ZW50cy5EYW1hZ2VFdmVudDsKKwlpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQuZXZlbnRzLk1vZGVsQ2hhbmdlOworCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5mb3JtYXRzLkJsb2NrUHJvZ3Jlc3Npb247CisJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmZvcm1hdHMuRmxvYXQ7CisJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LnRsZl9pbnRlcm5hbDsKKwlpbXBvcnQgZmxhc2h4LnVuZG8uVW5kb01hbmFnZXI7CisJCisJdXNlIG5hbWVzcGFjZSB0bGZfaW50ZXJuYWw7CisJCisJLyoqIAorCSAqIFRhYmxlQ2VsbEVsZW1lbnQgaXMgYW4gaXRlbSBpbiBhIFRhYmxlRWxlbWVudC4gSXQgbW9zdCBjb21tb25seSBjb250YWlucyBvbmUgb3IgbW9yZSBQYXJhZ3JhcGhFbGVtZW50IG9iamVjdHMuCisJICoKKwkgKiAKKwkgKiBAcGxheWVydmVyc2lvbiBGbGFzaCAxMAorCSAqIEBwbGF5ZXJ2ZXJzaW9uIEFJUiAxLjUKKwkgKiBAbGFuZ3ZlcnNpb24gMy4wCisJICoKKwkgKi8KKwlwdWJsaWMgZmluYWwgY2xhc3MgVGFibGVDZWxsRWxlbWVudCBleHRlbmRzIFRhYmxlRm9ybWF0dGVkRWxlbWVudAorCXsJCQorCQlwcml2YXRlIHZhciBfeDpOdW1iZXI7CisJCXByaXZhdGUgdmFyIF95Ok51bWJlcjsKKwkJcHJpdmF0ZSB2YXIgX3dpZHRoOk51bWJlcjsKKwkJcHJpdmF0ZSB2YXIgX2hlaWdodDpOdW1iZXI7CisKKwkJcHJpdmF0ZSB2YXIgX3BhcmNlbEluZGV4OmludDsKKwkJcHJpdmF0ZSB2YXIgX2NvbnRhaW5lcjpDZWxsQ29udGFpbmVyOworCQlwcml2YXRlIHZhciBfZW5hYmxlSU1FOkJvb2xlYW4gPSB0cnVlOworCQlwcml2YXRlIHZhciBfZGFtYWdlZDpCb29sZWFuID0gdHJ1ZTsKKwkJcHJpdmF0ZSB2YXIgX2NvbnRyb2xsZXI6Q29udGFpbmVyQ29udHJvbGxlcjsKKworCQlwcml2YXRlIHZhciBfcm93U3Bhbjp1aW50ID0gMTsKKwkJcHJpdmF0ZSB2YXIgX2NvbHVtblNwYW46dWludCA9IDE7CisJCXByaXZhdGUgdmFyIF9yb3dJbmRleDppbnQgPSAtMTsKKwkJcHJpdmF0ZSB2YXIgX2NvbEluZGV4OmludCA9IC0xOworCQlwcml2YXRlIHZhciBfaW5jbHVkZURlc2NlbnRJbkNlbGxCb3VuZHM6Qm9vbGVhbjsKKwkJCisJCXB1YmxpYyBmdW5jdGlvbiBUYWJsZUNlbGxFbGVtZW50KCkKKwkJeworCQkJc3VwZXIoKTsKKwkJCV9jb250cm9sbGVyID0gbmV3IENvbnRhaW5lckNvbnRyb2xsZXIoY29udGFpbmVyLE5hTixOYU4pOworCQl9CisKKwkJLyoqIEBwcml2YXRlICovCisJCW92ZXJyaWRlIHByb3RlY3RlZCBmdW5jdGlvbiBnZXQgYWJzdHJhY3QoKTpCb29sZWFuCisJCXsgcmV0dXJuIGZhbHNlOyB9CisJCQorCQkvKiogQHByaXZhdGUgKi8KKwkJdGxmX2ludGVybmFsIG92ZXJyaWRlIGZ1bmN0aW9uIGdldCBkZWZhdWx0VHlwZU5hbWUoKTpTdHJpbmcKKwkJeyByZXR1cm4gInRkIjsgfQorCQkKKwkJLyoqIEBwcml2YXRlICovCisJCXRsZl9pbnRlcm5hbCBvdmVycmlkZSBmdW5jdGlvbiBjYW5Pd25GbG93RWxlbWVudChlbGVtOkZsb3dFbGVtZW50KTpCb29sZWFuCisJCXsvLyBUYWJsZSBjZWxscyBoYXZlIG5vIFRMRiBjaGlsZHJlbi4gSW5zdGVhZCBpdCBjb250YWlucyBpdHMgb3duIFRleHRGbG93LgorCQkJcmV0dXJuIChlbGVtIGlzIEZsb3dFbGVtZW50KTsKKwkJfQorCisJCXB1YmxpYyBmdW5jdGlvbiBpc0RhbWFnZWQoKTpCb29sZWFuIHsKKwkJCXJldHVybiBfZGFtYWdlZCB8fCAoX3RleHRGbG93ICYmIF90ZXh0Rmxvdy5mbG93Q29tcG9zZXIuaXNEYW1hZ2VkKF90ZXh0Rmxvdy50ZXh0TGVuZ3RoKSk7CisJCX0KKwkJCisJCXByaXZhdGUgdmFyIF9zYXZlZFBhZGRpbmdUb3A6TnVtYmVyID0gMDsKKwkJcHJpdmF0ZSB2YXIgX3NhdmVkUGFkZGluZ0JvdHRvbTpOdW1iZXIgPSAwOworCQlwcml2YXRlIHZhciBfc2F2ZWRQYWRkaW5nTGVmdDpOdW1iZXIgPSAwOworCQlwcml2YXRlIHZhciBfc2F2ZWRQYWRkaW5nUmlnaHQ6TnVtYmVyID0gMDsKKwkJCisJCXB1YmxpYyBmdW5jdGlvbiBjb21wb3NlKCk6Qm9vbGVhbiB7CisJCQkKKwkJCXZhciBwdDpOdW1iZXIgPSBnZXRFZmZlY3RpdmVQYWRkaW5nVG9wKCk7CisJCQl2YXIgcGI6TnVtYmVyID0gZ2V0RWZmZWN0aXZlUGFkZGluZ0JvdHRvbSgpOworCQkJdmFyIHBsOk51bWJlciA9IGdldEVmZmVjdGl2ZVBhZGRpbmdMZWZ0KCk7CisJCQl2YXIgcHI6TnVtYmVyID0gZ2V0RWZmZWN0aXZlUGFkZGluZ1JpZ2h0KCk7CisKKwkJCWlmKHB0ICE9IF9zYXZlZFBhZGRpbmdUb3ApCisJCQl7CisJCQkJX2NvbnRyb2xsZXIucGFkZGluZ1RvcCA9IF9zYXZlZFBhZGRpbmdUb3AgPSBwdDsKKwkJCX0KKwkJCWlmKHBiICE9IF9zYXZlZFBhZGRpbmdCb3R0b20pCisJCQl7CisJCQkJX2NvbnRyb2xsZXIucGFkZGluZ0JvdHRvbSA9IF9zYXZlZFBhZGRpbmdCb3R0b20gPSBwYjsKKwkJCX0KKwkJCWlmKHBsICE9IF9zYXZlZFBhZGRpbmdMZWZ0KQorCQkJeworCQkJCV9jb250cm9sbGVyLnBhZGRpbmdMZWZ0ID0gX3NhdmVkUGFkZGluZ0xlZnQgPSBwbDsKKwkJCX0KKwkJCWlmKHByICE9IF9zYXZlZFBhZGRpbmdSaWdodCkKKwkJCXsKKwkJCQlfY29udHJvbGxlci5wYWRkaW5nUmlnaHQgPSBfc2F2ZWRQYWRkaW5nUmlnaHQgPSBwcjsKKwkJCX0KKworCQkJdmFyIHRhYmxlOlRhYmxlRWxlbWVudCA9IGdldFRhYmxlKCk7CisJCQkKKwkJCV9kYW1hZ2VkID0gZmFsc2U7CisJCQkKKwkJCXZhciBjb21wV2lkdGg6TnVtYmVyID0gMDsKKwkJCWZvcih2YXIgaTppbnQ9MDtpPGNvbHVtblNwYW47aSsrKQorCQkJeworCQkJCWlmICh0YWJsZSAmJiB0YWJsZS5nZXRDb2x1bW5BdChjb2xJbmRleCtpKSkgeworCQkJCQljb21wV2lkdGggKz0gdGFibGUuZ2V0Q29sdW1uQXQoY29sSW5kZXgraSkuY29sdW1uV2lkdGg7CisJCQkJfQorCQkJCQorCQkJfQorCQkJd2lkdGggPSBjb21wV2lkdGg7CisKKwkJCWlmIChfdGV4dEZsb3cgJiYgX3RleHRGbG93LmZsb3dDb21wb3NlcikgeworCQkJCXJldHVybiBfdGV4dEZsb3cuZmxvd0NvbXBvc2VyLmNvbXBvc2UoKTsKKwkJCX0KKwkJCQorCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCQorCQlwdWJsaWMgZnVuY3Rpb24gdXBkYXRlKCk6Qm9vbGVhbgorCQl7CisJCQlpZihfdGV4dEZsb3cgJiYgX3RleHRGbG93LmZsb3dDb21wb3Nlcil7CisJCQkJcmV0dXJuIF90ZXh0Rmxvdy5mbG93Q29tcG9zZXIudXBkYXRlQWxsQ29udHJvbGxlcnMoKTsKKwkJCX0KKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQkKKwkJcHVibGljIGZ1bmN0aW9uIGdldCBwYXJjZWxJbmRleCgpOmludAorCQl7CisJCQlyZXR1cm4gX3BhcmNlbEluZGV4OworCQl9CisJCQorCQlwdWJsaWMgZnVuY3Rpb24gc2V0IHBhcmNlbEluZGV4KHZhbHVlOmludCk6dm9pZAorCQl7CisJCQlfcGFyY2VsSW5kZXggPSB2YWx1ZTsKKwkJfQorCQkKKwkJcHVibGljIGZ1bmN0aW9uIGdldCByb3dJbmRleCgpOmludAorCQl7CisJCQlyZXR1cm4gX3Jvd0luZGV4OworCQl9CisJCQorCQlwdWJsaWMgZnVuY3Rpb24gc2V0IHJvd0luZGV4KHZhbHVlOmludCk6dm9pZAorCQl7CisJCQlfcm93SW5kZXggPSB2YWx1ZTsKKwkJfQorCQkKKwkJcHVibGljIGZ1bmN0aW9uIGdldCBjb2xJbmRleCgpOmludAorCQl7CisJCQlyZXR1cm4gX2NvbEluZGV4OworCQl9CisJCQorCQlwdWJsaWMgZnVuY3Rpb24gc2V0IGNvbEluZGV4KHZhbHVlOmludCk6dm9pZAorCQl7CisJCQlfY29sSW5kZXggPSB2YWx1ZTsKKwkJfQorCQkKKwkJcHJvdGVjdGVkIHZhciBfdGV4dEZsb3c6VGV4dEZsb3c7CisJCQorCQlwdWJsaWMgZnVuY3Rpb24gZ2V0IHRleHRGbG93KCk6VGV4dEZsb3cgeworCQkJCisJCQlpZiAoX3RleHRGbG93ID09IG51bGwpIHsKKwkJCQl2YXIgZmxvdzpUZXh0RmxvdyA9IG5ldyBUZXh0RmxvdygpOworCQkJCQorCQkJCWlmICh0YWJsZSAmJiB0YWJsZS5nZXRUZXh0RmxvdygpICYmIHRhYmxlLmdldFRleHRGbG93KCkuaW50ZXJhY3Rpb25NYW5hZ2VyIGlzIElFZGl0TWFuYWdlcikgeworCQkJCQlmbG93LmludGVyYWN0aW9uTWFuYWdlciA9IG5ldyBFZGl0TWFuYWdlcihJRWRpdE1hbmFnZXIoX3RleHRGbG93LmludGVyYWN0aW9uTWFuYWdlcikudW5kb01hbmFnZXIpOworCQkJCX0KKwkJCQllbHNlIGlmKHRhYmxlICYmIHRhYmxlLmdldFRleHRGbG93KCkgJiYgdGFibGUuZ2V0VGV4dEZsb3coKS5pbnRlcmFjdGlvbk1hbmFnZXIpIHsKKwkJCQkJdmFyIGltOkNsYXNzID0gZ2V0RGVmaW5pdGlvbkJ5TmFtZShnZXRRdWFsaWZpZWRDbGFzc05hbWUodGFibGUuZ2V0VGV4dEZsb3coKS5pbnRlcmFjdGlvbk1hbmFnZXIpKSBhcyBDbGFzczsKKwkJCQkJZmxvdy5pbnRlcmFjdGlvbk1hbmFnZXIgPSBuZXcgaW0oKTsKKwkJCQl9CisJCQkJZWxzZSB7CisJCQkJCWZsb3cubm9ybWFsaXplKCk7CisJCQkJfQorCQkJCQorCQkJCXRleHRGbG93ID0gZmxvdzsKKworCQkJfQorCQkJCisJCQlyZXR1cm4gX3RleHRGbG93OworCQl9CisJCQorCQlwdWJsaWMgZnVuY3Rpb24gc2V0IHRleHRGbG93KHZhbHVlOlRleHRGbG93KTp2b2lkCisJCXsKKwkJCWlmIChfdGV4dEZsb3cpIHsKKwkJCQlfdGV4dEZsb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihEYW1hZ2VFdmVudC5EQU1BR0UsIGhhbmRsZUNlbGxEYW1hZ2UpOworCQkJCV90ZXh0Rmxvdy5mbG93Q29tcG9zZXIucmVtb3ZlQWxsQ29udHJvbGxlcnMoKTsKKwkJCX0KKwkJCQorCQkJX3RleHRGbG93ID0gdmFsdWU7CisJCQlfdGV4dEZsb3cucGFyZW50RWxlbWVudCA9IHRoaXM7CisJCQlfdGV4dEZsb3cuZmxvd0NvbXBvc2VyLmFkZENvbnRyb2xsZXIoX2NvbnRyb2xsZXIpOworCQkJX3RleHRGbG93LmFkZEV2ZW50TGlzdGVuZXIoRGFtYWdlRXZlbnQuREFNQUdFLCBoYW5kbGVDZWxsRGFtYWdlKTsKKwkJCQorCQl9CisJCQorCQlwdWJsaWMgZnVuY3Rpb24gZ2V0IGNvbnRyb2xsZXIoKTpDb250YWluZXJDb250cm9sbGVyIHsKKwkJCXJldHVybiBfY29udHJvbGxlcjsKKwkJfQorCQkKKwkJcHJpdmF0ZSBmdW5jdGlvbiBoYW5kbGVDZWxsRGFtYWdlKGV2OkRhbWFnZUV2ZW50KTp2b2lkeworCQkJZGFtYWdlKCk7CisJCX0KKworCQlwdWJsaWMgZnVuY3Rpb24gZ2V0IGVuYWJsZUlNRSgpOkJvb2xlYW4NCisJCXsKKwkJCXJldHVybiBfZW5hYmxlSU1FOworCQl9CisKKwkJcHVibGljIGZ1bmN0aW9uIHNldCBlbmFibGVJTUUodmFsdWU6Qm9vbGVhbik6dm9pZA0KKwkJeworCQkJX2VuYWJsZUlNRSA9IHZhbHVlOworCQl9CisJCQorCQlwdWJsaWMgZnVuY3Rpb24gZ2V0IGNvbnRhaW5lcigpOkNlbGxDb250YWluZXJ7CisJCQlpZighX2NvbnRhaW5lcil7CisJCQkJX2NvbnRhaW5lciA9IG5ldyBDZWxsQ29udGFpbmVyKGVuYWJsZUlNRSk7CisJCQkJX2NvbnRhaW5lci5lbGVtZW50ID0gdGhpczsKKwkJCX0KKwkJCQorCQkJcmV0dXJuIF9jb250YWluZXI7CisJCX0KKworCQkvKioKKwkJICogR2V0cyB0aGUgd2lkdGguCisJCSAqKi8KKwkJcHVibGljIGZ1bmN0aW9uIGdldCB3aWR0aCgpOk51bWJlcg0KKwkJeworCQkJcmV0dXJuIF93aWR0aDsKKwkJfQorCisJCS8qKgorCQkgKiBAcHJpdmF0ZQorCQkgKiovCisJCXB1YmxpYyBmdW5jdGlvbiBzZXQgd2lkdGgodmFsdWU6TnVtYmVyKTp2b2lkDQorCQl7CisJCQlpZihfd2lkdGggIT0gdmFsdWUpIHsKKwkJCQlfZGFtYWdlZCA9IHRydWU7CisJCQl9CisJCQkKKwkJCV93aWR0aCA9IHZhbHVlOworCQkJCisJCQlfY29udHJvbGxlci5zZXRDb21wb3NpdGlvblNpemUoX3dpZHRoLCBfY29udHJvbGxlci5jb21wb3NpdGlvbkhlaWdodCk7CisJCX0KKwkJCisJCS8qKgorCQkgKiBSZXR1cm5zIHRoZSBoZWlnaHQgb2YgdGhlIGNlbGwuIAorCQkgKiovCisJCXB1YmxpYyBmdW5jdGlvbiBnZXQgaGVpZ2h0KCk6TnVtYmVyDQorCQl7CisJCQkvL3JldHVybiBnZXRSb3dIZWlnaHQoKTsgbm90IHN1cmUgaWYgd2Ugc2hvdWxkIGFsd2F5cyB1c2Ugcm93IGhlaWdodAorCQkJcmV0dXJuIF9oZWlnaHQ7CisJCX0KKworCQkvKioKKwkJICogQHByaXZhdGUKKwkJICoqLworCQlwdWJsaWMgZnVuY3Rpb24gc2V0IGhlaWdodCh2YWx1ZTpOdW1iZXIpOnZvaWQNCisJCXsKKwkJCWlmIChfaGVpZ2h0ICE9IHZhbHVlKSB7CisJCQkJX2RhbWFnZWQgPSB0cnVlOworCQkJfQorCQkJCisJCQlfaGVpZ2h0ID0gdmFsdWU7CisJCQkKKwkJCV9jb250cm9sbGVyLnNldENvbXBvc2l0aW9uU2l6ZShfY29udHJvbGxlci5jb21wb3NpdGlvbldpZHRoLCBfaGVpZ2h0KTsKKwkJfQorCQkKKwkJcHVibGljIGZ1bmN0aW9uIGdldENvbXBvc2VkSGVpZ2h0KCk6TnVtYmVyCisJCXsKKwkJCXZhciBkZXNjZW50Ok51bWJlciA9IDA7CisJCQlpZighaW5jbHVkZURlc2NlbnRJbkNlbGxCb3VuZHMpCisJCQl7CisJCQkJaWYoX3RleHRGbG93LmZsb3dDb21wb3NlciAmJiBfdGV4dEZsb3cuZmxvd0NvbXBvc2VyLm51bUxpbmVzKQorCQkJCXsKKwkJCQkJdmFyIGxhc3RMaW5lOlRleHRGbG93TGluZSA9IF90ZXh0Rmxvdy5mbG93Q29tcG9zZXIuZ2V0TGluZUF0KF90ZXh0Rmxvdy5mbG93Q29tcG9zZXIubnVtTGluZXMtMSk7CisJCQkJCWlmKGxhc3RMaW5lKQorCQkJCQkJZGVzY2VudCA9IGxhc3RMaW5lLmRlc2NlbnQ7CisJCQkJfQorCQkJfQorCQkJcmV0dXJuIChfY29udHJvbGxlci5nZXRDb250ZW50Qm91bmRzKCkuaGVpZ2h0IC0gZGVzY2VudCk7CisJCX0KKwkJCisJCXB1YmxpYyBmdW5jdGlvbiBnZXRSb3dIZWlnaHQoKTpOdW1iZXIKKwkJeworCQkJcmV0dXJuIGdldFJvdygpID8gZ2V0Um93KCkuY29tcG9zZWRIZWlnaHQgOiBOYU47CisJCX0KKworCQlwdWJsaWMgZnVuY3Rpb24gZ2V0IHJvd1NwYW4oKTp1aW50DQorCQl7CisJCQlyZXR1cm4gX3Jvd1NwYW47CisJCX0KKworCQlwdWJsaWMgZnVuY3Rpb24gc2V0IHJvd1NwYW4odmFsdWU6dWludCk6dm9pZA0KKwkJeworCQkJaWYodmFsdWUgPj0gMSkKKwkJCQlfcm93U3BhbiA9IHZhbHVlOworCQl9CisKKwkJcHVibGljIGZ1bmN0aW9uIGdldCBjb2x1bW5TcGFuKCk6dWludA0KKwkJeworCQkJcmV0dXJuIF9jb2x1bW5TcGFuOworCQl9CisKKwkJcHVibGljIGZ1bmN0aW9uIHNldCBjb2x1bW5TcGFuKHZhbHVlOnVpbnQpOnZvaWQNCisJCXsKKwkJCWlmKHZhbHVlID49IDEpCisJCQkJX2NvbHVtblNwYW4gPSB2YWx1ZTsKKwkJfQorCQkKKwkJcHVibGljIGZ1bmN0aW9uIHVwZGF0ZUNvbXBvc2l0aW9uU2hhcGVzKCk6dm9pZHsKKwkJCV9jb250cm9sbGVyLnVwZGF0ZUNvbXBvc2l0aW9uU2hhcGVzKCk7CisJCX0KKwkJCisJCS8qKgorCQkgKiBSZXR1cm4gdGhlIHJvdyB0aGF0IHRoaXMgY2VsbCBpcyBwYXJ0IG9mIG9yIG51bGwgCisJCSAqIGlmIG5vdCBwYXJ0IG9mIGEgcm93LgorCQkgKiovCisJCXB1YmxpYyBmdW5jdGlvbiBnZXRSb3coKTpUYWJsZVJvd0VsZW1lbnQKKwkJeworCQkJcmV0dXJuIHRhYmxlID8gdGFibGUuZ2V0Um93QXQocm93SW5kZXgpIDogbnVsbDsKKwkJfQorCQkKKwkJLyoqCisJCSAqIFJldHVybnMgdGhlIG5leHQgY2VsbCBpbiB0aGUgdGFibGUgb3IgbnVsbCBpZiBub3QgcGFydCBvZiBhCisJCSAqIHRhYmxlIG9yIG5vIGNlbGxzIGV4aXN0IGFmdGVyIHRoaXMgY2VsbC4KKwkJICoqLworCQlwdWJsaWMgZnVuY3Rpb24gZ2V0TmV4dENlbGwoKTpUYWJsZUNlbGxFbGVtZW50IHsKKwkJCXJldHVybiB0YWJsZSA/IHRhYmxlLmdldE5leHRDZWxsKHRoaXMpIDogbnVsbDsKKwkJfQorCQkKKwkJLyoqCisJCSAqIFJldHVybnMgdGhlIHByZXZpb3VzIGNlbGwgaW4gdGhlIHRhYmxlIG9yIG51bGwgaWYgbm90IHBhcnQgb2YgYQorCQkgKiB0YWJsZSBvciBubyBjZWxscyBleGlzdCBiZWZvcmUgdGhpcyBjZWxsLgorCQkgKiovCisJCXB1YmxpYyBmdW5jdGlvbiBnZXRQcmV2aW91c0NlbGwoKTpUYWJsZUNlbGxFbGVtZW50IHsKKwkJCXJldHVybiB0YWJsZSA/IHRhYmxlLmdldFByZXZpb3VzQ2VsbCh0aGlzKSA6IG51bGw7CisJCX0KKworCQlwdWJsaWMgZnVuY3Rpb24gZ2V0IHgoKTpOdW1iZXINCisJCXsKKwkJCXJldHVybiBjb250YWluZXIueDsKKwkJfQorCisJCXB1YmxpYyBmdW5jdGlvbiBzZXQgeCh2YWx1ZTpOdW1iZXIpOnZvaWQNCisJCXsKKwkJCWNvbnRhaW5lci54ID0gdmFsdWU7CisJCX0KKworCQlwdWJsaWMgZnVuY3Rpb24gZ2V0IHkoKTpOdW1iZXINCisJCXsKKwkJCXJldHVybiBjb250YWluZXIueTsKKwkJfQorCisJCXB1YmxpYyBmdW5jdGlvbiBzZXQgeSh2YWx1ZTpOdW1iZXIpOnZvaWQNCisJCXsKKwkJCWNvbnRhaW5lci55ID0gdmFsdWU7CisJCX0KKworCQlwdWJsaWMgZnVuY3Rpb24gZGFtYWdlKCk6dm9pZAorCQl7CisJCQlpZiAodGFibGUpIHsKKwkJCQl0YWJsZS5oYXNDZWxsRGFtYWdlID0gdHJ1ZTsKKwkJCX0KKwkJCQorCQkJX2RhbWFnZWQgPSB0cnVlOworCQl9CisJCQorCQkvKioKKwkJICogQWRkcyBpbiB0aGUgdGFibGUgY2VsbCBzcGFjaW5nLCBib3JkZXIgc3Ryb2tlIHdpZHRoLiAKKwkJICogV2UgbWF5IGJlIGFibGUgdG8gc2V0IHRoaXMgdmFsdWUgd2hlbiB0aGUgZm9ybWF0IGNoYW5nZXMuIAorCQkgKiBGb3Igbm93IHdlIGp1c3Qgd2FudCB0byBnZXQgaXQgdG8gd29yay4gCisJCSAqKi8KKwkJcHVibGljIGZ1bmN0aW9uIGdldFRvdGFsUGFkZGluZ1dpZHRoKCk6TnVtYmVyIHsKKwkJCXZhciBwYWRkaW5nQW1vdW50Ok51bWJlciA9IDA7CisJCQkKKwkJCS8vIG5vIHRleHRmbG93IGlzIG5vIHBhZGRpbmcKKwkJCWlmICghdGV4dEZsb3cpIHsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCQorCQkJaWYgKHRhYmxlICYmIHRhYmxlLmNlbGxTcGFjaW5nIT11bmRlZmluZWQpIHsKKwkJCQlwYWRkaW5nQW1vdW50ICs9IHRhYmxlLmNlbGxTcGFjaW5nOworCQkJfQorCQkJCisJCQlpZiAodGV4dEZsb3cuY29tcHV0ZWRGb3JtYXQuYmxvY2tQcm9ncmVzc2lvbiA9PSBCbG9ja1Byb2dyZXNzaW9uLlJMKSB7CisJCQkJcGFkZGluZ0Ftb3VudCArPSBNYXRoLm1heChnZXRFZmZlY3RpdmVQYWRkaW5nVG9wKCkgKyBnZXRFZmZlY3RpdmVQYWRkaW5nQm90dG9tKCksIGdldEVmZmVjdGl2ZUJvcmRlclRvcFdpZHRoKCkgKyBnZXRFZmZlY3RpdmVCb3JkZXJCb3R0b21XaWR0aCgpKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCXBhZGRpbmdBbW91bnQgKz0gTWF0aC5tYXgoZ2V0RWZmZWN0aXZlUGFkZGluZ0xlZnQoKSArIGdldEVmZmVjdGl2ZVBhZGRpbmdSaWdodCgpLCBnZXRFZmZlY3RpdmVCb3JkZXJMZWZ0V2lkdGgoKSArIGdldEVmZmVjdGl2ZUJvcmRlclJpZ2h0V2lkdGgoKSk7CisJCQl9CisJCQkKKwkJCXJldHVybiBwYWRkaW5nQW1vdW50OworCQl9CisJCQorCQkvKioKKwkJICogQWRkcyBpbiB0aGUgdGFibGUgY2VsbCBzcGFjaW5nLCBib3JkZXIgc3Ryb2tlIGhlaWdodC4gCisJCSAqIFdlIG1heSBiZSBhYmxlIHRvIHNldCB0aGlzIHZhbHVlIHdoZW4gdGhlIGZvcm1hdCBjaGFuZ2VzLiAKKwkJICoqLworCQlwdWJsaWMgZnVuY3Rpb24gZ2V0VG90YWxQYWRkaW5nSGVpZ2h0KCk6TnVtYmVyIHsKKwkJCXZhciBwYWRkaW5nQW1vdW50Ok51bWJlciA9IDA7CisJCQkKKwkJCS8vIG5vIHRleHRmbG93IGlzIG5vIHBhZGRpbmcKKwkJCWlmICghdGV4dEZsb3cpIHsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCQorCQkJaWYgKHRhYmxlICYmIHRhYmxlLmNlbGxTcGFjaW5nIT11bmRlZmluZWQpIHsKKwkJCQlwYWRkaW5nQW1vdW50ICs9IHRhYmxlLmNlbGxTcGFjaW5nOworCQkJfQorCQkJCisJCQlpZiAodGV4dEZsb3cuY29tcHV0ZWRGb3JtYXQuYmxvY2tQcm9ncmVzc2lvbiA9PSBCbG9ja1Byb2dyZXNzaW9uLlJMKSB7CisJCQkJcGFkZGluZ0Ftb3VudCArPSBNYXRoLm1heChnZXRFZmZlY3RpdmVQYWRkaW5nTGVmdCgpICsgZ2V0RWZmZWN0aXZlUGFkZGluZ1JpZ2h0KCksIGdldEVmZmVjdGl2ZUJvcmRlckxlZnRXaWR0aCgpICsgZ2V0RWZmZWN0aXZlQm9yZGVyUmlnaHRXaWR0aCgpKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCXBhZGRpbmdBbW91bnQgKz0gTWF0aC5tYXgoZ2V0RWZmZWN0aXZlUGFkZGluZ1RvcCgpICsgZ2V0RWZmZWN0aXZlUGFkZGluZ0JvdHRvbSgpLCBnZXRFZmZlY3RpdmVCb3JkZXJUb3BXaWR0aCgpICsgZ2V0RWZmZWN0aXZlQm9yZGVyQm90dG9tV2lkdGgoKSk7CisJCQl9CisJCQkKKwkJCXJldHVybiBwYWRkaW5nQW1vdW50OworCQl9CisKKwkJcHVibGljIGZ1bmN0aW9uIGdldCBpbmNsdWRlRGVzY2VudEluQ2VsbEJvdW5kcygpOkJvb2xlYW4NCisJCXsKKwkJCXJldHVybiBfaW5jbHVkZURlc2NlbnRJbkNlbGxCb3VuZHM7CisJCX0KKworCQlwdWJsaWMgZnVuY3Rpb24gc2V0IGluY2x1ZGVEZXNjZW50SW5DZWxsQm91bmRzKHZhbHVlOkJvb2xlYW4pOnZvaWQNCisJCXsKKwkJCV9pbmNsdWRlRGVzY2VudEluQ2VsbEJvdW5kcyA9IHZhbHVlOworCQl9CisKKwkJCisJfQorfQpkaWZmIC0tZ2l0IGEvdGV4dExheW91dC9zcmMvZmxhc2h4L3RleHRMYXlvdXQvZWxlbWVudHMvVGFibGVDb2xFbGVtZW50LmFzIGIvdGV4dExheW91dC9zcmMvZmxhc2h4L3RleHRMYXlvdXQvZWxlbWVudHMvVGFibGVDb2xFbGVtZW50LmFzCmluZGV4IDg1YTFkOWUuLjM0MmI5Y2UgMTAwNjQ0Ci0tLSBhL3RleHRMYXlvdXQvc3JjL2ZsYXNoeC90ZXh0TGF5b3V0L2VsZW1lbnRzL1RhYmxlQ29sRWxlbWVudC5hcworKysgYi90ZXh0TGF5b3V0L3NyYy9mbGFzaHgvdGV4dExheW91dC9lbGVtZW50cy9UYWJsZUNvbEVsZW1lbnQuYXMKQEAgLTE4LDYgKzE4LDcgQEAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiBwYWNrYWdlIGZsYXNoeC50ZXh0TGF5b3V0LmVsZW1lbnRzCiB7CisJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmZvcm1hdHMuSVRleHRMYXlvdXRGb3JtYXQ7CiAJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LnRsZl9pbnRlcm5hbDsKIAkKIAl1c2UgbmFtZXNwYWNlIHRsZl9pbnRlcm5hbDsKQEAgLTM2LDYgKzM3LDE1IEBACiAJewkJCiAJCS8vcHVibGljIHZhciBoZWlnaHQ6TnVtYmVyOwogCQlwdWJsaWMgdmFyIHg6TnVtYmVyOworCQlwdWJsaWMgdmFyIGNvbEluZGV4OmludDsKKwkJCisJCXB1YmxpYyBmdW5jdGlvbiBUYWJsZUNvbEVsZW1lbnQoZm9ybWF0OklUZXh0TGF5b3V0Rm9ybWF0PW51bGwpCisJCXsKKwkJCXN1cGVyKCk7CisJCQlpZihmb3JtYXQpCisJCQkJdGhpcy5mb3JtYXQgPSBmb3JtYXQ7CisJCX0KKwogCQkKIAkJLyoqIEBwcml2YXRlICovCiAJCW92ZXJyaWRlIHByb3RlY3RlZCBmdW5jdGlvbiBnZXQgYWJzdHJhY3QoKTpCb29sZWFuCkBAIC01Niw2ICs2NiwyOSBAQAogCQl7CiAJCQlzdXBlci5tb2RlbENoYW5nZWQoY2hhbmdlVHlwZSxlbGVtLGNoYW5nZVN0YXJ0LGNoYW5nZUxlbixuZWVkTm9ybWFsaXplLGJ1bXBHZW5lcmF0aW9uKTsKIAkJfQotCisJCQorCQkvKioKKwkJICogR2V0IGEgVmVjdG9yIG9mIGNlbGxzIG9yIG51bGwgaWYgdGhlIGNvbHVtbiBjb250YWlucyBubyBjZWxscworCQkgKiovCisJCXB1YmxpYyBmdW5jdGlvbiBnZXQgY2VsbHMoKTpWZWN0b3IuPFRhYmxlQ2VsbEVsZW1lbnQ+IHsKKwkJCQorCQkJaWYgKCF0YWJsZSkgeworCQkJCXJldHVybiBudWxsOworCQkJfQorCQkJCisJCQlyZXR1cm4gdGFibGUuZ2V0Q2VsbHNGb3JDb2x1bW4odGhpcyk7CisJCX0KKwkJCisJCS8qKgorCQkgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgY2VsbHMgaW4gdGhpcyBjb2x1bW4uIAorCQkgKiovCisJCXB1YmxpYyBmdW5jdGlvbiBnZXQgbnVtQ2VsbHMoKTppbnQgeworCQkJCisJCQlpZiAoIXRhYmxlKSB7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQkKKwkJCXJldHVybiB0YWJsZS5nZXRDZWxsc0ZvckNvbHVtbih0aGlzKS5sZW5ndGg7CisJCX0KIAl9CiB9CmRpZmYgLS1naXQgYS90ZXh0TGF5b3V0L3NyYy9mbGFzaHgvdGV4dExheW91dC9lbGVtZW50cy9UYWJsZUVsZW1lbnQuYXMgYi90ZXh0TGF5b3V0L3NyYy9mbGFzaHgvdGV4dExheW91dC9lbGVtZW50cy9UYWJsZUVsZW1lbnQuYXMKaW5kZXggOTJjZWZjYy4uYzdmMmZiYyAxMDA2NDQKLS0tIGEvdGV4dExheW91dC9zcmMvZmxhc2h4L3RleHRMYXlvdXQvZWxlbWVudHMvVGFibGVFbGVtZW50LmFzCisrKyBiL3RleHRMYXlvdXQvc3JjL2ZsYXNoeC90ZXh0TGF5b3V0L2VsZW1lbnRzL1RhYmxlRWxlbWVudC5hcwpAQCAtMTgsMTkgKzE4LDE3IEBACiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogcGFja2FnZSBmbGFzaHgudGV4dExheW91dC5lbGVtZW50cwogewotCWltcG9ydCBmbGFzaC5kaXNwbGF5LkdyYXBoaWNzOwotCWltcG9ydCBmbGFzaC5ldmVudHMuRXZlbnQ7Ci0JaW1wb3J0IGZsYXNoLmV2ZW50cy5FdmVudERpc3BhdGNoZXI7Ci0JaW1wb3J0IGZsYXNoLmV2ZW50cy5JRXZlbnREaXNwYXRjaGVyOwotCWltcG9ydCBmbGFzaC5ldmVudHMuTW91c2VFdmVudDsKLQlpbXBvcnQgZmxhc2guZ2VvbS5Qb2ludDsKLQlpbXBvcnQgZmxhc2gudGV4dC5lbmdpbmUuVGV4dEJsb2NrOwotCWltcG9ydCBmbGFzaC50ZXh0LmVuZ2luZS5UZXh0TGluZTsKKwlpbXBvcnQgZmxhc2guZGlzcGxheS5TcHJpdGU7CisJaW1wb3J0IGZsYXNoLnRleHQuZW5naW5lLkNvbnRlbnRFbGVtZW50OworCWltcG9ydCBmbGFzaC50ZXh0LmVuZ2luZS5HcmFwaGljRWxlbWVudDsKKwlpbXBvcnQgZmxhc2gudXRpbHMuRGljdGlvbmFyeTsKIAkKLQlpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQuZXZlbnRzLkZsb3dFbGVtZW50RXZlbnREaXNwYXRjaGVyOwotCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5ldmVudHMuRmxvd0VsZW1lbnRNb3VzZUV2ZW50TWFuYWdlcjsKKwlpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQuY29tcG9zZS5UZXh0Rmxvd1RhYmxlQmxvY2s7CisJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmVkaXQuU2VsZWN0aW9uRm9ybWF0OwogCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5ldmVudHMuTW9kZWxDaGFuZ2U7Ci0JaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmZvcm1hdHMuKjsKKwlpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQuZm9ybWF0cy5Gb3JtYXRWYWx1ZTsKKwlpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQuZm9ybWF0cy5JVGV4dExheW91dEZvcm1hdDsKKwlpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQuZm9ybWF0cy5UZXh0TGF5b3V0Rm9ybWF0OwogCWltcG9ydCBmbGFzaHgudGV4dExheW91dC50bGZfaW50ZXJuYWw7CiAJCiAJdXNlIG5hbWVzcGFjZSB0bGZfaW50ZXJuYWw7CkBAIC00MSw3ICszOSw2IEBACiAJICogQSBUYWJsZUVsZW1lbnQncyBjaGlsZHJlbiBtdXN0IGJlIG9mIHR5cGUgVGFibGVSb3dFbGVtZW50LCBUYWJsZUNvbEVsZW1lbnQsIFRhYmxlQ29sR3JvdXBFbGVtZW50LCBUYWJsZUJvZHlFbGVtZW50LgogCSAqIAogCSAqIAotCSAqIAogCSAqIEBwbGF5ZXJ2ZXJzaW9uIEZsYXNoIDEwCiAJICogQHBsYXllcnZlcnNpb24gQUlSIDEuNQogCSAqIEBsYW5ndmVyc2lvbiAzLjAKQEAgLTQ5LDQxICs0NiwzOCBAQAogCSAqLwogCXB1YmxpYyBjbGFzcyBUYWJsZUVsZW1lbnQgZXh0ZW5kcyBUYWJsZUZvcm1hdHRlZEVsZW1lbnQgCiAJewotCQlwcml2YXRlIHZhciBfcm93OmludDsKLQkJcHJpdmF0ZSB2YXIgX2NvbHVtbjppbnQ7CiAJCQotCQlwcml2YXRlIHZhciBfaGVpZ2h0OkFycmF5ID0gW107IC8vIHBhcmNlbC1pbmRleGVkCi0JCXB1YmxpYyB2YXIgY29tcHV0ZWRXaWR0aDpOdW1iZXI7CisJCXByaXZhdGUgdmFyIF9jb21wdXRlZFdpZHRoOk51bWJlcjsKIAkJCiAJCXB1YmxpYyB2YXIgeDpOdW1iZXI7CiAJCXB1YmxpYyB2YXIgeTpOdW1iZXI7CiAJCQotCQkvL1RoZXNlIGF0dHJpYnV0ZXMgaXMgZnJvbSB0aGUgb3JpZ2luYWwgbG9vcCBwcm90b3R5cGUuIE1heWJlIGNoYW5nZWQgbGF0ZXIKLQkJcHVibGljIHZhciB0b3RhbFJvd0RlcHRoOk51bWJlciA9IHVuZGVmaW5lZDsKLQkJcHVibGljIHZhciBvcmlnaW5QYXJjZWxJbmRleDpOdW1iZXI7Ci0JCXB1YmxpYyB2YXIgbnVtQWNyb3NzUGFyY2VsczppbnQ7Ci0gICAgICAgIHB1YmxpYyB2YXIgY3VyUm93SWR4OmludCA9IDA7IC8vIHRoaXMgdmFsdWUgc2hvdWxkIGJlIG9ubHkgdXNlZCB3aGlsZSBjb21wb3NpbmcKLSAgICAgICAgcHVibGljIHZhciBvdXRPZkxhc3RQYXJjZWw6Qm9vbGVhbiA9IGZhbHNlOyAKLQkJCQotCQlwcml2YXRlIHZhciBhckNvbHVtbjpBcnJheSA9IFtdOworCQlwcml2YXRlIHZhciBjb2x1bW5zOlZlY3Rvci48VGFibGVDb2xFbGVtZW50PiA9IG5ldyBWZWN0b3IuPFRhYmxlQ29sRWxlbWVudD4oKTsKKwkJcHJpdmF0ZSB2YXIgcm93czpWZWN0b3IuPFRhYmxlUm93RWxlbWVudD4gPSBuZXcgVmVjdG9yLjxUYWJsZVJvd0VsZW1lbnQ+KCk7CisJCXByaXZhdGUgdmFyIGRhbWFnZWRDb2x1bW5zOlZlY3Rvci48VGFibGVDb2xFbGVtZW50PiA9IG5ldyBWZWN0b3IuPFRhYmxlQ29sRWxlbWVudD4oKTsKKwkJcHJpdmF0ZSB2YXIgZGFtYWdlUm93czpWZWN0b3IuPFRhYmxlUm93RWxlbWVudD4gPSBuZXcgVmVjdG9yLjxUYWJsZVJvd0VsZW1lbnQ+KCk7CisJCXByaXZhdGUgdmFyIF9oYXNDZWxsRGFtYWdlOkJvb2xlYW4gPSB0cnVlOworCQkKKwkJcHJpdmF0ZSB2YXIgX2hlYWRlclJvd0NvdW50OnVpbnQgPSAwOworCQlwcml2YXRlIHZhciBfZm9vdGVyUm93Q291bnQ6dWludCA9IDA7CisJCXByaXZhdGUgdmFyIF90YWJsZVJvd3NDb21wdXRlZDpCb29sZWFuOworCQkKKwkJcHJpdmF0ZSB2YXIgX2hlYWRlclJvd3M6VmVjdG9yLjwgVmVjdG9yLjxUYWJsZUNlbGxFbGVtZW50PiA+OworCQlwcml2YXRlIHZhciBfZm9vdGVyUm93czpWZWN0b3IuPCBWZWN0b3IuPFRhYmxlQ2VsbEVsZW1lbnQ+ID47CisJCXByaXZhdGUgdmFyIF9ib2R5Um93czpWZWN0b3IuPCBWZWN0b3IuPFRhYmxlQ2VsbEVsZW1lbnQ+ID47CisJCXByaXZhdGUgdmFyIF9jb21wb3NlZFJvd0luZGV4OnVpbnQgPSAwOworCQkKKwkJcHJpdmF0ZSB2YXIgX3RhYmxlQmxvY2tzOlZlY3Rvci48VGV4dEZsb3dUYWJsZUJsb2NrPjsKKwkJcHJpdmF0ZSB2YXIgX3RhYmxlQmxvY2tJbmRleDp1aW50ID0gMDsKKwkJcHJpdmF0ZSB2YXIgX3RhYmxlQmxvY2tEaWN0OkRpY3Rpb25hcnk7CisJCQorCQlwcml2YXRlIHZhciBfbGVhZjpUYWJsZUxlYWZFbGVtZW50OwogCQkKIAkJcHVibGljIGZ1bmN0aW9uIFRhYmxlRWxlbWVudCgpCiAJCXsKIAkJCXN1cGVyKCk7CiAJCX0KIAkJCi0JCXB1YmxpYyBmdW5jdGlvbiBpbml0VGFibGVFbGVtZW50KHJvdzpOdW1iZXIsIGNvbHVtbjpOdW1iZXIpOnZvaWQKLQkJewotCQkJX3JvdyA9IHJvdzsKLQkJCV9jb2x1bW4gPSBjb2x1bW47Ci0JCQkKLQkJCWZvciAoIHZhciBpOmludCA9IDA7IGkgPCBjb2x1bW47IGkgKysgKQotCQkJewotCQkJCXZhciBjb2w6VGFibGVDb2xFbGVtZW50ID0gbmV3IFRhYmxlQ29sRWxlbWVudCgpOwkKLQkJCQlhckNvbHVtbltpXSA9IGNvbDsKLQkJCX0KLQkJfQotCQkKIAkJLyoqIEBwcml2YXRlICovCiAJCW92ZXJyaWRlIHByb3RlY3RlZCBmdW5jdGlvbiBnZXQgYWJzdHJhY3QoKTpCb29sZWFuCiAJCXsgcmV0dXJuIGZhbHNlOyB9CkBAIC05NSwzNSArODksNzM1IEBACiAJCS8qKiBAcHJpdmF0ZSAqLwogCQl0bGZfaW50ZXJuYWwgb3ZlcnJpZGUgZnVuY3Rpb24gY2FuT3duRmxvd0VsZW1lbnQoZWxlbTpGbG93RWxlbWVudCk6Qm9vbGVhbgogCQl7Ci0JCQlyZXR1cm4gIChlbGVtIGlzIFRhYmxlQm9keUVsZW1lbnQpIHx8IChlbGVtIGlzIFRhYmxlUm93RWxlbWVudCkgfHwgKGVsZW0gaXMgVGFibGVDb2xFbGVtZW50KSB8fCAoZWxlbSBpcyBUYWJsZUNvbEdyb3VwRWxlbWVudCk7CisJCQlyZXR1cm4gKGVsZW0gaXMgVGFibGVDZWxsRWxlbWVudCkgfHwgKGVsZW0gaXMgVGFibGVSb3dFbGVtZW50KSB8fCAoZWxlbSBpcyBUYWJsZUNvbEVsZW1lbnQpOy8vIHx8IChlbGVtIGlzIFRhYmxlQm9keUVsZW1lbnQpIHx8IChlbGVtIGlzIFRhYmxlQ29sR3JvdXBFbGVtZW50KTsKIAkJfQogCQkKIAkJLyoqIEBwcml2YXRlIGlmIGl0cyBpbiBhIG51bWJlcmVkIGxpc3QgZXhwYW5kIHRoZSBkYW1hZ2UgdG8gYWxsIGxpc3QgaXRlbXMgLSBjYXVzZXMgdGhlIG51bWJlcnMgdG8gYmUgcmVnZW5lcmF0ZWQgKi8KIAkJdGxmX2ludGVybmFsIG92ZXJyaWRlIGZ1bmN0aW9uIG1vZGVsQ2hhbmdlZChjaGFuZ2VUeXBlOlN0cmluZywgZWxlbTpGbG93RWxlbWVudCwgY2hhbmdlU3RhcnQ6aW50LCBjaGFuZ2VMZW46aW50LCBuZWVkTm9ybWFsaXplOkJvb2xlYW4gPSB0cnVlLCBidW1wR2VuZXJhdGlvbjpCb29sZWFuID0gdHJ1ZSk6dm9pZAogCQl7CisJCQlpZiAoY2hhbmdlVHlwZT09TW9kZWxDaGFuZ2UuRUxFTUVOVF9BRERFRCkgeworCQkJCQorCQkJfQorCQkJZWxzZSBpZiAoY2hhbmdlVHlwZT09TW9kZWxDaGFuZ2UuRUxFTUVOVF9SRU1PVkFMKSB7CisJCQkJaWYgKGhlYWRlclJvd0NvdW50ID4gMCB8fCBmb290ZXJSb3dDb3VudCA+IDApIHsKKwkJCQkJCisJCQkJfQorCQkJfQorCQkJCiAJCQlzdXBlci5tb2RlbENoYW5nZWQoY2hhbmdlVHlwZSxlbGVtLGNoYW5nZVN0YXJ0LGNoYW5nZUxlbixuZWVkTm9ybWFsaXplLGJ1bXBHZW5lcmF0aW9uKTsKIAkJfQogCQkKLQkJcHVibGljIGZ1bmN0aW9uIGdldCByb3coKTppbnQKKwkJb3ZlcnJpZGUgcHVibGljIGZ1bmN0aW9uIHNldCBjZWxsU3BhY2luZyhjZWxsU3BhY2luZ1ZhbHVlOiopOnZvaWQKIAkJewotCQkJcmV0dXJuIF9yb3c7CisJCQkKKwkJCW1hcmtDZWxsc0RhbWFnZWQoKTsKKwkJCWhhc0NlbGxEYW1hZ2UgPSB0cnVlOworCQkJbm9ybWFsaXplQ2VsbHMoKTsKKwkJCQorCQkJc3VwZXIuY2VsbFNwYWNpbmcgPSBjZWxsU3BhY2luZ1ZhbHVlOwogCQl9CiAJCQotCQlwdWJsaWMgZnVuY3Rpb24gZ2V0IGNvbHVtbigpOmludAorCQlwdWJsaWMgZnVuY3Rpb24gZ2V0IG51bVJvd3MoKTppbnQKIAkJewotCQkJcmV0dXJuIF9jb2x1bW47CisJCQlyZXR1cm4gcm93cy5sZW5ndGg7CisJCX0KKwkJCisJCXB1YmxpYyBmdW5jdGlvbiBnZXQgbnVtQ29sdW1ucygpOmludAorCQl7CisJCQlyZXR1cm4gY29sdW1ucy5sZW5ndGg7CisJCX0KKwkJCisJCS8qKgorCQkgKiBUb3RhbCBudW1iZXIgb2YgY2VsbHMKKwkJICoqLworCQlwdWJsaWMgZnVuY3Rpb24gZ2V0IG51bUNlbGxzKCk6aW50CisJCXsKKwkJCXJldHVybiBnZXRDZWxscygpLmxlbmd0aDsKKwkJfQorCQkKKwkJLyoqCisJCSAqIFRvdGFsIG51bWJlciBvZiByb3dzIGluIHRoZSB0YWJsZS4gSWYgc2V0IHRvIGEgdmFsdWUgbG93ZXIgdGhhbgorCQkgKiB0aGUgY3VycmVudCBudW1iZXIgb2Ygcm93cyB0aGUgcm93cyBhdCB0aGUgZW5kIG9mIHRoZSB0YWJsZSBhcmUgcmVtb3ZlZC4gCisJCSAqIElmIHRoZSBzZXQgdG8gYSB2YWx1ZSBncmVhdGVyIHRoYW4gdGhlIGN1cnJlbnQgbnVtYmVyIG9mIHJvd3MgYWRkaXRpb25hbAorCQkgKiByb3dzIGFyZSBhZGRlZCB0byB0aGUgdGFibGUuIAorCQkgKiovCisJCXB1YmxpYyBmdW5jdGlvbiBzZXQgbnVtUm93cyh2YWx1ZTppbnQpOnZvaWQKKwkJeworCQkJd2hpbGUodmFsdWUgPCBudW1Sb3dzKXsKKwkJCQlyb3dzLnBvcCgpOworCQkJfQorCQkJdmFyIG51bTppbnQgPSBudW1Sb3dzOworCQkJZm9yKHZhciBpOmludCA9IG51bTtpPHZhbHVlO2krKykgeworCQkJCXZhciByb3c6VGFibGVSb3dFbGVtZW50ID0gY3JlYXRlUm93RWxlbWVudChpLCBkZWZhdWx0Um93Rm9ybWF0KTsKKwkJCQlyb3dzLnB1c2gocm93KTsKKwkJCX0KIAkJfQogCi0JCXB1YmxpYyBmdW5jdGlvbiBnZXRDb2x1bW5BdChjb2x1bW5JbmRleDppbnQpOlRhYmxlQ29sRWxlbWVudAorCQkvKioKKwkJICogVG90YWwgbnVtYmVyIG9mIGNvbHVtbnMgaW4gdGhlIHRhYmxlLiBJZiBzZXQgdG8gYSB2YWx1ZSBsb3dlciB0aGFuCisJCSAqIHRoZSBjdXJyZW50IG51bWJlciBvZiBjb2x1bW5zIHRoZSBjb2x1bW5zIGF0IHRoZSBlbmQgb2YgdGhlIHRhYmxlIGFyZSByZW1vdmVkLiAKKwkJICogSWYgdGhlIHNldCB0byBhIHZhbHVlIGdyZWF0ZXIgdGhhbiB0aGUgY3VycmVudCBudW1iZXIgb2YgY29sdW1ucyBhZGRpdGlvbmFsCisJCSAqIGNvbHVtbnMgYXJlIGFkZGVkIHRvIHRoZSB0YWJsZS4gCisJCSAqKi8KKwkJcHVibGljIGZ1bmN0aW9uIHNldCBudW1Db2x1bW5zKHZhbHVlOmludCk6dm9pZAogCQl7Ci0JCQlpZiAoIGNvbHVtbkluZGV4IDwgMCB8fCBjb2x1bW5JbmRleCA+PSBfY29sdW1uICkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXJldHVybiBhckNvbHVtbltjb2x1bW5JbmRleF07CisJCQl3aGlsZSh2YWx1ZSA8IG51bUNvbHVtbnMpeworCQkJCWNvbHVtbnMucG9wKCk7CisJCQl9CisJCQl2YXIgbnVtOmludCA9IG51bUNvbHVtbnM7CisJCQlmb3IodmFyIGk6aW50ID0gbnVtO2k8dmFsdWU7aSsrKSB7CisJCQkJdmFyIGNvbHVtbjpUYWJsZUNvbEVsZW1lbnQgPSBjcmVhdGVDb2x1bW5FbGVtZW50KGksIGRlZmF1bHRDb2x1bW5Gb3JtYXQpOworCQkJCWNvbHVtbnMucHVzaChjb2x1bW4pOworCQkJfQorCQl9CisJCXByaXZhdGUgdmFyIF9kZWZhdWx0Um93Rm9ybWF0OklUZXh0TGF5b3V0Rm9ybWF0OworCisJCS8qKgorCQkgKiBHZXRzIHRoZSByb3cgZm9ybWF0IGZvciBuZXcgcm93cy4gCisJCSAqKi8KKwkJcHVibGljIGZ1bmN0aW9uIGdldCBkZWZhdWx0Um93Rm9ybWF0KCk6SVRleHRMYXlvdXRGb3JtYXQNCisJCXsKKwkJCWlmKCFfZGVmYXVsdFJvd0Zvcm1hdCkKKwkJCQlfZGVmYXVsdFJvd0Zvcm1hdCA9IG5ldyBUZXh0TGF5b3V0Rm9ybWF0KGNvbXB1dGVkRm9ybWF0KTsKKwkJCXJldHVybiBfZGVmYXVsdFJvd0Zvcm1hdDsKKwkJfQorCisJCXB1YmxpYyBmdW5jdGlvbiBzZXQgZGVmYXVsdFJvd0Zvcm1hdCh2YWx1ZTpJVGV4dExheW91dEZvcm1hdCk6dm9pZA0KKwkJeworCQkJX2RlZmF1bHRSb3dGb3JtYXQgPSB2YWx1ZTsKIAkJfQogCQkKKwkJcHJpdmF0ZSB2YXIgX2RlZmF1bHRDb2x1bW5Gb3JtYXQ6SVRleHRMYXlvdXRGb3JtYXQ7CisKKwkJLyoqCisJCSAqIEdldHMgdGhlIGNvbHVtbiBmb3JtYXQgZm9yIG5ldyBjb2x1bW5zLiAKKwkJICoqLworCQlwdWJsaWMgZnVuY3Rpb24gZ2V0IGRlZmF1bHRDb2x1bW5Gb3JtYXQoKTpJVGV4dExheW91dEZvcm1hdA0KKwkJeworCQkJaWYoIV9kZWZhdWx0Q29sdW1uRm9ybWF0KQorCQkJCV9kZWZhdWx0Q29sdW1uRm9ybWF0ID0gbmV3IFRleHRMYXlvdXRGb3JtYXQoY29tcHV0ZWRGb3JtYXQpOworCQkJcmV0dXJuIF9kZWZhdWx0Q29sdW1uRm9ybWF0OworCQl9CisKKwkJcHVibGljIGZ1bmN0aW9uIHNldCBkZWZhdWx0Q29sdW1uRm9ybWF0KHZhbHVlOklUZXh0TGF5b3V0Rm9ybWF0KTp2b2lkDQorCQl7CisJCQlfZGVmYXVsdENvbHVtbkZvcm1hdCA9IHZhbHVlOworCQl9CisJCQorCQkvKioKKwkJICogQWRkcyBhIHRhYmxlIGNlbGwgZWxlbWVudCB0byB0aGUgdGFibGUuIAorCQkgKiBAaW5oZXJpdERvYworCQkgKiovCisJCW92ZXJyaWRlIHB1YmxpYyBmdW5jdGlvbiBhZGRDaGlsZChjaGlsZDpGbG93RWxlbWVudCk6Rmxvd0VsZW1lbnQKKwkJeworCQkJCisJCQlpZiAoY2hpbGQgaXMgVGFibGVGb3JtYXR0ZWRFbGVtZW50KSB7CisJCQkJVGFibGVGb3JtYXR0ZWRFbGVtZW50KGNoaWxkKS50YWJsZSA9IHRoaXM7CisJCQl9CisJCQkKKwkJCXN1cGVyLmFkZENoaWxkKGNoaWxkKTsKKwkJCQorCQkJcmV0dXJuIGNoaWxkOworCQl9CisJCQorCQkvKioKKwkJICogUmVtb3ZlcyBhIHRhYmxlIGNlbGwgZWxlbWVudCBmcm9tIHRoZSB0YWJsZS4gCisJCSAqIEBpbmhlcml0RG9jCisJCSAqKi8KKwkJb3ZlcnJpZGUgcHVibGljIGZ1bmN0aW9uIHJlbW92ZUNoaWxkKGNoaWxkOkZsb3dFbGVtZW50KTpGbG93RWxlbWVudAorCQl7CisJCQlzdXBlci5yZW1vdmVDaGlsZChjaGlsZCk7CisJCQkKKwkJCWlmIChjaGlsZCBpcyBUYWJsZUZvcm1hdHRlZEVsZW1lbnQpIHsKKwkJCQlUYWJsZUZvcm1hdHRlZEVsZW1lbnQoY2hpbGQpLnRhYmxlID0gbnVsbDsKKwkJCX0KKwkJCQorCQkJcmV0dXJuIGNoaWxkOworCQl9CisJCQorCQkvKioKKwkJICogQWRkIGEgcm93IGF0IHRoZSBlbmQgb2YgdGhlIHRhYmxlLiBZb3Ugd291bGQgdXNlIHRoaXMgaWYgeW91IHdhbnQgdG8gYWRkIGEgcm93CisJCSAqIHdpdGhvdXQgY2hhbmdpbmcgdGhlIHRhYmxlIGNlbGxzLiAKKwkJICogQHNlZSBhZGRSb3dBdAorCQkgKiBAc2VlIGluc2VydFJvdworCQkgKiBAc2VlIGluc2VydFJvd0F0CisJCSAqKi8KKwkJcHVibGljIGZ1bmN0aW9uIGFkZFJvdyhmb3JtYXQ6SVRleHRMYXlvdXRGb3JtYXQ9bnVsbCk6dm9pZHsKKwkJCWFkZFJvd0F0KHJvd3MubGVuZ3RoLGZvcm1hdCk7CisJCX0KKwkJCisJCS8qKgorCQkgKiBBZGQgYSByb3cgYXQgdGhlIGluZGV4IHNwZWNpZmllZC4gCisJCSAqIEBzZWUgYWRkUm93CisJCSAqIEBzZWUgaW5zZXJ0Um93CisJCSAqIEBzZWUgaW5zZXJ0Um93QXQKKwkJICoqLworCQlwdWJsaWMgZnVuY3Rpb24gYWRkUm93QXQoaWR4OmludCwgZm9ybWF0OklUZXh0TGF5b3V0Rm9ybWF0PW51bGwpOnZvaWR7CisJCQlpZihpZHggPCAwIHx8IGlkeCA+IHJvd3MubGVuZ3RoKQorCQkJCXRocm93IFJhbmdlRXJyb3IoR2xvYmFsU2V0dGluZ3MucmVzb3VyY2VTdHJpbmdGdW5jdGlvbigiYmFkUHJvcGVydHlWYWx1ZSIpKTsKKwkJCQorCQkJdmFyIHJvdzpUYWJsZVJvd0VsZW1lbnQgPSBjcmVhdGVSb3dFbGVtZW50KGlkeCwgZm9ybWF0KTsKKwkJCXJvd3Muc3BsaWNlKGlkeCwgMCwgcm93KTsKKwkJCXJvdy5jb21wb3NlZEhlaWdodCA9IHJvdy5jb21wdXRlZEZvcm1hdC5taW5DZWxsSGVpZ2h0OworCQkJcm93LmlzTWF4SGVpZ2h0ID0gcm93LmNvbXB1dGVkRm9ybWF0Lm1pbkNlbGxIZWlnaHQgPT0gcm93LmNvbXB1dGVkRm9ybWF0Lm1heENlbGxIZWlnaHQ7CisJCQlyb3cuc2V0UGFyZW50QW5kUmVsYXRpdmVTdGFydE9ubHkodGhpcywgMSk7CisJCX0KKworCQkvKioKKwkJICogQWRkcyBhIGNvbHVtbi4gWW91IHdvdWxkIHVzZSB0aGlzIGlmIHlvdSB3YW50IHRvIGFkZCBhIGNvbHVtbiB3aXRob3V0IGNoYW5naW5nIHRoZSB0YWJsZSBjZWxscy4gCisJCSAqIFRoZSBjZWxscyB3b3VsZCByZWZsb3csIHNvIGEgY2VsbCBpbiByb3cgMiBtaWdodCBtb3ZlIHVwIHRvIHJvdyAxLgorCQkgKiBAc2VlIGFkZENvbHVtbkF0CisJCSAqIEBzZWUgaW5zZXJ0Q29sdW1uCisJCSAqIEBzZWUgaW5zZXJ0Q29sdW1uQXQKKwkJICoqLworCQlwdWJsaWMgZnVuY3Rpb24gYWRkQ29sdW1uKGZvcm1hdDpJVGV4dExheW91dEZvcm1hdD1udWxsKTp2b2lkeworCQkJYWRkQ29sdW1uQXQoY29sdW1ucy5sZW5ndGgsZm9ybWF0KTsKKwkJfQorCQkKKwkJLyoqCisJCSAqIEFkZHMgYSBjb2x1bW4gYXQgdGhlIGluZGV4IHNwZWNpZmllZC4gCisJCSAqIEBzZWUgYWRkQ29sdW1uCisJCSAqIEBzZWUgaW5zZXJ0Q29sdW1uCisJCSAqIEBzZWUgaW5zZXJ0Q29sdW1uQXQKKwkJICoqLworCQlwdWJsaWMgZnVuY3Rpb24gYWRkQ29sdW1uQXQoaWR4OmludCwgZm9ybWF0OklUZXh0TGF5b3V0Rm9ybWF0PW51bGwpOnZvaWR7CisJCQlpZihpZHggPCAwIHx8IGlkeCA+IGNvbHVtbnMubGVuZ3RoKQorCQkJCXRocm93IFJhbmdlRXJyb3IoR2xvYmFsU2V0dGluZ3MucmVzb3VyY2VTdHJpbmdGdW5jdGlvbigiYmFkUHJvcGVydHlWYWx1ZSIpKTsKKwkJCWlmKCFmb3JtYXQpIHsKKwkJCQlmb3JtYXQgPSBkZWZhdWx0Q29sdW1uRm9ybWF0OworCQkJfQorCQkJdmFyIGNvbHVtbjpUYWJsZUNvbEVsZW1lbnQgPSBjcmVhdGVDb2x1bW5FbGVtZW50KGlkeCwgZm9ybWF0KTsKKwkJCQorCQkJY29sdW1ucy5zcGxpY2UoaWR4LCAwLCBjb2x1bW4pOworCQl9CisKKwkJLyoqCisJCSAqIFJldHVybnMgdGhlIGNvbHVtbiBhdCB0aGUgaW5kZXggc3BlY2lmaWVkIG9yIG51bGwgaWYgdGhlIGluZGV4IGlzIG91dCBvZiByYW5nZS4gCisJCSAqKi8KKwkJcHVibGljIGZ1bmN0aW9uIGdldENvbHVtbkF0KGNvbHVtbkluZGV4OmludCk6VGFibGVDb2xFbGVtZW50CisJCXsKKwkJCWlmICggY29sdW1uSW5kZXggPCAwIHx8IGNvbHVtbkluZGV4ID49IG51bUNvbHVtbnMgKQorCQkJCXJldHVybiBudWxsOworCQkJcmV0dXJuIGNvbHVtbnNbY29sdW1uSW5kZXhdOworCQl9CisJCQorCQkvKioKKwkJICogUmV0dXJucyB0aGUgcm93IGF0IHRoZSBpbmRleCBzcGVjaWZpZWQgb3IgbnVsbCBpZiB0aGUgaW5kZXggaXMgb3V0IG9mIHJhbmdlLiAKKwkJICoqLworCQlwdWJsaWMgZnVuY3Rpb24gZ2V0Um93QXQocm93SW5kZXg6aW50KTpUYWJsZVJvd0VsZW1lbnQKKwkJeworCQkJaWYgKCByb3dJbmRleCA8IDAgfHwgcm93SW5kZXggPj0gbnVtUm93cyApCisJCQkJcmV0dXJuIG51bGw7CisJCQlyZXR1cm4gcm93c1tyb3dJbmRleF07CisJCX0KKwkJCisJCS8qKgorCQkgKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSByb3cgcHJvdmlkZWQgb3IgLTEgaWYgdGhlIHJvdyBpcyBub3QgZm91bmQuIAorCQkgKiovCisJCXB1YmxpYyBmdW5jdGlvbiBnZXRSb3dJbmRleChyb3c6VGFibGVSb3dFbGVtZW50KTppbnQKKwkJeworCQkJZm9yKHZhciBpOmludD0wO2k8cm93cy5sZW5ndGg7aSsrKQorCQkJeworCQkJCWlmKHJvd3NbaV0gPT0gcm93KQorCQkJCQlyZXR1cm4gaTsKKwkJCX0KKwkJCXJldHVybiAtMTsKKwkJfQorCQkKKwkJLyoqCisJCSAqIFJldHVybnMgYSB2ZWN0b3Igb2YgdGhlIGNlbGxzIGZvciB0aGUgcm93IHNwZWNpZmllZC4gCisJCSAqKi8KKwkJcHVibGljIGZ1bmN0aW9uIGdldENlbGxzRm9yUm93KHJvdzpUYWJsZVJvd0VsZW1lbnQpOlZlY3Rvci48VGFibGVDZWxsRWxlbWVudD57CisJCQkKKwkJCXJldHVybiBnZXRDZWxsc0ZvclJvd0F0KHJvdy5yb3dJbmRleCk7CisJCX0KKwkJCisJCS8qKgorCQkgKiBSZXR1cm5zIGEgdmVjdG9yIG9mIHRoZSBjZWxscyBmb3IgdGhlIHJvdyBzcGVjaWZpZWQuIAorCQkgKiovCisJCXB1YmxpYyBmdW5jdGlvbiBnZXRDZWxsc0ZvclJvd0FycmF5KHJvdzpUYWJsZVJvd0VsZW1lbnQpOkFycmF5IHsKKwkJCQorCQkJcmV0dXJuIGdldENlbGxzRm9yUm93QXRBcnJheShyb3cucm93SW5kZXgpOworCQl9CisJCQorCQkvKioKKwkJICogUmV0dXJucyBhIHZlY3RvciBvZiB0aGUgY2VsbHMgZm9yIHRoZSByb3cgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4gCisJCSAqKi8KKwkJcHVibGljIGZ1bmN0aW9uIGdldENlbGxzRm9yUm93QXQoaW5kZXg6aW50KTpWZWN0b3IuPFRhYmxlQ2VsbEVsZW1lbnQ+eworCQkJdmFyIGNlbGxzOlZlY3Rvci48VGFibGVDZWxsRWxlbWVudD4gPSBuZXcgVmVjdG9yLjxUYWJsZUNlbGxFbGVtZW50PigpOworCQkJCisJCQlpZiAoaW5kZXggPCAwKSB7CisJCQkJcmV0dXJuIGNlbGxzOworCQkJfQorCQkJCisJCQlmb3IgZWFjaCh2YXIgY2VsbDpUYWJsZUNlbGxFbGVtZW50IGluIG14bWxDaGlsZHJlbil7CisJCQkJaWYgKGNlbGwucm93SW5kZXggPT0gaW5kZXgpIHsKKwkJCQkJY2VsbHMucHVzaChjZWxsKTsKKwkJCQl9CisJCQl9CisJCQkKKwkJCXJldHVybiBjZWxsczsKKwkJfQorCQkKKwkJLyoqCisJCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgdGhlIGNlbGxzIGZvciB0aGUgcm93IHNwZWNpZmllZC4gCisJCSAqKi8KKwkJcHVibGljIGZ1bmN0aW9uIGdldENlbGxzRm9yUm93QXRBcnJheShpbmRleDppbnQpOkFycmF5IHsKKwkJCXZhciBjZWxsczpBcnJheSA9IFtdOworCQkJCisJCQlpZiAoaW5kZXggPCAwKSB7CisJCQkJcmV0dXJuIGNlbGxzOworCQkJfQorCQkJCisJCQlmb3IgZWFjaCh2YXIgY2VsbDpUYWJsZUNlbGxFbGVtZW50IGluIG14bWxDaGlsZHJlbil7CisJCQkJaWYgKGNlbGwucm93SW5kZXggPT0gaW5kZXgpIHsKKwkJCQkJY2VsbHMucHVzaChjZWxsKTsKKwkJCQl9CisJCQl9CisJCQkKKwkJCXJldHVybiBjZWxsczsKKwkJfQorCQkKKwkJLyoqCisJCSAqIFJldHVybnMgYSBWZWN0b3Igb2YgdGhlIFRhYmxlQ2VsbEVsZW1lbnRzIGZvciB0aGUgY29sdW1uIHNwZWNpZmllZC4gCisJCSAqKi8KKwkJcHVibGljIGZ1bmN0aW9uIGdldENlbGxzRm9yQ29sdW1uKGNvbHVtbjpUYWJsZUNvbEVsZW1lbnQpOlZlY3Rvci48VGFibGVDZWxsRWxlbWVudD4geworCQkJaWYoY29sdW1ucy5pbmRleE9mKGNvbHVtbikgPCAwKQorCQkJCXJldHVybiBudWxsOworCQkJCisJCQlyZXR1cm4gZ2V0Q2VsbHNGb3JDb2x1bW5BdChjb2x1bW4uY29sSW5kZXgpOworCQl9CisJCQorCQkvKioKKwkJICogUmV0dXJucyBhIFZlY3RvciBvZiB0aGUgVGFibGVDZWxsRWxlbWVudHMgZm9yIHRoZSBjb2x1bW4gYXQgdGhlIHNwZWNpZmllZCBpbmRleC4gCisJCSAqKi8KKwkJcHVibGljIGZ1bmN0aW9uIGdldENlbGxzRm9yQ29sdW1uQXQoaW5kZXg6aW50KTpWZWN0b3IuPFRhYmxlQ2VsbEVsZW1lbnQ+IHsKKwkJCXZhciBjZWxsczpWZWN0b3IuPFRhYmxlQ2VsbEVsZW1lbnQ+ID0gbmV3IFZlY3Rvci48VGFibGVDZWxsRWxlbWVudD4oKTsKKwkJCQorCQkJaWYgKGluZGV4IDwgMCkgeworCQkJCXJldHVybiBjZWxsczsKKwkJCX0KKwkJCQorCQkJZm9yIGVhY2godmFyIGNlbGw6VGFibGVDZWxsRWxlbWVudCBpbiBteG1sQ2hpbGRyZW4peworCQkJCWlmIChjZWxsLmNvbEluZGV4ID09IGluZGV4KSB7CisJCQkJCWNlbGxzLnB1c2goY2VsbCk7CisJCQkJfQorCQkJfQorCQkJCisJCQlyZXR1cm4gY2VsbHM7CisJCX0KKwkJCisJCS8qKgorCQkgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGNoZWNraW5nIGlmIHRhYmxlIGhhcyBtZXJnZWQgY2VsbHMKKwkJICogCisJCSAqLworCQlwdWJsaWMgZnVuY3Rpb24gaGFzTWVyZ2VkQ2VsbHMoKTpCb29sZWFuCisJCXsKKwkJCXZhciBjZWxsOlRhYmxlQ2VsbEVsZW1lbnQ7CisJCQl2YXIgY2hpbGQ6KjsKKwkJCWlmKG14bWxDaGlsZHJlbiA9PSBudWxsKQorCQkJCXJldHVybiBmYWxzZTsKKwkJCWZvciBlYWNoKGNoaWxkIGluIG14bWxDaGlsZHJlbikKKwkJCXsKKwkJCQljZWxsID0gY2hpbGQgYXMgVGFibGVDZWxsRWxlbWVudDsKKwkJCQlpZiggY2VsbCAmJiAoY2VsbC5jb2x1bW5TcGFuID4gMSB8fCBjZWxsLnJvd1NwYW4gPiAxKSApCisJCQkJCXJldHVybiB0cnVlOworCQkJfQorCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCQorCQkvKioKKwkJICogSW5zZXJ0cyBhIGNvbHVtbiBhdCB0aGUgZW5kIG9mIHRoZSB0YWJsZS4gSWYgYSBjb2x1bW4gaXMgbm90IHByb3ZpZGVkIG9uZSBpcyBjcmVhdGVkLiAKKwkJICogCisJCSAqIEBzZWUgYWRkQ29sdW1uCisJCSAqIEBzZWUgYWRkQ29sdW1uQXQKKwkJICogQHNlZSBpbnNlcnRDb2x1bW5BdAorCQkgKiovCisJCXB1YmxpYyBmdW5jdGlvbiBpbnNlcnRDb2x1bW4oY29sdW1uOlRhYmxlQ29sRWxlbWVudD1udWxsLGNlbGxzOkFycmF5ID0gbnVsbCk6Qm9vbGVhbnsKKwkJCXJldHVybiBpbnNlcnRDb2x1bW5BdChudW1Db2x1bW5zLGNvbHVtbixjZWxscyk7CisJCX0KKwkJCisJCS8qKgorCQkgKiBJbnNlcnRzIGEgY29sdW1uIGF0IHRoZSBjb2x1bW4gc3BlY2lmaWVkLiBJZiB0aGUgY29sdW1uIGlzIG5vdCBwcm92aWRlZCBpdAorCQkgKiBjcmVhdGVzIGEgbmV3IGNvbHVtbiBjb250YWluaW5nIHRoZSBjZWxscyBzdXBwbGllZCBvciBjcmVhdGVzIHRoZSBjZWxscworCQkgKiBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIHJvd3MgaW4gdGhlIHRhYmxlLiAKKwkJICogQHNlZSBhZGRDb2x1bW4KKwkJICogQHNlZSBhZGRDb2x1bW5BdAorCQkgKiBAc2VlIGluc2VydENvbHVtbgorCQkgKiovCisJCXB1YmxpYyBmdW5jdGlvbiBpbnNlcnRDb2x1bW5BdChpZHg6aW50LGNvbHVtbjpUYWJsZUNvbEVsZW1lbnQ9bnVsbCxjZWxsczpBcnJheSA9IG51bGwpOkJvb2xlYW57CisJCQkKKwkJCWlmIChpZHggPCAwIHx8IGlkeCA+IGNvbHVtbnMubGVuZ3RoKSB7CisJCQkJdGhyb3cgUmFuZ2VFcnJvcihHbG9iYWxTZXR0aW5ncy5yZXNvdXJjZVN0cmluZ0Z1bmN0aW9uKCJiYWRQcm9wZXJ0eVZhbHVlIikpOworCQkJfQorCQkJCisJCQlpZiAoIWNvbHVtbikgeworCQkJCWNvbHVtbiA9IGNyZWF0ZUNvbHVtbkVsZW1lbnQoaWR4LCBkZWZhdWx0Q29sdW1uRm9ybWF0KTsKKwkJCX0KKwkJCQorCQkJY29sdW1ucy5zcGxpY2UoaWR4LDAsY29sdW1uKTsKKwkJCQorCQkJdmFyIGJsb2NrZWRDb29yZHM6VmVjdG9yLjxDZWxsQ29vcmRzPiA9IGdldEJsb2NrZWRDb29yZHMoLTEsaWR4KTsKKwkJCXZhciBjZWxsSWR4OmludCA9IGdldENlbGxJbmRleCgwLGlkeCk7CisJCQlpZihjZWxsSWR4IDwgMCkKKwkJCQljZWxsSWR4ID0gbnVtQ2hpbGRyZW47CisJCQl2YXIgcm93SWR4OmludCA9IDA7CisJCQkKKwkJCWlmIChjZWxscz09bnVsbCkgY2VsbHMgPSBbXTsgCisJCQkKKwkJCXdoaWxlKGNlbGxzLmxlbmd0aCA8IG51bVJvd3MpeworCQkJCWNlbGxzLnB1c2gobmV3IFRhYmxlQ2VsbEVsZW1lbnQoKSk7CisJCQl9CisJCQkKKwkJCWZvciBlYWNoKHZhciBjZWxsOlRhYmxlQ2VsbEVsZW1lbnQgaW4gY2VsbHMpeworCQkJCXdoaWxlKGJsb2NrZWRDb29yZHMubGVuZ3RoICYmIGJsb2NrZWRDb29yZHNbMF0ucm93ID09IHJvd0lkeCl7CisJCQkJCXJvd0lkeCsrOworCQkJCQlibG9ja2VkQ29vcmRzLnNoaWZ0KCk7CisJCQkJfQorCQkJCWNlbGxJZHggPSBnZXRDZWxsSW5kZXgocm93SWR4LGlkeCk7CisJCQkJaWYoY2VsbElkeCA8IDApCisJCQkJCWNlbGxJZHggPSBudW1DaGlsZHJlbjsKKwkJCQkKKwkJCQlpZihyb3dJZHggPCBudW1Sb3dzKXsKKwkJCQkJYWRkQ2hpbGRBdChjZWxsSWR4LGNlbGwpOworCQkJCX0KKwkJCQlyb3dJZHgrKzsKKwkJCX0KKworCisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQkKKwkJLyoqCisJCSAqIEluc2VydHMgYSByb3cgYXQgdGhlIGVuZCBvZiB0aGUgdGFibGUuIElmIGEgcm93IGlzIG5vdCBwcm92aWRlZCBvbmUgaXMgY3JlYXRlZC4gCisJCSAqIEBzZWUgaW5zZXJ0Um93QXQKKwkJICoqLworCQlwdWJsaWMgZnVuY3Rpb24gaW5zZXJ0Um93KHJvdzpUYWJsZVJvd0VsZW1lbnQ9bnVsbCxjZWxsczpBcnJheSA9IG51bGwpOkJvb2xlYW57CisJCQlyZXR1cm4gaW5zZXJ0Um93QXQobnVtUm93cyxyb3csY2VsbHMpOworCQl9CisJCQorCQkvKioKKwkJICogSW5zZXJ0cyBhIHJvdyBhdCB0aGUgaW5kZXggc3BlY2lmaWVkLiBJZiB0aGUgcm93IGlzIG5vdCBwcm92aWRlZCBpdAorCQkgKiBjcmVhdGVzIGEgbmV3IHJvdyBjb250YWluaW5nIHRoZSBjZWxscyBzdXBwbGllZCBvciBjcmVhdGVzIHRoZSBjZWxscworCQkgKiBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgaW4gdGhlIHRhYmxlLiAKKwkJICoqLworCQlwdWJsaWMgZnVuY3Rpb24gaW5zZXJ0Um93QXQoaWR4OmludCxyb3c6VGFibGVSb3dFbGVtZW50PW51bGwsY2VsbHM6QXJyYXkgPSBudWxsKTpCb29sZWFueworCQkJaWYgKGlkeCA8IDAgfHwgaWR4ID4gcm93cy5sZW5ndGgpIHsKKwkJCQl0aHJvdyBSYW5nZUVycm9yKEdsb2JhbFNldHRpbmdzLnJlc291cmNlU3RyaW5nRnVuY3Rpb24oImJhZFByb3BlcnR5VmFsdWUiKSk7CisJCQl9CisJCQkKKwkJCWlmICghcm93KSB7CisJCQkJcm93ID0gY3JlYXRlUm93RWxlbWVudChpZHgsIGRlZmF1bHRSb3dGb3JtYXQpOworCQkJfQorCQkJCisJCQlyb3dzLnNwbGljZShpZHgsMCxyb3cpOworCQkJcm93LmNvbXBvc2VkSGVpZ2h0ID0gcm93LmNvbXB1dGVkRm9ybWF0Lm1pbkNlbGxIZWlnaHQ7CisJCQlyb3cuaXNNYXhIZWlnaHQgPSByb3cuY29tcHV0ZWRGb3JtYXQubWluQ2VsbEhlaWdodCA9PSByb3cuY29tcHV0ZWRGb3JtYXQubWF4Q2VsbEhlaWdodDsKKworCQkJdmFyIGJsb2NrZWRDb29yZHM6VmVjdG9yLjxDZWxsQ29vcmRzPiA9IGdldEJsb2NrZWRDb29yZHMoaWR4KTsKKwkJCXZhciBjZWxsSWR4OmludCA9IGdldENlbGxJbmRleChpZHgsMCk7CisJCQlpZihjZWxsSWR4IDwgMCkKKwkJCQljZWxsSWR4ID0gbnVtQ2hpbGRyZW47CisKKwkJCXZhciBjb2xJZHg6aW50ID0gMDsKKwkJCQorCQkJaWYgKGNlbGxzPT1udWxsKSBjZWxscyA9IFtdOworCQkJCisJCQkvLyBjcmVhdGUgbW9yZSBjZWxscyAKKwkJCXdoaWxlKGNlbGxzLmxlbmd0aCA8IG51bUNvbHVtbnMpeworCQkJCWNlbGxzLnB1c2gobmV3IFRhYmxlQ2VsbEVsZW1lbnQoKSk7CisJCQl9CisJCQkKKwkJCWZvciBlYWNoKHZhciBjZWxsOlRhYmxlQ2VsbEVsZW1lbnQgaW4gY2VsbHMpeworCQkJCXdoaWxlKGJsb2NrZWRDb29yZHMubGVuZ3RoICYmIGJsb2NrZWRDb29yZHNbMF0uY29sdW1uID09IGNvbElkeCl7CisJCQkJCWNvbElkeCsrOworCQkJCQlibG9ja2VkQ29vcmRzLnNoaWZ0KCk7CisJCQkJfQorCQkJCWlmKGNvbElkeCA8IG51bUNvbHVtbnMpeworCQkJCQlhZGRDaGlsZEF0KGNlbGxJZHgrKyxjZWxsKTsKKwkJCQkJY2VsbC5kYW1hZ2UoKTsKKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQkKKwkJLyoqCisJCSAqIFJlbW92ZXMgdGhlIHJvdworCQkgKiovCisJCXB1YmxpYyBmdW5jdGlvbiByZW1vdmVSb3cocm93OlRhYmxlUm93RWxlbWVudCk6VGFibGVSb3dFbGVtZW50IHsKKwkJCXZhciBpOmludCA9IHJvd3MuaW5kZXhPZihyb3cpOworCQkJaWYoaSA8IDApCisJCQkJcmV0dXJuIG51bGw7CisJCQlyZXR1cm4gcmVtb3ZlUm93QXQoaSk7CisJCX0KKwkJCisJCS8qKgorCQkgKiBSZW1vdmVzIHRoZSByb3cgYW5kIHRoZSBjZWxscyBpdCBjb250YWlucy4KKwkJICoqLworCQlwdWJsaWMgZnVuY3Rpb24gcmVtb3ZlUm93V2l0aENvbnRlbnQocm93OlRhYmxlUm93RWxlbWVudCk6QXJyYXkKKwkJeworCQkJdmFyIGk6aW50ID0gcm93cy5pbmRleE9mKHJvdyk7CisJCQlpZihpIDwgMCkKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCXJldHVybiByZW1vdmVSb3dXaXRoQ29udGVudEF0KGkpOworCQl9CisJCQorCQkvKioKKwkJICogUmVtb3ZlcyB0aGUgcm93IGF0IHRoZSBpbmRleCBzcGVjaWZpZWQuCisJCSAqIEBzZWUgcmVtb3ZlUm93V2l0aENvbnRlbnRBdAorCQkgKiovCisJCXB1YmxpYyBmdW5jdGlvbiByZW1vdmVSb3dBdChpZHg6aW50KTpUYWJsZVJvd0VsZW1lbnQgeworCQkJaWYoaWR4IDwgMCB8fCBpZHggPiByb3dzLmxlbmd0aCAtIDEpCisJCQkJcmV0dXJuIG51bGw7CisJCQkKKwkJCXZhciByb3c6VGFibGVSb3dFbGVtZW50ID0gVGFibGVSb3dFbGVtZW50KHJvd3Muc3BsaWNlKGlkeCwxKVswXSk7CisJCQlub3JtYWxpemVDZWxscygpOworCQkJaGFzQ2VsbERhbWFnZSA9IHRydWU7CisJCQlyZXR1cm4gcm93OworCQkJCisJCX0KKwkJCisJCS8qKgorCQkgKiBSZW1vdmVzIHRoZSByb3cgYXQgdGhlIGluZGV4IHNwZWNpZmllZCBhbmQgdGhlIGNlbGxzIGl0IGNvbnRhaW5zLgorCQkgKiovCisJCXB1YmxpYyBmdW5jdGlvbiByZW1vdmVSb3dXaXRoQ29udGVudEF0KGlkeDppbnQpOkFycmF5CisJCXsKKworCQkJdmFyIHJlbW92ZWRDZWxsczpBcnJheSA9IFtdOworCQkJCisJCQlpZihteG1sQ2hpbGRyZW4peworCQkJCWZvciAodmFyIGk6aW50ID0gbXhtbENoaWxkcmVuLmxlbmd0aC0xO2k+PTA7aS0tKXsKKwkJCQkJdmFyIGNoaWxkOiogPSBteG1sQ2hpbGRyZW5baV07CisJCQkJCWlmKCEoY2hpbGQgaXMgVGFibGVDZWxsRWxlbWVudCkpCisJCQkJCQljb250aW51ZTsKKwkJCQkJdmFyIGNlbGw6VGFibGVDZWxsRWxlbWVudCA9IGNoaWxkIGFzIFRhYmxlQ2VsbEVsZW1lbnQ7CisJCQkJCWlmKGNlbGwucm93SW5kZXggPT0gaWR4KXsKKwkJCQkJCXJlbW92ZWRDZWxscy51bnNoaWZ0KHJlbW92ZUNoaWxkKGNlbGwpKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCQorCQkJcmVtb3ZlUm93QXQoaWR4KTsKKwkJCXJldHVybiByZW1vdmVkQ2VsbHM7CisJCX0KKwkJCisJCS8qKgorCQkgKiBSZW1vdmVzIGFsbCB0aGUgcm93cyBhbmQgdGhlIGNlbGxzLgorCQkgKiovCisJCXB1YmxpYyBmdW5jdGlvbiByZW1vdmVBbGxSb3dzV2l0aENvbnRlbnQoKTp2b2lkCisJCXsKKwkJCXZhciByb3dDb3VudDppbnQ7CisJCQl2YXIgY2VsbENvdW50OmludDsKKwkJCQorCQkJaWYgKG51bVJvd3M+LTEpIHsKKwkJCQlyb3dDb3VudCA9IG51bVJvd3MtMTsKKwkJCQkKKwkJCQlmb3IgKDtyb3dDb3VudD4tMTspIHsKKwkJCQkJcmVtb3ZlUm93V2l0aENvbnRlbnRBdChyb3dDb3VudC0tKTsKKwkJCQl9CisJCQkJCisJCQl9CisJCX0KKwkJCisJCS8qKgorCQkgKiBSZW1vdmVzIGFsbCB0aGUgcm93cy4gRG9lcyBub3QgcmVtb3ZlIHRoZSBjZWxscy4KKwkJICogQHNlZSByZW1vdmVBbGxSb3dzV2l0aENvbnRlbnQKKwkJICoqLworCQlwdWJsaWMgZnVuY3Rpb24gcmVtb3ZlQWxsUm93cygpOnZvaWQKKwkJeworCQkJdmFyIHJvd0NvdW50OmludDsKKwkJCXZhciBjZWxsQ291bnQ6aW50OworCQkJCisJCQlpZiAobnVtUm93cz4tMSkgeworCQkJCXJvd0NvdW50ID0gbnVtUm93czsKKwkJCQkKKwkJCQlmb3IgKHZhciBpOmludDsgaSA8IHJvd0NvdW50OyBpKyspIHsKKwkJCQkJcmVtb3ZlUm93QXQoaSk7CisJCQkJfQorCQkJCQorCQkJfQorCQl9CisJCQorCQkvKioKKwkJICogUmVtb3ZlcyB0aGUgY29sdW1uCisJCSAqKi8KKwkJcHVibGljIGZ1bmN0aW9uIHJlbW92ZUNvbHVtbihjb2x1bW46VGFibGVDb2xFbGVtZW50KTpUYWJsZUNvbEVsZW1lbnQgeworCQkJdmFyIGk6aW50ID0gY29sdW1ucy5pbmRleE9mKGNvbHVtbik7CisJCQlpZihpIDwgMCkKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCXJldHVybiByZW1vdmVDb2x1bW5BdChpKTsKKwkJfQorCQkKKwkJLyoqCisJCSAqIFJlbW92ZXMgdGhlIGNvbHVtbiBhbmQgdGhlIGNlbGxzIGl0IGNvbnRhaW5zLgorCQkgKiovCisJCXB1YmxpYyBmdW5jdGlvbiByZW1vdmVDb2x1bW5XaXRoQ29udGVudChjb2x1bW46VGFibGVDb2xFbGVtZW50KTpBcnJheQorCQl7CisJCQl2YXIgaTppbnQgPSBjb2x1bW5zLmluZGV4T2YoY29sdW1uKTsKKwkJCWlmKGkgPCAwKQorCQkJCXJldHVybiBudWxsOworCQkJcmV0dXJuIHJlbW92ZUNvbHVtbldpdGhDb250ZW50QXQoaSk7CisJCX0KKworCQkvKioKKwkJICogUmVtb3ZlcyB0aGUgY29sdW1uIGF0IHRoZSBpbmRleCBzcGVjaWZpZWQKKwkJICoqLworCQlwdWJsaWMgZnVuY3Rpb24gcmVtb3ZlQ29sdW1uQXQoaWR4OmludCk6VGFibGVDb2xFbGVtZW50IHsKKwkJCWlmKGlkeCA8IDAgfHwgaWR4ID4gY29sdW1ucy5sZW5ndGggLSAxKQorCQkJCXJldHVybiBudWxsOworCQkJCisJCQl2YXIgY29sOlRhYmxlQ29sRWxlbWVudCA9IGNvbHVtbnMuc3BsaWNlKGlkeCwxKVswXTsKKwkJCW5vcm1hbGl6ZUNlbGxzKCk7CisJCQloYXNDZWxsRGFtYWdlID0gdHJ1ZTsKKwkJCXJldHVybiBjb2w7CisJCX0KKwkJCisJCS8qKgorCQkgKiBSZW1vdmVzIHRoZSBjb2x1bW4gYXQgdGhlIGluZGV4IHNwZWNpZmllZCBhbmQgdGhlIGNlbGxzIGl0IGNvbnRhaW5zLiAKKwkJICoqLworCQlwdWJsaWMgZnVuY3Rpb24gcmVtb3ZlQ29sdW1uV2l0aENvbnRlbnRBdChpZHg6aW50KTpBcnJheQorCQl7CisJCQkKKwkJCXZhciByZW1vdmVkQ2VsbHM6QXJyYXkgPSBbXTsKKwkJCWlmKG14bWxDaGlsZHJlbil7CisJCQkJZm9yICh2YXIgaTppbnQgPSBteG1sQ2hpbGRyZW4ubGVuZ3RoLTE7aT49MDtpLS0peworCQkJCQl2YXIgY2hpbGQ6KiA9IG14bWxDaGlsZHJlbltpXTsKKwkJCQkJaWYoIShjaGlsZCBpcyBUYWJsZUNlbGxFbGVtZW50KSkKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl2YXIgY2VsbDpUYWJsZUNlbGxFbGVtZW50ID0gY2hpbGQgYXMgVGFibGVDZWxsRWxlbWVudDsKKwkJCQkJaWYoY2VsbC5jb2xJbmRleCA9PSBpZHgpeworCQkJCQkJcmVtb3ZlZENlbGxzLnVuc2hpZnQocmVtb3ZlQ2hpbGQoY2VsbCkpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJcmVtb3ZlQ29sdW1uQXQoaWR4KTsKKworCQkJcmV0dXJuIHJlbW92ZWRDZWxsczsKKwkJfQorCQkKKwkJLyoqCisJCSAqIFJlbW92ZSBhbGwgY2VsbHMKKwkJICogQGluaGVyaXREb2MKKwkJICoqLworCQlvdmVycmlkZSB0bGZfaW50ZXJuYWwgZnVuY3Rpb24gcmVtb3ZlZCgpOnZvaWQKKwkJeworCQkJaGFzQ2VsbERhbWFnZSA9IHRydWU7CisJCQkvL3JlbW92ZUFsbFJvd3NXaXRoQ29udGVudCgpOworCQl9CisJCQorCQkvKioKKwkJICogQHByaXZhdGUKKwkJICogR2V0cyB0YWJsZSBjb29yZGluYXRlcyB3aGljaCByZXByZXNlbnRzIHRoZSBzcGFjZSBvY2N1cGllZCBieSBjZWxscyBzcGFubmluZyByb3dzIG9yIGNvbHVtbnMKKwkJICoqLworCQlwcml2YXRlIGZ1bmN0aW9uIGdldEJsb2NrZWRDb29yZHMoaW5Sb3c6aW50ID0gLTEsIGluQ29sdW1uOmludCA9IC0xKTpWZWN0b3IuPENlbGxDb29yZHM+eworCQkJdmFyIGNvb3JkczpWZWN0b3IuPENlbGxDb29yZHM+ID0gbmV3IFZlY3Rvci48Q2VsbENvb3Jkcz4oKTsKKwkJCQorCQkJaWYobXhtbENoaWxkcmVuKSB7CisJCQkJZm9yIGVhY2godmFyIGNoaWxkOiogaW4gbXhtbENoaWxkcmVuKXsKKwkJCQkJdmFyIGNlbGw6VGFibGVDZWxsRWxlbWVudCA9IGNoaWxkIGFzIFRhYmxlQ2VsbEVsZW1lbnQ7CisJCQkJCWlmIChjZWxsPT1udWxsKSBjb250aW51ZTsKKwkJCQkJaWYoY2VsbC5jb2x1bW5TcGFuID09IDEgJiYgY2VsbC5yb3dTcGFuID09IDEpCisJCQkJCQljb250aW51ZTsKKwkJCQkJdmFyIGN1clJvdzppbnQgPSBjZWxsLnJvd0luZGV4OworCQkJCQlpZihpblJvdyA+PSAwICYmIGN1clJvdyAhPSBpblJvdykKKwkJCQkJCWNvbnRpbnVlOworCQkJCQlpZihpbkNvbHVtbiA+PSAwICYmIGluQ29sdW1uICE9IGN1ckNvbHVtbikKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl2YXIgY3VyQ29sdW1uOmludCA9IGNlbGwuY29sSW5kZXg7CisJCQkJCXZhciBlbmRSb3c6aW50ID0gY3VyUm93ICsgY2VsbC5yb3dTcGFuIC0gMTsKKwkJCQkJdmFyIGVuZENvbHVtbjppbnQgPSBjdXJDb2x1bW4gKyBjZWxsLmNvbHVtblNwYW4gLTE7CisJCQkJCWZvcih2YXIgcm93SWR4OmludCA9IGN1clJvdztyb3dJZHggPD0gZW5kUm93O3Jvd0lkeCsrKXsKKwkJCQkJCWZvcih2YXIgY29sSWR4OmludCA9IGN1ckNvbHVtbjtjb2xJZHggPD1lbmRDb2x1bW47Y29sSWR4KyspeworCQkJCQkJCWlmKHJvd0lkeCA9PSBjdXJSb3cgJiYgY29sSWR4ID09IGN1ckNvbHVtbil7CisJCQkJCQkJCWNvbnRpbnVlOworCQkJCQkJCX0KKwkJCQkJCQljb29yZHMucHVzaCggbmV3IENlbGxDb29yZHMoY29sSWR4LCByb3dJZHgpICk7CisJCQkJCQl9CisJCQkJCX0KKworCQkJCX0KKwkJCX0KKwkJCXJldHVybiBjb29yZHM7CisJCX0KKwkJCisJCS8qKgorCQkgKiBTZXRzIHRoZSByb3cgYW5kIGNvbHVtbiBpbmRpY2VzIG9mIHRoZSBjZWxscyBpbiB0aGUgdGFibGUgdG8gbWF0Y2ggdGhlaXIgbG9naWNhbCBwb3NpdGlvbiBhcyBkZXNjcmliZWQgYnkgdGhlIHRhYmxlIGNvbHVtbnMgYW5kIHJvd3MKKwkJICoqLworCQlwdWJsaWMgZnVuY3Rpb24gbm9ybWFsaXplQ2VsbHMoKTp2b2lkCisJCXsKKwkJCXRoaXMubnVtQ29sdW1uczt0aGlzLm51bVJvd3M7CisJCQl2YXIgaTppbnQ7CisJCQl2YXIgYmxvY2tlZENvb3JkczpWZWN0b3IuPENlbGxDb29yZHM+ID0gbmV3IFZlY3Rvci48Q2VsbENvb3Jkcz4oKTsKKwkJCQorCQkJaWYgKCFteG1sQ2hpbGRyZW4pIHsKKwkJCQlyZXR1cm47CisJCQl9CisJCQkKKwkJCXZhciBjdXJSb3c6aW50ID0gMDsKKwkJCXZhciBjdXJDb2x1bW46aW50ID0gMDsKKwkJCQorCQkJZm9yIGVhY2godmFyIGNoaWxkOiogaW4gbXhtbENoaWxkcmVuKSB7CisJCQkJCisJCQkJaWYgKCEoY2hpbGQgaXMgVGFibGVDZWxsRWxlbWVudCkpIHsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCQorCQkJCXZhciBjZWxsOlRhYmxlQ2VsbEVsZW1lbnQgPSBjaGlsZCBhcyBUYWJsZUNlbGxFbGVtZW50OworCQkJCQorCQkJCWlmIChjZWxsLnJvd0luZGV4ICE9IGN1clJvdyB8fCBjZWxsLmNvbEluZGV4ICE9IGN1ckNvbHVtbikgeworCQkJCQljZWxsLnJvd0luZGV4ID0gY3VyUm93OworCQkJCQljZWxsLmNvbEluZGV4ID0gY3VyQ29sdW1uOworCQkJCQljZWxsLmRhbWFnZSgpOworCQkJCX0KKwkJCQkKKwkJCQkvLyBhZGQgYmxvY2tlZCBjb29yZHMgaWYgdGhlIGNlbGwgc3BhbnMgcm93cyBvciBjb2x1bW5zCisJCQkJdmFyIGVuZFJvdzppbnQgPSBjdXJSb3cgKyBjZWxsLnJvd1NwYW4gLSAxOworCQkJCXZhciBlbmRDb2x1bW46aW50ID0gY3VyQ29sdW1uICsgY2VsbC5jb2x1bW5TcGFuIC0xOworCQkJCQorCQkJCWZvcih2YXIgcm93SWR4OmludCA9IGN1clJvdztyb3dJZHggPD0gZW5kUm93O3Jvd0lkeCsrKXsKKwkJCQkJZm9yKHZhciBjb2xJZHg6aW50ID0gY3VyQ29sdW1uO2NvbElkeCA8PWVuZENvbHVtbjtjb2xJZHgrKyl7CisJCQkJCQlpZihyb3dJZHggPT0gY3VyUm93ICYmIGNvbElkeCA9PSBjdXJDb2x1bW4peworCQkJCQkJCWNvbnRpbnVlOworCQkJCQkJfQorCQkJCQkJYmxvY2tlZENvb3Jkcy5wdXNoKG5ldyBDZWxsQ29vcmRzKGNvbElkeCxyb3dJZHgpICk7CisJCQkJCX0KKwkJCQl9CisJCQkJCisJCQkJLy8gYWR2YW5jZSBjb29yZGluYXRlcyB3aGlsZSBjaGVja2luZyBibG9ja2VkIG9uZXMgZnJvbSBzcGFucworCQkJCWRvIHsKKwkJCQkJY3VyQ29sdW1uKys7CisJCQkJCQorCQkJCQlpZiAoY3VyQ29sdW1uID49IG51bUNvbHVtbnMpeworCQkJCQkJY3VyQ29sdW1uID0gMDsKKwkJCQkJCWN1clJvdysrOworCQkJCQl9CisJCQkJCQorCQkJCQl2YXIgYWR2YW5jZWQ6Qm9vbGVhbiA9IHRydWU7CisJCQkJCQorCQkJCQlmb3IgKGk9MDtpPGJsb2NrZWRDb29yZHMubGVuZ3RoO2krKyl7CisJCQkJCQlpZihibG9ja2VkQ29vcmRzW2ldLmNvbHVtbiA9PSBjdXJDb2x1bW4gJiYgYmxvY2tlZENvb3Jkc1tpXS5yb3cgPT0gY3VyUm93KXsKKwkJCQkJCQlhZHZhbmNlZCA9IGZhbHNlOworCQkJCQkJCWJsb2NrZWRDb29yZHMuc3BsaWNlKGksMSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJCisJCQkJCWlmIChhZHZhbmNlZCkgeworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJCisJCQkJfSB3aGlsZSgxKTsKKwkJCQkKKwkJCX0KKwkJCQorCQl9CisJCQorCQkvKioKKwkJICogU2V0IHRoZSB3aWR0aCBvZiB0aGUgc3BlY2lmaWVkIGNvbHVtbi4gVGhlIHZhbHVlIGNhbiBiZSBhIG51bWJlciBvciBwZXJjZW50LiAKKwkJICoqLwogCQlwdWJsaWMgZnVuY3Rpb24gc2V0Q29sdW1uV2lkdGgoY29sdW1uSW5kZXg6aW50LCB2YWx1ZToqKTpCb29sZWFuCiAJCXsKLQkJCXZhciB0YWJsZUNvbEVsZW1lbnQ6VGFibGVDb2xFbGVtZW50ID0gZ2V0Q29sdW1uQXQoY29sdW1uSW5kZXgpIGFzIFRhYmxlQ29sRWxlbWVudDsKKwkJCS8vVE9ETzogY2hhbmdpbmcgdGhlIGNvbHVtbiB3aWR0aCBwcm9iYWJseSByZXF1aXJlcyBhIHJlY29tcG9zZSBvZiBhbGwgY2VsbHMgaW4gdGhhdCBjb2x1bW4uIE1hcmsgdGhlIGNlbGxzIGluIHRoYXQgcm93IGRhbWFnZWQuCisJCQl2YXIgdGFibGVDb2xFbGVtZW50OlRhYmxlQ29sRWxlbWVudCA9IGdldENvbHVtbkF0KGNvbHVtbkluZGV4KTsKIAkJCWlmICggISB0YWJsZUNvbEVsZW1lbnQgKQogCQkJCXJldHVybiBmYWxzZTsKIAkJCQpAQCAtMTMxLDYgKzgyNSwyMiBAQAogCQkJcmV0dXJuIHRydWU7CiAJCX0KIAkJCisJCS8qKgorCQkgKiBTZXQgdGhlIGhlaWdodCBvZiB0aGUgc3BlY2lmaWVkIHJvdy4gVGhlIHZhbHVlIGNhbiBiZSBhIG51bWJlciBvciBwZXJjZW50LiAKKwkJICoqLworCQlwdWJsaWMgZnVuY3Rpb24gc2V0Um93SGVpZ2h0KHJvd0lkeDppbnQsIHZhbHVlOiopOkJvb2xlYW57CisJCQkvL1RPRE86IHNldHRpbmcgdGhlIHJvdyBoZWlnaHQgbWlnaHQgY2hhbmdlIHRoZSBjb21wb3NpdGlvbiBoZWlnaHQgb2YgdGhlIGNlbGxzLiBXZSdsbCBuZWVkIHRvIGRvIHNvbWUgaG91c2VrZWVwaW5nIGhlcmUuCisJCQkvLyBJJ20gbm90IHN1cmUgdGhpcyBmdW5jdGlvbiBtYWtlcyBzZW5zZS4gV2UgbmVlZCB0byBoYW5kbGUgYm90aCBtaW4gYW5kIG1heCB2YWx1ZXMgdG8gYWxsb3cgZm9yIGV4cGFuZGluZyBjZWxscy4KKwkJCXZhciByb3c6VGFibGVSb3dFbGVtZW50ID0gZ2V0Um93QXQocm93SWR4KTsKKwkJCWlmKCFyb3cpCisJCQkJcmV0dXJuIGZhbHNlOworCQkJCisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQkKKwkJLyoqCisJCSAqIEdldCB0aGUgd2lkdGggb2YgdGhlIGNvbHVtbi4gCisJCSAqKi8KIAkJcHVibGljIGZ1bmN0aW9uIGdldENvbHVtbldpZHRoKGNvbHVtbkluZGV4OmludCk6KgogCQl7CiAJCQl2YXIgdGFibGVDb2xFbGVtZW50OlRhYmxlQ29sRWxlbWVudCA9IGdldENvbHVtbkF0KGNvbHVtbkluZGV4KSBhcyBUYWJsZUNvbEVsZW1lbnQ7CkBAIC0xMzgsMjYgKzg0OCw3MTUgQEAKIAkJCQlyZXR1cm4gdGFibGVDb2xFbGVtZW50LnRhYmxlQ29sdW1uV2lkdGg7CiAJCQlyZXR1cm4gMDsKICAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIGZ1bmN0aW9uIGdldCBoZWlnaHQoKTpOdW1iZXIKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIF9oZWlnaHRbbnVtQWNyb3NzUGFyY2Vsc107Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBmdW5jdGlvbiBzZXQgaGVpZ2h0KHZhbDoqKTp2b2lkCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9oZWlnaHRbbnVtQWNyb3NzUGFyY2Vsc10gPSB2YWw7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBmdW5jdGlvbiBnZXQgaGVpZ2h0QXJyYXkoKTpBcnJheQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gX2hlaWdodDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIGZ1bmN0aW9uIHNldCBoZWlnaHRBcnJheShuZXdBcnJheTpBcnJheSk6dm9pZAotICAgICAgICB7Ci0gICAgICAgICAgICBfaGVpZ2h0ID0gbmV3QXJyYXk7Ci0gICAgICAgIH0KIAkJCisJCS8qKgorCQkgKiBTaXplcyBhbmQgcG9zaXRpb25zIHRoZSBjZWxscyBpbiB0aGUgdGFibGUuIAorCQkgKiovCisJCXB1YmxpYyBmdW5jdGlvbiBjb21wb3NlQ2VsbHMoKTp2b2lkeworCQkJbm9ybWFsaXplQ2VsbHMoKTsKKwkJCV9jb21wb3NlZFJvd0luZGV4ID0gMDsKKwkJCQorCQkJLy8gbWFrZSBzdXJlIHRoZSBoZWlnaHQgdGhhdCBkZWZpbmVzIHRoZSByb3cgaGVpZ2h0IGRpZCBub3QgY2hhbmdlLiBJZiBpdCBkaWQgd2UgbWlnaHQgbmVlZCB0byBjaGFuZ2UgdGhlIHJvdyBoZWlnaHQuCisJCQlpZighaGFzQ2VsbERhbWFnZSkKKwkJCQlyZXR1cm47CisJCQl2YXIgZGFtYWdlZENlbGxzOlZlY3Rvci48VGFibGVDZWxsRWxlbWVudD4gPSBnZXREYW1hZ2VkQ2VsbHMoKTsKKwkJCXZhciBjZWxsOlRhYmxlQ2VsbEVsZW1lbnQ7CisJCQkKKwkJCWZvciBlYWNoKGNlbGwgaW4gZGFtYWdlZENlbGxzKXsKKwkJCQkvLyByZWNvbXBvc2UgdGhlIGNlbGxzIHdoaWxlIHRyYWNraW5nIHJvdyBoZWlnaHQgaWYgbmVjZXNzYXJ5CisJCQkJY2VsbC5jb21wb3NlKCk7CisJCQl9CisJCQkKKwkJCS8vIHNldCByb3cgaGVpZ2h0cyB0byBtaW5pbXVtCisJCQlmb3IgZWFjaCAodmFyIHJvdzpUYWJsZVJvd0VsZW1lbnQgaW4gcm93cyl7CisJCQkJdmFyIG1pbkg6TnVtYmVyID0gcm93LmNvbXB1dGVkRm9ybWF0Lm1pbkNlbGxIZWlnaHQ7CisJCQkJdmFyIG1heEg6TnVtYmVyID0gcm93LmNvbXB1dGVkRm9ybWF0Lm1heENlbGxIZWlnaHQ7CisJCQkJcm93LnRvdGFsSGVpZ2h0ID0gcm93LmNvbXBvc2VkSGVpZ2h0ID0gbWluSDsKKwkJCQlpZihtYXhIID4gbWluSCkKKwkJCQkJcm93LmlzTWF4SGVpZ2h0ID0gZmFsc2U7CisJCQkJZWxzZQorCQkJCQlyb3cuaXNNYXhIZWlnaHQgPSB0cnVlOworCQkJCQorCQkJfQorCQkJCisJCQkvLyBzZXQgY29sdW1uIHBvc2l0aW9ucy4uLgorCQkJdmFyIHhQb3M6TnVtYmVyID0gMDsKKwkJCWZvciBlYWNoICh2YXIgY29sOlRhYmxlQ29sRWxlbWVudCBpbiBjb2x1bW5zKXsKKwkJCQljb2wueCA9IHhQb3M7CisJCQkJeFBvcyArPSBjb2wuY29sdW1uV2lkdGg7CisJCQl9CisJCQkKKwkJCWlmIChteG1sQ2hpbGRyZW4pIHsKKwkJCQlmb3IodmFyIGk6aW50PTA7aTxteG1sQ2hpbGRyZW4ubGVuZ3RoO2krKyl7CisJCQkJCWlmKCAhKG14bWxDaGlsZHJlbltpXSBpcyBUYWJsZUNlbGxFbGVtZW50KSApCisJCQkJCQljb250aW51ZTsKKwkJCQkJY2VsbCA9IG14bWxDaGlsZHJlbltpXSBhcyBUYWJsZUNlbGxFbGVtZW50OworCQkJCQl3aGlsZShyb3dzLmxlbmd0aCA8IGNlbGwucm93SW5kZXgrMSl7CisJCQkJCQlhZGRSb3coZGVmYXVsdFJvd0Zvcm1hdCk7CisJCQkJCX0KKwkJCQkJcm93ID0gZ2V0Um93QXQoY2VsbC5yb3dJbmRleCk7CisJCQkJCWlmKCFyb3cpCisJCQkJCQl0aHJvdyBuZXcgRXJyb3IoInRoaXMgc2hvdWxkIG5vdCBoYXBwZW4uLi4iKTsKKwkJCQkJaWYocm93LmlzTWF4SGVpZ2h0KSB7CisJCQkJCQljb250aW51ZTsKKwkJCQkJfQorCQkJCQkKKwkJCQkJdmFyIGNlbGxIZWlnaHQ6TnVtYmVyID0gY2VsbC5nZXRDb21wb3NlZEhlaWdodCgpOworCQkJCQlpZihjZWxsLnJvd1NwYW4gPiAxKQorCQkJCQl7CisJCQkJCQkvLyBmaWd1cmUgb3V0IHRoZSB0b3RhbCBoZWlnaHQgdGFraW5nIGludG8gYWNjb3VudCBmaXhlZCBoZWlnaHQgcm93cyBhbmQgdGhlIHRvdGFsIHNwYW4uCisJCQkJCQkKKwkJCQkJCS8vIGZvciBub3csIHdlJ3JlIHRha2luZyB0aGUgZWFzeSB3YXkgb3V0IGFzc3VtaW5nIHRoZSByb3dzIGFyZSBub3QgZml4ZWQuLi4KKwkJCQkJCXJvdy50b3RhbEhlaWdodCA9IE1hdGgubWF4KHJvdy50b3RhbEhlaWdodCwgY2VsbEhlaWdodCk7CisJCQkJCQkKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCXJvdy5jb21wb3NlZEhlaWdodCA9IE1hdGgubWF4KHJvdy5jb21wb3NlZEhlaWdodCwgY2VsbEhlaWdodCk7CisJCQkJCQlyb3cuY29tcG9zZWRIZWlnaHQgPSBNYXRoLm1pbihyb3cuY29tcG9zZWRIZWlnaHQsIHJvdy5jb21wdXRlZEZvcm1hdC5tYXhDZWxsSGVpZ2h0KTsKKwkJCQkJCXJvdy50b3RhbEhlaWdodCA9IE1hdGgubWF4KHJvdy5jb21wb3NlZEhlaWdodCwgcm93LnRvdGFsSGVpZ2h0KTsKKwkJCQkJfQorCQkJCQlpZihyb3cuY29tcG9zZWRIZWlnaHQgPT0gcm93LmNvbXB1dGVkRm9ybWF0Lm1heENlbGxIZWlnaHQpCisJCQkJCQlyb3cuaXNNYXhIZWlnaHQgPSB0cnVlOworCQkJCX0KKwkJCX0KKwkJCQorCQkJCisJCQlpZighX3RhYmxlUm93c0NvbXB1dGVkKQorCQkJeworCQkJCS8vIGNyZWF0ZSBhcnJheXMgb3Igcm93cyB0byBtYWtlIHRhYmxlIGNvbXBvc2l0aW9uIHNpbXBsZXIKKwkJCQkvLyBGb3Igbm93IHdlJ3JlIGFzc3VtaW5nIGFsbCBjZWxscyBoYXZlIHRoZSBjb3JyZWN0IHJvdyBhbmQgY29sdW1uIGluZGljZXMuCisJCQkJLy8gRm9yIHRoaXMgYXNzdW1wdGlvbiB0byByZW1haW4gdmFsaWQsIHRoZSBpbnRlcmFjdGlvbiBtYW5hZ2VyIHdpbGwgaGF2ZSB0byB1cGRhdGUgYWxsIGluZGljZXMgd2hlbiBpbnNlcnRpbmcgcm93cyBhbmQgY29sdW1ucy4KKwkJCQkvLyBhY3R1YWxseSwgaXQgcHJvYmFibHkgbWFrZXMgc2Vuc2UgZm9yIFRhYmxlRWxlbWVudCB0byBoYW5kbGUgdGhhdCB3aGVuIGFkZGluZyByb3dzIGFuZCBjb2x1bW5zLgorCQkJCS8vIHdlIG5lZWQgdG8gdGhpbmsgdGhpcyB0aHJvdWdoLgorCQkJCV9ib2R5Um93cyA9IG5ldyBWZWN0b3IuPCBWZWN0b3IuPFRhYmxlQ2VsbEVsZW1lbnQ+ID4oKTsKKwkJCQkKKwkJCQlpZiAobXhtbENoaWxkcmVuKSB7CisJCQkJCWZvcihpPTA7aTxteG1sQ2hpbGRyZW4ubGVuZ3RoO2krKyl7CisJCQkJCQkKKwkJCQkJCWlmICggIShteG1sQ2hpbGRyZW5baV0gaXMgVGFibGVDZWxsRWxlbWVudCkgKSB7CisJCQkJCQkJY29udGludWU7CisJCQkJCQl9CisJCQkJCQkKKwkJCQkJCWNlbGwgPSBteG1sQ2hpbGRyZW5baV0gYXMgVGFibGVDZWxsRWxlbWVudDsKKwkJCQkJCQorCQkJCQkJd2hpbGUoY2VsbC5yb3dJbmRleCA+PSBfYm9keVJvd3MubGVuZ3RoKQorCQkJCQkJCV9ib2R5Um93cy5wdXNoKG5ldyBWZWN0b3IuPFRhYmxlQ2VsbEVsZW1lbnQ+KCkpOworCQkJCQkJCQorCQkJCQkJdmFyIHJvd1ZlYzpWZWN0b3IuPFRhYmxlQ2VsbEVsZW1lbnQ+ID0gX2JvZHlSb3dzW2NlbGwucm93SW5kZXhdIGFzIFZlY3Rvci48VGFibGVDZWxsRWxlbWVudD47CisJCQkJCQkKKwkJCQkJCWlmKCFyb3dWZWMpeworCQkJCQkJCXJvd1ZlYyA9IG5ldyBWZWN0b3IuPFRhYmxlQ2VsbEVsZW1lbnQ+KCk7CisJCQkJCQkJX2JvZHlSb3dzW2NlbGwucm93SW5kZXhdID0gcm93VmVjOworCQkJCQkJfQorCQkJCQkJCisJCQkJCQlpZihyb3dWZWMubGVuZ3RoID4gY2VsbC5jb2xJbmRleCAmJiByb3dWZWNbY2VsbC5jb2xJbmRleF0pIHsKKwkJCQkJCQl0aHJvdyBuZXcgRXJyb3IoIlR3byBjZWxscyBjYW5ub3QgaGF2ZSB0aGUgc2FtZSBjb29yZGluYXRlcyIpOworCQkJCQkJfQorCQkJCQkJCisJCQkJCQlyb3dWZWMucHVzaChjZWxsKTsKKwkJCQkJfQorCQkJCX0KKwkJCQkKKwkJCQlpZihoZWFkZXJSb3dDb3VudCA+IDApeworCQkJCQlfaGVhZGVyUm93cyA9IF9ib2R5Um93cy5zcGxpY2UoMCxoZWFkZXJSb3dDb3VudCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJX2hlYWRlclJvd3MgPSBudWxsOworCQkJCX0KKwkJCQkKKwkJCQlpZihmb290ZXJSb3dDb3VudCA+IDApeworCQkJCQlfZm9vdGVyUm93cyA9IF9ib2R5Um93cy5zcGxpY2UoLWZvb3RlclJvd0NvdW50LE51bWJlci5NQVhfVkFMVUUpOworCQkJCX0gZWxzZSB7CisJCQkJCV9mb290ZXJSb3dzID0gbnVsbDsKKwkJCQl9CisJCQl9CisJCX0KKwkJCisJCS8qKgorCQkgKiByZXR1cm5zIHRoZSBoZWFkZXIgcm93cyBmb3IgY29tcG9zaXRpb24KKwkJICoqLworCQlwdWJsaWMgZnVuY3Rpb24gZ2V0SGVhZGVyUm93cygpOlZlY3Rvci48IFZlY3Rvci48VGFibGVDZWxsRWxlbWVudD4gPnsKKwkJCXJldHVybiBfaGVhZGVyUm93czsKKwkJfQorCQkKKwkJLyoqCisJCSAqIHJldHVybnMgdGhlIGZvb3RlciByb3dzIGZvciBjb21wb3NpdGlvbgorCQkgKiovCisJCXB1YmxpYyBmdW5jdGlvbiBnZXRGb290ZXJSb3dzKCk6VmVjdG9yLjwgVmVjdG9yLjxUYWJsZUNlbGxFbGVtZW50PiA+eworCQkJcmV0dXJuIF9mb290ZXJSb3dzOworCQl9CisJCQorCQkvKioKKwkJICogcmV0dXJucyB0aGUgYm9keSByb3dzIChzYW5zIGhlYWRlciBhbmQgZm9vdGVyIGNlbGxzKSBmb3IgY29tcG9zaXRpb24KKwkJICoqLworCQlwdWJsaWMgZnVuY3Rpb24gZ2V0Qm9keVJvd3MoKTpWZWN0b3IuPCBWZWN0b3IuPFRhYmxlQ2VsbEVsZW1lbnQ+ID57CisJCQlyZXR1cm4gX2JvZHlSb3dzOworCQl9CisJCQorCQkvKioKKwkJICogcmV0dXJucyBhIHZlY3RvciBvZiB0YWJsZSBjZWxscyBpbiB0aGUgbmV4dCByb3cgZHVyaW5nIGNvbXBvc2l0aW9uCisJCSAqKi8KKwkJcHVibGljIGZ1bmN0aW9uIGdldE5leHRSb3coKTpWZWN0b3IuPFRhYmxlQ2VsbEVsZW1lbnQ+eworCQkJaWYoX2NvbXBvc2VkUm93SW5kZXggPj0gX2JvZHlSb3dzLmxlbmd0aCkKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCXJldHVybiBfYm9keVJvd3NbX2NvbXBvc2VkUm93SW5kZXgrK107CisJCX0KKwkJCisJCS8qKgorCQkgKiBSZXR1cm5zIHRoZSBuZXh0IHRhYmxlIGNlbGwgYWZ0ZXIgdGhlIHN1cHBsaWVkIHRhYmxlIGNlbGwKKwkJICoqLworCQlwdWJsaWMgZnVuY3Rpb24gZ2V0TmV4dENlbGwodGFibGVDZWxsOlRhYmxlQ2VsbEVsZW1lbnQpOlRhYmxlQ2VsbEVsZW1lbnQgeworCQkJdmFyIGNlbGw6VGFibGVDZWxsRWxlbWVudDsKKwkJCQorCQkJZm9yIGVhY2ggKHZhciBlbGVtZW50OkZsb3dFbGVtZW50IGluIG14bWxDaGlsZHJlbikgeworCQkJCWNlbGwgPSBlbGVtZW50IGFzIFRhYmxlQ2VsbEVsZW1lbnQ7CisJCQkJCisJCQkJaWYgKGNlbGwpIHsKKwkJCQkJCisJCQkJCS8vIGdldCBuZXh0IGNlbGwgaW4gc2FtZSByb3cgCisJCQkJCWlmIChjZWxsLnJvd0luZGV4PT10YWJsZUNlbGwucm93SW5kZXggJiYgY2VsbC5jb2xJbmRleC0xPT10YWJsZUNlbGwuY29sSW5kZXgpIHsKKwkJCQkJCXJldHVybiBjZWxsOworCQkJCQl9CisJCQkJCQorCQkJCQkvLyBnZXQgZmlyc3QgY2VsbCBpbiBuZXh0IHJvdworCQkJCQlpZiAoY2VsbC5yb3dJbmRleC0xPT10YWJsZUNlbGwucm93SW5kZXggJiYgY2VsbC5jb2xJbmRleD09MCkgeworCQkJCQkJcmV0dXJuIGNlbGw7CisJCQkJCX0KKwkJCQkJCisJCQkJfQorCQkJfQorCQkJCisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQkKKwkJLyoqCisJCSAqIFJldHVybnMgdGhlIHByZXZpb3VzIHRhYmxlIGNlbGwgYWZ0ZXIgdGhlIHN1cHBsaWVkIHRhYmxlIGNlbGwKKwkJICoqLworCQlwdWJsaWMgZnVuY3Rpb24gZ2V0UHJldmlvdXNDZWxsKHRhYmxlQ2VsbDpUYWJsZUNlbGxFbGVtZW50KTpUYWJsZUNlbGxFbGVtZW50IHsKKwkJCXZhciBjZWxsOlRhYmxlQ2VsbEVsZW1lbnQ7CisJCQl2YXIgaGlnaGVzdENlbGxJbmRleDppbnQgPSAtMTsKKwkJCXZhciByb3dJbmRleDppbnQgPSAtMTsKKwkJCQorCQkJZm9yIGVhY2ggKHZhciBlbGVtZW50OkZsb3dFbGVtZW50IGluIG14bWxDaGlsZHJlbikgeworCQkJCWNlbGwgPSBlbGVtZW50IGFzIFRhYmxlQ2VsbEVsZW1lbnQ7CisJCQkJCisJCQkJaWYgKGNlbGwpIHsKKwkJCQkJCisJCQkJCS8vIGdldCBwcmV2aW91cyBjZWxsIGluIHNhbWUgcm93IAorCQkJCQlpZiAoY2VsbC5yb3dJbmRleD09dGFibGVDZWxsLnJvd0luZGV4ICYmIGNlbGwuY29sSW5kZXgrMT09dGFibGVDZWxsLmNvbEluZGV4KSB7CisJCQkJCQlyZXR1cm4gY2VsbDsKKwkJCQkJfQorCQkJCQkKKwkJCQkJLy8gZ2V0IGxhc3QgY2VsbCBpbiBwcmV2aW91cyByb3cKKwkJCQkJaWYgKGNlbGwucm93SW5kZXgrMT09dGFibGVDZWxsLnJvd0luZGV4KSB7CisJCQkJCQlyb3dJbmRleCA9IGNlbGwucm93SW5kZXg7CisJCQkJCQkKKwkJCQkJCWlmIChoaWdoZXN0Q2VsbEluZGV4PGNlbGwuY29sSW5kZXgpIHsKKwkJCQkJCQloaWdoZXN0Q2VsbEluZGV4ID0gY2VsbC5jb2xJbmRleDsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQkKKwkJCQl9CisJCQl9CisJCQkKKwkJCWlmIChyb3dJbmRleD4tMSAmJiBoaWdoZXN0Q2VsbEluZGV4Pi0xKSB7CisJCQkJcmV0dXJuIGdldENlbGxBdChyb3dJbmRleCwgaGlnaGVzdENlbGxJbmRleCk7CisJCQl9CisJCQkKKwkJCXJldHVybiBudWxsOworCQl9CisJCQorCQkvKioKKwkJICogUmV0dXJucyB0aGUgdGFibGUgY2VsbCBhdCB0aGUgcm93IGFuZCBjb2x1bW4gc3BlY2lmaWVkLgorCQkgKiovCisJCXB1YmxpYyBmdW5jdGlvbiBnZXRDZWxsQXQocm93SW5kZXg6aW50LCBjb2x1bW5JbmRleDppbnQpOlRhYmxlQ2VsbEVsZW1lbnQgeworCQkJdmFyIGNlbGw6VGFibGVDZWxsRWxlbWVudDsKKwkJCQorCQkJZm9yIGVhY2ggKHZhciBlbGVtZW50OkZsb3dFbGVtZW50IGluIG14bWxDaGlsZHJlbikgeworCQkJCWNlbGwgPSBlbGVtZW50IGFzIFRhYmxlQ2VsbEVsZW1lbnQ7CisJCQkJCisJCQkJaWYgKGNlbGwgJiYgY2VsbC5yb3dJbmRleD09cm93SW5kZXggJiYgY2VsbC5jb2xJbmRleD09Y29sdW1uSW5kZXgpIHsKKwkJCQkJcmV0dXJuIGNlbGw7CisJCQkJfQorCQkJfQorCQkJCisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQkKKwkJLyoqCisJCSAqIENvbXB1dGVkIGhlaWdodCBvZiB0aGUgaGVhZGVyIGNlbGxzCisJCSAqKi8KKwkJcHVibGljIGZ1bmN0aW9uIGdldEhlYWRlckhlaWdodCgpOk51bWJlcnsKKwkJCS8vVE9ETzogY29tcHV0ZSB0aGUgaGVhZGVyIGhlaWdodCBmcm9tIHRoZSBoZWFkZXIgY2VsbHMKKwkJCXJldHVybiAwOworCQl9CisJCQorCQkvKioKKwkJICogQ29tcHV0ZWQgaGVpZ2h0IG9mIHRoZSBmb290ZXIgY2VsbHMKKwkJICoqLworCQlwdWJsaWMgZnVuY3Rpb24gZ2V0Rm9vdGVySGVpZ2h0KCk6TnVtYmVyeworCQkJLy9UT0RPOiBjb21wdXRlIHRoZSBmb290ZXIgaGVpZ2h0IGZyb20gdGhlIGZvb3RlciBjZWxscworCQkJcmV0dXJuIDA7CisJCQkKKwkJfQorCQkKKwkJLyoqCisJCSAqIEFjY2VwdHMgYSBzdWdnZXN0ZWQgdGFibGUgd2lkdGggYW5kIGNhbGN1bGF0ZXMgdGhlIGNvbHVtbiB3aWR0aHMuIAorCQkgKiovCisJCXB1YmxpYyBmdW5jdGlvbiBub3JtYWxpemVDb2x1bW5XaWR0aHMoc3VnZ2VzdGVkV2lkdGg6TnVtYmVyID0gNjAwKTp2b2lkeworCQkJLy9UT0RPOiBiZWZvcmUgY29tcG9zaXRpb24gbWFrZSBzdXJlIGFsbCBjb2x1bW4gd2lkdGhzIGFyZSByYXRpb25hbCBudW1iZXJzCisJCQkvLyBXZSBmZWVkIGluIGEgd2lkdGggdG8gdXNlIGlmIHRoZXJlJ3Mgbm8gd2lkdGggb3RoZXJ3aXNlIHNwZWNpZmllZC4KKwkJCQorCQkJLy8gcXVpY2sgYW5kIGRpcnR5Li4uCisJCQl2YXIgc2V0Q291bnQ6KiA9IGNvbXB1dGVkRm9ybWF0LmNvbHVtbkNvdW50OworCQkJaWYoIXNldENvdW50KXsKKwkJCQkvLyB3ZSBuZWVkIHRvIGZpZ3VyZSB0aGlzIG91dC4uLgorCQkJfSBlbHNlIGlmKHNldENvdW50ID09IEZvcm1hdFZhbHVlLkFVVE8peworCQkJCS8vIGZpZ3VyZSBvdXQuLi4KKwkJCX0gZWxzZSB7CisJCQkJdmFyIGNDb3VudDpOdW1iZXIgPSBjb21wdXRlZEZvcm1hdC5jb2x1bW5Db3VudDsKKwkJCX0KKwkJCQorCQkJd2hpbGUgKGNDb3VudCA+IGNvbHVtbnMubGVuZ3RoKXsKKwkJCQlhZGRDb2x1bW4oKTsKKwkJCX0KKwkJCQorCQkJdmFyIHc6TnVtYmVyOworCQkJc3dpdGNoKHR5cGVvZihjb21wdXRlZEZvcm1hdC50YWJsZVdpZHRoKSl7CisJCQkJY2FzZSAibnVtYmVyIjoKKwkJCQkJdyA9IHN1Z2dlc3RlZFdpZHRoOworCQkJCQlicmVhazsKKwkJCQljYXNlICJzdHJpbmciOgorCQkJCQlpZihjb21wdXRlZEZvcm1hdC50YWJsZVdpZHRoLmluZGV4T2YoIiUiKSA+IDApeworCQkJCQkJdyA9IHN1Z2dlc3RlZFdpZHRoIC8gKHBhcnNlRmxvYXQoY29tcHV0ZWRGb3JtYXQudGFibGVXaWR0aCkvMTAwKTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJZGVmYXVsdDoKKwkJCQkJdyA9IHN1Z2dlc3RlZFdpZHRoOworCQkJCQlicmVhazsKKwkJCX0KKwkJCWlmKGlzTmFOKHcpKQorCQkJCXcgPSA2MDA7CisJCQlpZih3ID4gMjAwMDApCisJCQkJdyA9IDYwMDsKKwkJCQorCQkJX2NvbXB1dGVkV2lkdGggPSB3OworCisJCQl2YXIgbnVtTm9uc2V0Q29sdW1uczppbnQgPSBudW1Db2x1bW5zOworCQkJdmFyIGNvbDpUYWJsZUNvbEVsZW1lbnQ7CisJCQlmb3IgZWFjaChjb2wgaW4gY29sdW1ucyl7CisJCQkJLy8gc2ltcGx5IHN0b21wIG9uIHRoZSBzZXR0aW5ncy4gKG5lZWQgdG8gZmluZXNzZSB0aGlzLi4uKQorCQkJCWlmKHR5cGVvZihjb2wuY29sdW1uV2lkdGgpID09ICJudW1iZXIiKQorCQkJCXsKKwkJCQkJdy09IGNvbC5jb2x1bW5XaWR0aDsKKwkJCQkJbnVtTm9uc2V0Q29sdW1ucy0tOworCQkJCX0KKwkJCX0KKworCQkJZm9yIGVhY2goY29sIGluIGNvbHVtbnMpCisJCQl7CisJCQkJLy8gc2ltcGx5IHN0b21wIG9uIHRoZSBzZXR0aW5ncy4gKG5lZWQgdG8gZmluZXNzZSB0aGlzLi4uKQorCQkJCWlmKHR5cGVvZihjb2wuY29sdW1uV2lkdGgpID09ICJudW1iZXIiKQorCQkJCQljb250aW51ZTsKKwkJCQljb2wuY29sdW1uV2lkdGggPSB3IC8gbnVtTm9uc2V0Q29sdW1uczsKKwkJCX0KKwkJfQorCQkKKwkJLyoqCisJCSAqIFJldHVybnMgYSB2ZWN0b3Igb2YgYWxsIHRoZSBkYW1hZ2VkIGNlbGxzIGluIHRoZSB0YWJsZS4KKwkJICoqLworCQlwcml2YXRlIGZ1bmN0aW9uIGdldERhbWFnZWRDZWxscygpOlZlY3Rvci48VGFibGVDZWxsRWxlbWVudD57CisJCQl2YXIgY2VsbHM6VmVjdG9yLjxUYWJsZUNlbGxFbGVtZW50PiA9IG5ldyBWZWN0b3IuPFRhYmxlQ2VsbEVsZW1lbnQ+KCk7CisJCQlmb3IgZWFjaCAodmFyIGNlbGw6KiBpbiB0aGlzLm14bWxDaGlsZHJlbil7CisJCQkJaWYoKGNlbGwgaXMgVGFibGVDZWxsRWxlbWVudCkgJiYgY2VsbC5pc0RhbWFnZWQoKSkKKwkJCQkJY2VsbHMucHVzaChjZWxsIGFzIFRhYmxlQ2VsbEVsZW1lbnQpOworCQkJfQorCQkJcmV0dXJuIGNlbGxzOworCQl9CisJCQorCQkvKioKKwkJICogTWFya3MgYWxsIG9mIHRoZSBjZWxscyBpbiB0aGUgdGFibGUgYXMgZGFtYWdlZC4KKwkJICoqLworCQlwcml2YXRlIGZ1bmN0aW9uIG1hcmtDZWxsc0RhbWFnZWQoKTp2b2lkIHsKKwkJCWlmICghbXhtbENoaWxkcmVuKSByZXR1cm47CisJCQkKKwkJCWZvciBlYWNoICh2YXIgY2VsbDoqIGluIHRoaXMubXhtbENoaWxkcmVuKXsKKwkJCQlpZiAoY2VsbCBpcyBUYWJsZUNlbGxFbGVtZW50KSB7CisJCQkJCWNlbGwuZGFtYWdlKCk7CisJCQkJfQorCQkJfQorCQl9CisJCQorCQkvKioKKwkJICogUmV0dXJucyBhIHZlY3RvciBvZiBhbGwgdGhlIHRhYmxlIGNlbGwgZWxlbWVudHMgaW4gdGhlIHRhYmxlLgorCQkgKiovCisJCXB1YmxpYyBmdW5jdGlvbiBnZXRDZWxscygpOlZlY3Rvci48VGFibGVDZWxsRWxlbWVudD4geworCQkJdmFyIGNlbGxzOlZlY3Rvci48VGFibGVDZWxsRWxlbWVudD4gPSBuZXcgVmVjdG9yLjxUYWJsZUNlbGxFbGVtZW50PigpOworCQkJCisJCQlmb3IgZWFjaCAodmFyIGNlbGw6KiBpbiBteG1sQ2hpbGRyZW4peworCQkJCWlmIChjZWxsIGlzIFRhYmxlQ2VsbEVsZW1lbnQpIHsKKwkJCQkJY2VsbHMucHVzaChjZWxsIGFzIFRhYmxlQ2VsbEVsZW1lbnQpOworCQkJCX0KKwkJCX0KKwkJCQorCQkJcmV0dXJuIGNlbGxzOworCQl9CisJCQorCQkvKioKKwkJICogUmV0dXJucyBhbiBhcnJheSBvZiBhbGwgdGhlIHRhYmxlIGNlbGxzLgorCQkgKiovCisJCXB1YmxpYyBmdW5jdGlvbiBnZXRDZWxsc0FycmF5KCk6QXJyYXkgeworCQkJdmFyIGNlbGxzOkFycmF5ID0gW107CisJCQkKKwkJCWZvciBlYWNoICh2YXIgY2VsbDoqIGluIG14bWxDaGlsZHJlbil7CisJCQkJaWYgKGNlbGwgaXMgVGFibGVDZWxsRWxlbWVudCkgeworCQkJCQljZWxscy5wdXNoKGNlbGwgYXMgVGFibGVDZWxsRWxlbWVudCk7CisJCQkJfQorCQkJfQorCQkJCisJCQlyZXR1cm4gY2VsbHM7CisJCX0KKwkJCisJCS8qKgorCQkgKiBSZXR1cm5zIHRoZSB0YWJsZSB3aWR0aAorCQkgKiovCisJCXB1YmxpYyBmdW5jdGlvbiBnZXQgd2lkdGgoKTpOdW1iZXIKKwkJeworCQkJcmV0dXJuIF9jb21wdXRlZFdpZHRoOworCQl9CisJCQorCQkvKioKKwkJICogU2V0cyB0aGUgdGFibGUgd2lkdGgKKwkJICoqLworCQlwdWJsaWMgZnVuY3Rpb24gc2V0IHdpZHRoKHZhbHVlOiopOnZvaWQKKwkJeworCQkJbm9ybWFsaXplQ29sdW1uV2lkdGhzKHZhbHVlKTsKKwkJfQorCQkKKwkJCisJCS8qKgorCQkgKiBJbmRpY2F0ZXMgZWxlbWVudHMgaW4gdGhlIHRhYmxlIGhhdmUgYmVlbiBtb2RpZmllZCBhbmQgdGhlIHRhYmxlIG11c3QgYmUgcmVjb21wb3NlZC4KKwkJICoqLworCQlwdWJsaWMgZnVuY3Rpb24gZ2V0IGhhc0NlbGxEYW1hZ2UoKTpCb29sZWFuDQorCQl7CisJCQlyZXR1cm4gX2hhc0NlbGxEYW1hZ2U7CisJCX0KKworCQlwdWJsaWMgZnVuY3Rpb24gc2V0IGhhc0NlbGxEYW1hZ2UodmFsdWU6Qm9vbGVhbik6dm9pZA0KKwkJeworCQkJX2hhc0NlbGxEYW1hZ2UgPSB2YWx1ZTsKKwkJfQorCisJCS8qKgorCQkgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgaGVhZGVyIHJvd3MgaW4gdGhlIHRhYmxlCisJCSAqKi8KKwkJcHVibGljIGZ1bmN0aW9uIGdldCBoZWFkZXJSb3dDb3VudCgpOnVpbnQNCisJCXsKKwkJCXJldHVybiBfaGVhZGVyUm93Q291bnQ7CisJCX0KKworCQkvKioKKwkJICogU2V0cyB0aGUgbnVtYmVyIG9mIGhlYWRlciByb3dzIGluIHRoZSB0YWJsZQorCQkgKiovCisJCXB1YmxpYyBmdW5jdGlvbiBzZXQgaGVhZGVyUm93Q291bnQodmFsdWU6dWludCk6dm9pZA0KKwkJeworCQkJaWYodmFsdWUgIT0gX2hlYWRlclJvd0NvdW50KQorCQkJCV90YWJsZVJvd3NDb21wdXRlZCA9IGZhbHNlOworCQkJX2hlYWRlclJvd0NvdW50ID0gdmFsdWU7CisJCX0KKworCQkvKioKKwkJICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGZvb3RlciByb3dzIGluIHRoZSB0YWJsZQorCQkgKiovCisJCXB1YmxpYyBmdW5jdGlvbiBnZXQgZm9vdGVyUm93Q291bnQoKTp1aW50DQorCQl7CisJCQlyZXR1cm4gX2Zvb3RlclJvd0NvdW50OworCQl9CisKKwkJLyoqCisJCSAqIFNldHMgdGhlIG51bWJlciBvZiBmb290ZXIgcm93cyBpbiB0aGUgdGFibGUKKwkJICoqLworCQlwdWJsaWMgZnVuY3Rpb24gc2V0IGZvb3RlclJvd0NvdW50KHZhbHVlOnVpbnQpOnZvaWQNCisJCXsKKwkJCWlmKHZhbHVlICE9IF9mb290ZXJSb3dDb3VudCkKKwkJCQlfdGFibGVSb3dzQ29tcHV0ZWQgPSBmYWxzZTsKKwkJCV9mb290ZXJSb3dDb3VudCA9IHZhbHVlOworCQl9CisJCQorCQkvKioKKwkJICogR2V0cyB0aGUgZmlyc3QgVGV4dEZsb3dUYWJsZUJsb2NrIGluIHRoZSB0YWJsZS4gCisJCSAqKi8KKwkJcHVibGljIGZ1bmN0aW9uIGdldEZpcnN0QmxvY2soKTpUZXh0Rmxvd1RhYmxlQmxvY2t7CisJCQlpZihfdGFibGVCbG9ja3MgPT0gbnVsbCkKKwkJCQlfdGFibGVCbG9ja3MgPSBuZXcgVmVjdG9yLjxUZXh0Rmxvd1RhYmxlQmxvY2s+KCk7CisJCQlpZihfdGFibGVCbG9ja3MubGVuZ3RoID09IDApCisJCQkJX3RhYmxlQmxvY2tzLnB1c2gobmV3IFRleHRGbG93VGFibGVCbG9jaygwKSk7CisJCQlfdGFibGVCbG9ja0luZGV4ID0gMDsKKwkJCV90YWJsZUJsb2Nrc1swXS5wYXJlbnRUYWJsZSA9IHRoaXM7CisJCQkKKwkJCXJldHVybiBfdGFibGVCbG9ja3NbMF07CisJCX0KKwkJCisJCS8qKgorCQkgKiBHZXRzIHRoZSBuZXh0IFRleHRGbG93VGFibGVCbG9jay4gCisJCSAqKi8KKwkJcHVibGljIGZ1bmN0aW9uIGdldE5leHRCbG9jaygpOlRleHRGbG93VGFibGVCbG9ja3sKKwkJCWlmKF90YWJsZUJsb2NrcyA9PSBudWxsKQorCQkJCV90YWJsZUJsb2NrcyA9IG5ldyBWZWN0b3IuPFRleHRGbG93VGFibGVCbG9jaz4oKTsKKwkJCV90YWJsZUJsb2NrSW5kZXgrKzsKKwkJCXdoaWxlKF90YWJsZUJsb2Nrcy5sZW5ndGggPD0gX3RhYmxlQmxvY2tJbmRleCl7CisJCQkJX3RhYmxlQmxvY2tzLnB1c2goIG5ldyBUZXh0Rmxvd1RhYmxlQmxvY2soX3RhYmxlQmxvY2tzLmxlbmd0aCkgKTsKKwkJCX0KKwkJCV90YWJsZUJsb2Nrc1tfdGFibGVCbG9ja0luZGV4XS5wYXJlbnRUYWJsZSA9IHRoaXM7CisJCQkKKwkJCXJldHVybiBfdGFibGVCbG9ja3NbX3RhYmxlQmxvY2tJbmRleF07CisJCX0KKwkJCisJCS8qKgorCQkgKiBHZXRzIHRoZSB0b3RhbCBhdG9tIGxlbmd0aCBvZiB0aGlzIGZsb3cgZWxlbWVudCBpbiB0aGUgdGV4dCBmbG93LiAgCisJCSAqIAorCQkgKiBAaW5oZXJpdERvYworCQkgKiovCisJCW92ZXJyaWRlIHB1YmxpYyBmdW5jdGlvbiBnZXQgdGV4dExlbmd0aCgpOmludHsKKwkJCXJldHVybiAxOworCQl9CisJCQorCQkvKioKKwkJICogUmV0dXJucyB0aGUgY2VsbCBhdCB0aGUgc3BlY2lmaWVkIHJvdyBhbmQgY29sdW1uLiAKKwkJICoqLworCQlwcml2YXRlIGZ1bmN0aW9uIGdldENlbGxJbmRleChyb3dJZHg6aW50LGNvbHVtbklkeDppbnQpOmludHsKKwkJCWlmKHJvd0lkeCA9PSAwICYmIGNvbHVtbklkeCA9PSAwKQorCQkJCXJldHVybiAwOworCQkJZm9yICh2YXIgaTppbnQ9MDtpPG14bWxDaGlsZHJlbi5sZW5ndGg7aSsrKXsKKwkJCQl2YXIgaXRlbToqID0gbXhtbENoaWxkcmVuW2ldOworCQkJCWlmKCEoaXRlbSBpcyBUYWJsZUNlbGxFbGVtZW50KSkKKwkJCQkJY29udGludWU7CisJCQkJdmFyIGNlbGw6VGFibGVDZWxsRWxlbWVudCA9IGl0ZW0gYXMgVGFibGVDZWxsRWxlbWVudDsKKwkJCQlpZihjZWxsLnJvd0luZGV4ID09IHJvd0lkeCAmJiBjZWxsLmNvbEluZGV4ID09IGNvbHVtbklkeCkKKwkJCQkJcmV0dXJuIGk7CisJCQl9CisJCQlyZXR1cm4gLTE7CisJCQkKKwkJfQorCQkKKwkJLyoqCisJCSAqIFJldHVybnMgYSB2ZWN0b3Igb2YgdGFibGUgY2VsbCBlbGVtZW50cyBpbiB0aGUgZ2l2ZW4gY2VsbCByYW5nZS4gCisJCSAqKi8KKwkJcHVibGljIGZ1bmN0aW9uIGdldENlbGxzSW5SYW5nZShhbmNob3JDb29yZHM6Q2VsbENvb3JkaW5hdGVzLCBhY3RpdmVDb29yZHM6Q2VsbENvb3JkaW5hdGVzLCBibG9jazpUZXh0Rmxvd1RhYmxlQmxvY2s9bnVsbCk6VmVjdG9yLjxUYWJsZUNlbGxFbGVtZW50PgorCQl7CisJCQl2YXIgZmlyc3RDb29yZHM6Q2VsbENvb3JkaW5hdGVzID0gYW5jaG9yQ29vcmRzLmNsb25lKCk7CisJCQl2YXIgbGFzdENvb3JkczpDZWxsQ29vcmRpbmF0ZXMgPSBhY3RpdmVDb29yZHMuY2xvbmUoKTsKKwkJCWlmKAorCQkJCWxhc3RDb29yZHMucm93IDwgZmlyc3RDb29yZHMucm93IHx8CisJCQkJKGxhc3RDb29yZHMucm93ID09IGZpcnN0Q29vcmRzLnJvdyAmJiBsYXN0Q29vcmRzLmNvbHVtbiA8IGZpcnN0Q29vcmRzLmNvbHVtbikKKwkJCSkKKwkJCXsKKwkJCQlmaXJzdENvb3JkcyA9IGFjdGl2ZUNvb3Jkcy5jbG9uZSgpOworCQkJCWxhc3RDb29yZHMgPSBhbmNob3JDb29yZHMuY2xvbmUoKTsKKwkJCX0KKwkJCQorCQkJLy8gbWFrZSBzdXJlIHRoZSByZWN0YW5nbGUgaXMgbm90IGludmVyc2VkCisJCQlpZihsYXN0Q29vcmRzLmNvbHVtbiA8IGZpcnN0Q29vcmRzLmNvbHVtbikKKwkJCXsKKwkJCQl2YXIgY29sOmludCA9IGZpcnN0Q29vcmRzLmNvbHVtbjsKKwkJCQlmaXJzdENvb3Jkcy5jb2x1bW4gPSBsYXN0Q29vcmRzLmNvbHVtbjsKKwkJCQlsYXN0Q29vcmRzLmNvbHVtbiA9IGNvbDsKKwkJCX0KKwkJCXZhciBmaXJzdENlbGw6VGFibGVDZWxsRWxlbWVudCA9IGZpbmRDZWxsKGZpcnN0Q29vcmRzKTsKKwkJCXZhciBjZWxsczpWZWN0b3IuPFRhYmxlQ2VsbEVsZW1lbnQ+ID0gbmV3IFZlY3Rvci48VGFibGVDZWxsRWxlbWVudD4oKTsKKwkJCWlmKCFibG9jayB8fCBnZXRDZWxsQmxvY2soZmlyc3RDZWxsKSA9PSBibG9jaykKKwkJCQljZWxscy5wdXNoKGZpcnN0Q2VsbCk7CisJCQl2YXIgaWR4OmludCA9IG14bWxDaGlsZHJlbi5pbmRleE9mKGZpcnN0Q2VsbCk7CisJCQl3aGlsZSgrK2lkeCA8IG14bWxDaGlsZHJlbi5sZW5ndGgpCisJCQl7CisJCQkJdmFyIG5leHRDZWxsOlRhYmxlQ2VsbEVsZW1lbnQgPSBteG1sQ2hpbGRyZW5baWR4XTsKKwkJCQlpZihuZXh0Q2VsbC5yb3dJbmRleCA+IGxhc3RDb29yZHMucm93IHx8IChuZXh0Q2VsbC5yb3dJbmRleCA9PSBsYXN0Q29vcmRzLnJvdyAmJiBuZXh0Q2VsbC5jb2xJbmRleCA+IGxhc3RDb29yZHMuY29sdW1uKSkKKwkJCQkJYnJlYWs7CisJCQkJLy8gc2tpcCBjZWxscyBvdXRzaWRlIHJlY3RhbmdsZQorCQkJCWlmKG5leHRDZWxsLmNvbEluZGV4ID4gbGFzdENvb3Jkcy5jb2x1bW4gfHwgbmV4dENlbGwuY29sSW5kZXggPCBmaXJzdENvb3Jkcy5jb2x1bW4pCisJCQkJCWNvbnRpbnVlOworCQkJCWlmKCFibG9jayB8fCBnZXRDZWxsQmxvY2sobmV4dENlbGwpID09IGJsb2NrKQorCQkJCQljZWxscy5wdXNoKG5leHRDZWxsKTsKKwkJCX0KKwkJCXJldHVybiBjZWxsczsKKwkJfQorCQkKKwkJLyoqCisJCSAqIEZpbmRzIHRoZSBjZWxsIGF0IHRoZSBzcGVjaWZpZWQgY2VsbCBjb29yZGluYXRlcyBvciBudWxsIGlmIG5vIGNlbGwgaXMgZm91bmQuIAorCQkgKiovCisJCXB1YmxpYyBmdW5jdGlvbiBmaW5kQ2VsbChjb29yZHM6Q2VsbENvb3JkaW5hdGVzKTpUYWJsZUNlbGxFbGVtZW50CisJCXsKKwkJCS8vIGdldCBhIGd1ZXNzIG9mIHRoZSBjZWxsIGxvY2F0aW9uLiBJZiB0aGVyZSdzIG5vIGhvbGVzIChzdWNoIGFzIHNwYW5zKSwgaXQgc2hvdWxkIHRoZW9yZXRpY2FsbHkgcGlucG9pbnQgdGhlIGluZGV4LgorCQkJdmFyIGlkeDppbnQgPSAoY29vcmRzLnJvdysxKSAqIChjb29yZHMuY29sdW1uKzEpIC0xOworCQkJaWYoaWR4ID49IG51bUNoaWxkcmVuKQorCQkJCWlkeCA9IG51bUNoaWxkcmVuLTE7CisJCQkKKwkJCXZhciBjZWxsOlRhYmxlQ2VsbEVsZW1lbnQgPSBteG1sQ2hpbGRyZW5baWR4XTsKKwkJCS8vIGxvb2sgYWhlYWQgdG8gc2VlIGlmIHdlJ3JlIHNob3J0IChub3Qgc3VyZSBpZiB0aGlzIGlzIG5lZWRlZCkuCisJCQlkbworCQkJeworCQkJCWlmKGlkeCA9PSBudW1DaGlsZHJlbi0xKQorCQkJCQlicmVhazsKKwkJCQl2YXIgbmV4dENlbGw6VGFibGVDZWxsRWxlbWVudCA9IG14bWxDaGlsZHJlbltpZHgrMV07CisJCQkJaWYobmV4dENlbGwucm93SW5kZXggPiBjb29yZHMucm93IHx8IChuZXh0Q2VsbC5yb3dJbmRleCA9PSBjb29yZHMucm93ICYmIG5leHRDZWxsLmNvbEluZGV4ID4gY29vcmRzLmNvbHVtbikpCisJCQkJCWJyZWFrOworCQkJCQorCQkJCWNlbGwgPSBuZXh0Q2VsbDsKKwkJCQlpZHgrKzsKKwkJCQkKKwkJCX13aGlsZSh0cnVlKTsKKwkJCS8vIGxvb2sgYmVoaW5kIGFjY291bnRpbmcgZm9yIHNwYW5zCisJCQlkbworCQkJeworCQkJCS8vY2hlY2sgaWYgdGhlIGNvb3JkcyBmYWxsIHdpdGhpbiB0aGUgcm93IGFuZCBjb2x1bW4gc3BhbgorCQkJCWlmKAorCQkJCQljZWxsLmNvbEluZGV4IDw9IGNvb3Jkcy5jb2x1bW4gJiYgY2VsbC5jb2xJbmRleCArIGNlbGwuY29sdW1uU3BhbiAtIDEgPj0gY29vcmRzLmNvbHVtbiAmJgorCQkJCQljZWxsLnJvd0luZGV4IDw9IGNvb3Jkcy5yb3cgJiYgY2VsbC5yb3dJbmRleCArIGNlbGwucm93U3BhbiAtIDEgPj0gY29vcmRzLnJvdworCQkJCSkKKwkJCQkJYnJlYWs7CisJCQkJLy9vb3BzIHdlIGhpdCB0aGUgZmlyc3QgY2VsbCB3aXRob3V0IGZpbmRpbmcgYW55dGhpbmcuIEF0IGxlYXN0IHJldHVybiB0aGF0Li4uCisJCQkJaWYoY2VsbC5jb2xJbmRleCA9PSAwICYmIGNlbGwucm93SW5kZXggPT0gMCkKKwkJCQkJYnJlYWs7CisJCQkJaWYoaWR4ID09IDApCisJCQkJCWJyZWFrOworCQkJCXZhciBwcmV2Q2VsbDpUYWJsZUNlbGxFbGVtZW50ID0gbXhtbENoaWxkcmVuW2lkeC0xXTsKKwkJCQljZWxsID0gcHJldkNlbGw7CisJCQkJaWR4LS07CisJCQl9d2hpbGUodHJ1ZSk7CisJCQkKKwkJCXJldHVybiBjZWxsOworCQl9CisJCQorCQkvKioKKwkJICogQWRkcyB0aGUgdGFibGUgY2VsbCBjb250YWluZXIgdG8gdGhlIHRhYmxlIGJsb2NrIHNwZWNpZmllZC4gCisJCSAqKi8KKwkJcHVibGljIGZ1bmN0aW9uIGFkZENlbGxUb0Jsb2NrKGNlbGw6VGFibGVDZWxsRWxlbWVudCwgYmxvY2s6VGV4dEZsb3dUYWJsZUJsb2NrKTp2b2lkCisJCXsKKwkJCWJsb2NrLmFkZENlbGwoY2VsbC5jb250YWluZXIpOworCQkJdGFibGVCbG9ja0RpY3RbY2VsbF0gPSBibG9jazsKKwkJfQorCQkKKwkJLyoqCisJCSAqIFJldHVybnMgdGhlIHRhYmxlIGJsb2NrIGZvciB0aGUgZ2l2ZW4gdGFibGUgY2VsbC4gCisJCSAqKi8KKwkJcHVibGljIGZ1bmN0aW9uIGdldENlbGxCbG9jayhjZWxsOlRhYmxlQ2VsbEVsZW1lbnQpOlRleHRGbG93VGFibGVCbG9jaworCQl7CisJCQlyZXR1cm4gdGFibGVCbG9ja0RpY3RbY2VsbF07CisJCX0KKworCQkvKioKKwkJICogS2VlcHMgYSByZWZlcmVuY2UgdG8gYWxsIHRoZSB0YWJsZSBibG9ja3MgYmVsb25naW5nIHRvIHRoaXMgdGFibGUuIAorCQkgKiovCisJCXByaXZhdGUgZnVuY3Rpb24gZ2V0IHRhYmxlQmxvY2tEaWN0KCk6RGljdGlvbmFyeQ0KKwkJeworCQkJaWYoX3RhYmxlQmxvY2tEaWN0ID09IG51bGwpCisJCQkJX3RhYmxlQmxvY2tEaWN0ID0gbmV3IERpY3Rpb25hcnkoKTsKKwkJCXJldHVybiBfdGFibGVCbG9ja0RpY3Q7CisJCX0KKwkJCisJCS8qKgorCQkgKiBSZXR1cm5zIGEgdmVjdG9yIG9mIHRoZSB0YWJsZSBibG9ja3MuCisJCSAqKi8KKwkJcHVibGljIGZ1bmN0aW9uIGdldCB0YWJsZUJsb2NrcygpOlZlY3Rvci48VGV4dEZsb3dUYWJsZUJsb2NrPgorCQl7CisJCQlyZXR1cm4gX3RhYmxlQmxvY2tzOworCQl9CisJCQorCQkvKioKKwkJICogUmV0dXJucyBhIHZlY3RvciBvZiB0aGUgdGFibGUgYmxvY2tzIGluIHRoZSBzcGVjaWZpZWQgY2VsbCByYW5nZS4KKwkJICoqLworCQlwdWJsaWMgZnVuY3Rpb24gZ2V0VGFibGVCbG9ja3NJblJhbmdlKHN0YXJ0OkNlbGxDb29yZGluYXRlcyxlbmQ6Q2VsbENvb3JkaW5hdGVzKTpWZWN0b3IuPFRleHRGbG93VGFibGVCbG9jaz4KKwkJeworCQkJdmFyIGNvb3JkczpDZWxsQ29vcmRpbmF0ZXMgPSBzdGFydC5jbG9uZSgpOworCQkJaWYoZW5kLmNvbHVtbiA8IHN0YXJ0LmNvbHVtbikKKwkJCXsKKwkJCQljb29yZHMgPSBlbmQuY2xvbmUoKTsKKwkJCQllbmQgPSBzdGFydC5jbG9uZSgpOworCQkJfQorCQkJdmFyIGJsb2NrczpWZWN0b3IuPFRleHRGbG93VGFibGVCbG9jaz4gPSBuZXcgVmVjdG9yLjxUZXh0Rmxvd1RhYmxlQmxvY2s+KCk7CisJCQl2YXIgYmxvY2s6VGV4dEZsb3dUYWJsZUJsb2NrID0gZ2V0Q2VsbEJsb2NrKGZpbmRDZWxsKGNvb3JkcykpOworCQkJaWYoYmxvY2spCisJCQkJYmxvY2tzLnB1c2goYmxvY2spOworCQkJd2hpbGUoYmxvY2spCisJCQl7CisJCQkJY29vcmRzLnJvdysrOworCQkJCWlmKGNvb3Jkcy5yb3cgPiBlbmQucm93KQorCQkJCQlicmVhazsKKwkJCQlpZihnZXRDZWxsQmxvY2soZmluZENlbGwoY29vcmRzKSkgPT0gYmxvY2spCisJCQkJCWNvbnRpbnVlOworCQkJCWJsb2NrID0gZ2V0Q2VsbEJsb2NrKGZpbmRDZWxsKGNvb3JkcykpOworCQkJCWlmKGJsb2NrKQorCQkJCQlibG9ja3MucHVzaChibG9jayk7CisJCQl9CisJCQlyZXR1cm4gYmxvY2tzOworCQl9CisKKwkJLyoqIEBwcml2YXRlICovCisJCXRsZl9pbnRlcm5hbCBvdmVycmlkZSBmdW5jdGlvbiBnZXROZXh0TGVhZkhlbHBlcihsaW1pdEVsZW1lbnQ6Rmxvd0dyb3VwRWxlbWVudCxjaGlsZDpGbG93RWxlbWVudCk6Rmxvd0xlYWZFbGVtZW50CisJCXsKKwkJCXJldHVybiBwYXJlbnQuZ2V0TmV4dExlYWZIZWxwZXIobGltaXRFbGVtZW50LHRoaXMpOworCQl9CisJCQorCQkvKiogQHByaXZhdGUgKi8KKwkJdGxmX2ludGVybmFsIG92ZXJyaWRlIGZ1bmN0aW9uIGdldFByZXZpb3VzTGVhZkhlbHBlcihsaW1pdEVsZW1lbnQ6Rmxvd0dyb3VwRWxlbWVudCxjaGlsZDpGbG93RWxlbWVudCk6Rmxvd0xlYWZFbGVtZW50CisJCXsKKwkJCXJldHVybiBwYXJlbnQuZ2V0UHJldmlvdXNMZWFmSGVscGVyKGxpbWl0RWxlbWVudCx0aGlzKTsKKwkJfQorCisJCXByaXZhdGUgZnVuY3Rpb24gZ2V0TGVhZigpOlRhYmxlTGVhZkVsZW1lbnQKKwkJeworCQkJaWYoX2xlYWYgPT0gbnVsbCkKKwkJCQlfbGVhZiA9IG5ldyBUYWJsZUxlYWZFbGVtZW50KHRoaXMpOworCQkJcmV0dXJuIF9sZWFmOworCQl9CisJCQorCQlwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gZmluZExlYWYocmVsYXRpdmVQb3NpdGlvbjppbnQpOkZsb3dMZWFmRWxlbWVudAorCQl7CisJCQlyZXR1cm4gZ2V0TGVhZigpOworCQl9CisJCXB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBnZXRMYXN0TGVhZigpOiBGbG93TGVhZkVsZW1lbnQKKwkJeworCQkJcmV0dXJuIGdldExlYWYoKTsKKwkJfQorCQlwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gZ2V0Rmlyc3RMZWFmKCk6Rmxvd0xlYWZFbGVtZW50CisJCXsKKwkJCXJldHVybiBnZXRMZWFmKCk7CisJCX0KKworCQl0bGZfaW50ZXJuYWwgb3ZlcnJpZGUgZnVuY3Rpb24gY3JlYXRlQ29udGVudEVsZW1lbnQoKTp2b2lke30KKwkJLyoqIEBwcml2YXRlIAorCQkgKiBSZWxlYXNlIHRoZSBGVEUgZGF0YSBzdHJ1Y3R1cmUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgRmxvd0VsZW1lbnQsIHNvIGl0IGNhbiBiZSBnYydlZAorCQkgKi8KKwkJdGxmX2ludGVybmFsIG92ZXJyaWRlIGZ1bmN0aW9uIHJlbGVhc2VDb250ZW50RWxlbWVudCgpOnZvaWR7fQorCisJCS8qKgorCQkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgZGVmYXVsdCByb3cgCisJCSAqKi8KKwkJdGxmX2ludGVybmFsIGZ1bmN0aW9uIGNyZWF0ZVJvd0VsZW1lbnQoaW5kZXg6aW50LCBkZWZhdWx0Um93Rm9ybWF0OklUZXh0TGF5b3V0Rm9ybWF0KTpUYWJsZVJvd0VsZW1lbnQgeworCQkJdmFyIHJvdzpUYWJsZVJvd0VsZW1lbnQgPSBuZXcgVGFibGVSb3dFbGVtZW50KGRlZmF1bHRSb3dGb3JtYXQpOworCQkJcm93LnJvd0luZGV4ID0gaW5kZXg7CisJCQlyb3cudGFibGUgPSB0aGlzOworCQkJcmV0dXJuIHJvdzsKKwkJfQorCisJCS8qKgorCQkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgZGVmYXVsdCBjb2x1bW4gCisJCSAqKi8KKwkJdGxmX2ludGVybmFsIGZ1bmN0aW9uIGNyZWF0ZUNvbHVtbkVsZW1lbnQoaW5kZXg6aW50LCBkZWZhdWx0Q29sdW1uRm9ybWF0OklUZXh0TGF5b3V0Rm9ybWF0KTpUYWJsZUNvbEVsZW1lbnQgeworCQkJdmFyIGNvbHVtbjpUYWJsZUNvbEVsZW1lbnQgPSBuZXcgVGFibGVDb2xFbGVtZW50KGRlZmF1bHRDb2x1bW5Gb3JtYXQpOworCQkJY29sdW1uLmNvbEluZGV4ID0gaW5kZXg7CisJCQljb2x1bW4udGFibGUgPSB0aGlzOworCQkJcmV0dXJuIGNvbHVtbjsKKwkJfQorCX0KK30KK2NsYXNzIENlbGxDb29yZHMKK3sKKwlwdWJsaWMgdmFyIGNvbHVtbjppbnQ7CisJcHVibGljIHZhciByb3c6aW50OworCXB1YmxpYyBmdW5jdGlvbiBDZWxsQ29vcmRzKGNvbElkeDppbnQscm93SWR4OmludCkKKwl7CisJCWNvbHVtbiA9IGNvbElkeDsKKwkJcm93ID0gcm93SWR4OwogCX0KIH0KZGlmZiAtLWdpdCBhL3RleHRMYXlvdXQvc3JjL2ZsYXNoeC90ZXh0TGF5b3V0L2VsZW1lbnRzL1RhYmxlRm9ybWF0dGVkRWxlbWVudC5hcyBiL3RleHRMYXlvdXQvc3JjL2ZsYXNoeC90ZXh0TGF5b3V0L2VsZW1lbnRzL1RhYmxlRm9ybWF0dGVkRWxlbWVudC5hcwppbmRleCA0YjViZDBmLi5lZGFkNWUzIDEwMDY0NAotLS0gYS90ZXh0TGF5b3V0L3NyYy9mbGFzaHgvdGV4dExheW91dC9lbGVtZW50cy9UYWJsZUZvcm1hdHRlZEVsZW1lbnQuYXMKKysrIGIvdGV4dExheW91dC9zcmMvZmxhc2h4L3RleHRMYXlvdXQvZWxlbWVudHMvVGFibGVGb3JtYXR0ZWRFbGVtZW50LmFzCkBAIC0yNSw2ICsyNSw5IEBACiAJCQlzdXBlcigpOwogCQl9CiAJCQorCQkvKioKKwkJICogR2V0IGEgcmVmZXJlbmNlIHRvIHRoZSB0YWJsZS4gV2UgY291bGQgcmVmYWN0b3IgdGhpcyBzaW5jZSBpdCdzIGFjY2Vzc2VkIG11bHRpcGxlIHRpbWVzLgorCQkgKiovCiAJCXB1YmxpYyBmdW5jdGlvbiBnZXRUYWJsZSgpOlRhYmxlRWxlbWVudAogCQl7CiAJCQkvLyBmaW5kIHRoZSByb290IGVsZW1lbnQgZW50cnkgYW5kIGVpdGhlciByZXR1cm4gbnVsbCBvciB0aGUgY29udGFpbmluZyB0ZXh0RmxvdwpAQCAtMzIsNiArMzUsMzcgQEAKIAkJCXdoaWxlICgoZWxlbS5wYXJlbnQpICE9IG51bGwgJiYgISggZWxlbS5wYXJlbnQgaXMgVGFibGVFbGVtZW50KSkKIAkJCQllbGVtID0gZWxlbS5wYXJlbnQ7CiAJCQlyZXR1cm4gZWxlbS5wYXJlbnQgYXMgVGFibGVFbGVtZW50OwkJCi0JCX0JCisJCX0KKwkJCisJCQorCQlwcml2YXRlIHZhciBfdGFibGU6VGFibGVFbGVtZW50OworCQkKKwkJLyoqCisJCSAqIFJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIHRhYmxlLiBGb3IgdGhpcyB0byB3b3JrIHdlIG5lZWQgdG8gc2V0IHRoZSAKKwkJICogdGFibGUgdG8gbnVsbCB3aGVuIGl0J3MgcmVtb3ZlZC4gCisJCSAqKi8KKwkJcHVibGljIGZ1bmN0aW9uIGdldCB0YWJsZSgpOlRhYmxlRWxlbWVudCB7CisJCQkKKwkJCWlmIChfdGFibGUpIHJldHVybiBfdGFibGU7CisJCQkKKwkJCS8vIGZpbmQgdGhlIHJvb3QgZWxlbWVudCBlbnRyeSBhbmQgZWl0aGVyIHJldHVybiBudWxsIG9yIHRoZSBjb250YWluaW5nIHRleHRGbG93CisJCQl2YXIgZWxlbTpGbG93R3JvdXBFbGVtZW50ID0gdGhpczsKKwkJCQorCQkJd2hpbGUgKChlbGVtLnBhcmVudCkgIT0gbnVsbCAmJiAhKGVsZW0ucGFyZW50IGlzIFRhYmxlRWxlbWVudCkpIHsKKwkJCQllbGVtID0gZWxlbS5wYXJlbnQ7CisJCQl9CisJCQkKKwkJCV90YWJsZSA9IGVsZW0ucGFyZW50IGFzIFRhYmxlRWxlbWVudDsKKwkJCQorCQkJcmV0dXJuIF90YWJsZTsKKwkJfQorCQkKKwkJLyoqCisJCSAqIEBwcml2YXRlCisJCSAqKi8KKwkJcHVibGljIGZ1bmN0aW9uIHNldCB0YWJsZShlbGVtZW50OlRhYmxlRWxlbWVudCk6dm9pZCB7CisJCQlfdGFibGUgPSBlbGVtZW50OworCQl9CiAJfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KKwpkaWZmIC0tZ2l0IGEvdGV4dExheW91dC9zcmMvZmxhc2h4L3RleHRMYXlvdXQvZWxlbWVudHMvVGFibGVMZWFmRWxlbWVudC5hcyBiL3RleHRMYXlvdXQvc3JjL2ZsYXNoeC90ZXh0TGF5b3V0L2VsZW1lbnRzL1RhYmxlTGVhZkVsZW1lbnQuYXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZkZjYyOQotLS0gL2Rldi9udWxsCisrKyBiL3RleHRMYXlvdXQvc3JjL2ZsYXNoeC90ZXh0TGF5b3V0L2VsZW1lbnRzL1RhYmxlTGVhZkVsZW1lbnQuYXMKQEAgLTAsMCArMSwxMjUgQEAKK3BhY2thZ2UgZmxhc2h4LnRleHRMYXlvdXQuZWxlbWVudHMKK3sKKwlpbXBvcnQgZmxhc2gudGV4dC5lbmdpbmUuRWxlbWVudEZvcm1hdDsKKwlpbXBvcnQgZmxhc2gudGV4dC5lbmdpbmUuVGV4dEVsZW1lbnQ7CisJaW1wb3J0IGZsYXNoLnRleHQuZW5naW5lLlRleHRMaW5lOworCQorCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5jb21wb3NlLkJhc2VDb21wb3NlOworCWltcG9ydCBmbGFzaHgudGV4dExheW91dC5jb21wb3NlLklGbG93Q29tcG9zZXI7CisJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmNvbXBvc2UuSVNXRkNvbnRleHQ7CisJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmZvcm1hdHMuSVRleHRMYXlvdXRGb3JtYXQ7CisJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LnRsZl9pbnRlcm5hbDsKKwkKKwl1c2UgbmFtZXNwYWNlIHRsZl9pbnRlcm5hbDsKKwkKKwlwdWJsaWMgY2xhc3MgVGFibGVMZWFmRWxlbWVudCBleHRlbmRzIEZsb3dMZWFmRWxlbWVudAorCXsKKwkJcHJpdmF0ZSB2YXIgX3RhYmxlOlRhYmxlRWxlbWVudDsKKwkJcHVibGljIGZ1bmN0aW9uIFRhYmxlTGVhZkVsZW1lbnQodGFibGU6VGFibGVFbGVtZW50KQorCQl7CisJCQlzdXBlcigpOworCQkJX3RhYmxlID0gdGFibGU7CisJCX0KKworCQkvKiogQHByaXZhdGUgKi8KKwkJb3ZlcnJpZGUgdGxmX2ludGVybmFsIGZ1bmN0aW9uIGNyZWF0ZUNvbnRlbnRFbGVtZW50KCk6dm9pZAorCQl7CisJCQkvLyBub3Qgc3VyZSBpZiB0aGlzIG1ha2VzIHNlbnNlLi4uCisJCQlpZiAoX2Jsb2NrRWxlbWVudCkKKwkJCQlyZXR1cm47CisJCQkKKwkJCWNvbXB1dGVkRm9ybWF0OwkvLyBCRUZPUkUgY3JlYXRpbmcgdGhlIGVsZW1lbnQKKwkJCXZhciBmbG93Q29tcG9zZXI6SUZsb3dDb21wb3NlciA9IGdldFRleHRGbG93KCkuZmxvd0NvbXBvc2VyOworCQkJdmFyIHN3ZkNvbnRleHQ6SVNXRkNvbnRleHQgPSBmbG93Q29tcG9zZXIgJiYgZmxvd0NvbXBvc2VyLnN3ZkNvbnRleHQgPyBmbG93Q29tcG9zZXIuc3dmQ29udGV4dCA6IEJhc2VDb21wb3NlLmdsb2JhbFNXRkNvbnRleHQ7CisKKwkJCXZhciBmb3JtYXQ6RWxlbWVudEZvcm1hdCA9IEZsb3dMZWFmRWxlbWVudC5jb21wdXRlRWxlbWVudEZvcm1hdEhlbHBlciAoX3RhYmxlLmNvbXB1dGVkRm9ybWF0LCBfdGFibGUuZ2V0UGFyYWdyYXBoKCksIHN3ZkNvbnRleHQpIAorCQkJX2Jsb2NrRWxlbWVudCA9IG5ldyBUZXh0RWxlbWVudChfdGV4dCxmb3JtYXQpOworCQkJQ09ORklHOjpkZWJ1ZyB7IERlYnVnZ2luZy50cmFjZUZURUNhbGwoX2Jsb2NrRWxlbWVudCxudWxsLCJuZXcgVGV4dEVsZW1lbnQoKSIpOyB9CisJCQlDT05GSUc6OmRlYnVnIHsgRGVidWdnaW5nLnRyYWNlRlRFQXNzaWduKF9ibG9ja0VsZW1lbnQsICJ0ZXh0IiwgX3RleHQpOyB9CisJCQlzdXBlci5jcmVhdGVDb250ZW50RWxlbWVudCgpOworCisJCX0KKworCQkvKiogQHByaXZhdGUgKi8KKwkJb3ZlcnJpZGUgcHJvdGVjdGVkIGZ1bmN0aW9uIGdldCBhYnN0cmFjdCgpOkJvb2xlYW4KKwkJeyByZXR1cm4gZmFsc2U7IH0JCQorCQkKKwkJLyoqIEBwcml2YXRlICovCisJCXRsZl9pbnRlcm5hbCBvdmVycmlkZSBmdW5jdGlvbiBnZXQgZGVmYXVsdFR5cGVOYW1lKCk6U3RyaW5nCisJCXsgcmV0dXJuICJ0YWJsZSI7IH0KKwkJCisJCS8qKiBAcHJpdmF0ZSAqLworCQlwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gZ2V0IHRleHQoKTpTdHJpbmcKKwkJeworCQkJcmV0dXJuICJcdTAwMTYiOworCQl9CisJCQorCQkvKiogQHByaXZhdGUgKi8KKwkJcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIGdldFRleHQocmVsYXRpdmVTdGFydDppbnQ9MCwgcmVsYXRpdmVFbmQ6aW50PS0xLCBwYXJhZ3JhcGhTZXBhcmF0b3I6U3RyaW5nPSJcbiIpOlN0cmluZworCQl7CisJCQlyZXR1cm4gX3RhYmxlLmdldFRleHQocmVsYXRpdmVTdGFydCwgcmVsYXRpdmVFbmQsIHBhcmFncmFwaFNlcGFyYXRvcik7CisJCX0KKwkJCisJCS8qKiBAcHJpdmF0ZSAqLworCQl0bGZfaW50ZXJuYWwgb3ZlcnJpZGUgZnVuY3Rpb24gbm9ybWFsaXplUmFuZ2Uobm9ybWFsaXplU3RhcnQ6dWludCxub3JtYWxpemVFbmQ6dWludCk6dm9pZAorCQl7CisJCQkvLyBub3Qgc3VyZSB3aGF0IHRvIGRvIGhlcmUgKHNlZSBTcGFuRWxlbWVudCkuLi4KKwkJCXN1cGVyLm5vcm1hbGl6ZVJhbmdlKG5vcm1hbGl6ZVN0YXJ0LG5vcm1hbGl6ZUVuZCk7CisJCX0KKwkJCisJCS8qKiBAcHJpdmF0ZSAqLworCQl0bGZfaW50ZXJuYWwgb3ZlcnJpZGUgZnVuY3Rpb24gbWVyZ2VUb1ByZXZpb3VzSWZQb3NzaWJsZSgpOkJvb2xlYW4KKwkJeworCQkJLy8gbm90IHN1cmUgd2hhdCB0byBkbyBoZXJlIChzZWUgU3BhbkVsZW1lbnQpLi4uCisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJCisJCXB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBnZXROZXh0TGVhZihsaW1pdEVsZW1lbnQ6Rmxvd0dyb3VwRWxlbWVudD1udWxsKTpGbG93TGVhZkVsZW1lbnQKKwkJeworCQkJcmV0dXJuIF90YWJsZS5nZXROZXh0TGVhZkhlbHBlcihsaW1pdEVsZW1lbnQsdGhpcyk7CisJCX0KKwkJCisJCXB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBnZXRQcmV2aW91c0xlYWYobGltaXRFbGVtZW50OkZsb3dHcm91cEVsZW1lbnQ9bnVsbCk6Rmxvd0xlYWZFbGVtZW50CisJCXsKKwkJCXJldHVybiBfdGFibGUuZ2V0UHJldmlvdXNMZWFmSGVscGVyKGxpbWl0RWxlbWVudCx0aGlzKTsKKwkJfQorCQkvKiogQHByaXZhdGUgKi8KKwkJcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIGdldENoYXJBdFBvc2l0aW9uKHJlbGF0aXZlUG9zaXRpb246aW50KTpTdHJpbmcKKwkJeworCQkJcmV0dXJuIGdldFRleHQocmVsYXRpdmVQb3NpdGlvbixyZWxhdGl2ZVBvc2l0aW9uKTsKKwkJfQorCQlwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gZ2V0IGNvbXB1dGVkRm9ybWF0KCk6SVRleHRMYXlvdXRGb3JtYXQKKwkJeworCQkJcmV0dXJuIF90YWJsZS5jb21wdXRlZEZvcm1hdDsKKwkJfQorCQlwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gZ2V0IHRleHRMZW5ndGgoKTppbnQKKwkJeworCQkJcmV0dXJuIF90YWJsZS50ZXh0TGVuZ3RoOworCQl9CisJCXRsZl9pbnRlcm5hbCBvdmVycmlkZSBmdW5jdGlvbiB1cGRhdGVBZG9ybm1lbnRzKHRMaW5lOlRleHRMaW5lLCBibG9ja1Byb2dyZXNzaW9uOlN0cmluZyk6aW50CisJCXsKKwkJCXJldHVybiAwOworCQl9CisKKwkJb3ZlcnJpZGUgcHVibGljIGZ1bmN0aW9uIGdldCBwYXJlbnQoKTpGbG93R3JvdXBFbGVtZW50CisJCXsgCisJCQlyZXR1cm4gX3RhYmxlOyAKKwkJfQorCisJCW92ZXJyaWRlIHB1YmxpYyBmdW5jdGlvbiBnZXRUZXh0RmxvdygpOlRleHRGbG93CisJCXsKKwkJCXJldHVybiBfdGFibGUuZ2V0VGV4dEZsb3coKTsKKwkJfQorCQkKKwkJb3ZlcnJpZGUgcHVibGljIGZ1bmN0aW9uIGdldFBhcmFncmFwaCgpOlBhcmFncmFwaEVsZW1lbnQKKwkJeworCQkJcmV0dXJuIF90YWJsZS5nZXRQYXJhZ3JhcGgoKTsKKwkJfQorCQkKKwkJb3ZlcnJpZGUgcHVibGljIGZ1bmN0aW9uIGdldEVsZW1lbnRSZWxhdGl2ZVN0YXJ0KGFuY2VzdG9yRWxlbWVudDpGbG93RWxlbWVudCk6aW50CisJCXsKKwkJCXJldHVybiBfdGFibGUuZ2V0RWxlbWVudFJlbGF0aXZlU3RhcnQoYW5jZXN0b3JFbGVtZW50KTsKKwkJfQorCisJfQorfQpkaWZmIC0tZ2l0IGEvdGV4dExheW91dC9zcmMvZmxhc2h4L3RleHRMYXlvdXQvZWxlbWVudHMvVGFibGVSb3dFbGVtZW50LmFzIGIvdGV4dExheW91dC9zcmMvZmxhc2h4L3RleHRMYXlvdXQvZWxlbWVudHMvVGFibGVSb3dFbGVtZW50LmFzCmluZGV4IGRjYTkyZDMuLjBhMjNhYmMgMTAwNjQ0Ci0tLSBhL3RleHRMYXlvdXQvc3JjL2ZsYXNoeC90ZXh0TGF5b3V0L2VsZW1lbnRzL1RhYmxlUm93RWxlbWVudC5hcworKysgYi90ZXh0TGF5b3V0L3NyYy9mbGFzaHgvdGV4dExheW91dC9lbGVtZW50cy9UYWJsZVJvd0VsZW1lbnQuYXMKQEAgLTE4LDEzICsxOCwxOCBAQAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIHBhY2thZ2UgZmxhc2h4LnRleHRMYXlvdXQuZWxlbWVudHMKIHsKKwlpbXBvcnQgZmxhc2gudXRpbHMuZ2V0UXVhbGlmaWVkQ2xhc3NOYW1lOworCQogCWltcG9ydCBmbGFzaHgudGV4dExheW91dC50bGZfaW50ZXJuYWw7CisJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmVkaXQuRWRpdE1hbmFnZXI7CisJaW1wb3J0IGZsYXNoeC50ZXh0TGF5b3V0LmVkaXQuU2VsZWN0aW9uTWFuYWdlcjsKKwlpbXBvcnQgZmxhc2h4LnRleHRMYXlvdXQuZm9ybWF0cy5JVGV4dExheW91dEZvcm1hdDsKIAkKIAl1c2UgbmFtZXNwYWNlIHRsZl9pbnRlcm5hbDsKIAkKIAkvKiogCi0JICogPHA+IFRhYmxlUm93RWxlbWVudCBpcyBhbiBpdGVtIGluIGEgVGFibGVFbGVtZW50LiBJdCBtb3N0IGNvbW1vbmx5IGNvbnRhaW5zIG9uZSBvciBtb3JlIFRhYmxlRGF0YUNlbGxFbGVtZW50IG9iamVjdHMsIAotCSAqIEEgVGFibGVSb3dFbGVtZW50IGFsd2F5cyBhcHBlYXJzIHdpdGhpbiBhIFRhYmxlRWxlbWVudCwgVGFibGVCb2R5RWxlbWVudC48L3A+CisJICogVGFibGVSb3dFbGVtZW50IGlzIGFuIGl0ZW0gaW4gYSBUYWJsZUVsZW1lbnQuIEl0IG1vc3QgY29tbW9ubHkgY29udGFpbnMgb25lIG9yIG1vcmUgVGFibGVDZWxsRWxlbWVudCBvYmplY3RzLCAKKwkgKiBBIFRhYmxlUm93RWxlbWVudCBhbHdheXMgYXBwZWFycyB3aXRoaW4gYSBUYWJsZUVsZW1lbnQsIFRhYmxlQm9keUVsZW1lbnQuCiAJICoKIAkgKiAKIAkgKiBAcGxheWVydmVyc2lvbiBGbGFzaCAxMApAQCAtMzIsNyArMzcsNyBAQAogCSAqIEBsYW5ndmVyc2lvbiAzLjAKIAkgKgogCSAqLwotCXB1YmxpYyBmaW5hbCBjbGFzcyBUYWJsZVJvd0VsZW1lbnQgZXh0ZW5kcyBUYWJsZUZvcm1hdHRlZEVsZW1lbnQKKwlwdWJsaWMgY2xhc3MgVGFibGVSb3dFbGVtZW50IGV4dGVuZHMgVGFibGVGb3JtYXR0ZWRFbGVtZW50CiAJewkJCiAJCXB1YmxpYyB2YXIgeDpOdW1iZXI7CiAJCXB1YmxpYyB2YXIgeTpOdW1iZXI7CkBAIC00NSw2ICs1MCwxOSBAQAogCQlwdWJsaWMgdmFyIGNvbHVtbkluZGV4Ok51bWJlciA9IDA7CiAJCXB1YmxpYyB2YXIgaU1heFJvd0RlcHRoOk51bWJlciA9IDA7CiAJCXB1YmxpYyB2YXIgYmV5b25kUGFyY2VsOkJvb2xlYW4gPSBmYWxzZTsKKwkJcHVibGljIHZhciBjb21wb3NlZEhlaWdodDpOdW1iZXIgPSAwOworCQlwdWJsaWMgdmFyIHRvdGFsSGVpZ2h0Ok51bWJlciA9IDA7Ly8gdXNlZCB0byBjb21wdXRlIGlmIGEgcm93IHdpbGwgZml0IGluIHBhcmNlbC4gTmVlZCBhIHNlcGFyYXRlIHZhbHVlIGZvciBjZWxscyB0aGF0IHNwYW4gcm93cy4KKwkJcHVibGljIHZhciBpc01heEhlaWdodDpCb29sZWFuID0gZmFsc2U7CisJCQorCQlwdWJsaWMgZnVuY3Rpb24gVGFibGVSb3dFbGVtZW50KGZvcm1hdDpJVGV4dExheW91dEZvcm1hdD1udWxsKQorCQl7CisJCQlzdXBlcigpOworCQkJCisJCQlpZiAoZm9ybWF0KSB7CisJCQkJdGhpcy5mb3JtYXQgPSBmb3JtYXQ7CisJCQl9CisJCX0KKwogCQkKIAkJLyoqIEBwcml2YXRlICovCiAJCW92ZXJyaWRlIHByb3RlY3RlZCBmdW5jdGlvbiBnZXQgYWJzdHJhY3QoKTpCb29sZWFuCkBAIC01Nyw3ICs3NSw3IEBACiAJCS8qKiBAcHJpdmF0ZSAqLwogCQl0bGZfaW50ZXJuYWwgb3ZlcnJpZGUgZnVuY3Rpb24gY2FuT3duRmxvd0VsZW1lbnQoZWxlbTpGbG93RWxlbWVudCk6Qm9vbGVhbgogCQl7Ci0JCQlyZXR1cm4gKGVsZW0gaXMgVGFibGVEYXRhQ2VsbEVsZW1lbnQpOworCQkJcmV0dXJuIChlbGVtIGlzIFRhYmxlQ2VsbEVsZW1lbnQpOwogCQl9CiAJCQogCQkvKiogQHByaXZhdGUgaWYgaXRzIGluIGEgbnVtYmVyZWQgbGlzdCBleHBhbmQgdGhlIGRhbWFnZSB0byBhbGwgbGlzdCBpdGVtcyAtIGNhdXNlcyB0aGUgbnVtYmVycyB0byBiZSByZWdlbmVyYXRlZCAqLwpAQCAtNjUsNiArODMsMTAyIEBACiAJCXsKIAkJCXN1cGVyLm1vZGVsQ2hhbmdlZChjaGFuZ2VUeXBlLGVsZW0sY2hhbmdlU3RhcnQsY2hhbmdlTGVuLG5lZWROb3JtYWxpemUsYnVtcEdlbmVyYXRpb24pOwogCQl9CisJCQorCQkvKioKKwkJICogUmV0dXJucyBhIHZlY3RvciBvZiB0YWJsZSBjZWxsIGVsZW1lbnRzIG9yIG51bGwgaWYgdGhlIHJvdyBjb250YWlucyBubyBjZWxscworCQkgKiovCisJCXB1YmxpYyBmdW5jdGlvbiBnZXRDZWxscygpOlZlY3Rvci48VGFibGVDZWxsRWxlbWVudD4KKwkJeworCQkJdmFyIHRhYmxlOlRhYmxlRWxlbWVudCA9IGdldFRhYmxlKCk7CisJCQkKKwkJCWlmKCF0YWJsZSkgeworCQkJCXJldHVybiBudWxsOworCQkJfQorCQkJCisJCQlyZXR1cm4gdGFibGUuZ2V0Q2VsbHNGb3JSb3codGhpcyk7CisJCX0KKwkJCisJCS8qKgorCQkgKiBHZXQgYW4gYXJyYXkgb2YgY2VsbHMgb3IgbnVsbCBpZiB0aGUgcm93IGNvbnRhaW5zIG5vIGNlbGxzCisJCSAqKi8KKwkJcHVibGljIGZ1bmN0aW9uIGdldCBjZWxscygpOkFycmF5CisJCXsKKwkJCXZhciB0YWJsZTpUYWJsZUVsZW1lbnQgPSBnZXRUYWJsZSgpOworCQkJCisJCQlpZiAoIXRhYmxlKSB7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisJCQkKKwkJCXJldHVybiB0YWJsZS5nZXRDZWxsc0ZvclJvd0FycmF5KHRoaXMpOworCQl9CisJCQorCQkvKioKKwkJICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNlbGxzIGluIHRoaXMgcm93LiAKKwkJICoqLworCQlwdWJsaWMgZnVuY3Rpb24gZ2V0IG51bUNlbGxzKCk6aW50CisJCXsKKwkJCXZhciB0YWJsZTpUYWJsZUVsZW1lbnQgPSBnZXRUYWJsZSgpOworCQkJCisJCQlpZiAoIXRhYmxlKSB7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQkKKwkJCXJldHVybiB0YWJsZS5nZXRDZWxsc0ZvclJvdyh0aGlzKS5sZW5ndGg7CisJCX0KKwkJCisJCS8qKgorCQkgKiBSZXR1cm5zIHRoZSBjZWxsIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggb3IgbnVsbCBpZiBvdXQgb2YgcmFuZ2UuIAorCQkgKiovCisJCXB1YmxpYyBmdW5jdGlvbiBnZXRDZWxsQXQoaW5kZXg6aW50KTpUYWJsZUNlbGxFbGVtZW50CisJCXsKKwkJCXZhciBjZWxsczpWZWN0b3IuPFRhYmxlQ2VsbEVsZW1lbnQ+ID0gZ2V0Q2VsbHMoKTsKKwkJCQorCQkJaWYoIWNlbGxzIHx8IGluZGV4PDAgfHwgaW5kZXg+PWNlbGxzLmxlbmd0aCkKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCXJldHVybiBjZWxsc1tpbmRleF07CisJCX0KKwkJCisJCS8qKgorCQkgKiBBZGRzIGEgdGFibGUgY2VsbCB0byB0aGUgcm93CisJCSAqKi8KKwkJcHVibGljIGZ1bmN0aW9uIGFkZENlbGwoY2VsbDpUYWJsZUNlbGxFbGVtZW50KTpUYWJsZUNlbGxFbGVtZW50CisJCXsKKwkJCXZhciB0YWJsZTpUYWJsZUVsZW1lbnQgPSBnZXRUYWJsZSgpOworCQkJdmFyIGNlbGxMZW5ndGg6aW50ID0gbnVtQ2hpbGRyZW47CisJCQkKKwkJCWlmICghdGFibGUpIHsKKwkJCQl0aHJvdyBuZXcgRXJyb3IoIlRhYmxlIG11c3QgYmUgc2V0Iik7CisJCQl9CisJCQkKKwkJCWNlbGwucm93SW5kZXggPSByb3dJbmRleDsKKwkJCQorCQkJaWYgKGNlbGwuY29sSW5kZXg9PS0xKSB7CisJCQkJY2VsbC5jb2xJbmRleCA9IGNlbGxMZW5ndGg7CisJCQl9CisJCQkKKwkJCWNlbGxzLnB1c2goY2VsbCk7CisJCQkvL3ZhciBzZWxlY3RhYmxlOkJvb2xlYW4gPSB0ZXh0Rmxvdy5pbnRlcmFjdGlvbk1hbmFnZXIgaXMgU2VsZWN0aW9uTWFuYWdlcjsKKwkJCS8vdmFyIGVkaXRhYmxlOkJvb2xlYW4gPSB0ZXh0Rmxvdy5pbnRlcmFjdGlvbk1hbmFnZXIgaXMgRWRpdE1hbmFnZXI7CisJCQkKKwkJCXJldHVybiBjZWxsOworCQl9CisJCQorCQkvKioKKwkJICogQWRkcyBhIHRhYmxlIGNlbGwgdG8gdGhlIHJvdworCQkgKiovCisJCXB1YmxpYyBmdW5jdGlvbiBhZGRDZWxsQXQoaW5kZXg6aW50KTpUYWJsZUNlbGxFbGVtZW50CisJCXsKKwkJCXRocm93IG5ldyBFcnJvcigiQWRkIGNlbGwgYXQgaXMgbm90IGltcGxlbWVudGVkIik7CisJCX0KKwkJCisJCS8qKgorCQkgKiBHZXQgYW4gZXN0aW1hdGUgY29sdW1uIGNvdW50IGZvciB0aGlzIHJvdy4KKwkJICogVGhpcyBpcyB0ZW1wb3JhcnkuIFRPRE8gbG9vcCB0aHJvdWdoIGNlbGxzIGFuZCBjaGVjayBmb3IgY29sdW1uIHNwYW4uCisJCSAqKi8KKwkJcHVibGljIGZ1bmN0aW9uIGdldENvbHVtbkNvdW50KCk6aW50CisJCXsKKwkJCXJldHVybiBudW1DZWxscyB8fCBudW1DaGlsZHJlbjsKKwkJfQogCiAJfQogfQpkaWZmIC0tZ2l0IGEvdGV4dExheW91dC9zcmMvZmxhc2h4L3RleHRMYXlvdXQvZWxlbWVudHMvVGV4dEZsb3cuYXMgYi90ZXh0TGF5b3V0L3NyYy9mbGFzaHgvdGV4dExheW91dC9lbGVtZW50cy9UZXh0Rmxvdy5hcwppbmRleCBhMjQ4NjY1Li42Y2NmNTc2IDEwMDY0NAotLS0gYS90ZXh0TGF5b3V0L3NyYy9mbGFzaHgvdGV4dExheW91dC9lbGVtZW50cy9UZXh0Rmxvdy5hcworKysgYi90ZXh0TGF5b3V0L3NyYy9mbGFzaHgvdGV4dExheW91dC9lbGVtZW50cy9UZXh0Rmxvdy5hcwpAQCAtMjg0LDYgKzI4NCw5IEBACiAJCQogCQkvLyBJTEcgY291bnQKIAkJcHJpdmF0ZSB2YXIgX2dyYXBoaWNPYmplY3RDb3VudDppbnQ7CisJCQorCQkvLyBuZXN0ZWQgVGV4dEZsb3cgc3VwcG9ydAorCQlwcml2YXRlIHZhciBfcGFyZW50RWxlbWVudDpGbG93R3JvdXBFbGVtZW50OwogCQkJCQogCQkvKiogCiAJCSAqIENvbnN0cnVjdG9yIC0gY3JlYXRlcyBhIG5ldyBUZXh0RmxvdyBpbnN0YW5jZS4KQEAgLTExODAsNiArMTE4MywyOSBAQAogCQkJCV9mb3JtYXRSZXNvbHZlci5pbnZhbGlkYXRlQWxsKHRoaXMpOwogCQkJZm9ybWF0Q2hhbmdlZCh0cnVlKTsKIAkJfQorCisJCS8qKiBUaGUgcGFyZW50IGVsZW1lbnQgaXMgdGhlIGVsZW1lbnQgdGhhdCB0aGUgVGV4dEZsb3cgaXMgbmVzdGVkIGluc2lkZSAoc3VjaCBhcyBhIFRhYmxlQ2VsbEVsZW1lbnQpLgorCQkgKiBUaGlzIHByb3BlcnR5IGlzIGZvciBzdXBwb3J0IG9mIG5lc3RlZCBUZXh0Rmxvd3MgdG8gaGFuZGxlIHRoaW5ncyBsaWtlIHNlbGVjdGlvbiBhbmQgZWRpdGluZy4KKwkJICogCisJCSAqIEBwbGF5ZXJ2ZXJzaW9uIEZsYXNoIDEwCisJCSAqIEBwbGF5ZXJ2ZXJzaW9uIEFJUiAxLjUKKwkJICogQGxhbmd2ZXJzaW9uIDMuMAorCQkgKiAKKwkJICovCQkKKwkJcHVibGljIGZ1bmN0aW9uIGdldCBwYXJlbnRFbGVtZW50KCk6Rmxvd0dyb3VwRWxlbWVudA0KKwkJeworCQkJcmV0dXJuIF9wYXJlbnRFbGVtZW50OworCQl9CisKKwkJcHVibGljIGZ1bmN0aW9uIHNldCBwYXJlbnRFbGVtZW50KHZhbHVlOkZsb3dHcm91cEVsZW1lbnQpOnZvaWQNCisJCXsKKwkJCV9wYXJlbnRFbGVtZW50ID0gdmFsdWU7CisJCX0KKwkJCisJCXB1YmxpYyBmdW5jdGlvbiBuZXN0ZWRJblRhYmxlKCk6Qm9vbGVhbnsKKwkJCXJldHVybiBwYXJlbnRFbGVtZW50ICYmIHBhcmVudEVsZW1lbnQgaXMgVGFibGVDZWxsRWxlbWVudDsKKwkJfQorCiAJfSAvLyBlbmQgVGV4dEZsb3cgY2xhc3MKIH0KIGltcG9ydCBmbGFzaC51dGlscy5EaWN0aW9uYXJ5OwpkaWZmIC0tZ2l0IGEvdGV4dExheW91dC9zcmMvZmxhc2h4L3RleHRMYXlvdXQvZmFjdG9yeS9TdHJpbmdUZXh0TGluZUZhY3RvcnkuYXMgYi90ZXh0TGF5b3V0L3NyYy9mbGFzaHgvdGV4dExheW91dC9mYWN0b3J5L1N0cmluZ1RleHRMaW5lRmFjdG9yeS5hcwppbmRleCAzNTVlNmM1Li43MDc0ZjVjIDEwMDY0NAotLS0gYS90ZXh0TGF5b3V0L3NyYy9mbGFzaHgvdGV4dExheW91dC9mYWN0b3J5L1N0cmluZ1RleHRMaW5lRmFjdG9yeS5hcworKysgYi90ZXh0TGF5b3V0L3NyYy9mbGFzaHgvdGV4dExheW91dC9mYWN0b3J5L1N0cmluZ1RleHRMaW5lRmFjdG9yeS5hcwpAQCAtNDYzLDcgKzQ2Myw3IEBACiAJCQkJY2hhclBvc2l0aW9uID0gbGluZS5nZXRBdG9tVGV4dEJsb2NrRW5kSW5kZXgoYXRvbUluZGV4KTsKIAkJCX0KIAkJCQotCQkJbGluZS5mbHVzaEF0b21EYXRhKCk7CisJCQkvLyBsaW5lLmZsdXNoQXRvbURhdGEoKTsgLy8gV2FybmluZzogTm93IGRvZXMgbm90aGluZwogCQkJcmV0dXJuIGNoYXJQb3NpdGlvbjsKIAkJfQogCQkKZGlmZiAtLWdpdCBhL3RleHRMYXlvdXQvc3JjL2ZsYXNoeC90ZXh0TGF5b3V0L2ZhY3RvcnkvVGV4dExpbmVGYWN0b3J5QmFzZS5hcyBiL3RleHRMYXlvdXQvc3JjL2ZsYXNoeC90ZXh0TGF5b3V0L2ZhY3RvcnkvVGV4dExpbmVGYWN0b3J5QmFzZS5hcwppbmRleCBjNTk5OTliLi44MDkyY2Q1IDEwMDY0NAotLS0gYS90ZXh0TGF5b3V0L3NyYy9mbGFzaHgvdGV4dExheW91dC9mYWN0b3J5L1RleHRMaW5lRmFjdG9yeUJhc2UuYXMKKysrIGIvdGV4dExheW91dC9zcmMvZmxhc2h4L3RleHRMYXlvdXQvZmFjdG9yeS9UZXh0TGluZUZhY3RvcnlCYXNlLmFzCkBAIC0zOTMsNyArMzkzLDcgQEAKIAkJCS8vIDQuIEdldCB0aGUgY2hhciBpbmRleCBmb3IgdGhpcyBhdG9tIGluZGV4CiAJCQl2YXIgbmV4dFRydW5jYXRpb25Qb3NpdGlvbjppbnQgPSBsaW5lLmdldEF0b21UZXh0QmxvY2tCZWdpbkluZGV4KGF0b21JbmRleCkgKyBwYXJhU3RhcnQ7CiAJCQkKLQkJCWxpbmUuZmx1c2hBdG9tRGF0YSgpOworCQkJLy9saW5lLmZsdXNoQXRvbURhdGEoKTsgLy8gV2FybmluZzogTm93IGRvZXMgbm90aGluZwogCQkJCiAJCQlyZXR1cm4gbmV4dFRydW5jYXRpb25Qb3NpdGlvbjsKIAkJfSAKZGlmZiAtLWdpdCBhL3RleHRMYXlvdXQvc3JjL2ZsYXNoeC90ZXh0TGF5b3V0L2Zvcm1hdHMvSVRleHRMYXlvdXRGb3JtYXQuYXMgYi90ZXh0TGF5b3V0L3NyYy9mbGFzaHgvdGV4dExheW91dC9mb3JtYXRzL0lUZXh0TGF5b3V0Rm9ybWF0LmFzCmluZGV4IGUyNWI2ODMuLjhlMzA5OWQgMTAwNjQ0Ci0tLSBhL3RleHRMYXlvdXQvc3JjL2ZsYXNoeC90ZXh0TGF5b3V0L2Zvcm1hdHMvSVRleHRMYXlvdXRGb3JtYXQuYXMKKysrIGIvdGV4dExheW91dC9zcmMvZmxhc2h4L3RleHRMYXlvdXQvZm9ybWF0cy9JVGV4dExheW91dEZvcm1hdC5hcwpAQCAtMTE2MSw2ICsxMTYxLDYyIEBACiAJCWZ1bmN0aW9uIGdldCBib3JkZXJCb3R0b21Db2xvcigpOio7CiAKIAkJLyoqCisJCSAqIFNwZWNpZmllcyB0aGUgcHJpb3JpdHkgd2hlbiBkcmF3aW5nIGNlbGwgYm91bmRhcmllcy4gV2hlbiBzZXR0aW5ncyBiZXR3ZWVuIHR3byBhZGphY2VudCBjZWxscyBjb25mbGljdCwgdGhlIGJvcmRlciB3aXRoIHRoZSBoaWdoZXIgcHJpb3JpdHkgd2lucy4gSWYgdGhlIHByaW9yaXRpZXMgYXJlIGVxdWFsLCB0aGUgbGF0dGVyIG9mIHRoZSB0d28gY2VsbHMgdGFrZXMgcHJpb3JpdHkuCisJCSAqIDxwPkxlZ2FsIHZhbHVlcyBhcmUgYW55IHJhdGlvbmFsIG51bWJlci4gQ29uZmxpY3RzIGFyZSByZXNvbHZlZCB3aXRoIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBoaWdoZXIgbnVtYmVyIGJlaW5nIGRyYXduLjwvcD4KKwkJICogPHA+RGVmYXVsdCB2YWx1ZSBpcyB1bmRlZmluZWQgaW5kaWNhdGluZyBub3Qgc2V0LjwvcD4KKwkJICogPHA+SWYgdW5kZWZpbmVkIGR1cmluZyB0aGUgY2FzY2FkZSB0aGlzIHByb3BlcnR5IHdpbGwgaW5oZXJpdCwgYW5kIGRlZmF1bHQgdG8gMC48L3A+CisJCSAqIAorCQkgKiBAdGhyb3dzIFJhbmdlRXJyb3Igd2hlbiBzZXQgdmFsdWUgaXMgbm90IHdpdGhpbiByYW5nZSBmb3IgdGhpcyBwcm9wZXJ0eQorCQkgKiAKKwkJICogQHBsYXllcnZlcnNpb24gRmxhc2ggMTAKKwkJICogQHBsYXllcnZlcnNpb24gQUlSIDEuNQorCQkgKiBAbGFuZ3ZlcnNpb24gMy4wCisJCSAqLworCQlmdW5jdGlvbiBnZXQgYm9yZGVyTGVmdFByaW9yaXR5KCk6KjsKKwkJCisJCS8qKgorCQkgKiBTcGVjaWZpZXMgdGhlIHByaW9yaXR5IHdoZW4gZHJhd2luZyBjZWxsIGJvdW5kYXJpZXMuIFdoZW4gc2V0dGluZ3MgYmV0d2VlbiB0d28gYWRqYWNlbnQgY2VsbHMgY29uZmxpY3QsIHRoZSBib3JkZXIgd2l0aCB0aGUgaGlnaGVyIHByaW9yaXR5IHdpbnMuIElmIHRoZSBwcmlvcml0aWVzIGFyZSBlcXVhbCwgdGhlIGxhdHRlciBvZiB0aGUgdHdvIGNlbGxzIHRha2VzIHByaW9yaXR5LgorCQkgKiA8cD5MZWdhbCB2YWx1ZXMgYXJlIGFueSByYXRpb25hbCBudW1iZXIuIENvbmZsaWN0cyBhcmUgcmVzb2x2ZWQgd2l0aCB0aGUgcHJvcGVydGllcyBvZiB0aGUgaGlnaGVyIG51bWJlciBiZWluZyBkcmF3bi48L3A+CisJCSAqIDxwPkRlZmF1bHQgdmFsdWUgaXMgdW5kZWZpbmVkIGluZGljYXRpbmcgbm90IHNldC48L3A+CisJCSAqIDxwPklmIHVuZGVmaW5lZCBkdXJpbmcgdGhlIGNhc2NhZGUgdGhpcyBwcm9wZXJ0eSB3aWxsIGluaGVyaXQsIGFuZCBkZWZhdWx0IHRvIDAuPC9wPgorCQkgKiAKKwkJICogQHRocm93cyBSYW5nZUVycm9yIHdoZW4gc2V0IHZhbHVlIGlzIG5vdCB3aXRoaW4gcmFuZ2UgZm9yIHRoaXMgcHJvcGVydHkKKwkJICogCisJCSAqIEBwbGF5ZXJ2ZXJzaW9uIEZsYXNoIDEwCisJCSAqIEBwbGF5ZXJ2ZXJzaW9uIEFJUiAxLjUKKwkJICogQGxhbmd2ZXJzaW9uIDMuMAorCQkgKi8KKwkJZnVuY3Rpb24gZ2V0IGJvcmRlclJpZ2h0UHJpb3JpdHkoKToqOworCQkKKwkJLyoqCisJCSAqIFNwZWNpZmllcyB0aGUgcHJpb3JpdHkgd2hlbiBkcmF3aW5nIGNlbGwgYm91bmRhcmllcy4gV2hlbiBzZXR0aW5ncyBiZXR3ZWVuIHR3byBhZGphY2VudCBjZWxscyBjb25mbGljdCwgdGhlIGJvcmRlciB3aXRoIHRoZSBoaWdoZXIgcHJpb3JpdHkgd2lucy4gSWYgdGhlIHByaW9yaXRpZXMgYXJlIGVxdWFsLCB0aGUgbGF0dGVyIG9mIHRoZSB0d28gY2VsbHMgdGFrZXMgcHJpb3JpdHkuCisJCSAqIDxwPkxlZ2FsIHZhbHVlcyBhcmUgYW55IHJhdGlvbmFsIG51bWJlci4gQ29uZmxpY3RzIGFyZSByZXNvbHZlZCB3aXRoIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBoaWdoZXIgbnVtYmVyIGJlaW5nIGRyYXduLjwvcD4KKwkJICogPHA+RGVmYXVsdCB2YWx1ZSBpcyB1bmRlZmluZWQgaW5kaWNhdGluZyBub3Qgc2V0LjwvcD4KKwkJICogPHA+SWYgdW5kZWZpbmVkIGR1cmluZyB0aGUgY2FzY2FkZSB0aGlzIHByb3BlcnR5IHdpbGwgaW5oZXJpdCwgYW5kIGRlZmF1bHQgdG8gMC48L3A+CisJCSAqIAorCQkgKiBAdGhyb3dzIFJhbmdlRXJyb3Igd2hlbiBzZXQgdmFsdWUgaXMgbm90IHdpdGhpbiByYW5nZSBmb3IgdGhpcyBwcm9wZXJ0eQorCQkgKiAKKwkJICogQHBsYXllcnZlcnNpb24gRmxhc2ggMTAKKwkJICogQHBsYXllcnZlcnNpb24gQUlSIDEuNQorCQkgKiBAbGFuZ3ZlcnNpb24gMy4wCisJCSAqLworCQlmdW5jdGlvbiBnZXQgYm9yZGVyVG9wUHJpb3JpdHkoKToqOworCQkKKwkJLyoqCisJCSAqIFNwZWNpZmllcyB0aGUgcHJpb3JpdHkgd2hlbiBkcmF3aW5nIGNlbGwgYm91bmRhcmllcy4gV2hlbiBzZXR0aW5ncyBiZXR3ZWVuIHR3byBhZGphY2VudCBjZWxscyBjb25mbGljdCwgdGhlIGJvcmRlciB3aXRoIHRoZSBoaWdoZXIgcHJpb3JpdHkgd2lucy4gSWYgdGhlIHByaW9yaXRpZXMgYXJlIGVxdWFsLCB0aGUgbGF0dGVyIG9mIHRoZSB0d28gY2VsbHMgdGFrZXMgcHJpb3JpdHkuCisJCSAqIDxwPkxlZ2FsIHZhbHVlcyBhcmUgYW55IHJhdGlvbmFsIG51bWJlci4gQ29uZmxpY3RzIGFyZSByZXNvbHZlZCB3aXRoIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBoaWdoZXIgbnVtYmVyIGJlaW5nIGRyYXduLjwvcD4KKwkJICogPHA+RGVmYXVsdCB2YWx1ZSBpcyB1bmRlZmluZWQgaW5kaWNhdGluZyBub3Qgc2V0LjwvcD4KKwkJICogPHA+SWYgdW5kZWZpbmVkIGR1cmluZyB0aGUgY2FzY2FkZSB0aGlzIHByb3BlcnR5IHdpbGwgaW5oZXJpdCwgYW5kIGRlZmF1bHQgdG8gMC48L3A+CisJCSAqIAorCQkgKiBAdGhyb3dzIFJhbmdlRXJyb3Igd2hlbiBzZXQgdmFsdWUgaXMgbm90IHdpdGhpbiByYW5nZSBmb3IgdGhpcyBwcm9wZXJ0eQorCQkgKiAKKwkJICogQHBsYXllcnZlcnNpb24gRmxhc2ggMTAKKwkJICogQHBsYXllcnZlcnNpb24gQUlSIDEuNQorCQkgKiBAbGFuZ3ZlcnNpb24gMy4wCisJCSAqLworCQlmdW5jdGlvbiBnZXQgYm9yZGVyQm90dG9tUHJpb3JpdHkoKToqOworCisJCS8qKgogCQkgKiBsZWZ0IG1hcmdpbiBpbiBwaXhlbHMoYWRvcHRzIGRlZmF1bHQgdmFsdWUgaWYgdW5kZWZpbmVkIGR1cmluZyBjYXNjYWRlKS4KIAkJICogPHA+TGVnYWwgdmFsdWVzIGFyZSBudW1iZXJzIGZyb20gLTgwMDAgdG8gODAwMCBhbmQgRm9ybWF0VmFsdWUuSU5IRVJJVC48L3A+CiAJCSAqIDxwPkRlZmF1bHQgdmFsdWUgaXMgdW5kZWZpbmVkIGluZGljYXRpbmcgbm90IHNldC48L3A+CkBAIC0xMjQ1LDcgKzEzMDEsNyBAQAogCQkgKiBAbGFuZ3ZlcnNpb24gMy4wCiAJCSAqLwogCQlmdW5jdGlvbiBnZXQgY2VsbFBhZGRpbmcoKToqOwotCisJCQogCQkvKioKIAkJICogV2lkdGggb2YgdGFibGUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIGRlc2lyZWQgd2lkdGggb2YgdGhlIGVudGlyZSB0YWJsZSBhbmQgaXMgaW50ZW5kZWQgZm9yIHZpc3VhbCB1c2VyIGFnZW50cy4gV2hlbiB0aGUgdmFsdWUgaXMgYSBwZXJjZW50YWdlIHZhbHVlLCB0aGUgdmFsdWUgaXMgcmVsYXRpdmUgdG8gdGhlIHVzZXIgYWdlbnQncyBhdmFpbGFibGUgaG9yaXpvbnRhbCBzcGFjZS4KIAkJICogPHA+TGVnYWwgdmFsdWVzIGFzIGEgbnVtYmVyIGFyZSBmcm9tIDAgdG8gODAwMC48L3A+CkBAIC0xMjc3LDYgKzEzMzMsMzYgQEAKIAkJICogQGxhbmd2ZXJzaW9uIDMuMAogCQkgKi8KIAkJZnVuY3Rpb24gZ2V0IHRhYmxlQ29sdW1uV2lkdGgoKToqOworCQkKKwkJLyoqCisJCSAqIE1pbmltdW0gaGVpZ2h0IG9mIGEgdGFibGUgY2VsbC4gSWYgdGhlcmUgaXMgbm8gbWF4aW11bSwgdGhlIGNlbGwgd2lsbCBncm93IGluIGhlaWdodCB0byBmaXQgdGhlIGNvbnRlbnQuIE1pbmltdW0gYW5kIG1heGltdW0gb2YgdGhlIHNhbWUgdmFsdWVzIHdpbGwgZ2l2ZSB0aGUgY2VsbCBhIGZpeGVkIGhlaWdodC4KKwkJICogPHA+TGVnYWwgdmFsdWVzIGFzIGEgbnVtYmVyIGFyZSBmcm9tIDIgdG8gMTAwMDAuPC9wPgorCQkgKiA8cD5MZWdhbCB2YWx1ZXMgaW5jbHVkZSBGb3JtYXRWYWx1ZS5JTkhFUklULjwvcD4KKwkJICogPHA+RGVmYXVsdCB2YWx1ZSBpcyB1bmRlZmluZWQgaW5kaWNhdGluZyBub3Qgc2V0LjwvcD4KKwkJICogPHA+SWYgdW5kZWZpbmVkIGR1cmluZyB0aGUgY2FzY2FkZSB0aGlzIHByb3BlcnR5IHdpbGwgaGF2ZSBhIHZhbHVlIG9mIDIuPC9wPgorCQkgKiAKKwkJICogQHRocm93cyBSYW5nZUVycm9yIHdoZW4gc2V0IHZhbHVlIGlzIG5vdCB3aXRoaW4gcmFuZ2UgZm9yIHRoaXMgcHJvcGVydHkKKwkJICogCisJCSAqIEBwbGF5ZXJ2ZXJzaW9uIEZsYXNoIDEwCisJCSAqIEBwbGF5ZXJ2ZXJzaW9uIEFJUiAxLjUKKwkJICogQGxhbmd2ZXJzaW9uIDMuMAorCQkgKi8KKwkJZnVuY3Rpb24gZ2V0IG1pbkNlbGxIZWlnaHQoKToqOworCQkKKwkJLyoqCisJCSAqIE1heGltdW0gaGVpZ2h0IG9mIGEgdGFibGUgY2VsbC4gSWYgdGhlcmUgaXMgbm8gbWF4aW11bSwgdGhlIGNlbGwgd2lsbCBncm93IGluIGhlaWdodCB0byBmaXQgdGhlIGNvbnRlbnQuIE1pbmltdW0gYW5kIG1heGltdW0gb2YgdGhlIHNhbWUgdmFsdWVzIHdpbGwgZ2l2ZSB0aGUgY2VsbCBhIGZpeGVkIGhlaWdodC4KKwkJICogPHA+TGVnYWwgdmFsdWVzIGFzIGEgbnVtYmVyIGFyZSBmcm9tIDIgdG8gMTAwMDAuPC9wPgorCQkgKiA8cD5MZWdhbCB2YWx1ZXMgaW5jbHVkZSBGb3JtYXRWYWx1ZS5JTkhFUklULjwvcD4KKwkJICogPHA+RGVmYXVsdCB2YWx1ZSBpcyB1bmRlZmluZWQgaW5kaWNhdGluZyBub3Qgc2V0LjwvcD4KKwkJICogPHA+SWYgdW5kZWZpbmVkIGR1cmluZyB0aGUgY2FzY2FkZSB0aGlzIHByb3BlcnR5IHdpbGwgaGF2ZSBhIHZhbHVlIG9mIDIuPC9wPgorCQkgKiAKKwkJICogQHRocm93cyBSYW5nZUVycm9yIHdoZW4gc2V0IHZhbHVlIGlzIG5vdCB3aXRoaW4gcmFuZ2UgZm9yIHRoaXMgcHJvcGVydHkKKwkJICogCisJCSAqIEBwbGF5ZXJ2ZXJzaW9uIEZsYXNoIDEwCisJCSAqIEBwbGF5ZXJ2ZXJzaW9uIEFJUiAxLjUKKwkJICogQGxhbmd2ZXJzaW9uIDMuMAorCQkgKi8KKwkJZnVuY3Rpb24gZ2V0IG1heENlbGxIZWlnaHQoKToqOwogCiAJCS8qKgogCQkgKiBmcmFtZSBzcGVjaWZpZXMgd2hpY2ggc2lkZXMgb2YgdGhlIGZyYW1lIHN1cnJvdW5kaW5nIGEgdGFibGUgd2lsbCBiZSB2aXNpYmxlLiBQb3NzaWJsZSB2YWx1ZXM6CmRpZmYgLS1naXQgYS90ZXh0TGF5b3V0L3NyYy9mbGFzaHgvdGV4dExheW91dC9mb3JtYXRzL1RleHRMYXlvdXRGb3JtYXQuYXMgYi90ZXh0TGF5b3V0L3NyYy9mbGFzaHgvdGV4dExheW91dC9mb3JtYXRzL1RleHRMYXlvdXRGb3JtYXQuYXMKaW5kZXggYjUzMmM0MC4uYWE4MTY2YSAxMDA2NDQKLS0tIGEvdGV4dExheW91dC9zcmMvZmxhc2h4L3RleHRMYXlvdXQvZm9ybWF0cy9UZXh0TGF5b3V0Rm9ybWF0LmFzCisrKyBiL3RleHRMYXlvdXQvc3JjL2ZsYXNoeC90ZXh0TGF5b3V0L2Zvcm1hdHMvVGV4dExheW91dEZvcm1hdC5hcwpAQCAtNzQsNyArNzQsNyBAQAogCiAJLyoqCiAJICogVGhlIFRleHRMYXlvdXRGb3JtYXQgY2xhc3MgaG9sZHMgYWxsIG9mIHRoZSB0ZXh0IGxheW91dCBwcm9wZXJ0aWVzLiBUaGVzZSBwcm9wZXJ0aWVzIGFmZmVjdCB0aGUgZm9ybWF0IGFuZCBzdHlsZSBvZiBhIHRleHQgZmxvdyBhdCB0aGUgY29udGFpbmVyIGxldmVsLCBwYXJhZ3JhcGggbGV2ZWwsIGFuZCB0ZXh0IGxldmVsLiAgQm90aCB0aGUgQ29udGFpbmVyQ29udHJvbGxlciBjbGFzcyBhbmQgdGhlIEZsb3dFbGVtZW50IGJhc2UgY2xhc3MgaGF2ZSA8Y29kZT5mb3JtYXQ8L2NvZGU+IHByb3BlcnRpZXMgdGhhdCBlbmFibGUgeW91IHRvIGFzc2lnbiBhIFRleHRMYXlvdXRGb3JtYXQgaW5zdGFuY2UgdG8gdGhlbS4gQXNzaWduIGEgVGV4dExheW91dEZvcm1hdCBvYmplY3QgdG8gYSBjb250YWluZXIgdG8gYWZmZWN0IHRoZSBmb3JtYXQgb2YgYWxsIG9mIHRoZSBjb250YWluZXIncyBjb250ZW50LiBBc3NpZ24gYSBUZXh0TGF5b3V0Rm9ybWF0IG9iamVjdCB0byBhIEZsb3dFbGVtZW50IGRlc2NlbmRhbnQgdG8gc3BlY2lmeSBmb3JtYXR0aW5nIGZvciB0aGF0IHBhcnRpY3VsYXIgZWxlbWVudDogVGV4dEZsb3csIFBhcmFncmFwaEVsZW1lbnQsIERpdkVsZW1lbnQsIFNwYW5FbGVtZW50LCBJbmxpbmVHcmFwaGljRWxlbWVudCwgTGlua0VsZW1lbnQsIGFuZCBUQ1lFbGVtZW50LgotCSAqIEluIGFkZGl0aW9uIHRvIHRoZSA8Y29kZT5mb3JtYXQ8L2NvZGU+IHByb3BlcnR5LCB0aGVzZSBjbGFzc2VzIGFsc28gZGVmaW5lIGVhY2ggb2YgdGhlIGluZGl2aWR1YWwgVGV4dExheW91dEZvcm1hdCBwcm9wZXJ0aWVzIHNvIHRoYXQgeW91IGNhbiBvdmVycmlkZSB0aGUgc2V0dGluZyBvZiBhIHBhcnRpY3VsYXIgc3R5bGUgcHJvcGVydHkgZm9yIHRoYXQgZWxlbWVudCwgaWYgeW91IHdpc2guIDxwPkJlY2F1c2UgeW91IGNhbiBzZXQgYSBnaXZlbiBzdHlsZSBhdCBtdWx0aXBsZSBsZXZlbHMsIGl0IGlzIHBvc3NpYmxlIHRvIGhhdmUgY29uZmxpY3RzLiBGb3IgZXhhbXBsZSwgdGhlIGNvbG9yIG9mIHRoZSB0ZXh0IGF0IHRoZSBUZXh0RmxvdyBsZXZlbCBjb3VsZCBiZSBzZXQgdG8gYmxhY2sgd2hpbGUgYSBTcGFuRWxlbWVudCBvYmplY3Qgc2V0cyBpdCB0byBibHVlLiBUaGUgZ2VuZXJhbCBydWxlIGlzIHRoYXQgdGhlIHNldHRpbmcgYXQgdGhlIGxvd2VzdCBsZXZlbCBvbiB0aGUgdGV4dCBmbG93IHRyZWUgdGFrZXMgcHJlY2VkZW5jZS4gU28gaWYgdGhlIGxpZ2F0dXJlIGxldmVsIGlzIHNldCBmb3IgYSBUZXh0RmxvdyBpbnN0YW5jZSBhbmQgYWxzbyBzZXQgZm9yIGEgRGl2RWxlbWVudCwgdGhlIERpdkVsZW1lbnQgc2V0dGluZyB0YWtlcyBwcmVjZWRlbmNlLiA8L3A+PHA+Q2FzY2FkaW5nIHN0eWxlcyByZWZlcnMgdG8gdGhlIHByb2Nlc3Mgb2YgYWRvcHRpbmcgc3R5bGVzIGZyb20gYSBoaWdoZXIgbGV2ZWwgaW4gdGhlIHRleHQgZmxvdyBpZiBhIHN0eWxlIHZhbHVlIGlzIHVuZGVmaW5lZCBhdCBhIGxvd2VyIGxldmVsLiBXaGVuIGEgc3R5bGUgaXMgdW5kZWZpbmVkIG9uIGFuIGVsZW1lbnQgYXQgdGhlIHBvaW50IGl0IGlzIGFib3V0IHRvIGJlIHJlbmRlcmVkLCBpdCBlaXRoZXIgdGFrZXMgaXRzIGRlZmF1bHQgdmFsdWUgb3IgdGhlIHZhbHVlIGNhc2NhZGVzIG9yIGRlc2NlbmRzIGZyb20gdGhlIHZhbHVlIG9uIGEgcGFyZW50IGVsZW1lbnQuIEZvciBleGFtcGxlLCBpZiB0aGUgdHJhbnNwYXJlbmN5ICg8Y29kZT50ZXh0QWxwaGE8L2NvZGU+IHByb3BlcnR5KSBvZiB0aGUgdGV4dCBpcyB1bmRlZmluZWQgb24gYSBTcGFuRWxlbWVudCBvYmplY3QsIGJ1dCBpcyBzZXQgb24gdGhlIFRleHRGbG93LCB0aGUgdmFsdWUgb2YgdGhlIDxjb2RlPlRleHRGbG93LnRleHRBbHBoYTwvY29kZT4gcHJvcGVydHkgY2FzY2FkZXMgdG8gdGhlIFNwYW5FbGVtZW50IG9iamVjdCBhbmQgaXMgYXBwbGllZCB0byB0aGUgdGV4dCBmb3IgdGhhdCBzcGFuLiBUaGUgcmVzdWx0IG9mIHRoZSBjYXNjYWRlLCBvciB0aGUgc3VtIG9mIHRoZSBzdHlsZXMgdGhhdCBpcyBhcHBsaWVkIHRvIHRoZSBlbGVtZW50LCBpcyBzdG9yZWQgaW4gdGhlIGVsZW1lbnQncyA8Y29kZT5jb21wdXRlZEZvcm1hdDwvY29kZT4gcHJvcGVydHkuPC9wPjxwPkluIHRoZSBzYW1lIHdheSwgeW91IGNhbiBhcHBseSB1c2VyIHN0eWxlcyB1c2luZyB0aGUgPGNvZGU+dXNlclN0eWxlczwvY29kZT4gcHJvcGVydHkgb2YgdGhlIENvbnRhaW5lckNvbnRyb2xsZXIgYW5kIEZsb3dFbGVtZW50IGNsYXNzZXMuIFRoaXMgIHByb3BlcnR5IGFsbG93cyB5b3UgdG8gcmVhZCBvciB3cml0ZSBhIGRpY3Rpb25hcnkgb2YgdXNlciBzdHlsZXMgYW5kIGFwcGx5IGl0cyBzZXR0aW5ncyB0byBhIGNvbnRhaW5lciBvciBhIHRleHQgZmxvdyBlbGVtZW50LiBUaGUgdXNlciBzdHlsZXMgZGljdGlvbmFyeSBpcyBhbiBvYmplY3QgdGhhdCBjb25zaXN0cyBvZiA8ZW0+c3R5bGVuYW1lLXZhbHVlPC9lbT4gcGFpcnMuIFN0eWxlcyBzcGVjaWZpZWQgYnkgdGhlIDxjb2RlPnVzZXJTdHlsZXM8L2NvZGU+IHByb3BlcnR5IHRha2UgcHJlY2VkZW5jZSBvdmVyIGFsbCBvdGhlcnMuPC9wPjxwPk1vc3Qgc3R5bGVzIHRoYXQgYXJlIHVuZGVmaW5lZCBpbmhlcml0IHRoZSB2YWx1ZSBvZiB0aGVpciBpbW1lZGlhdGUgcGFyZW50IGR1cmluZyBhIGNhc2NhZGUuIEEgc21hbGwgbnVtYmVyIG9mIHN0eWxlcywgaG93ZXZlciwgZG8gbm90IGluaGVyaXQgdGhlaXIgcGFyZW501XMgdmFsdWUgYW5kIHRha2Ugb24gdGhlaXIgZGVmYXVsdCB2YWx1ZXMgaW5zdGVhZC48L3A+PHA+PHN0cm9uZz5TdHlsZSBwcm9wZXJ0aWVzIHRoYXQgYWRvcHQgdGhlaXIgZGVmYXVsdCB2YWx1ZXMsIGlmIHVuZGVmaW5lZCwgaW5jbHVkZTo8L3N0cm9uZz4gPGNvZGU+YmFja2dyb3VuZEFscGhhPC9jb2RlPiwgPGNvZGU+YmFja2dyb3VuZENvbG9yPC9jb2RlPiwgPGNvZGU+Y29sdW1uQ291bnQ8L2NvZGU+LCA8Y29kZT5jb2x1bW5HYXA8L2NvZGU+LCA8Y29kZT5jb2x1bW5XaWR0aDwvY29kZT4sIDxjb2RlPmxpbmVCcmVhazwvY29kZT4sIDxjb2RlPnBhZGRpbmdCb3R0b208L2NvZGU+LCA8Y29kZT5wYWRkaW5nTGVmdDwvY29kZT4sIDxjb2RlPnBhZGRpbmdSaWdodDwvY29kZT4sIDxjb2RlPnBhZGRpbmdUb3A8L2NvZGU+LCA8Y29kZT52ZXJ0aWNhbEFsaWduPC9jb2RlPjwvcD4uCisJICogSW4gYWRkaXRpb24gdG8gdGhlIDxjb2RlPmZvcm1hdDwvY29kZT4gcHJvcGVydHksIHRoZXNlIGNsYXNzZXMgYWxzbyBkZWZpbmUgZWFjaCBvZiB0aGUgaW5kaXZpZHVhbCBUZXh0TGF5b3V0Rm9ybWF0IHByb3BlcnRpZXMgc28gdGhhdCB5b3UgY2FuIG92ZXJyaWRlIHRoZSBzZXR0aW5nIG9mIGEgcGFydGljdWxhciBzdHlsZSBwcm9wZXJ0eSBmb3IgdGhhdCBlbGVtZW50LCBpZiB5b3Ugd2lzaC4gPHA+QmVjYXVzZSB5b3UgY2FuIHNldCBhIGdpdmVuIHN0eWxlIGF0IG11bHRpcGxlIGxldmVscywgaXQgaXMgcG9zc2libGUgdG8gaGF2ZSBjb25mbGljdHMuIEZvciBleGFtcGxlLCB0aGUgY29sb3Igb2YgdGhlIHRleHQgYXQgdGhlIFRleHRGbG93IGxldmVsIGNvdWxkIGJlIHNldCB0byBibGFjayB3aGlsZSBhIFNwYW5FbGVtZW50IG9iamVjdCBzZXRzIGl0IHRvIGJsdWUuIFRoZSBnZW5lcmFsIHJ1bGUgaXMgdGhhdCB0aGUgc2V0dGluZyBhdCB0aGUgbG93ZXN0IGxldmVsIG9uIHRoZSB0ZXh0IGZsb3cgdHJlZSB0YWtlcyBwcmVjZWRlbmNlLiBTbyBpZiB0aGUgbGlnYXR1cmUgbGV2ZWwgaXMgc2V0IGZvciBhIFRleHRGbG93IGluc3RhbmNlIGFuZCBhbHNvIHNldCBmb3IgYSBEaXZFbGVtZW50LCB0aGUgRGl2RWxlbWVudCBzZXR0aW5nIHRha2VzIHByZWNlZGVuY2UuIDwvcD48cD5DYXNjYWRpbmcgc3R5bGVzIHJlZmVycyB0byB0aGUgcHJvY2VzcyBvZiBhZG9wdGluZyBzdHlsZXMgZnJvbSBhIGhpZ2hlciBsZXZlbCBpbiB0aGUgdGV4dCBmbG93IGlmIGEgc3R5bGUgdmFsdWUgaXMgdW5kZWZpbmVkIGF0IGEgbG93ZXIgbGV2ZWwuIFdoZW4gYSBzdHlsZSBpcyB1bmRlZmluZWQgb24gYW4gZWxlbWVudCBhdCB0aGUgcG9pbnQgaXQgaXMgYWJvdXQgdG8gYmUgcmVuZGVyZWQsIGl0IGVpdGhlciB0YWtlcyBpdHMgZGVmYXVsdCB2YWx1ZSBvciB0aGUgdmFsdWUgY2FzY2FkZXMgb3IgZGVzY2VuZHMgZnJvbSB0aGUgdmFsdWUgb24gYSBwYXJlbnQgZWxlbWVudC4gRm9yIGV4YW1wbGUsIGlmIHRoZSB0cmFuc3BhcmVuY3kgKDxjb2RlPnRleHRBbHBoYTwvY29kZT4gcHJvcGVydHkpIG9mIHRoZSB0ZXh0IGlzIHVuZGVmaW5lZCBvbiBhIFNwYW5FbGVtZW50IG9iamVjdCwgYnV0IGlzIHNldCBvbiB0aGUgVGV4dEZsb3csIHRoZSB2YWx1ZSBvZiB0aGUgPGNvZGU+VGV4dEZsb3cudGV4dEFscGhhPC9jb2RlPiBwcm9wZXJ0eSBjYXNjYWRlcyB0byB0aGUgU3BhbkVsZW1lbnQgb2JqZWN0IGFuZCBpcyBhcHBsaWVkIHRvIHRoZSB0ZXh0IGZvciB0aGF0IHNwYW4uIFRoZSByZXN1bHQgb2YgdGhlIGNhc2NhZGUsIG9yIHRoZSBzdW0gb2YgdGhlIHN0eWxlcyB0aGF0IGlzIGFwcGxpZWQgdG8gdGhlIGVsZW1lbnQsIGlzIHN0b3JlZCBpbiB0aGUgZWxlbWVudCdzIDxjb2RlPmNvbXB1dGVkRm9ybWF0PC9jb2RlPiBwcm9wZXJ0eS48L3A+PHA+SW4gdGhlIHNhbWUgd2F5LCB5b3UgY2FuIGFwcGx5IHVzZXIgc3R5bGVzIHVzaW5nIHRoZSA8Y29kZT51c2VyU3R5bGVzPC9jb2RlPiBwcm9wZXJ0eSBvZiB0aGUgQ29udGFpbmVyQ29udHJvbGxlciBhbmQgRmxvd0VsZW1lbnQgY2xhc3Nlcy4gVGhpcyAgcHJvcGVydHkgYWxsb3dzIHlvdSB0byByZWFkIG9yIHdyaXRlIGEgZGljdGlvbmFyeSBvZiB1c2VyIHN0eWxlcyBhbmQgYXBwbHkgaXRzIHNldHRpbmdzIHRvIGEgY29udGFpbmVyIG9yIGEgdGV4dCBmbG93IGVsZW1lbnQuIFRoZSB1c2VyIHN0eWxlcyBkaWN0aW9uYXJ5IGlzIGFuIG9iamVjdCB0aGF0IGNvbnNpc3RzIG9mIDxlbT5zdHlsZW5hbWUtdmFsdWU8L2VtPiBwYWlycy4gU3R5bGVzIHNwZWNpZmllZCBieSB0aGUgPGNvZGU+dXNlclN0eWxlczwvY29kZT4gcHJvcGVydHkgdGFrZSBwcmVjZWRlbmNlIG92ZXIgYWxsIG90aGVycy48L3A+PHA+TW9zdCBzdHlsZXMgdGhhdCBhcmUgdW5kZWZpbmVkIGluaGVyaXQgdGhlIHZhbHVlIG9mIHRoZWlyIGltbWVkaWF0ZSBwYXJlbnQgZHVyaW5nIGEgY2FzY2FkZS4gQSBzbWFsbCBudW1iZXIgb2Ygc3R5bGVzLCBob3dldmVyLCBkbyBub3QgaW5oZXJpdCB0aGVpciBwYXJlbnTvv71zIHZhbHVlIGFuZCB0YWtlIG9uIHRoZWlyIGRlZmF1bHQgdmFsdWVzIGluc3RlYWQuPC9wPjxwPjxzdHJvbmc+U3R5bGUgcHJvcGVydGllcyB0aGF0IGFkb3B0IHRoZWlyIGRlZmF1bHQgdmFsdWVzLCBpZiB1bmRlZmluZWQsIGluY2x1ZGU6PC9zdHJvbmc+IDxjb2RlPmJhY2tncm91bmRBbHBoYTwvY29kZT4sIDxjb2RlPmJhY2tncm91bmRDb2xvcjwvY29kZT4sIDxjb2RlPmNvbHVtbkNvdW50PC9jb2RlPiwgPGNvZGU+Y29sdW1uR2FwPC9jb2RlPiwgPGNvZGU+Y29sdW1uV2lkdGg8L2NvZGU+LCA8Y29kZT5saW5lQnJlYWs8L2NvZGU+LCA8Y29kZT5wYWRkaW5nQm90dG9tPC9jb2RlPiwgPGNvZGU+cGFkZGluZ0xlZnQ8L2NvZGU+LCA8Y29kZT5wYWRkaW5nUmlnaHQ8L2NvZGU+LCA8Y29kZT5wYWRkaW5nVG9wPC9jb2RlPiwgPGNvZGU+dmVydGljYWxBbGlnbjwvY29kZT48L3A+LgogCSAqIEBpbmNsdWRlRXhhbXBsZSBleGFtcGxlc1xUZXh0TGF5b3V0Rm9ybWF0RXhhbXBsZS5hcyAtbm9zd2YKIAkgKiBAaW5jbHVkZUV4YW1wbGUgZXhhbXBsZXNcVGV4dExheW91dEZvcm1hdEV4YW1wbGUyLmFzIC1ub3N3ZgogCSAqIEBzZWUgZmxhc2h4LnRleHRMYXlvdXQuZWxlbWVudHMuRmxvd0VsZW1lbnQjZm9ybWF0CkBAIC05NTMsNiArOTUzLDM4IEBACiAJCQlyZXR1cm4gX2JvcmRlckJvdHRvbUNvbG9yUHJvcGVydHk7CiAJCX0KIAkJLyoqIEBwcml2YXRlICovCisJCXN0YXRpYyBwcml2YXRlIHZhciBfYm9yZGVyTGVmdFByaW9yaXR5UHJvcGVydHk6UHJvcGVydHk7CisJCXN0YXRpYyBwdWJsaWMgZnVuY3Rpb24gZ2V0IGJvcmRlckxlZnRQcmlvcml0eVByb3BlcnR5KCk6UHJvcGVydHkKKwkJeworCQkJaWYgKCFfYm9yZGVyTGVmdFByaW9yaXR5UHJvcGVydHkpCisJCQkJX2JvcmRlckxlZnRQcmlvcml0eVByb3BlcnR5ID0gUHJvcGVydHkuTmV3TnVtYmVyUHJvcGVydHkoImJvcmRlckxlZnRQcmlvcml0eSIsMCxmYWxzZSxWZWN0b3IuPFN0cmluZz4oW0NhdGVnb3J5LlRBQkxFLENhdGVnb3J5LlRBQkxFQ0VMTCxDYXRlZ29yeS5UQUJMRUNPTFVNTixDYXRlZ29yeS5UQUJMRVJPV10pLC04MDAwLDgwMDApOworCQkJcmV0dXJuIF9ib3JkZXJMZWZ0UHJpb3JpdHlQcm9wZXJ0eTsKKwkJfQorCQkvKiogQHByaXZhdGUgKi8KKwkJc3RhdGljIHByaXZhdGUgdmFyIF9ib3JkZXJSaWdodFByaW9yaXR5UHJvcGVydHk6UHJvcGVydHk7CisJCXN0YXRpYyBwdWJsaWMgZnVuY3Rpb24gZ2V0IGJvcmRlclJpZ2h0UHJpb3JpdHlQcm9wZXJ0eSgpOlByb3BlcnR5CisJCXsKKwkJCWlmICghX2JvcmRlclJpZ2h0UHJpb3JpdHlQcm9wZXJ0eSkKKwkJCQlfYm9yZGVyUmlnaHRQcmlvcml0eVByb3BlcnR5ID0gUHJvcGVydHkuTmV3TnVtYmVyUHJvcGVydHkoImJvcmRlclJpZ2h0UHJpb3JpdHkiLDAsZmFsc2UsVmVjdG9yLjxTdHJpbmc+KFtDYXRlZ29yeS5UQUJMRSxDYXRlZ29yeS5UQUJMRUNFTEwsQ2F0ZWdvcnkuVEFCTEVDT0xVTU4sQ2F0ZWdvcnkuVEFCTEVST1ddKSwtODAwMCw4MDAwKTsKKwkJCXJldHVybiBfYm9yZGVyUmlnaHRQcmlvcml0eVByb3BlcnR5OworCQl9CisJCS8qKiBAcHJpdmF0ZSAqLworCQlzdGF0aWMgcHJpdmF0ZSB2YXIgX2JvcmRlclRvcFByaW9yaXR5UHJvcGVydHk6UHJvcGVydHk7CisJCXN0YXRpYyBwdWJsaWMgZnVuY3Rpb24gZ2V0IGJvcmRlclRvcFByaW9yaXR5UHJvcGVydHkoKTpQcm9wZXJ0eQorCQl7CisJCQlpZiAoIV9ib3JkZXJUb3BQcmlvcml0eVByb3BlcnR5KQorCQkJCV9ib3JkZXJUb3BQcmlvcml0eVByb3BlcnR5ID0gUHJvcGVydHkuTmV3TnVtYmVyUHJvcGVydHkoImJvcmRlclRvcFByaW9yaXR5IiwwLGZhbHNlLFZlY3Rvci48U3RyaW5nPihbQ2F0ZWdvcnkuVEFCTEUsQ2F0ZWdvcnkuVEFCTEVDRUxMLENhdGVnb3J5LlRBQkxFQ09MVU1OLENhdGVnb3J5LlRBQkxFUk9XXSksLTgwMDAsODAwMCk7CisJCQlyZXR1cm4gX2JvcmRlclRvcFByaW9yaXR5UHJvcGVydHk7CisJCX0KKwkJLyoqIEBwcml2YXRlICovCisJCXN0YXRpYyBwcml2YXRlIHZhciBfYm9yZGVyQm90dG9tUHJpb3JpdHlQcm9wZXJ0eTpQcm9wZXJ0eTsKKwkJc3RhdGljIHB1YmxpYyBmdW5jdGlvbiBnZXQgYm9yZGVyQm90dG9tUHJpb3JpdHlQcm9wZXJ0eSgpOlByb3BlcnR5CisJCXsKKwkJCWlmICghX2JvcmRlckJvdHRvbVByaW9yaXR5UHJvcGVydHkpCisJCQkJX2JvcmRlckJvdHRvbVByaW9yaXR5UHJvcGVydHkgPSBQcm9wZXJ0eS5OZXdOdW1iZXJQcm9wZXJ0eSgiYm9yZGVyQm90dG9tUHJpb3JpdHkiLDAsZmFsc2UsVmVjdG9yLjxTdHJpbmc+KFtDYXRlZ29yeS5UQUJMRSxDYXRlZ29yeS5UQUJMRUNFTEwsQ2F0ZWdvcnkuVEFCTEVDT0xVTU4sQ2F0ZWdvcnkuVEFCTEVST1ddKSwtODAwMCw4MDAwKTsKKwkJCXJldHVybiBfYm9yZGVyQm90dG9tUHJpb3JpdHlQcm9wZXJ0eTsKKwkJfQorCQkvKiogQHByaXZhdGUgKi8KIAkJc3RhdGljIHByaXZhdGUgdmFyIF9tYXJnaW5MZWZ0UHJvcGVydHk6UHJvcGVydHk7CiAJCXN0YXRpYyBwdWJsaWMgZnVuY3Rpb24gZ2V0IG1hcmdpbkxlZnRQcm9wZXJ0eSgpOlByb3BlcnR5CiAJCXsKQEAgLTEwMTcsNiArMTA0OSwyMiBAQAogCQkJcmV0dXJuIF90YWJsZUNvbHVtbldpZHRoUHJvcGVydHk7CiAJCX0KIAkJLyoqIEBwcml2YXRlICovCisJCXN0YXRpYyBwcml2YXRlIHZhciBfbWluQ2VsbEhlaWdodFByb3BlcnR5OlByb3BlcnR5OworCQlzdGF0aWMgcHVibGljIGZ1bmN0aW9uIGdldCBtaW5DZWxsSGVpZ2h0UHJvcGVydHkoKTpQcm9wZXJ0eQorCQl7CisJCQlpZiAoIV9taW5DZWxsSGVpZ2h0UHJvcGVydHkpCisJCQkJX21pbkNlbGxIZWlnaHRQcm9wZXJ0eSA9IFByb3BlcnR5Lk5ld051bWJlck9yRW51bVByb3BlcnR5KCJtaW5DZWxsSGVpZ2h0IiwyLGZhbHNlLFZlY3Rvci48U3RyaW5nPihbQ2F0ZWdvcnkuVEFCTEUsQ2F0ZWdvcnkuVEFCTEVDRUxMXSksMiw4MDAwKTsKKwkJCXJldHVybiBfbWluQ2VsbEhlaWdodFByb3BlcnR5OworCQl9CisJCS8qKiBAcHJpdmF0ZSAqLworCQlzdGF0aWMgcHJpdmF0ZSB2YXIgX21heENlbGxIZWlnaHRQcm9wZXJ0eTpQcm9wZXJ0eTsKKwkJc3RhdGljIHB1YmxpYyBmdW5jdGlvbiBnZXQgbWF4Q2VsbEhlaWdodFByb3BlcnR5KCk6UHJvcGVydHkKKwkJeworCQkJaWYgKCFfbWF4Q2VsbEhlaWdodFByb3BlcnR5KQorCQkJCV9tYXhDZWxsSGVpZ2h0UHJvcGVydHkgPSBQcm9wZXJ0eS5OZXdOdW1iZXJPckVudW1Qcm9wZXJ0eSgibWF4Q2VsbEhlaWdodCIsODAwMCxmYWxzZSxWZWN0b3IuPFN0cmluZz4oW0NhdGVnb3J5LlRBQkxFLENhdGVnb3J5LlRBQkxFQ0VMTF0pLDIsODAwMCk7CisJCQlyZXR1cm4gX21heENlbGxIZWlnaHRQcm9wZXJ0eTsKKwkJfQorCQkvKiogQHByaXZhdGUgKi8KIAkJc3RhdGljIHByaXZhdGUgdmFyIF9mcmFtZVByb3BlcnR5OlByb3BlcnR5OwogCQlzdGF0aWMgcHVibGljIGZ1bmN0aW9uIGdldCBmcmFtZVByb3BlcnR5KCk6UHJvcGVydHkKIAkJewpAQCAtMTEzNiw2ICsxMTg0LDEyIEBACiAJCQksIHRhYmxlQ29sdW1uV2lkdGg6dGFibGVDb2x1bW5XaWR0aFByb3BlcnR5CiAJCQksIGZyYW1lOmZyYW1lUHJvcGVydHkKIAkJCSwgcnVsZXM6cnVsZXNQcm9wZXJ0eQorCQkJLCBib3JkZXJMZWZ0UHJpb3JpdHk6Ym9yZGVyTGVmdFByaW9yaXR5UHJvcGVydHkKKwkJCSwgYm9yZGVyUmlnaHRQcmlvcml0eTpib3JkZXJSaWdodFByaW9yaXR5UHJvcGVydHkKKwkJCSwgYm9yZGVyVG9wUHJpb3JpdHk6Ym9yZGVyVG9wUHJpb3JpdHlQcm9wZXJ0eQorCQkJLCBib3JkZXJCb3R0b21Qcmlvcml0eTpib3JkZXJCb3R0b21Qcmlvcml0eVByb3BlcnR5CisJCQksIG1pbkNlbGxIZWlnaHQ6bWluQ2VsbEhlaWdodFByb3BlcnR5CisJCQksIG1heENlbGxIZWlnaHQ6bWF4Q2VsbEhlaWdodFByb3BlcnR5CiAJCX0KIAogCQkvKiogUHJvcGVydHkgZGVzY3JpcHRpb25zIGFjY2Vzc2libGUgYnkgbmFtZS4gQHByaXZhdGUgKi8KQEAgLTI5NjIsNiArMzAxNiw3NCBAQAogCQl7IHNldFN0eWxlQnlQcm9wZXJ0eShUZXh0TGF5b3V0Rm9ybWF0LmJvcmRlckJvdHRvbUNvbG9yUHJvcGVydHksdmFsdWUpOyB9CiAKIAkJLyoqCisJCSAqIFNwZWNpZmllcyB0aGUgcHJpb3JpdHkgd2hlbiBkcmF3aW5nIGNlbGwgYm91bmRhcmllcy4gV2hlbiBzZXR0aW5ncyBiZXR3ZWVuIHR3byBhZGphY2VudCBjZWxscyBjb25mbGljdCwgdGhlIGJvcmRlciB3aXRoIHRoZSBoaWdoZXIgcHJpb3JpdHkgd2lucy4gSWYgdGhlIHByaW9yaXRpZXMgYXJlIGVxdWFsLCB0aGUgbGF0dGVyIG9mIHRoZSB0d28gY2VsbHMgdGFrZXMgcHJpb3JpdHkuCisJCSAqIDxwPkxlZ2FsIHZhbHVlcyBhcmUgYW55IHJhdGlvbmFsIG51bWJlci4gQ29uZmxpY3RzIGFyZSByZXNvbHZlZCB3aXRoIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBoaWdoZXIgbnVtYmVyIGJlaW5nIGRyYXduLjwvcD4KKwkJICogPHA+RGVmYXVsdCB2YWx1ZSBpcyB1bmRlZmluZWQgaW5kaWNhdGluZyBub3Qgc2V0LjwvcD4KKwkJICogPHA+SWYgdW5kZWZpbmVkIGR1cmluZyB0aGUgY2FzY2FkZSB0aGlzIHByb3BlcnR5IHdpbGwgaW5oZXJpdCwgYW5kIGRlZmF1bHQgdG8gMC48L3A+CisJCSAqIAorCQkgKiBAdGhyb3dzIFJhbmdlRXJyb3Igd2hlbiBzZXQgdmFsdWUgaXMgbm90IHdpdGhpbiByYW5nZSBmb3IgdGhpcyBwcm9wZXJ0eQorCQkgKiAKKwkJICogQHBsYXllcnZlcnNpb24gRmxhc2ggMTAKKwkJICogQHBsYXllcnZlcnNpb24gQUlSIDEuNQorCQkgKiBAbGFuZ3ZlcnNpb24gMy4wCisJCSAqLworCQlwdWJsaWMgZnVuY3Rpb24gZ2V0IGJvcmRlckxlZnRQcmlvcml0eSgpOioKKwkJeyByZXR1cm4gX3N0eWxlcy5ib3JkZXJMZWZ0UHJpb3JpdHk7IH0KKwkJcHVibGljIGZ1bmN0aW9uIHNldCBib3JkZXJMZWZ0UHJpb3JpdHkodmFsdWU6Kik6dm9pZAorCQl7IHNldFN0eWxlQnlQcm9wZXJ0eShUZXh0TGF5b3V0Rm9ybWF0LmJvcmRlckxlZnRQcmlvcml0eVByb3BlcnR5LHZhbHVlKTsgfQorCQkKKwkJLyoqCisJCSAqIFNwZWNpZmllcyB0aGUgcHJpb3JpdHkgd2hlbiBkcmF3aW5nIGNlbGwgYm91bmRhcmllcy4gV2hlbiBzZXR0aW5ncyBiZXR3ZWVuIHR3byBhZGphY2VudCBjZWxscyBjb25mbGljdCwgdGhlIGJvcmRlciB3aXRoIHRoZSBoaWdoZXIgcHJpb3JpdHkgd2lucy4gSWYgdGhlIHByaW9yaXRpZXMgYXJlIGVxdWFsLCB0aGUgbGF0dGVyIG9mIHRoZSB0d28gY2VsbHMgdGFrZXMgcHJpb3JpdHkuCisJCSAqIDxwPkxlZ2FsIHZhbHVlcyBhcmUgYW55IHJhdGlvbmFsIG51bWJlci4gQ29uZmxpY3RzIGFyZSByZXNvbHZlZCB3aXRoIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBoaWdoZXIgbnVtYmVyIGJlaW5nIGRyYXduLjwvcD4KKwkJICogPHA+RGVmYXVsdCB2YWx1ZSBpcyB1bmRlZmluZWQgaW5kaWNhdGluZyBub3Qgc2V0LjwvcD4KKwkJICogPHA+SWYgdW5kZWZpbmVkIGR1cmluZyB0aGUgY2FzY2FkZSB0aGlzIHByb3BlcnR5IHdpbGwgaW5oZXJpdCwgYW5kIGRlZmF1bHQgdG8gMC48L3A+CisJCSAqIAorCQkgKiBAdGhyb3dzIFJhbmdlRXJyb3Igd2hlbiBzZXQgdmFsdWUgaXMgbm90IHdpdGhpbiByYW5nZSBmb3IgdGhpcyBwcm9wZXJ0eQorCQkgKiAKKwkJICogQHBsYXllcnZlcnNpb24gRmxhc2ggMTAKKwkJICogQHBsYXllcnZlcnNpb24gQUlSIDEuNQorCQkgKiBAbGFuZ3ZlcnNpb24gMy4wCisJCSAqLworCQlwdWJsaWMgZnVuY3Rpb24gZ2V0IGJvcmRlclJpZ2h0UHJpb3JpdHkoKToqCisJCXsgcmV0dXJuIF9zdHlsZXMuYm9yZGVyUmlnaHRQcmlvcml0eTsgfQorCQlwdWJsaWMgZnVuY3Rpb24gc2V0IGJvcmRlclJpZ2h0UHJpb3JpdHkodmFsdWU6Kik6dm9pZAorCQl7IHNldFN0eWxlQnlQcm9wZXJ0eShUZXh0TGF5b3V0Rm9ybWF0LmJvcmRlclJpZ2h0UHJpb3JpdHlQcm9wZXJ0eSx2YWx1ZSk7IH0KKwkJCisJCS8qKgorCQkgKiBTcGVjaWZpZXMgdGhlIHByaW9yaXR5IHdoZW4gZHJhd2luZyBjZWxsIGJvdW5kYXJpZXMuIFdoZW4gc2V0dGluZ3MgYmV0d2VlbiB0d28gYWRqYWNlbnQgY2VsbHMgY29uZmxpY3QsIHRoZSBib3JkZXIgd2l0aCB0aGUgaGlnaGVyIHByaW9yaXR5IHdpbnMuIElmIHRoZSBwcmlvcml0aWVzIGFyZSBlcXVhbCwgdGhlIGxhdHRlciBvZiB0aGUgdHdvIGNlbGxzIHRha2VzIHByaW9yaXR5LgorCQkgKiA8cD5MZWdhbCB2YWx1ZXMgYXJlIGFueSByYXRpb25hbCBudW1iZXIuIENvbmZsaWN0cyBhcmUgcmVzb2x2ZWQgd2l0aCB0aGUgcHJvcGVydGllcyBvZiB0aGUgaGlnaGVyIG51bWJlciBiZWluZyBkcmF3bi48L3A+CisJCSAqIDxwPkRlZmF1bHQgdmFsdWUgaXMgdW5kZWZpbmVkIGluZGljYXRpbmcgbm90IHNldC48L3A+CisJCSAqIDxwPklmIHVuZGVmaW5lZCBkdXJpbmcgdGhlIGNhc2NhZGUgdGhpcyBwcm9wZXJ0eSB3aWxsIGluaGVyaXQsIGFuZCBkZWZhdWx0IHRvIDAuPC9wPgorCQkgKiAKKwkJICogQHRocm93cyBSYW5nZUVycm9yIHdoZW4gc2V0IHZhbHVlIGlzIG5vdCB3aXRoaW4gcmFuZ2UgZm9yIHRoaXMgcHJvcGVydHkKKwkJICogCisJCSAqIEBwbGF5ZXJ2ZXJzaW9uIEZsYXNoIDEwCisJCSAqIEBwbGF5ZXJ2ZXJzaW9uIEFJUiAxLjUKKwkJICogQGxhbmd2ZXJzaW9uIDMuMAorCQkgKi8KKwkJcHVibGljIGZ1bmN0aW9uIGdldCBib3JkZXJUb3BQcmlvcml0eSgpOioKKwkJeyByZXR1cm4gX3N0eWxlcy5ib3JkZXJUb3BQcmlvcml0eTsgfQorCQlwdWJsaWMgZnVuY3Rpb24gc2V0IGJvcmRlclRvcFByaW9yaXR5KHZhbHVlOiopOnZvaWQKKwkJeyBzZXRTdHlsZUJ5UHJvcGVydHkoVGV4dExheW91dEZvcm1hdC5ib3JkZXJUb3BQcmlvcml0eVByb3BlcnR5LHZhbHVlKTsgfQorCQkKKwkJLyoqCisJCSAqIFNwZWNpZmllcyB0aGUgcHJpb3JpdHkgd2hlbiBkcmF3aW5nIGNlbGwgYm91bmRhcmllcy4gV2hlbiBzZXR0aW5ncyBiZXR3ZWVuIHR3byBhZGphY2VudCBjZWxscyBjb25mbGljdCwgdGhlIGJvcmRlciB3aXRoIHRoZSBoaWdoZXIgcHJpb3JpdHkgd2lucy4gSWYgdGhlIHByaW9yaXRpZXMgYXJlIGVxdWFsLCB0aGUgbGF0dGVyIG9mIHRoZSB0d28gY2VsbHMgdGFrZXMgcHJpb3JpdHkuCisJCSAqIDxwPkxlZ2FsIHZhbHVlcyBhcmUgYW55IHJhdGlvbmFsIG51bWJlci4gQ29uZmxpY3RzIGFyZSByZXNvbHZlZCB3aXRoIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBoaWdoZXIgbnVtYmVyIGJlaW5nIGRyYXduLjwvcD4KKwkJICogPHA+RGVmYXVsdCB2YWx1ZSBpcyB1bmRlZmluZWQgaW5kaWNhdGluZyBub3Qgc2V0LjwvcD4KKwkJICogPHA+SWYgdW5kZWZpbmVkIGR1cmluZyB0aGUgY2FzY2FkZSB0aGlzIHByb3BlcnR5IHdpbGwgaW5oZXJpdCwgYW5kIGRlZmF1bHQgdG8gMC48L3A+CisJCSAqIAorCQkgKiBAdGhyb3dzIFJhbmdlRXJyb3Igd2hlbiBzZXQgdmFsdWUgaXMgbm90IHdpdGhpbiByYW5nZSBmb3IgdGhpcyBwcm9wZXJ0eQorCQkgKiAKKwkJICogQHBsYXllcnZlcnNpb24gRmxhc2ggMTAKKwkJICogQHBsYXllcnZlcnNpb24gQUlSIDEuNQorCQkgKiBAbGFuZ3ZlcnNpb24gMy4wCisJCSAqLworCQlwdWJsaWMgZnVuY3Rpb24gZ2V0IGJvcmRlckJvdHRvbVByaW9yaXR5KCk6KgorCQl7IHJldHVybiBfc3R5bGVzLmJvcmRlckJvdHRvbVByaW9yaXR5OyB9CisJCXB1YmxpYyBmdW5jdGlvbiBzZXQgYm9yZGVyQm90dG9tUHJpb3JpdHkodmFsdWU6Kik6dm9pZAorCQl7IHNldFN0eWxlQnlQcm9wZXJ0eShUZXh0TGF5b3V0Rm9ybWF0LmJvcmRlckJvdHRvbVByaW9yaXR5UHJvcGVydHksdmFsdWUpOyB9CisKKwkJLyoqCiAJCSAqIGxlZnQgbWFyZ2luIGluIHBpeGVscyhhZG9wdHMgZGVmYXVsdCB2YWx1ZSBpZiB1bmRlZmluZWQgZHVyaW5nIGNhc2NhZGUpLgogCQkgKiA8cD5MZWdhbCB2YWx1ZXMgYXJlIG51bWJlcnMgZnJvbSAtODAwMCB0byA4MDAwIGFuZCBGb3JtYXRWYWx1ZS5JTkhFUklULjwvcD4KIAkJICogPHA+RGVmYXVsdCB2YWx1ZSBpcyB1bmRlZmluZWQgaW5kaWNhdGluZyBub3Qgc2V0LjwvcD4KQEAgLTMxMDIsNiArMzIyNCw0NCBAQAogCQl7IHJldHVybiBfc3R5bGVzLnRhYmxlQ29sdW1uV2lkdGg7IH0KIAkJcHVibGljIGZ1bmN0aW9uIHNldCB0YWJsZUNvbHVtbldpZHRoKHZhbHVlOiopOnZvaWQKIAkJeyBzZXRTdHlsZUJ5UHJvcGVydHkoVGV4dExheW91dEZvcm1hdC50YWJsZUNvbHVtbldpZHRoUHJvcGVydHksdmFsdWUpOyB9CisJCQorCQkvKioKKwkJICogTWluaW11bSBoZWlnaHQgb2YgYSB0YWJsZSBjZWxsLiBJZiB0aGVyZSBpcyBubyBtYXhpbXVtLCB0aGUgY2VsbCB3aWxsIGdyb3cgaW4gaGVpZ2h0IHRvIGZpdCB0aGUgY29udGVudC4gTWluaW11bSBhbmQgbWF4aW11bSBvZiB0aGUgc2FtZSB2YWx1ZXMgd2lsbCBnaXZlIHRoZSBjZWxsIGEgZml4ZWQgaGVpZ2h0LgorCQkgKiA8cD5MZWdhbCB2YWx1ZXMgYXMgYSBudW1iZXIgYXJlIGZyb20gMiB0byAxMDAwMC48L3A+CisJCSAqIDxwPkxlZ2FsIHZhbHVlcyBpbmNsdWRlIEZvcm1hdFZhbHVlLklOSEVSSVQuPC9wPgorCQkgKiA8cD5EZWZhdWx0IHZhbHVlIGlzIHVuZGVmaW5lZCBpbmRpY2F0aW5nIG5vdCBzZXQuPC9wPgorCQkgKiA8cD5JZiB1bmRlZmluZWQgZHVyaW5nIHRoZSBjYXNjYWRlIHRoaXMgcHJvcGVydHkgd2lsbCBoYXZlIGEgdmFsdWUgb2YgMi48L3A+CisJCSAqIAorCQkgKiBAdGhyb3dzIFJhbmdlRXJyb3Igd2hlbiBzZXQgdmFsdWUgaXMgbm90IHdpdGhpbiByYW5nZSBmb3IgdGhpcyBwcm9wZXJ0eQorCQkgKiAKKwkJICogQHBsYXllcnZlcnNpb24gRmxhc2ggMTAKKwkJICogQHBsYXllcnZlcnNpb24gQUlSIDEuNQorCQkgKiBAbGFuZ3ZlcnNpb24gMy4wCisJCSAqLworCQlwdWJsaWMgZnVuY3Rpb24gZ2V0IG1pbkNlbGxIZWlnaHQoKToqCisJCXsgcmV0dXJuIF9zdHlsZXMubWluQ2VsbEhlaWdodDsgfQorCQlwdWJsaWMgZnVuY3Rpb24gc2V0IG1pbkNlbGxIZWlnaHQodmFsdWU6Kik6dm9pZAorCQl7IHNldFN0eWxlQnlQcm9wZXJ0eShUZXh0TGF5b3V0Rm9ybWF0Lm1pbkNlbGxIZWlnaHRQcm9wZXJ0eSx2YWx1ZSk7IH0KKwkJCisJCS8qKgorCQkgKiBNYXhpbXVtIGhlaWdodCBvZiBhIHRhYmxlIGNlbGwuIElmIHRoZXJlIGlzIG5vIG1heGltdW0sIHRoZSBjZWxsIHdpbGwgZ3JvdyBpbiBoZWlnaHQgdG8gZml0IHRoZSBjb250ZW50LiBNaW5pbXVtIGFuZCBtYXhpbXVtIG9mIHRoZSBzYW1lIHZhbHVlcyB3aWxsIGdpdmUgdGhlIGNlbGwgYSBmaXhlZCBoZWlnaHQuCisJCSAqIDxwPkxlZ2FsIHZhbHVlcyBhcyBhIG51bWJlciBhcmUgZnJvbSAyIHRvIDEwMDAwLjwvcD4KKwkJICogPHA+TGVnYWwgdmFsdWVzIGluY2x1ZGUgRm9ybWF0VmFsdWUuSU5IRVJJVC48L3A+CisJCSAqIDxwPkRlZmF1bHQgdmFsdWUgaXMgdW5kZWZpbmVkIGluZGljYXRpbmcgbm90IHNldC48L3A+CisJCSAqIDxwPklmIHVuZGVmaW5lZCBkdXJpbmcgdGhlIGNhc2NhZGUgdGhpcyBwcm9wZXJ0eSB3aWxsIGhhdmUgYSB2YWx1ZSBvZiAyLjwvcD4KKwkJICogCisJCSAqIEB0aHJvd3MgUmFuZ2VFcnJvciB3aGVuIHNldCB2YWx1ZSBpcyBub3Qgd2l0aGluIHJhbmdlIGZvciB0aGlzIHByb3BlcnR5CisJCSAqIAorCQkgKiBAcGxheWVydmVyc2lvbiBGbGFzaCAxMAorCQkgKiBAcGxheWVydmVyc2lvbiBBSVIgMS41CisJCSAqIEBsYW5ndmVyc2lvbiAzLjAKKwkJICovCisJCXB1YmxpYyBmdW5jdGlvbiBnZXQgbWF4Q2VsbEhlaWdodCgpOioKKwkJeyByZXR1cm4gX3N0eWxlcy5tYXhDZWxsSGVpZ2h0OyB9CisJCXB1YmxpYyBmdW5jdGlvbiBzZXQgbWF4Q2VsbEhlaWdodCh2YWx1ZToqKTp2b2lkCisJCXsgc2V0U3R5bGVCeVByb3BlcnR5KFRleHRMYXlvdXRGb3JtYXQubWF4Q2VsbEhlaWdodFByb3BlcnR5LHZhbHVlKTsgfQorCisKIAogCQlbSW5zcGVjdGFibGUoZW51bWVyYXRpb249InZvaWQsYWJvdmUsYmVsb3csaHNpZGVzLHZzaWRlcyxsaHMscmhzLGJveCxib3JkZXIsaW5oZXJpdCIpXQogCQkvKioKQEAgLTMyNDEsNiArMzQwMSwxOCBAQAogCQkJCXN0eWxlc09iamVjdC5mcmFtZSA9IFRleHRMYXlvdXRGb3JtYXQuZnJhbWVQcm9wZXJ0eS5kZWZhdWx0VmFsdWU7CiAJCQlpZiAoc3R5bGVzT2JqZWN0LnJ1bGVzICE9IHVuZGVmaW5lZCAmJiBzdHlsZXNPYmplY3QucnVsZXMgIT0gVGV4dExheW91dEZvcm1hdC5ydWxlc1Byb3BlcnR5LmRlZmF1bHRWYWx1ZSkKIAkJCQlzdHlsZXNPYmplY3QucnVsZXMgPSBUZXh0TGF5b3V0Rm9ybWF0LnJ1bGVzUHJvcGVydHkuZGVmYXVsdFZhbHVlOworCQkJaWYoIHN0eWxlc09iamVjdC5ib3JkZXJCb3R0b21Qcmlvcml0eSAhPSB1bmRlZmluZWQgJiYgIHN0eWxlc09iamVjdC5ib3JkZXJCb3R0b21Qcmlvcml0eSAhPSBUZXh0TGF5b3V0Rm9ybWF0LmJvcmRlckJvdHRvbVByaW9yaXR5UHJvcGVydHkuZGVmYXVsdFZhbHVlKQorCQkJCXN0eWxlc09iamVjdC5ib3JkZXJCb3R0b21Qcmlvcml0eSA9IFRleHRMYXlvdXRGb3JtYXQuYm9yZGVyQm90dG9tUHJpb3JpdHlQcm9wZXJ0eS5kZWZhdWx0VmFsdWU7CisJCQlpZiggc3R5bGVzT2JqZWN0LmJvcmRlclRvcFByaW9yaXR5ICE9IHVuZGVmaW5lZCAmJiAgc3R5bGVzT2JqZWN0LmJvcmRlclRvcFByaW9yaXR5ICE9IFRleHRMYXlvdXRGb3JtYXQuYm9yZGVyVG9wUHJpb3JpdHlQcm9wZXJ0eS5kZWZhdWx0VmFsdWUpCisJCQkJc3R5bGVzT2JqZWN0LmJvcmRlclRvcFByaW9yaXR5ID0gVGV4dExheW91dEZvcm1hdC5ib3JkZXJUb3BQcmlvcml0eVByb3BlcnR5LmRlZmF1bHRWYWx1ZTsKKwkJCWlmKCBzdHlsZXNPYmplY3QuYm9yZGVyTGVmdFByaW9yaXR5ICE9IHVuZGVmaW5lZCAmJiAgc3R5bGVzT2JqZWN0LmJvcmRlckxlZnRQcmlvcml0eSAhPSBUZXh0TGF5b3V0Rm9ybWF0LmJvcmRlckxlZnRQcmlvcml0eVByb3BlcnR5LmRlZmF1bHRWYWx1ZSkKKwkJCQlzdHlsZXNPYmplY3QuYm9yZGVyTGVmdFByaW9yaXR5ID0gVGV4dExheW91dEZvcm1hdC5ib3JkZXJMZWZ0UHJpb3JpdHlQcm9wZXJ0eS5kZWZhdWx0VmFsdWU7CisJCQlpZiggc3R5bGVzT2JqZWN0LmJvcmRlclJpZ2h0UHJpb3JpdHkgIT0gdW5kZWZpbmVkICYmICBzdHlsZXNPYmplY3QuYm9yZGVyUmlnaHRQcmlvcml0eSAhPSBUZXh0TGF5b3V0Rm9ybWF0LmJvcmRlclJpZ2h0UHJpb3JpdHlQcm9wZXJ0eS5kZWZhdWx0VmFsdWUpCisJCQkJc3R5bGVzT2JqZWN0LmJvcmRlclJpZ2h0UHJpb3JpdHkgPSBUZXh0TGF5b3V0Rm9ybWF0LmJvcmRlclJpZ2h0UHJpb3JpdHlQcm9wZXJ0eS5kZWZhdWx0VmFsdWU7CisJCQlpZiAoc3R5bGVzT2JqZWN0Lm1pbkNlbGxIZWlnaHQgIT0gdW5kZWZpbmVkICYmIHN0eWxlc09iamVjdC5taW5DZWxsSGVpZ2h0ICE9IFRleHRMYXlvdXRGb3JtYXQubWluQ2VsbEhlaWdodFByb3BlcnR5LmRlZmF1bHRWYWx1ZSkKKwkJCQlzdHlsZXNPYmplY3QubWluQ2VsbEhlaWdodCA9IFRleHRMYXlvdXRGb3JtYXQubWluQ2VsbEhlaWdodFByb3BlcnR5LmRlZmF1bHRWYWx1ZTsKKwkJCWlmIChzdHlsZXNPYmplY3QubWF4Q2VsbEhlaWdodCAhPSB1bmRlZmluZWQgJiYgc3R5bGVzT2JqZWN0Lm1heENlbGxIZWlnaHQgIT0gVGV4dExheW91dEZvcm1hdC5tYXhDZWxsSGVpZ2h0UHJvcGVydHkuZGVmYXVsdFZhbHVlKQorCQkJCXN0eWxlc09iamVjdC5tYXhDZWxsSGVpZ2h0ID0gVGV4dExheW91dEZvcm1hdC5tYXhDZWxsSGVpZ2h0UHJvcGVydHkuZGVmYXVsdFZhbHVlOwogCQl9CiAKIAkJLyoqCmRpZmYgLS1naXQgYS90ZXh0TGF5b3V0L3NyYy9mbGFzaHgvdGV4dExheW91dC9mb3JtYXRzL1RleHRMYXlvdXRGb3JtYXRJbmMuYXMgYi90ZXh0TGF5b3V0L3NyYy9mbGFzaHgvdGV4dExheW91dC9mb3JtYXRzL1RleHRMYXlvdXRGb3JtYXRJbmMuYXMKaW5kZXggYzI2MzQzMy4uMmMxZjZmNiAxMDA2NDQKLS0tIGEvdGV4dExheW91dC9zcmMvZmxhc2h4L3RleHRMYXlvdXQvZm9ybWF0cy9UZXh0TGF5b3V0Rm9ybWF0SW5jLmFzCisrKyBiL3RleHRMYXlvdXQvc3JjL2ZsYXNoeC90ZXh0TGF5b3V0L2Zvcm1hdHMvVGV4dExheW91dEZvcm1hdEluYy5hcwpAQCAtMTgzNyw2ICsxODM3LDk4IEBACiAJCX0KIAogCQkvKioKKyAJCSogVGV4dExheW91dEZvcm1hdDoKKyAJCSogU3BlY2lmaWVzIHRoZSBwcmlvcml0eSB3aGVuIGRyYXdpbmcgY2VsbCBib3VuZGFyaWVzLiBXaGVuIHNldHRpbmdzIGJldHdlZW4gdHdvIGFkamFjZW50IGNlbGxzIGNvbmZsaWN0LCB0aGUgYm9yZGVyIHdpdGggdGhlIGhpZ2hlciBwcmlvcml0eSB3aW5zLiBJZiB0aGUgcHJpb3JpdGllcyBhcmUgZXF1YWwsIHRoZSBsYXR0ZXIgb2YgdGhlIHR3byBjZWxscyB0YWtlcyBwcmlvcml0eS4KKyAJCSogPHA+TGVnYWwgdmFsdWVzIGFyZSBhbnkgcmF0aW9uYWwgbnVtYmVyLiBDb25mbGljdHMgYXJlIHJlc29sdmVkIHdpdGggdGhlIHByb3BlcnRpZXMgb2YgdGhlIGhpZ2hlciBudW1iZXIgYmVpbmcgZHJhd24uPC9wPgorIAkJKiA8cD5EZWZhdWx0IHZhbHVlIGlzIHVuZGVmaW5lZCBpbmRpY2F0aW5nIG5vdCBzZXQuPC9wPgorIAkJKiA8cD5JZiB1bmRlZmluZWQgZHVyaW5nIHRoZSBjYXNjYWRlIHRoaXMgcHJvcGVydHkgd2lsbCBpbmhlcml0LCBhbmQgZGVmYXVsdCB0byAwLjwvcD4KKyAJCSogCisgCQkqIEB0aHJvd3MgUmFuZ2VFcnJvciB3aGVuIHNldCB2YWx1ZSBpcyBub3Qgd2l0aGluIHJhbmdlIGZvciB0aGlzIHByb3BlcnR5CisgCQkqIAorIAkJKiBAcGxheWVydmVyc2lvbiBGbGFzaCAxMAorIAkJKiBAcGxheWVydmVyc2lvbiBBSVIgMS41CisgCQkqIEBsYW5ndmVyc2lvbiAzLjAKKyAJCSovCisJCXB1YmxpYyBmdW5jdGlvbiBnZXQgYm9yZGVyTGVmdFByaW9yaXR5KCk6KgorCQl7CisJCQlyZXR1cm4gX2Zvcm1hdCA/IF9mb3JtYXQuYm9yZGVyTGVmdFByaW9yaXR5IDogdW5kZWZpbmVkOworCQl9CisJCXB1YmxpYyBmdW5jdGlvbiBzZXQgYm9yZGVyTGVmdFByaW9yaXR5KHZhbHVlOiopOnZvaWQKKwkJeyAKKwkJCXdyaXRhYmxlVGV4dExheW91dEZvcm1hdCgpLmJvcmRlckxlZnRQcmlvcml0eSA9IHZhbHVlOworCQkJZm9ybWF0Q2hhbmdlZCgpOworCQl9CisKKwkJLyoqCisJCSAqIFRleHRMYXlvdXRGb3JtYXQ6CisJCSAqIFNwZWNpZmllcyB0aGUgcHJpb3JpdHkgd2hlbiBkcmF3aW5nIGNlbGwgYm91bmRhcmllcy4gV2hlbiBzZXR0aW5ncyBiZXR3ZWVuIHR3byBhZGphY2VudCBjZWxscyBjb25mbGljdCwgdGhlIGJvcmRlciB3aXRoIHRoZSBoaWdoZXIgcHJpb3JpdHkgd2lucy4gSWYgdGhlIHByaW9yaXRpZXMgYXJlIGVxdWFsLCB0aGUgbGF0dGVyIG9mIHRoZSB0d28gY2VsbHMgdGFrZXMgcHJpb3JpdHkuCisJCSAqIDxwPkxlZ2FsIHZhbHVlcyBhcmUgYW55IHJhdGlvbmFsIG51bWJlci4gQ29uZmxpY3RzIGFyZSByZXNvbHZlZCB3aXRoIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBoaWdoZXIgbnVtYmVyIGJlaW5nIGRyYXduLjwvcD4KKwkJICogPHA+RGVmYXVsdCB2YWx1ZSBpcyB1bmRlZmluZWQgaW5kaWNhdGluZyBub3Qgc2V0LjwvcD4KKwkJICogPHA+SWYgdW5kZWZpbmVkIGR1cmluZyB0aGUgY2FzY2FkZSB0aGlzIHByb3BlcnR5IHdpbGwgaW5oZXJpdCwgYW5kIGRlZmF1bHQgdG8gMC48L3A+CisJCSAqIAorCQkgKiBAdGhyb3dzIFJhbmdlRXJyb3Igd2hlbiBzZXQgdmFsdWUgaXMgbm90IHdpdGhpbiByYW5nZSBmb3IgdGhpcyBwcm9wZXJ0eQorCQkgKiAKKwkJICogQHBsYXllcnZlcnNpb24gRmxhc2ggMTAKKwkJICogQHBsYXllcnZlcnNpb24gQUlSIDEuNQorCQkgKiBAbGFuZ3ZlcnNpb24gMy4wCisJCSAqLworCQlwdWJsaWMgZnVuY3Rpb24gZ2V0IGJvcmRlclJpZ2h0UHJpb3JpdHkoKToqCisJCXsKKwkJCXJldHVybiAgX2Zvcm1hdCA/IF9mb3JtYXQuYm9yZGVyUmlnaHRQcmlvcml0eSA6IHVuZGVmaW5lZDsKKwkJfQorCQlwdWJsaWMgZnVuY3Rpb24gc2V0IGJvcmRlclJpZ2h0UHJpb3JpdHkodmFsdWU6Kik6dm9pZAorCQl7CisJCQl3cml0YWJsZVRleHRMYXlvdXRGb3JtYXQoKS5ib3JkZXJSaWdodFByaW9yaXR5ID0gdmFsdWU7CisJCQlmb3JtYXRDaGFuZ2VkKCk7CisJCX0KKwkJCisJCS8qKgorCQkgKiBUZXh0TGF5b3V0Rm9ybWF0OgorCQkgKiBTcGVjaWZpZXMgdGhlIHByaW9yaXR5IHdoZW4gZHJhd2luZyBjZWxsIGJvdW5kYXJpZXMuIFdoZW4gc2V0dGluZ3MgYmV0d2VlbiB0d28gYWRqYWNlbnQgY2VsbHMgY29uZmxpY3QsIHRoZSBib3JkZXIgd2l0aCB0aGUgaGlnaGVyIHByaW9yaXR5IHdpbnMuIElmIHRoZSBwcmlvcml0aWVzIGFyZSBlcXVhbCwgdGhlIGxhdHRlciBvZiB0aGUgdHdvIGNlbGxzIHRha2VzIHByaW9yaXR5LgorCQkgKiA8cD5MZWdhbCB2YWx1ZXMgYXJlIGFueSByYXRpb25hbCBudW1iZXIuIENvbmZsaWN0cyBhcmUgcmVzb2x2ZWQgd2l0aCB0aGUgcHJvcGVydGllcyBvZiB0aGUgaGlnaGVyIG51bWJlciBiZWluZyBkcmF3bi48L3A+CisJCSAqIDxwPkRlZmF1bHQgdmFsdWUgaXMgdW5kZWZpbmVkIGluZGljYXRpbmcgbm90IHNldC48L3A+CisJCSAqIDxwPklmIHVuZGVmaW5lZCBkdXJpbmcgdGhlIGNhc2NhZGUgdGhpcyBwcm9wZXJ0eSB3aWxsIGluaGVyaXQsIGFuZCBkZWZhdWx0IHRvIDAuPC9wPgorCQkgKiAKKwkJICogQHRocm93cyBSYW5nZUVycm9yIHdoZW4gc2V0IHZhbHVlIGlzIG5vdCB3aXRoaW4gcmFuZ2UgZm9yIHRoaXMgcHJvcGVydHkKKwkJICogCisJCSAqIEBwbGF5ZXJ2ZXJzaW9uIEZsYXNoIDEwCisJCSAqIEBwbGF5ZXJ2ZXJzaW9uIEFJUiAxLjUKKwkJICogQGxhbmd2ZXJzaW9uIDMuMAorCQkgKi8KKwkJcHVibGljIGZ1bmN0aW9uIGdldCBib3JkZXJUb3BQcmlvcml0eSgpOioKKwkJeworCQkJcmV0dXJuICBfZm9ybWF0ID8gX2Zvcm1hdC5ib3JkZXJUb3BQcmlvcml0eSA6IHVuZGVmaW5lZDsKKwkJfQorCQlwdWJsaWMgZnVuY3Rpb24gc2V0IGJvcmRlclRvcFByaW9yaXR5KHZhbHVlOiopOnZvaWQKKwkJeworCQkJd3JpdGFibGVUZXh0TGF5b3V0Rm9ybWF0KCkuYm9yZGVyVG9wUHJpb3JpdHkgPSB2YWx1ZTsKKwkJCWZvcm1hdENoYW5nZWQoKTsKKwkJfQorCQkKKwkJLyoqCisJCSAqIFRleHRMYXlvdXRGb3JtYXQ6CisJCSAqIFNwZWNpZmllcyB0aGUgcHJpb3JpdHkgd2hlbiBkcmF3aW5nIGNlbGwgYm91bmRhcmllcy4gV2hlbiBzZXR0aW5ncyBiZXR3ZWVuIHR3byBhZGphY2VudCBjZWxscyBjb25mbGljdCwgdGhlIGJvcmRlciB3aXRoIHRoZSBoaWdoZXIgcHJpb3JpdHkgd2lucy4gSWYgdGhlIHByaW9yaXRpZXMgYXJlIGVxdWFsLCB0aGUgbGF0dGVyIG9mIHRoZSB0d28gY2VsbHMgdGFrZXMgcHJpb3JpdHkuCisJCSAqIDxwPkxlZ2FsIHZhbHVlcyBhcmUgYW55IHJhdGlvbmFsIG51bWJlci4gQ29uZmxpY3RzIGFyZSByZXNvbHZlZCB3aXRoIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBoaWdoZXIgbnVtYmVyIGJlaW5nIGRyYXduLjwvcD4KKwkJICogPHA+RGVmYXVsdCB2YWx1ZSBpcyB1bmRlZmluZWQgaW5kaWNhdGluZyBub3Qgc2V0LjwvcD4KKwkJICogPHA+SWYgdW5kZWZpbmVkIGR1cmluZyB0aGUgY2FzY2FkZSB0aGlzIHByb3BlcnR5IHdpbGwgaW5oZXJpdCwgYW5kIGRlZmF1bHQgdG8gMC48L3A+CisJCSAqIAorCQkgKiBAdGhyb3dzIFJhbmdlRXJyb3Igd2hlbiBzZXQgdmFsdWUgaXMgbm90IHdpdGhpbiByYW5nZSBmb3IgdGhpcyBwcm9wZXJ0eQorCQkgKiAKKwkJICogQHBsYXllcnZlcnNpb24gRmxhc2ggMTAKKwkJICogQHBsYXllcnZlcnNpb24gQUlSIDEuNQorCQkgKiBAbGFuZ3ZlcnNpb24gMy4wCisJCSAqLworCQlwdWJsaWMgZnVuY3Rpb24gZ2V0IGJvcmRlckJvdHRvbVByaW9yaXR5KCk6KgorCQl7CisJCQlyZXR1cm4gIF9mb3JtYXQgPyBfZm9ybWF0LmJvcmRlckJvdHRvbVByaW9yaXR5IDogdW5kZWZpbmVkOworCQl9CisJCXB1YmxpYyBmdW5jdGlvbiBzZXQgYm9yZGVyQm90dG9tUHJpb3JpdHkodmFsdWU6Kik6dm9pZAorCQl7CisJCQl3cml0YWJsZVRleHRMYXlvdXRGb3JtYXQoKS5ib3JkZXJCb3R0b21Qcmlvcml0eSA9IHZhbHVlOworCQkJZm9ybWF0Q2hhbmdlZCgpOworCQl9CisKKwkJLyoqCiAJCSAqIFRleHRMYXlvdXRGb3JtYXQ6CiAJCSAqIGxlZnQgbWFyZ2luIGluIHBpeGVscyhhZG9wdHMgZGVmYXVsdCB2YWx1ZSBpZiB1bmRlZmluZWQgZHVyaW5nIGNhc2NhZGUpLgogCQkgKiA8cD5MZWdhbCB2YWx1ZXMgYXJlIG51bWJlcnMgZnJvbSAtODAwMCB0byA4MDAwIGFuZCBGb3JtYXRWYWx1ZS5JTkhFUklULjwvcD4KQEAgLTE4NDksNiArMTk0MSw3IEBACiAJCSAqIEBwbGF5ZXJ2ZXJzaW9uIEFJUiAxLjUKIAkJICogQGxhbmd2ZXJzaW9uIDMuMAogCQkgKi8KKwogCQlwdWJsaWMgZnVuY3Rpb24gZ2V0IG1hcmdpbkxlZnQoKToqCiAJCXsKIAkJCXJldHVybiBfZm9ybWF0ID8gX2Zvcm1hdC5tYXJnaW5MZWZ0IDogdW5kZWZpbmVkOwpAQCAtMjAyNiw2ICsyMTE5LDU0IEBACiAJCQlmb3JtYXRDaGFuZ2VkKCk7CiAJCX0KIAorCQkvKioKKwkJICogVGV4dExheW91dEZvcm1hdDoKKwkJICogTWluaW11bSBoZWlnaHQgb2YgYSB0YWJsZSBjZWxsLiBJZiB0aGVyZSBpcyBubyBtYXhpbXVtLCB0aGUgY2VsbCB3aWxsIGdyb3cgaW4gaGVpZ2h0IHRvIGZpdCB0aGUgY29udGVudC4gTWluaW11bSBhbmQgbWF4aW11bSBvZiB0aGUgc2FtZSB2YWx1ZXMgd2lsbCBnaXZlIHRoZSBjZWxsIGEgZml4ZWQgaGVpZ2h0LgorCQkgKiA8cD5MZWdhbCB2YWx1ZXMgYXMgYSBudW1iZXIgYXJlIGZyb20gMiB0byAxMDAwMC48L3A+CisJCSAqIDxwPkxlZ2FsIHZhbHVlcyBpbmNsdWRlIEZvcm1hdFZhbHVlLklOSEVSSVQuPC9wPgorCQkgKiA8cD5EZWZhdWx0IHZhbHVlIGlzIHVuZGVmaW5lZCBpbmRpY2F0aW5nIG5vdCBzZXQuPC9wPgorCQkgKiA8cD5JZiB1bmRlZmluZWQgZHVyaW5nIHRoZSBjYXNjYWRlIHRoaXMgcHJvcGVydHkgd2lsbCBoYXZlIGEgdmFsdWUgb2YgMi48L3A+CisJCSAqIAorCQkgKiBAdGhyb3dzIFJhbmdlRXJyb3Igd2hlbiBzZXQgdmFsdWUgaXMgbm90IHdpdGhpbiByYW5nZSBmb3IgdGhpcyBwcm9wZXJ0eQorCQkgKiAKKwkJICogQHBsYXllcnZlcnNpb24gRmxhc2ggMTAKKwkJICogQHBsYXllcnZlcnNpb24gQUlSIDEuNQorCQkgKiBAbGFuZ3ZlcnNpb24gMy4wCisJCSAqLworCQlwdWJsaWMgZnVuY3Rpb24gZ2V0IG1pbkNlbGxIZWlnaHQoKToqCisJCXsKKwkJCXJldHVybiBfZm9ybWF0ID8gX2Zvcm1hdC5taW5DZWxsSGVpZ2h0IDogdW5kZWZpbmVkOworCQl9CisJCXB1YmxpYyBmdW5jdGlvbiBzZXQgbWluQ2VsbEhlaWdodCh2YWx1ZToqKTp2b2lkCisJCXsKKwkJCXdyaXRhYmxlVGV4dExheW91dEZvcm1hdCgpLm1pbkNlbGxIZWlnaHQgPSB2YWx1ZTsKKwkJCWZvcm1hdENoYW5nZWQoKTsKKwkJfQorCQkKKwkJLyoqCisJCSAqIFRleHRMYXlvdXRGb3JtYXQ6CisJCSAqIE1heGltdW0gaGVpZ2h0IG9mIGEgdGFibGUgY2VsbC4gSWYgdGhlcmUgaXMgbm8gbWF4aW11bSwgdGhlIGNlbGwgd2lsbCBncm93IGluIGhlaWdodCB0byBmaXQgdGhlIGNvbnRlbnQuIE1pbmltdW0gYW5kIG1heGltdW0gb2YgdGhlIHNhbWUgdmFsdWVzIHdpbGwgZ2l2ZSB0aGUgY2VsbCBhIGZpeGVkIGhlaWdodC4KKwkJICogPHA+TGVnYWwgdmFsdWVzIGFzIGEgbnVtYmVyIGFyZSBmcm9tIDIgdG8gMTAwMDAuPC9wPgorCQkgKiA8cD5MZWdhbCB2YWx1ZXMgaW5jbHVkZSBGb3JtYXRWYWx1ZS5JTkhFUklULjwvcD4KKwkJICogPHA+RGVmYXVsdCB2YWx1ZSBpcyB1bmRlZmluZWQgaW5kaWNhdGluZyBub3Qgc2V0LjwvcD4KKwkJICogPHA+SWYgdW5kZWZpbmVkIGR1cmluZyB0aGUgY2FzY2FkZSB0aGlzIHByb3BlcnR5IHdpbGwgaGF2ZSBhIHZhbHVlIG9mIDIuPC9wPgorCQkgKiAKKwkJICogQHRocm93cyBSYW5nZUVycm9yIHdoZW4gc2V0IHZhbHVlIGlzIG5vdCB3aXRoaW4gcmFuZ2UgZm9yIHRoaXMgcHJvcGVydHkKKwkJICogCisJCSAqIEBwbGF5ZXJ2ZXJzaW9uIEZsYXNoIDEwCisJCSAqIEBwbGF5ZXJ2ZXJzaW9uIEFJUiAxLjUKKwkJICogQGxhbmd2ZXJzaW9uIDMuMAorCQkgKi8KKwkJcHVibGljIGZ1bmN0aW9uIGdldCBtYXhDZWxsSGVpZ2h0KCk6KgorCQl7CisJCQlyZXR1cm4gX2Zvcm1hdCA/IF9mb3JtYXQubWF4Q2VsbEhlaWdodCA6IHVuZGVmaW5lZDsKKwkJfQorCQlwdWJsaWMgZnVuY3Rpb24gc2V0IG1heENlbGxIZWlnaHQodmFsdWU6Kik6dm9pZAorCQl7CisJCQl3cml0YWJsZVRleHRMYXlvdXRGb3JtYXQoKS5tYXhDZWxsSGVpZ2h0ID0gdmFsdWU7CisJCQlmb3JtYXRDaGFuZ2VkKCk7CisJCX0KKwogCQlbSW5zcGVjdGFibGUoZW51bWVyYXRpb249InZvaWQsYWJvdmUsYmVsb3csaHNpZGVzLHZzaWRlcyxsaHMscmhzLGJveCxib3JkZXIsaW5oZXJpdCIpXQogCQkvKioKIAkJICogVGV4dExheW91dEZvcm1hdDoKZGlmZiAtLWdpdCBhL3RleHRMYXlvdXQvc3JjL2ZsYXNoeC90ZXh0TGF5b3V0L29wZXJhdGlvbnMvQXBwbHlFbGVtZW50U3R5bGVOYW1lT3BlcmF0aW9uLmFzIGIvdGV4dExheW91dC9zcmMvZmxhc2h4L3RleHRMYXlvdXQvb3BlcmF0aW9ucy9BcHBseUVsZW1lbnRTdHlsZU5hbWVPcGVyYXRpb24uYXMKaW5kZXggNWNkMDQ3NC4uNjc5YzdjYiAxMDA2NDQKLS0tIGEvdGV4dExheW91dC9zcmMvZmxhc2h4L3RleHRMYXlvdXQvb3BlcmF0aW9ucy9BcHBseUVsZW1lbnRTdHlsZU5hbWVPcGVyYXRpb24uYXMKKysrIGIvdGV4dExheW91dC9zcmMvZmxhc2h4L3RleHRMYXlvdXQvb3BlcmF0aW9ucy9BcHBseUVsZW1lbnRTdHlsZU5hbWVPcGVyYXRpb24uYXMKQEAgLTMxLDcgKzMxLDYgQEAKIAogCXVzZSBuYW1lc3BhY2UgdGxmX2ludGVybmFsOwogCQotCVtEZXByZWNhdGVkKHJlcGxhY2VtZW50PSJBcHBseUZvcm1hdFRvRWxlbWVudE9wZXJhdGlvbiIsIGRlcHJlY2F0ZWRTaW5jZT0iMi4wIildCiAJLyoqCiAJICogVGhlIEFwcGx5RWxlbWVudFN0eWxlTmFtZU9wZXJhdGlvbiBjbGFzcyBlbmNhcHN1bGF0ZXMgYSBzdHlsZSBuYW1lIGNoYW5nZS4KIAkgKgpkaWZmIC0tZ2l0IGEvdGV4dExheW91dC9zcmMvZmxhc2h4L3RleHRMYXlvdXQvb3BlcmF0aW9ucy9BcHBseUVsZW1lbnRVc2VyU3R5bGVPcGVyYXRpb24uYXMgYi90ZXh0TGF5b3V0L3NyYy9mbGFzaHgvdGV4dExheW91dC9vcGVyYXRpb25zL0FwcGx5RWxlbWVudFVzZXJTdHlsZU9wZXJhdGlvbi5hcwppbmRleCAwMmNmMWQ3Li5hZmMyNTFmIDEwMDY0NAotLS0gYS90ZXh0TGF5b3V0L3NyYy9mbGFzaHgvdGV4dExheW91dC9vcGVyYXRpb25zL0FwcGx5RWxlbWVudFVzZXJTdHlsZU9wZXJhdGlvbi5hcworKysgYi90ZXh0TGF5b3V0L3NyYy9mbGFzaHgvdGV4dExheW91dC9vcGVyYXRpb25zL0FwcGx5RWxlbWVudFVzZXJTdHlsZU9wZXJhdGlvbi5hcwpAQCAtMzAsNyArMzAsNiBAQAogCiAJdXNlIG5hbWVzcGFjZSB0bGZfaW50ZXJuYWw7CiAJCi0JW0RlcHJlY2F0ZWQocmVwbGFjZW1lbnQ9IkFwcGx5Rm9ybWF0VG9FbGVtZW50T3BlcmF0aW9uIiwgZGVwcmVjYXRlZFNpbmNlPSIyLjAiKV0KIAkvKioKIAkgKiBUaGUgQXBwbHlFbGVtZW50VXNlclN0eWxlT3BlcmF0aW9uIGNsYXNzIGVuY2Fwc3VsYXRlcyBhIGNoYW5nZSBpbiBhIHN0eWxlIHZhbHVlIG9mIGFuIGVsZW1lbnQuCiAJICoK